From 5bacc44dea6d76b8dfd470777d0cfd8b7efcebfd Mon Sep 17 00:00:00 2001 From: mguessan Date: Fri, 30 Jul 2010 00:04:54 +0000 Subject: [PATCH] Caldav: implement VALARM in VCalendar git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1320 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- .../davmail/exchange/ExchangeSession.java | 7 ++- src/java/davmail/exchange/VCalendar.java | 62 ++++++++++++++++--- src/java/davmail/exchange/VProperty.java | 14 ++++- .../exchange/TestExchangeSessionEvent.java | 15 +++++ 4 files changed, 85 insertions(+), 13 deletions(-) diff --git a/src/java/davmail/exchange/ExchangeSession.java b/src/java/davmail/exchange/ExchangeSession.java index 67d7d4d9..6fc8269c 100644 --- a/src/java/davmail/exchange/ExchangeSession.java +++ b/src/java/davmail/exchange/ExchangeSession.java @@ -2189,8 +2189,13 @@ public abstract class ExchangeSession { } finally { reader.close(); } - String resultString = result.toString(); + + /* new experimental code + VCalendar vCalendar = new VCalendar(icsBody, getEmail()); + vCalendar.fixVCalendar(fromServer); + resultString = vCalendar.toString(); + */ dumpICS(resultString, fromServer, true); return resultString; diff --git a/src/java/davmail/exchange/VCalendar.java b/src/java/davmail/exchange/VCalendar.java index 87755938..4307a33d 100644 --- a/src/java/davmail/exchange/VCalendar.java +++ b/src/java/davmail/exchange/VCalendar.java @@ -18,6 +18,8 @@ */ package davmail.exchange; +import davmail.Settings; + import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; @@ -129,18 +131,53 @@ public class VCalendar extends VObject { } // set OWA allday flag vObject.setPropertyValue("X-MICROSOFT-CDO-ALLDAYEVENT", isAllDay(vObject) ? "TRUE" : "FALSE"); - fixAttendees(vObject); + vObject.setPropertyValue("X-MICROSOFT-CDO-BUSYSTATUS", + !"TRANSPARENT".equals(vObject.getPropertyValue("TRANSP")) ? "BUSY" : "FREE"); + } else { // remove organizer line for event without attendees for iPhone if (getProperty("ATTENDEE") == null) { vObject.setPropertyValue("ORGANIZER", null); } + // TODO: handle transparent ? } + + fixAttendees(vObject, fromServer); + + // TODO handle BUSYSTATUS + + fixAlarm(vObject, fromServer); } } } + private void fixAlarm(VObject vObject, boolean fromServer) { + for (VObject vAlarm : vObject.vObjects) { + if ("VALARM".equals(vAlarm.type)) { + String action = vAlarm.getPropertyValue("ACTION"); + if (fromServer && "DISPLAY".equals(action) + // convert DISPLAY to AUDIO only if user defined an alarm sound + && Settings.getProperty("davmail.caldavAlarmSound") != null) { + // Convert alarm to audio for iCal + vAlarm.setPropertyValue("ACTION", "AUDIO"); + + if (vAlarm.getPropertyValue("ATTACH") == null) { + // Add defined sound into the audio alarm + VProperty vProperty = new VProperty("ATTACH", Settings.getProperty("davmail.caldavAlarmSound")); + vProperty.addParam("VALUE", "URI"); + vAlarm.addProperty(vProperty); + } + + } else if (!fromServer && "AUDIO".equals(action)) { + // Use the alarm action that exchange (and blackberry) understand + // (exchange and blackberry don't understand audio actions) + vAlarm.setPropertyValue("ACTION", "DISPLAY"); + } + } + } + } + /** * Replace iCal4 (Snow Leopard) principal paths with mailto expression * @@ -155,20 +192,25 @@ public class VCalendar extends VObject { } } - private void fixAttendees(VObject vObject) { - if (properties != null) { - for (VProperty property : properties) { - if ("ATTENDEE".equalsIgnoreCase(property.getKey())) { - property.setValue(replaceIcal4Principal(property.getValue())); + private void fixAttendees(VObject vObject, boolean fromServer) { + if (!fromServer) { + if (vObject.properties != null) { + for (VProperty property : vObject.properties) { + if ("ATTENDEE".equalsIgnoreCase(property.getKey())) { + property.setValue(replaceIcal4Principal(property.getValue())); - // ignore attendee as organizer - if (property.getValue().contains(email)) { - property.setValue(null); + // ignore attendee as organizer + if (property.getValue().contains(email)) { + property.setValue(null); + } } } - } + } + } else { + // TODO patch RSVP } + } /** diff --git a/src/java/davmail/exchange/VProperty.java b/src/java/davmail/exchange/VProperty.java index 5c207d8b..d10e2824 100644 --- a/src/java/davmail/exchange/VProperty.java +++ b/src/java/davmail/exchange/VProperty.java @@ -82,13 +82,13 @@ public class VProperty { } else if (currentChar == ';') { // param with no value paramName = line.substring(startIndex, i).toUpperCase(); - addParam(paramName, null); + addParam(paramName); state = State.PARAM_NAME; startIndex = i + 1; } else if (currentChar == ':') { // param with no value paramName = line.substring(startIndex, i).toUpperCase(); - addParam(paramName, null); + addParam(paramName); state = State.VALUE; startIndex = i + 1; } @@ -198,6 +198,16 @@ public class VProperty { return false; } + protected void addParam(String paramName) { + addParam(paramName, (String)null); + } + + protected void addParam(String paramName, String paramValue) { + List paramValues = new ArrayList(); + paramValues.add(paramValue); + addParam(paramName, paramValues); + } + protected void addParam(String paramName, List paramValues) { if (params == null) { params = new ArrayList(); diff --git a/src/test/davmail/exchange/TestExchangeSessionEvent.java b/src/test/davmail/exchange/TestExchangeSessionEvent.java index 16dd7955..4f608a7f 100644 --- a/src/test/davmail/exchange/TestExchangeSessionEvent.java +++ b/src/test/davmail/exchange/TestExchangeSessionEvent.java @@ -476,4 +476,19 @@ public class TestExchangeSessionEvent extends TestCase { assertTrue(toServer.contains("ORGANIZER")); } + + public void testValarm() throws IOException { + String itemBody = "BEGIN:VCALENDAR\n" + + "BEGIN:VEVENT\n" + + "BEGIN:VALARM\n" + + "TRIGGER:-PT15M\n" + + "ATTACH;VALUE=URI:Basso\n" + + "ACTION:AUDIO\n" + + "END:VALARM\n" + + "END:VEVENT\n" + + "END:VCALENDAR"; + String toServer = fixICS(itemBody, false); + System.out.println(toServer); + assertTrue(toServer.contains("ACTION:DISPLAY")); + } }