diff --git a/mozilla/calendar/providers/wcap/calWcapCalendarItems.js b/mozilla/calendar/providers/wcap/calWcapCalendarItems.js index 95184dd4d55..3ff4908c73f 100644 --- a/mozilla/calendar/providers/wcap/calWcapCalendarItems.js +++ b/mozilla/calendar/providers/wcap/calWcapCalendarItems.js @@ -58,7 +58,7 @@ function calWcapCalendar_encodeAttendee(att) } return params; } - var params = "";//encodeAttr(att.rsvp, "RSVP", ""); + var params = encodeAttr(att.rsvp ? "TRUE" : "FALSE", "RSVP", ""); params = encodeAttr(att.participationStatus, "PARTSTAT", params); params = encodeAttr(att.role, "ROLE", params); params = encodeAttr(att.commonName, "CN", params); @@ -257,7 +257,13 @@ function calWcapCalendar_getInvitedAttendee(item) }; function equalDatetimes(one, two) { - return ((!one && !two) || (one && two && one.compare(two) == 0)); + return ((!one && !two) || + (one && two && (one.compare(two) == 0))); +} + +function identicalDatetimes(one, two) { + return ((!one && !two) || + (one && two && (one.compare(two) == 0) && (one.timezone == two.timezone))); } // @return null if nothing has changed else value to be written @@ -317,8 +323,8 @@ function calWcapCalendar_storeItem(bAddItem, item, oldItem, request, netRespFunc var dtstart = item.startDate; var dtend = item.endDate; bIsAllDay = (dtstart.isDate && dtend.isDate); - if (!oldItem || !equalDatetimes(dtstart, oldItem.startDate) - || !equalDatetimes(dtend, oldItem.endDate)) { + if (!oldItem || !identicalDatetimes(dtstart, oldItem.startDate) + || !identicalDatetimes(dtend, oldItem.endDate)) { params += ("&dtstart=" + getIcalUTC(dtstart)); params += ("&X-NSCP-DTSTART-TZID=" + "X-NSCP-ORIGINAL-OPERATION=X-NSCP-WCAP-PROPERTY-REPLACE^" + @@ -339,8 +345,8 @@ function calWcapCalendar_storeItem(bAddItem, item, oldItem, request, netRespFunc var dtstart = item.entryDate; var dtend = item.dueDate; bIsAllDay = (dtstart && dtstart.isDate); - if (!oldItem || !equalDatetimes(dtstart, oldItem.entryDate) - || !equalDatetimes(dtend, oldItem.dueDate)) { + if (!oldItem || !identicalDatetimes(dtstart, oldItem.entryDate) + || !identicalDatetimes(dtend, oldItem.dueDate)) { params += ("&dtstart=" + getIcalUTC(dtstart)); if (dtstart) { params += ("&X-NSCP-DTSTART-TZID=" + @@ -727,8 +733,15 @@ function calWcapCalendar_deleteItem(item, listener) var params = ("&uid=" + encodeURIComponent(item.id)); if (isParent(item)) // delete THIS AND ALL: params += "&mod=4&rid=0"; - else // delete THIS INSTANCE: - params += ("&mod=1&rid=" + getIcalUTC(item.recurrenceId)); + else { // delete THIS INSTANCE: + var rid = item.recurrenceId; + if (rid.isDate) { + // cs does not accept DATE: + rid = rid.clone(); + rid.isDate = false; + } + params += ("&mod=1&rid=" + getIcalUTC(rid)); + } params += "&fmt-out=text%2Fxml"; this.issueNetworkRequest( @@ -1185,7 +1198,7 @@ function calWcapCalendar_getItems(itemFilter, maxResults, rangeStart, rangeEnd, return; var now = (new Date()).getTime(); // sort out old entries: - entries = []; + var entries = []; for (var i = 0; i < this_.m_cachedResults.length; ++i) { var entry = this_.m_cachedResults[i]; if ((now - entry.stamp) < diff --git a/mozilla/calendar/providers/wcap/calWcapRequest.js b/mozilla/calendar/providers/wcap/calWcapRequest.js index b6f8b7e0f36..247213fac7d 100644 --- a/mozilla/calendar/providers/wcap/calWcapRequest.js +++ b/mozilla/calendar/providers/wcap/calWcapRequest.js @@ -397,9 +397,9 @@ function getWcapRequestStatusString( xml ) return str; } -function stringToIcal( data, expectedErrno ) +function stringToIcal(data, expectedErrno) { - if (!data || data == "") { // assuming time-out; WTF. + if (!data || data.length == 0) { // assuming time-out; WTF. throw new Components.Exception( "Login failed. Invalid session ID.", Components.interfaces.calIWcapErrors.WCAP_LOGIN_FAILED); @@ -416,9 +416,9 @@ function stringToIcal( data, expectedErrno ) return icalRootComp; } -function stringToXml( data, expectedErrno ) +function stringToXml(data, expectedErrno) { - if (!data || data == "") { // assuming time-out + if (!data || data.length == 0) { // assuming time-out throw new Components.Exception( "Login failed. Invalid session ID.", Components.interfaces.calIWcapErrors.WCAP_LOGIN_FAILED); diff --git a/mozilla/calendar/providers/wcap/calWcapSession.js b/mozilla/calendar/providers/wcap/calWcapSession.js index 59c11b431ea..b4bda84f7a1 100644 --- a/mozilla/calendar/providers/wcap/calWcapSession.js +++ b/mozilla/calendar/providers/wcap/calWcapSession.js @@ -140,7 +140,8 @@ calWcapSession.prototype = { } this.m_observers.forEach( - function notifyFunc(obj) { + function notifyFunc(entry) { + var obj = entry.obj; try { obj[func].apply(obj, args); } @@ -153,14 +154,26 @@ calWcapSession.prototype = { addObserver: function calWcapSession_addObserver(observer) { - if (this.m_observers.indexOf(observer) == -1) - this.m_observers.push(observer); + for each (var entry in this.m_observers) { + if (entry.obj == observer) { + ++entry.count; + return; + } + } + this.m_observers.push( { obj: observer, count: 1 } ); }, removeObserver: function calWcapSession_removeObserver(observer) { - this.m_observers = this.m_observers.filter( - function filterFunc(x) { return x != observer; } ); + function filterFunc(entry) { + if (entry.obj == observer) { + --entry.count; + if (entry.count == 0) + return false; + } + return true; + } + this.m_observers = this.m_observers.filter(filterFunc); }, m_serverTimezones: null, @@ -561,10 +574,31 @@ calWcapSession.prototype = { function calprops_resp(err, data) { if (err) throw err; - this_.defaultCalendar.m_calProps = data; - log("installed default cal props.", this_); + // string to xml converter func without WCAP errno check: + if (!data || data.length == 0) { // assuming time-out + throw new Components.Exception( + "Login failed. Invalid session ID.", + calIWcapErrors.WCAP_LOGIN_FAILED); + } + var xml = getDomParser().parseFromString(data, "text/xml"); + var nodeList = xml.getElementsByTagName("iCal"); + for (var i = 0; i < nodeList.length; ++i) { + var node = nodeList.item(i); + var ar = filterXmlNodes("X-NSCP-CALPROPS-RELATIVE-CALID", node); + if ((ar.length > 0) && (ar[0] == this_.defaultCalId)) { + checkWcapXmlErrno(node); + this_.defaultCalendar.m_calProps = node; + log("installed default cal props.", this_); + break; + } + } + if (!this_.defaultCalendar.m_calProps) { + throw new Components.Exception( + "Login failed. Invalid session ID.", + calIWcapErrors.WCAP_LOGIN_FAILED); + } }, - stringToXml, "search_calprops", + null, "search_calprops", "&fmt-out=text%2Fxml&searchOpts=3&calid=1&search-string=" + encodeURIComponent(this_.defaultCalId), sessionId); @@ -773,7 +807,10 @@ calWcapSession.prototype = { var data; if (!err) { try { - data = dataConvFunc(str); + if (dataConvFunc) + data = dataConvFunc(str); + else + data = str; } catch (exc) { err = exc; @@ -941,8 +978,7 @@ calWcapSession.prototype = { log("search done. number of found calendars: " + ret.length, this_); request.execRespFunc(null, ret); }, - function identity(data) { return data; }, - "search_calprops", params); + null, "search_calprops", params); } catch (exc) { request.execRespFunc(exc); diff --git a/mozilla/calendar/providers/wcap/calWcapUtils.js b/mozilla/calendar/providers/wcap/calWcapUtils.js index 9ae0b275093..474d759fe14 100644 --- a/mozilla/calendar/providers/wcap/calWcapUtils.js +++ b/mozilla/calendar/providers/wcap/calWcapUtils.js @@ -338,24 +338,19 @@ function getPref(prefName, defaultValue) { var prefBranch = Components.classes["@mozilla.org/preferences-service;1"] .getService(nsIPrefBranch); var ret; - try { - switch (prefBranch.getPrefType(prefName)) { - case nsIPrefBranch.PREF_BOOL: - ret = prefBranch.getBoolPref(prefName); - break; - case nsIPrefBranch.PREF_INT: - ret = prefBranch.getIntPref(prefName); - break; - case nsIPrefBranch.PREF_STRING: - ret = prefBranch.getCharPref(prefName); - break; - default: - ret = defaultValue; - break; - } - } - catch (exc) { + switch (prefBranch.getPrefType(prefName)) { + case nsIPrefBranch.PREF_BOOL: + ret = prefBranch.getBoolPref(prefName); + break; + case nsIPrefBranch.PREF_INT: + ret = prefBranch.getIntPref(prefName); + break; + case nsIPrefBranch.PREF_STRING: + ret = prefBranch.getCharPref(prefName); + break; + default: ret = defaultValue; + break; } log(ret, "getPref(): prefName=" + prefName); return ret;