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:
@@ -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) <
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user