From 7619bb715d7973a9cc8e4120c4d9d58108b31ee7 Mon Sep 17 00:00:00 2001 From: mguessan Date: Mon, 13 Sep 2010 19:27:16 +0000 Subject: [PATCH] Caldav: additional VCalendar properties for rebuilt item: RRULE, EXDATE, CLASS git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1440 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- src/java/davmail/exchange/VObject.java | 7 +++++ .../exchange/dav/DavExchangeSession.java | 27 ++++++++++++++++--- src/java/davmail/exchange/dav/Field.java | 5 ++-- src/java/davmail/util/StringUtil.java | 21 +++++++++++++++ 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/java/davmail/exchange/VObject.java b/src/java/davmail/exchange/VObject.java index 4b150e57..6a58b98c 100644 --- a/src/java/davmail/exchange/VObject.java +++ b/src/java/davmail/exchange/VObject.java @@ -205,6 +205,13 @@ public class VObject { } } + public void addPropertyValue(String name, String value) { + if (value != null) { + VProperty property = new VProperty(name, value); + addProperty(property); + } + } + public void removeProperty(String name) { if (properties != null) { VProperty property = getProperty(name); diff --git a/src/java/davmail/exchange/dav/DavExchangeSession.java b/src/java/davmail/exchange/dav/DavExchangeSession.java index 65306f87..544e0e12 100644 --- a/src/java/davmail/exchange/dav/DavExchangeSession.java +++ b/src/java/davmail/exchange/dav/DavExchangeSession.java @@ -1307,9 +1307,10 @@ public class DavExchangeSession extends ExchangeSession { result = getICSFromItemProperties(); } // debug code - //if (new String(result).indexOf("VTODO") < 0) { - // LOGGER.debug("Rebuilt body: " + new String(getICSFromItemProperties())); - //} + if (new String(result).indexOf("VTODO") < 0) { + result = getICSFromItemProperties(); + LOGGER.debug("Rebuilt body: " + new String(result)); + } return result; } @@ -1332,6 +1333,9 @@ public class DavExchangeSession extends ExchangeSession { davPropertyNameSet.add(Field.getPropertyName("organizer")); davPropertyNameSet.add(Field.getPropertyName("to")); davPropertyNameSet.add(Field.getPropertyName("description")); + davPropertyNameSet.add(Field.getPropertyName("rrule")); + davPropertyNameSet.add(Field.getPropertyName("exdate")); + davPropertyNameSet.add(Field.getPropertyName("sensitivity")); davPropertyNameSet.add(Field.getPropertyName("alldayevent")); davPropertyNameSet.add(Field.getPropertyName("busystatus")); @@ -1356,6 +1360,23 @@ public class DavExchangeSession extends ExchangeSession { vEvent.setPropertyValue("DTSTART", convertDateFromExchange(getPropertyIfExists(davPropertySet, "dtstart"))); vEvent.setPropertyValue("DTEND", convertDateFromExchange(getPropertyIfExists(davPropertySet, "dtend"))); vEvent.setPropertyValue("TRANSP", getPropertyIfExists(davPropertySet, "transparent")); + vEvent.setPropertyValue("RRULE", getPropertyIfExists(davPropertySet, "rrule")); + String exdates = getPropertyIfExists(davPropertySet, "exdate"); + if (exdates != null) { + String[] exdatearray = exdates.split(","); + for (String exdate:exdatearray) { + vEvent.addPropertyValue("EXDATE", + StringUtil.convertZuluDateTimeToAllDay(convertDateFromExchange(exdate))); + } + } + String sensitivity = getPropertyIfExists(davPropertySet, "sensitivity"); + if ("2".equals(sensitivity)) { + vEvent.setPropertyValue("CLASS", "PRIVATE"); + } else if ("3".equals(sensitivity)) { + vEvent.setPropertyValue("CLASS", "CONFIDENTIAL"); + } else if ("0".equals(sensitivity)) { + vEvent.setPropertyValue("CLASS", "PUBLIC"); + } String organizer = getPropertyIfExists(davPropertySet, "organizer"); String organizerEmail = null; if (organizer != null) { diff --git a/src/java/davmail/exchange/dav/Field.java b/src/java/davmail/exchange/dav/Field.java index bcfcda38..af988bd0 100644 --- a/src/java/davmail/exchange/dav/Field.java +++ b/src/java/davmail/exchange/dav/Field.java @@ -174,6 +174,9 @@ public class Field { createField(URN_SCHEMAS_CALENDAR, "created"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:created/SystemTime createField(URN_SCHEMAS_CALENDAR, "alldayevent"); // DistinguishedPropertySetType.Appointment/0x8215 Boolean + createField(URN_SCHEMAS_CALENDAR, "rrule"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:rrule/PtypMultipleString + createField(URN_SCHEMAS_CALENDAR, "exdate"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:exdate/PtypMultipleTime + // TODO createField(SCHEMAS_MAPI, "allattendeesstring"); // PidLidAllAttendeesString createField(SCHEMAS_MAPI, "required_attendees"); // PidLidRequiredAttendees @@ -184,11 +187,9 @@ public class Field { createField(URN_SCHEMAS_CALENDAR, "location"); // DistinguishedPropertySetType.Appointment/0x8208 String createField(URN_SCHEMAS_CALENDAR, "attendeerole"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:attendeerole/Integer createField(URN_SCHEMAS_CALENDAR, "busystatus"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:busystatus/String - createField(URN_SCHEMAS_CALENDAR, "exdate"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:exdate/PtypMultipleTime createField(URN_SCHEMAS_CALENDAR, "exrule"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:exrule/PtypMultipleString createField(URN_SCHEMAS_CALENDAR, "recurrenceidrange"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:recurrenceidrange/String createField(URN_SCHEMAS_CALENDAR, "rdate"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:rdate/PtypMultipleTime - createField(URN_SCHEMAS_CALENDAR, "rrule"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:rrule/PtypMultipleString createField(URN_SCHEMAS_CALENDAR, "reminderoffset"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:reminderoffset/Integer createField(URN_SCHEMAS_CALENDAR, "timezone"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:timezone/String diff --git a/src/java/davmail/util/StringUtil.java b/src/java/davmail/util/StringUtil.java index 150c3e9a..26d0eb97 100644 --- a/src/java/davmail/util/StringUtil.java +++ b/src/java/davmail/util/StringUtil.java @@ -22,6 +22,9 @@ import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Hex; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.Set; import java.util.regex.Pattern; @@ -313,4 +316,22 @@ public final class StringUtil { } return result; } + + public static String convertZuluDateTimeToAllDay(String value) { + String result = value; + if (value != null && value.length() != 8) { + // try to convert datetime value to date value + try { + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat dateParser = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); + calendar.setTime(dateParser.parse(value)); + calendar.add(Calendar.HOUR_OF_DAY, 12); + SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyyMMdd"); + result = dateFormatter.format(calendar.getTime()); + } catch (ParseException e) { + // ignore + } + } + return result; + } }