1
0
mirror of https://github.com/moparisthebest/davmail synced 2025-02-28 17:31:52 -05:00

fix Caldav : return 404 if recipient unknown on freebusy and handle busy at interval end

git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@256 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
mguessan 2008-12-25 22:51:57 +00:00
parent d0ebab2d7f
commit a3191fbde2
2 changed files with 45 additions and 35 deletions

View File

@ -360,32 +360,37 @@ public class CaldavConnection extends AbstractConnection {
keyMap.put(key, fullkey);
}
}
String response = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
" <C:schedule-response xmlns:D=\"DAV:\"\n" +
" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n" +
" <C:response>\n" +
" <C:recipient>\n" +
" <D:href>" + valueMap.get("ATTENDEE") + "</D:href>\n" +
" </C:recipient>\n" +
" <C:request-status>2.0;Success</C:request-status>\n" +
" <C:calendar-data>BEGIN:VCALENDAR\n" +
"VERSION:2.0\n" +
"PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\n" +
"METHOD:REPLY\n" +
"BEGIN:VFREEBUSY\n" +
"DTSTAMP:" + valueMap.get("DTSTAMP") + "\n" +
"ORGANIZER:" + valueMap.get("ORGANIZER") + "\n" +
"DTSTART:" + valueMap.get("DTSTART") + "\n" +
"DTEND:" + valueMap.get("DTEND") + "\n" +
"UID:" + valueMap.get("UID") + "\n" +
keyMap.get("ATTENDEE") + ";" + valueMap.get("ATTENDEE") + "\n" +
"FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:" + session.getFreebusy(valueMap) + "\n" +
"END:VFREEBUSY\n" +
"END:VCALENDAR" +
"</C:calendar-data>\n" +
" </C:response>\n" +
" </C:schedule-response>";
sendHttpResponse(HttpStatus.SC_OK, null, "text/xml;charset=UTF-8", response, true);
String freeBusy = session.getFreebusy(valueMap);
if (freeBusy != null) {
String response = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
" <C:schedule-response xmlns:D=\"DAV:\"\n" +
" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n" +
" <C:response>\n" +
" <C:recipient>\n" +
" <D:href>" + valueMap.get("ATTENDEE") + "</D:href>\n" +
" </C:recipient>\n" +
" <C:request-status>2.0;Success</C:request-status>\n" +
" <C:calendar-data>BEGIN:VCALENDAR\n" +
"VERSION:2.0\n" +
"PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\n" +
"METHOD:REPLY\n" +
"BEGIN:VFREEBUSY\n" +
"DTSTAMP:" + valueMap.get("DTSTAMP") + "\n" +
"ORGANIZER:" + valueMap.get("ORGANIZER") + "\n" +
"DTSTART:" + valueMap.get("DTSTART") + "\n" +
"DTEND:" + valueMap.get("DTEND") + "\n" +
"UID:" + valueMap.get("UID") + "\n" +
keyMap.get("ATTENDEE") + ";" + valueMap.get("ATTENDEE") + "\n" +
"FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:" + freeBusy + "\n" +
"END:VFREEBUSY\n" +
"END:VCALENDAR" +
"</C:calendar-data>\n" +
" </C:response>\n" +
" </C:schedule-response>";
sendHttpResponse(HttpStatus.SC_OK, null, "text/xml;charset=UTF-8", response, true);
} else {
sendHttpResponse(HttpStatus.SC_NOT_FOUND, null, "text/plain", "Unknown recipient: " + valueMap.get("ATTENDEE"), true);
}
} else if ("DELETE".equals(command) && path.startsWith("/calendar/")) {
int status = session.deleteEvent(path.substring("/calendar/".length()));
@ -401,7 +406,7 @@ public class CaldavConnection extends AbstractConnection {
int size = events.size();
int count = 0;
for (ExchangeSession.Event event : events) {
DavGatewayTray.debug("Retrieving event "+(++count)+"/"+size);
DavGatewayTray.debug("Retrieving event " + (++count) + "/" + size);
appendEventResponse(buffer, request, event);
}
}
@ -483,7 +488,7 @@ public class CaldavConnection extends AbstractConnection {
sendClient("");
if (content != null && content.length() > 0) {
// full debug trace
DavGatewayTray.debug("> "+content);
DavGatewayTray.debug("> " + content);
sendClient(content.getBytes("UTF-8"));
}
}

View File

@ -1259,32 +1259,37 @@ public class ExchangeSession {
currentCal.setTime(startDate);
StringBuilder busyBuffer = new StringBuilder();
boolean isBusy = fbdata.charAt(0) != '0';
boolean isBusy = fbdata.charAt(0) != '0' && fbdata.charAt(0) != '4';
if (isBusy) {
busyBuffer.append(icalParser.format(currentCal.getTime()));
}
boolean knownAttendee = fbdata.charAt(0) != '4';
for (int i = 1; i < fbdata.length(); i++) {
knownAttendee = knownAttendee || fbdata.charAt(i) != '4';
currentCal.add(Calendar.MINUTE, interval);
if (isBusy && fbdata.charAt(i) == '0') {
// busy -> non busy
busyBuffer.append('/').append(icalParser.format(currentCal.getTime()));
} else if (!isBusy && fbdata.charAt(i) != '0') {
} else if (!isBusy && (fbdata.charAt(i) != '0') && fbdata.charAt(0) != '4') {
// non busy -> busy
if (busyBuffer.length() > 0) {
busyBuffer.append(',');
}
busyBuffer.append(icalParser.format(currentCal.getTime()));
}
isBusy = fbdata.charAt(i) != '0';
isBusy = fbdata.charAt(i) != '0' && fbdata.charAt(0) != '4';
}
// still busy at end
if (isBusy) {
busyBuffer.append('/').append(icalParser.format(currentCal.getTime()));
}
if (knownAttendee) {
result = busyBuffer.toString();
}
result = busyBuffer.toString();
}
} finally {
getMethod.releaseConnection();
}
if (result == null) {
throw new IOException("Unable to get user free-busy data from: " + getMethod.getPath());
}
return result;
}