diff --git a/src/java/davmail/exchange/VCalendar.java b/src/java/davmail/exchange/VCalendar.java index 7da998e7..ceb0bd74 100644 --- a/src/java/davmail/exchange/VCalendar.java +++ b/src/java/davmail/exchange/VCalendar.java @@ -25,10 +25,7 @@ import org.apache.log4j.Logger; import java.io.*; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashSet; -import java.util.List; +import java.util.*; /** * VCalendar object. @@ -146,6 +143,20 @@ public class VCalendar extends VObject { setPropertyValue("METHOD", "PUBLISH"); } + // rename TZID for maximum iCal/iPhone compatibility + String tzid = null; + if (fromServer) { + // get current tzid + VObject vObject = getVTimezone(); + if (vObject != null) { + try { + tzid = ResourceBundle.getBundle("timezones").getString(vObject.getPropertyValue("TZID")); + } catch (MissingResourceException e) { + LOGGER.debug("Timezone rename failed, timezone "+vObject.getPropertyValue("TZID")+" not found in table"); + } + } + } + // iterate over vObjects for (VObject vObject : vObjects) { if ("VEVENT".equals(vObject.type)) { @@ -187,6 +198,17 @@ public class VCalendar extends VObject { if ("".equals(vObject.getPropertyValue("CLASS"))) { vObject.removeProperty("CLASS"); } + // rename TZID + if (tzid != null) { + VProperty dtStart = vObject.getProperty("DTSTART"); + if (dtStart != null && dtStart.getParam("TZID") != null) { + dtStart.setParam("TZID", tzid); + } + VProperty dtEnd = vObject.getProperty("DTEND"); + if (dtEnd != null && dtStart.getParam("TZID") != null) { + dtEnd.setParam("TZID", tzid); + } + } } else { // add organizer line to all events created in Exchange for active sync String organizer = getEmailValue(vObject.getProperty("ORGANIZER")); diff --git a/src/java/davmail/exchange/VProperty.java b/src/java/davmail/exchange/VProperty.java index 0d5cec97..f4dc0540 100644 --- a/src/java/davmail/exchange/VProperty.java +++ b/src/java/davmail/exchange/VProperty.java @@ -230,6 +230,14 @@ public class VProperty { addParam(paramName, (String) null); } + public void setParam(String paramName, String paramValue) { + Param currentParam = getParam(paramName); + if (currentParam != null) { + getParams().remove(currentParam); + } + addParam(paramName, paramValue); + } + public void addParam(String paramName, String paramValue) { List paramValues = new ArrayList(); paramValues.add(paramValue);