gecko-dev/calendar/providers/wcap/calWcapCalendarModule.js

249 lines
10 KiB
JavaScript

/* -*- Mode: javascript; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Sun Microsystems, Inc.
* Portions created by Sun Microsystems are Copyright (C) 2006 Sun
* Microsystems, Inc. All Rights Reserved.
*
* Original Author: Daniel Boelzle (daniel.boelzle@sun.com)
*
* Contributor(s):
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// init code for globals, prefs:
//
// constants:
const NS_OK = Components.results.NS_OK;
const nsIException = Components.interfaces.nsIException;
const calIWcapSession = Components.interfaces.calIWcapSession;
const calIWcapCalendar = Components.interfaces.calIWcapCalendar;
const calIWcapErrors = Components.interfaces.calIWcapErrors;
const calICalendar = Components.interfaces.calICalendar;
const calIItemBase = Components.interfaces.calIItemBase;
const calIOperationListener = Components.interfaces.calIOperationListener;
// ctors:
var CalEvent;
var CalTodo;
var CalDateTime;
var CalDuration;
var CalPeriod;
var Timer;
// some string resources:
var g_privateItemTitle;
var g_confidentialItemTitle;
var g_busyItemTitle;
var g_busyPhantomItemUuidPrefix;
// global preferences:
// caching: off|memory|storage:
var CACHE = "off";
// denotes where to host local storage calendar(s)
var CACHE_DIR = null;
// caching the last data retrievals:
var CACHE_LAST_RESULTS = 4;
// timer secs for invalidation:
var CACHE_LAST_RESULTS_INVALIDATE = 120;
// logging:
var LOG_LEVEL = 0;
// whether alarms are turned on/off:
var SUPPRESS_ALARMS = false;
var g_ioService = null;
function getIoService() {
if (!g_ioService) {
g_ioService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
}
return g_ioService;
}
function initWcapProvider()
{
try {
// xxx todo: hack
// the master password prompt is currently not guarded against
// multiple prompt; this initializes/raises the pw db at early stage.
var tokenDB = Components.classes["@mozilla.org/security/pk11tokendb;1"]
.getService(Components.interfaces.nsIPK11TokenDB);
var token = tokenDB.getInternalKeyToken();
if (token.needsLogin && !token.needsUserInit)
token.login(false);
}
catch (exc) {
}
try {
// ctors:
CalEvent = new Components.Constructor("@mozilla.org/calendar/event;1",
"calIEvent");
CalTodo = new Components.Constructor("@mozilla.org/calendar/todo;1",
"calITodo");
CalDateTime = new Components.Constructor("@mozilla.org/calendar/datetime;1",
"calIDateTime");
CalDuration = new Components.Constructor("@mozilla.org/calendar/duration;1",
"calIDuration");
CalPeriod = new Components.Constructor("@mozilla.org/calendar/period;1",
"calIPeriod");
Timer = new Components.Constructor("@mozilla.org/timer;1",
"nsITimer");
initLogging();
// some string resources:
g_privateItemTitle = getWcapBundle().GetStringFromName("privateItem.title.text");
g_confidentialItemTitle = getWcapBundle().GetStringFromName("confidentialItem.title.text");
g_busyItemTitle = getWcapBundle().GetStringFromName("busyItem.title.text");
g_busyPhantomItemUuidPrefix = ("PHANTOM_uuid" + getTime().icalString);
SUPPRESS_ALARMS = getPref("calendar.wcap.suppress_alarms", true);
CACHE_LAST_RESULTS = getPref("calendar.wcap.cache_last_results", 4);
CACHE_LAST_RESULTS_INVALIDATE = getPref("calendar.wcap.cache_last_results_invalidate", 120);
// init cache dir directory:
CACHE = getPref("calendar.wcap.cache", "off");
if (CACHE == "storage") {
var cacheDir = null;
var sCacheDir = getPref("calendar.wcap.cache_dir", null);
if (sCacheDir != null) {
cacheDir = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
cacheDir.initWithPath( sCacheDir );
}
else { // not found: default to wcap/ directory in profile
var dirService = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties);
cacheDir = dirService.get("ProfD", Components.interfaces.nsILocalFile);
cacheDir.append("wcap");
}
CACHE_DIR = cacheDir;
log(CACHE_DIR.path, "cache dir");
if (!CACHE_DIR.exists()) {
CACHE_DIR.create(Components.interfaces.nsIFile.DIRECTORY_TYPE,
0700 /* read, write, execute/search by owner */);
}
}
}
catch (exc) {
logError(exc, "error in init sequence");
}
}
var calWcapCalendarFactory = { // nsIFactory:
lockFactory: function calWcapCalendarFactory_lockFactory(lock) {},
createInstance: function calWcapCalendarFactory_createInstance(outer, iid) {
if (outer)
throw Components.results.NS_ERROR_NO_AGGREGATION;
var session = new calWcapSession();
return session.defaultCalendar.QueryInterface(iid);
}
};
var calWcapCalendarModule = { // nsIModule:
WcapCalendarInfo: {
classDescription: "Sun Java System Calendar Server WCAP Provider",
contractID: "@mozilla.org/calendar/calendar;1?type=wcap",
classID: Components.ID("{CF4D93E5-AF79-451a-95F3-109055B32EF0}")
},
WcapSessionInfo: {
classDescription: "Sun Java System Calendar Server WCAP Session",
contractID: "@mozilla.org/calendar/wcap/session;1",
classID: Components.ID("{CBF803FD-4469-4999-AE39-367AF1C7B077}")
},
registerSelf: function calWcapCalendarModule_registerSelf(compMgr, fileSpec, location, type)
{
compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
compMgr.registerFactoryLocation(this.WcapCalendarInfo.classID,
this.WcapCalendarInfo.classDescription,
this.WcapCalendarInfo.contractID,
fileSpec, location, type);
compMgr.registerFactoryLocation(this.WcapSessionInfo.classID,
this.WcapSessionInfo.classDescription,
this.WcapSessionInfo.contractID,
fileSpec, location, type);
},
unregisterSelf: function calWcapCalendarModule_unregisterSelf(compMgr, fileSpec, location)
{
compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
compMgr.unregisterFactoryLocation(this.WcapCalendarInfo.classID, fileSpec);
compMgr.unregisterFactoryLocation(this.WcapSessionInfo.classID, fileSpec);
},
m_scriptsLoaded: false,
getClassObject: function calWcapCalendarModule_getClassObject(compMgr, cid, iid)
{
if (!this.m_scriptsLoaded) {
// loading extra scripts from ../js:
const scripts = [ "calWcapUtils.js", "calWcapErrors.js",
"calWcapRequest.js", "calWcapSession.js",
"calWcapCalendar.js", "calWcapCalendarItems.js" ];
var scriptLoader =
Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
.createInstance(Components.interfaces.mozIJSSubScriptLoader);
var ioService = getIoService();
var baseDir = __LOCATION__.parent.parent;
baseDir.append("js");
for each (var script in scripts) {
var scriptFile = baseDir.clone();
scriptFile.append(script);
scriptLoader.loadSubScript(ioService.newFileURI(scriptFile).spec, null);
}
initWcapProvider();
this.m_scriptsLoaded = true;
}
if (!iid.equals(Components.interfaces.nsIFactory))
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
if (!cid.equals(calWcapCalendar.prototype.classID))
throw Components.results.NS_ERROR_NO_INTERFACE;
return calWcapCalendarFactory;
},
canUnload: function calWcapCalendarModule_canUnload(compMgr) { return true; }
};
/** module export */
function NSGetModule(compMgr, fileSpec) {
return calWcapCalendarModule;
}