mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-07 12:15:51 +00:00
364 lines
11 KiB
JavaScript
364 lines
11 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 ***** */
|
|
|
|
function createWcapCalendar( calId, session )
|
|
{
|
|
var cal = new calWcapCalendar( calId, session );
|
|
switch (CACHE) {
|
|
case "memory":
|
|
case "storage":
|
|
// wrap it up:
|
|
var cal_ = new calWcapCachedCalendar();
|
|
cal_.remoteCal = cal;
|
|
cal = cal_;
|
|
break;
|
|
}
|
|
return cal;
|
|
}
|
|
|
|
function calWcapCalendar( calId, session ) {
|
|
this.wrappedJSObject = this;
|
|
this.m_calId = calId;
|
|
this.m_session = session;
|
|
this.m_bSuppressAlarms = SUPPRESS_ALARMS;
|
|
}
|
|
calWcapCalendar.prototype = {
|
|
m_ifaces: [ Components.interfaces.calIWcapCalendar,
|
|
Components.interfaces.calICalendar,
|
|
Components.interfaces.calICalendarProvider,
|
|
Components.interfaces.nsIInterfaceRequestor,
|
|
Components.interfaces.nsIClassInfo,
|
|
Components.interfaces.nsISupports ],
|
|
|
|
// nsISupports:
|
|
QueryInterface:
|
|
function( iid )
|
|
{
|
|
for each ( var iface in this.m_ifaces ) {
|
|
if (iid.equals( iface ))
|
|
return this;
|
|
}
|
|
throw Components.results.NS_ERROR_NO_INTERFACE;
|
|
},
|
|
|
|
// nsIClassInfo:
|
|
getInterfaces:
|
|
function( count )
|
|
{
|
|
count.value = this.m_ifaces.length;
|
|
return this.m_ifaces;
|
|
},
|
|
get classDescription() {
|
|
return calWcapCalendarModule.WcapCalendarInfo.classDescription;
|
|
},
|
|
get contractID() {
|
|
return calWcapCalendarModule.WcapCalendarInfo.contractID;
|
|
},
|
|
get classID() {
|
|
return calWcapCalendarModule.WcapCalendarInfo.classID;
|
|
},
|
|
getHelperForLanguage: function( language ) { return null; },
|
|
implementationLanguage:
|
|
Components.interfaces.nsIProgrammingLanguage.JAVASCRIPT,
|
|
flags: 0,
|
|
|
|
// nsIInterfaceRequestor:
|
|
getInterface:
|
|
function( iid, instance )
|
|
{
|
|
if (iid.equals(Components.interfaces.nsIAuthPrompt)) {
|
|
// use the window watcher service to get a nsIAuthPrompt impl
|
|
return getWindowWatcher().getNewAuthPrompter(null);
|
|
}
|
|
else if (iid.equals(Components.interfaces.nsIPrompt)) {
|
|
// use the window watcher service to get a nsIPrompt impl
|
|
return getWindowWatcher().getNewPrompter(null);
|
|
}
|
|
Components.returnCode = Components.results.NS_ERROR_NO_INTERFACE;
|
|
return null;
|
|
},
|
|
|
|
toString:
|
|
function()
|
|
{
|
|
var str = this.session.toString();
|
|
str += (", calId=" + this.calId);
|
|
return str;
|
|
},
|
|
log:
|
|
function( msg, context )
|
|
{
|
|
return logMessage( context ? context : this.toString(), msg );
|
|
},
|
|
logError:
|
|
function( err, context )
|
|
{
|
|
var msg = errorToString(err);
|
|
Components.utils.reportError( this.log("error: " + msg, context) );
|
|
return msg;
|
|
},
|
|
notifyError:
|
|
function( err )
|
|
{
|
|
debugger;
|
|
var msg = this.logError(err);
|
|
this.notifyObservers(
|
|
"onError",
|
|
err instanceof Components.interfaces.nsIException
|
|
? [err.result, err.message] : [-1, msg] );
|
|
},
|
|
|
|
// calICalendarProvider:
|
|
get prefChromeOverlay() {
|
|
return null;
|
|
},
|
|
// displayName attribute already part of calIWcapCalendar
|
|
createCalendar:
|
|
function( name, url, listener )
|
|
{
|
|
throw NS_ERROR_NOT_IMPLEMENTED;
|
|
},
|
|
deleteCalendar:
|
|
function( calendar, listener )
|
|
{
|
|
throw NS_ERROR_NOT_IMPLEMENTED;
|
|
},
|
|
getCalendar:
|
|
function( url )
|
|
{
|
|
throw NS_ERROR_NOT_IMPLEMENTED;
|
|
},
|
|
|
|
// calICalendar:
|
|
get name() {
|
|
return getCalendarManager().getCalendarPref( this, "NAME" );
|
|
},
|
|
set name( name ) {
|
|
getCalendarManager().setCalendarPref( this, "NAME", name );
|
|
},
|
|
|
|
get type() { return "wcap"; },
|
|
|
|
m_superCalendar: null,
|
|
get superCalendar() { return this.m_superCalendar || this; },
|
|
set superCalendar( cal ) { this.m_superCalendar = cal; },
|
|
|
|
m_bReadOnly: false,
|
|
get readOnly() { return (this.m_bReadOnly || !this.isOwnedCalendar); },
|
|
set readOnly( bReadOnly ) { this.m_bReadOnly = bReadOnly; },
|
|
|
|
// xxx todo: will potentially vanish from calICalendar:
|
|
get uri() { return this.session.uri; },
|
|
set uri( thatUri ) {
|
|
this.session.uri = thatUri;
|
|
this.m_calProps = null;
|
|
},
|
|
notifyObservers:
|
|
function( func, args ) {
|
|
this.session.notifyObservers( func, args );
|
|
},
|
|
addObserver:
|
|
function( observer ) {
|
|
this.session.addObserver( observer );
|
|
},
|
|
removeObserver:
|
|
function( observer ) {
|
|
this.session.removeObserver( observer );
|
|
},
|
|
|
|
// xxx todo: batch currently not used
|
|
startBatch: function() { this.notifyObservers( "onStartBatch", [] ); },
|
|
endBatch: function() { this.notifyObservers( "onEndBatch", [] ); },
|
|
|
|
// xxx todo: rework like in
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=257428
|
|
m_bSuppressAlarms: false,
|
|
get suppressAlarms() {
|
|
return (this.m_bSuppressAlarms || this.readOnly);
|
|
},
|
|
set suppressAlarms( bSuppressAlarms ) {
|
|
this.m_bSuppressAlarms = bSuppressAlarms;
|
|
},
|
|
|
|
get canRefresh() { return false; },
|
|
refresh: function() {
|
|
// no-op
|
|
this.log("refresh()");
|
|
},
|
|
|
|
// calIWcapCalendar:
|
|
|
|
m_session: null,
|
|
get session() { return this.m_session; },
|
|
|
|
// xxx todo: for now to make subscriptions context menu work,
|
|
// will vanish when UI has been revised and every subscribed
|
|
// calendar has its own calICalendar object...
|
|
// poking calId, so default calendar will then behave
|
|
// like a subscribed one...
|
|
m_calId: null,
|
|
get calId() {
|
|
var userId = this.session.defaultCalId; // assure being logged in
|
|
return this.m_calId || userId;
|
|
},
|
|
set calId( id ) {
|
|
this.log( "setting calId to " + id );
|
|
this.m_calId = id;
|
|
// refresh calprops:
|
|
this.m_calProps = null;
|
|
this.getCalProps_( true /* async */ );
|
|
},
|
|
|
|
get ownerId() {
|
|
var ar = this.getCalendarProperties("X-NSCP-CALPROPS-PRIMARY-OWNER",{});
|
|
if (ar.length < 1 || ar[0].length == 0) {
|
|
this.notifyError(
|
|
"cannot determine primary owner of calendar " + this.calId );
|
|
// fallback to userId:
|
|
return this.session.userId;
|
|
}
|
|
return ar[0];
|
|
},
|
|
|
|
get description() {
|
|
var ar = this.getCalendarProperties("X-NSCP-CALPROPS-DESCRIPTION", {});
|
|
if (ar.length < 1 || ar[0].length == 0) {
|
|
// fallback to display name:
|
|
return this.displayName;
|
|
}
|
|
return ar[0];
|
|
},
|
|
|
|
get displayName() {
|
|
var ar = this.getCalendarProperties("X-NSCP-CALPROPS-NAME", {});
|
|
if (ar.length < 1 || ar[0].length == 0) {
|
|
// fallback to common name:
|
|
ar = this.getCalendarProperties(
|
|
"X-S1CS-CALPROPS-COMMON-NAME", {});
|
|
if (ar.length < 1) {
|
|
return this.calId;
|
|
}
|
|
}
|
|
return ar[0];
|
|
},
|
|
|
|
get isOwnedCalendar() {
|
|
if (!this.session.isLoggedIn)
|
|
return false;
|
|
var ownerId = this.ownerId;
|
|
return (this.calId == ownerId ||
|
|
this.calId.indexOf(ownerId + ":") == 0);
|
|
},
|
|
|
|
getCalendarProperties:
|
|
function( propName, out_count )
|
|
{
|
|
var ret = [];
|
|
var calProps = this.getCalProps_(false /* !async: waits for response*/);
|
|
if (calProps != null) {
|
|
var nodeList = calProps.getElementsByTagName(propName);
|
|
for ( var i = 0; i < nodeList.length; ++i ) {
|
|
ret.push( trimString(nodeList.item(i).textContent) );
|
|
}
|
|
}
|
|
out_count.value = ret.length;
|
|
return ret;
|
|
},
|
|
m_calProps: null,
|
|
getCalProps_:
|
|
function( bAsync )
|
|
{
|
|
try {
|
|
if (this.m_calProps == null) {
|
|
var url = this.session.getCommandUrl( "get_calprops" );
|
|
url += ("&calid=" + encodeURIComponent(this.calId));
|
|
url += "&fmt-out=text%2Fxml";
|
|
var this_ = this;
|
|
function resp( wcapResponse ) {
|
|
try {
|
|
// first statement, may throw:
|
|
var xml = wcapResponse.data;
|
|
if (this_.m_calProps == null)
|
|
this_.m_calProps = xml;
|
|
}
|
|
catch (exc) {
|
|
this_.notifyError( exc );
|
|
}
|
|
}
|
|
if (bAsync)
|
|
this.session.issueAsyncRequest( url, stringToXml, resp );
|
|
else
|
|
this.session.issueSyncRequest( url, stringToXml, resp );
|
|
}
|
|
}
|
|
catch (exc) {
|
|
this.notifyError( exc );
|
|
throw exc;
|
|
}
|
|
return this.m_calProps;
|
|
},
|
|
|
|
get defaultTimezone() {
|
|
var tzid = this.getCalendarProperties("X-NSCP-CALPROPS-TZID", {});
|
|
if (tzid.length < 1 || tzid[0].length == 0) {
|
|
return "UTC"; // fallback
|
|
}
|
|
return tzid[0];
|
|
},
|
|
// set defaultTimezone( tzid ) {
|
|
// if (this.readOnly)
|
|
// // xxx todo:
|
|
// throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
|
|
// },
|
|
|
|
getAlignedTimezone:
|
|
function( tzid )
|
|
{
|
|
// check whether it is one of cs:
|
|
if (tzid.indexOf("/mozilla.org/20050126_1/") == 0 ||
|
|
!this.session.isSupportedTimezone(tzid)) {
|
|
// use calendar's default:
|
|
return this.defaultTimezone;
|
|
}
|
|
else // is ok (supported):
|
|
return tzid;
|
|
}
|
|
};
|
|
|