Bug 371221, 340949: fixing observer madness, write RSVP=TRUE, check for identical datetimes, workaround deleteitem rid for DATEs, workaround cs searchOpts bug

git-svn-id: svn://10.0.0.236/trunk@220991 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
daniel.boelzle%sun.com
2007-02-27 13:58:52 +00:00
parent 0c4b62303b
commit fae0fd6cb9
4 changed files with 85 additions and 41 deletions

View File

@@ -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) <

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;