bug 451585 - [CalDAV] Use ICS service for ics parsing. r=browning

git-svn-id: svn://10.0.0.236/trunk@253835 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
daniel.boelzle%sun.com
2008-08-26 08:45:31 +00:00
parent d13604c083
commit 6223c77d06

View File

@@ -1626,34 +1626,33 @@ calDavCalendar.prototype = {
&& aCalIdParts[0] != "https" ) {
return;
}
mailto_aCalId = aCalIdParts.join(":");
var mailto_aCalId = aCalIdParts.join(":");
var thisCalendar = this;
var organizer = this.calendarUserAddress;
var dtstamp = now().getInTimezone(UTC()).icalString;
var dtstart = aRangeStart.getInTimezone(UTC()).icalString;
var dtend = aRangeEnd.getInTimezone(UTC()).icalString;
var uuid = getUUID();
var fbQuery = "BEGIN:VCALENDAR\n";
fbQuery += "VERSION:" + calGetProductVersion() + "\n";
fbQuery += "PRODID:-" + calGetProductId() + "\n";
fbQuery += "METHOD:REQUEST\n";
fbQuery += "BEGIN:VFREEBUSY\n";
fbQuery += "DTSTAMP:" + dtstamp + "\n";
fbQuery += "ORGANIZER:" + organizer + "\n";
fbQuery += "DTSTART:" + dtstart + "\n";
fbQuery += "DTEND:" + dtend + "\n";
fbQuery += "UID:" + uuid + "\n";
var attendee = "ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL:" + mailto_aCalId + "\n";
var attendeeFolded = this.foldLine(attendee);
fbQuery += attendeeFolded;
fbQuery += "END:VFREEBUSY\n";
fbQuery += "END:VCALENDAR\n";
// RFC 2445 is specific about how lines end...
fbQuery = fbQuery.replace(/\n/g, "\r\n");
var fbQuery = getIcsService().createIcalComponent("VCALENDAR");
calSetProdidVersion(fbQuery);
var prop = getIcsService().createIcalProperty("METHOD");
prop.value = "REQUEST";
fbQuery.addProperty(prop);
var fbComp = getIcsService().createIcalComponent("VFREEBUSY");
fbComp.stampTime = now().getInTimezone(UTC());
prop = getIcsService().createIcalProperty("ORGANIZER");
prop.value = organizer;
fbComp.addProperty(prop);
fbComp.startTime = aRangeStart.getInTimezone(UTC());
fbComp.endTime = aRangeEnd.getInTimezone(UTC());
fbComp.uid = getUUID();
prop = getIcsService().createIcalProperty("ATTENDEE");
prop.setParameter("PARTSTAT", "NEEDS-ACTION");
prop.setParameter("ROLE", "REQ-PARTICIPANT");
prop.setParameter("CUTYPE", "INDIVIDUAL");
prop.value = mailto_aCalId;
fbComp.addProperty(prop);
fbQuery.addSubcomponent(fbComp);
fbQuery = fbQuery.serializeToICS();
if (this.verboseLogging()) {
LOG("CalDAV: send (Originator=" + organizer +
",Recipient=" + mailto_aCalId + "): " + fbQuery);
@@ -1694,8 +1693,6 @@ calDavCalendar.prototype = {
if (str.substr(0,6) == "<?xml ") {
str = str.substring(str.indexOf('<', 2));
}
str = str.replace(/\n\ /g, "");
str = str.replace(/\r/g, "");
var response = new XML(str);
var status = response..C::response..C::["request-status"];
@@ -1706,21 +1703,43 @@ calDavCalendar.prototype = {
if (status.substr(0,3) != "2.0") {
LOG("CalDAV: Got status " + status + " in response to freebusy query");
}
var interval;
var caldata = response..C::response..C::["calendar-data"];
var lines = caldata.split("\n");
for (var i = 0; i < lines.length; i++) {
if (lines[i].substr(0,8) == "FREEBUSY") {
var descDat = lines[i].split(":");
var fbName = descDat[0].split("=")[1];
var fbType = fbTypeMap[fbName];
var ranges = descDat[1].split(",");
for (var j = 0; j < ranges.length; j++) {
var parts = ranges[j].split("/");
try {
function iterFunc(fbComp) {
var interval;
var replyRangeStart = fbComp.startTime;
if (replyRangeStart && (aRangeStart.compare(replyRangeStart) == -1)) {
interval = new calFreeBusyInterval(aCalId,
calIFreeBusyInterval.UNKNOWN,
aRangeStart,
replyRangeStart);
periodsToReturn.push(interval);
}
var replyRangeEnd = fbComp.endTime;
if (replyRangeEnd && (aRangeEnd.compare(replyRangeEnd) == 1)) {
interval = new calFreeBusyInterval(aCalId,
calIFreeBusyInterval.UNKNOWN,
replyRangeEnd,
aRangeEnd);
periodsToReturn.push(interval);
}
for (var fbProp = fbComp.getFirstProperty("FREEBUSY");
fbProp;
fbProp = fbComp.getNextProperty("FREEBUSY")) {
var fbType = fbProp.getParameter("FBTYPE");
if (fbType) {
fbType = fbTypeMap[fbType];
} else {
fbType = calIFreeBusyInterval.UNKNOWN;
}
var parts = fbProp.value.split("/");
var begin = createDateTime(parts[0]);
var end;
if (parts[1].charAt(0) == "P") {
// This is a duration
if (parts[1].charAt(0) == "P") { // this is a duration
end = begin.clone();
end.addDuration(createDuration(parts[1]))
} else {
@@ -1734,29 +1753,11 @@ calDavCalendar.prototype = {
periodsToReturn.push(interval);
}
}
if (lines[i].substr(0,7) == "DTSTART") {
var dts = lines[i].split(":")[1];
var replyRangeStart = createDateTime(dts);
if (aRangeStart.compare(replyRangeStart) == -1) {
interval = new calFreeBusyInterval(aCalId,
calIFreeBusyInterval.UNKNOWN,
aRangeStart,
replyRangeStart);
periodsToReturn.push(interval);
}
}
if (lines[i].substr(0,5) == "DTEND") {
var dte = lines[i].split(":")[1];
var replyRangeEnd = createDateTime(dte);
if (aRangeEnd.compare(replyRangeEnd) == 1) {
interval = new calFreeBusyInterval(aCalId,
calIFreeBusyInterval.UNKNOWN,
replyRangeEnd,
aRangeEnd);
periodsToReturn.push(interval);
}
}
calIterateIcalComponent(getIcsService().parseICS(caldata, null), iterFunc);
} catch (exc) {
LOG("Error parsing free-busy info.");
}
aListener.onResult(null, periodsToReturn);
} else {
LOG("CalDAV: Received status " + aContext.responseStatus + " from freebusy query");
@@ -1768,19 +1769,6 @@ calDavCalendar.prototype = {
calSendHttpRequest(streamLoader, httpchannel, streamListener);
},
/**
* RFC 2445 line folding
*/
foldLine: function caldav_foldLine(aString) {
var parts = [];
while (aString.length) {
var part = aString.substr(0,72);
parts.push(part);
aString = aString.substr(72);
}
return parts.join("\n ");
},
ensurePath: function caldav_ensurePath(aString) {
if (aString.charAt(0) != "/") {
var bogusUri = makeURL(aString);
@@ -1949,7 +1937,7 @@ calDavCalendar.prototype = {
}
if (status != 200) {
Components.utils.reportError("Sending iITIP failed with status " + status);
LOG("Sending iITIP failed with status " + status);
}
var str = convertByteArray(aResult, aResultLength, "UTF-8", false);