From 3431aeecd7507568a407f8ba8963101a3a018ba0 Mon Sep 17 00:00:00 2001 From: "daniel.boelzle%sun.com" Date: Thu, 19 Oct 2006 11:41:36 +0000 Subject: [PATCH] Bug 340949: fixing calId encoded into url, alarms/ tunneling X- props, support for TRANSP --- .../providers/wcap/calWcapCalendarItems.js | 62 ++++++++++++++----- .../providers/wcap/calWcapCalendarModule.js | 7 +-- calendar/providers/wcap/calWcapSession.js | 27 ++++---- 3 files changed, 62 insertions(+), 34 deletions(-) diff --git a/calendar/providers/wcap/calWcapCalendarItems.js b/calendar/providers/wcap/calWcapCalendarItems.js index 790b2c87fe81..08183d561a66 100644 --- a/calendar/providers/wcap/calWcapCalendarItems.js +++ b/calendar/providers/wcap/calWcapCalendarItems.js @@ -384,10 +384,21 @@ calWcapCalendar.prototype.storeItem = function( item, oldItem, receiverFunc ) // xxx todo: sentBy sentUID fields in cs: missing in cal api } - // xxx todo: force exclusion from free-busy calc for PRIVATE items - // until user can check this on/off in UI: - url += ("&transparent=" + - (((icsClass == "PRIVATE") || bIsAllDay) ? "1" : "0")); + var strTransp = null; + if (item.hasProperty("TRANSP")) + strTransp = item.getProperty("TRANSP"); + switch (strTransp) { + case "TRANSPARENT": + url += "&transparent=1"; + break; + case "OPAQUE": + url += "&transparent=0"; + break; + default: + url += ("&transparent=" + + (((icsClass == "PRIVATE") || bIsAllDay) ? "1" : "0")); + break; + } url += ("&isAllDay=" + (bIsAllDay ? "1" : "0")); @@ -504,7 +515,22 @@ calWcapCalendar.prototype.storeItem = function( item, oldItem, receiverFunc ) url + "&fmt-out=text%2Fcalendar", stringToIcal, receiverFunc ); }; -calWcapCalendar.prototype.adoptItem_resp = function( wcapResponse, listener ) +calWcapCalendar.prototype.tunnelXProps = function( destItem, srcItem ) +{ + var enum = srcItem.propertyEnumerator; + while (enum.hasMoreElements()) { + var prop = enum.getNext().QueryInterface( + Components.interfaces.nsIProperty); + var name = prop.name; + if (name.indexOf("X-MOZ-") == 0) { + this.log( "tunneling " + name ); + destItem.setProperty(name, prop.value); + } + } +}; + +calWcapCalendar.prototype.adoptItem_resp = function( + wcapResponse, newItem_, listener ) { var item = null; try { @@ -513,12 +539,14 @@ calWcapCalendar.prototype.adoptItem_resp = function( wcapResponse, listener ) var items = this.parseItems( icalRootComp, Components.interfaces.calICalendar.ITEM_FILTER_ALL_ITEMS, - 0, null, null ); + 0, null, null, true /* bLeaveMutable */ ); if (items.length < 1) throw new Components.Exception("empty VCALENDAR returned!"); if (items.length > 1) this.notifyError( "unexpected number of items: " + items.length ); item = items[0]; + this.tunnelXProps(item, newItem_); + item.makeImmutable(); this.log( "item.id=" + item.id ); if (listener != null) { @@ -560,7 +588,7 @@ calWcapCalendar.prototype.adoptItem = function( item, listener ) this.storeItem( item, oldItem, function( wcapResponse ) { - this_.adoptItem_resp( wcapResponse, listener ); + this_.adoptItem_resp( wcapResponse, item, listener ); } ); } catch (exc) { @@ -581,7 +609,7 @@ calWcapCalendar.prototype.addItem = function( item, listener ) }; calWcapCalendar.prototype.modifyItem_resp = function( - wcapResponse, oldItem, listener ) + wcapResponse, newItem_, oldItem, listener ) { var item = null; try { @@ -590,12 +618,14 @@ calWcapCalendar.prototype.modifyItem_resp = function( var items = this.parseItems( icalRootComp, Components.interfaces.calICalendar.ITEM_FILTER_ALL_ITEMS, - 0, null, null ); + 0, null, null, true /* bLeaveMutable */ ); if (items.length < 1) throw new Components.Exception("empty VCALENDAR returned!"); if (items.length > 1) this.notifyError( "unexpected number of items: " + items.length ); item = items[0]; + this.tunnelXProps(item, newItem_); + item.makeImmutable(); if (listener != null) { listener.onOperationComplete( @@ -629,7 +659,7 @@ calWcapCalendar.prototype.modifyItem = function( newItem, oldItem, listener ) this.storeItem( newItem, oldItem, function( wcapResponse ) { - this_.modifyItem_resp( wcapResponse, oldItem, listener ); + this_.modifyItem_resp(wcapResponse, newItem, oldItem, listener); } ); } catch (exc) { @@ -715,7 +745,8 @@ calWcapCalendar.prototype.deleteItem = function( item, listener ) }; calWcapCalendar.prototype.parseItems = function( - icalRootComp, itemFilter, maxResult, rangeStart, rangeEnd ) + icalRootComp, itemFilter, maxResult, rangeStart, rangeEnd, + bLeaveMutable ) { var unexpandedItems = []; var uid2parent = {}; @@ -867,7 +898,7 @@ calWcapCalendar.prototype.parseItems = function( } }, maxResult ); - + // tag "exceptions", i.e. items with rid: for each ( var item in excItems ) { var parent = uid2parent[item.id]; @@ -889,7 +920,8 @@ calWcapCalendar.prototype.parseItems = function( ++i ) { var item = unexpandedItems[i]; - item.makeImmutable(); + if (!bLeaveMutable) + item.makeImmutable(); if (item.recurrenceInfo != null && (itemFilter & Components.interfaces.calICalendar .ITEM_FILTER_CLASS_OCCURRENCES)) @@ -1287,7 +1319,7 @@ calWcapCalendar.prototype.syncChangesTo = function( try { var this_ = this; // new stamp for this sync: - var now = getTime(); // xxx todo: not exact + var now = getTime(); var syncState = new SyncState( // finishFunc: @@ -1329,7 +1361,7 @@ calWcapCalendar.prototype.syncChangesTo = function( var params = ("&relativealarm=1&compressed=1&recurring=1&calid=" + encodeURIComponent(this.calId)); params += ("&fmt-out=text%2Fcalendar&dtstart=" + zdtFrom); - params += ("&dtend=" + getIcalUTC(now)); + params += ("&dtend=" + getIcalUTC( this.session.getServerTime(now) )); syncState.acquire(); this.session.issueAsyncRequest( diff --git a/calendar/providers/wcap/calWcapCalendarModule.js b/calendar/providers/wcap/calWcapCalendarModule.js index 197779376cc7..de6b93a5eea9 100644 --- a/calendar/providers/wcap/calWcapCalendarModule.js +++ b/calendar/providers/wcap/calWcapCalendarModule.js @@ -79,7 +79,7 @@ var LOG_TIMEZONE = null; var LOG_FILE_STREAM = null; // whether alarms are by default turned on/off: -var SUPPRESS_ALARMS = true; +var SUPPRESS_ALARMS = false; function initWcapProvider() { @@ -145,9 +145,8 @@ function initWcapProvider() "#################################" ); } - SUPPRESS_ALARMS = getPref("calendar.wcap.suppress_alarms", true); - if (SUPPRESS_ALARMS) - logMessage( "calendar.wcap.suppress_alarms", SUPPRESS_ALARMS ); + SUPPRESS_ALARMS = getPref("calendar.wcap.suppress_alarms", false); + logMessage( "calendar.wcap.suppress_alarms", SUPPRESS_ALARMS ); // init cache dir directory: CACHE = getPref("calendar.wcap.cache", "off"); diff --git a/calendar/providers/wcap/calWcapSession.js b/calendar/providers/wcap/calWcapSession.js index 6764381b001f..d8048c9fb6d6 100644 --- a/calendar/providers/wcap/calWcapSession.js +++ b/calendar/providers/wcap/calWcapSession.js @@ -336,13 +336,7 @@ calWcapSession.prototype = { } } - // xxx todo: realm names must not have a - // trailing slash var sessionUri = this_.uri.clone(); - var spec = sessionUri.spec; - if (spec[spec.length - 1] == '/') - spec = spec.substr(0, spec.length - 1); - sessionUri.spec = spec; sessionUri.userPass = ""; if (sessionUri.scheme.toLowerCase() != "https" && sessionUri.port == -1 /* no port specified */) @@ -415,8 +409,12 @@ calWcapSession.prototype = { Components.classes["@mozilla.org/passwordmanager;1"] .getService(Components.interfaces.nsIPasswordManager); + // xxx todo: pw host names must not have a trailing slash + var pwHost = sessionUri.spec; + if (pwHost[pwHost.length - 1] == '/') + pwHost = pwHost.substr(0, pwHost.length - 1); + this.log( "looking in pw db for: " + pwHost ); var enumerator = passwordManager.enumerator; - this.log( "looking in pw db for: " + sessionUri.spec ); while (enumerator.hasMoreElements()) { var pwEntry = enumerator.getNext().QueryInterface( Components.interfaces.nsIPassword ); @@ -424,7 +422,7 @@ calWcapSession.prototype = { this.log( "pw entry:\n\thost=" + pwEntry.host + "\n\tuser=" + pwEntry.user ); } - if (pwEntry.host == sessionUri.spec) { + if (pwEntry.host == pwHost) { // found an entry matching URI: outUser.value = pwEntry.user; outPW.value = pwEntry.password; @@ -433,22 +431,21 @@ calWcapSession.prototype = { } if (outPW.value) { - this.log( "password entry found for host " + sessionUri.spec + + this.log( "password entry found for host " + pwHost + "\nuser is " + outUser.value ); this.assureSecureLogin(sessionUri); this.login_( sessionUri, outUser.value, outPW.value ); } else - this.log( "no password entry found for " + sessionUri.spec ); + this.log( "no password entry found for " + pwHost ); if (!this.m_sessionId) { var loginText = this.getServerInfo(sessionUri); if (outPW.value) { // login failed before, so try to remove from pw db: try { - passwordManager.removeUser( sessionUri.spec, - outUser.value ); - this.log( "removed from pw db: " + sessionUri.spec ); + passwordManager.removeUser( pwHost, outUser.value ); + this.log( "removed from pw db: " + pwHost ); } catch (exc) { this.logError( "error removing from pw db: " + exc ); @@ -481,9 +478,9 @@ calWcapSession.prototype = { } if (savePW.value) { try { // save pw under session uri: - passwordManager.addUser( sessionUri.spec, + passwordManager.addUser( pwHost, outUser.value, outPW.value ); - this.log( "added to pw db: " + sessionUri.spec ); + this.log( "added to pw db: " + pwHost ); } catch (exc) { this.logError( "error adding pw to db: " + exc );