/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.syncml.pim.vcalendar; /** * vCalendar string composer class */ public class VCalComposer { public final static String VERSION_VCALENDAR10 = "vcalendar1.0"; public final static String VERSION_VCALENDAR20 = "vcalendar2.0"; public final static int VERSION_VCAL10_INT = 1; public final static int VERSION_VCAL20_INT = 2; private static String mNewLine = "\r\n"; private String mVersion = null; public VCalComposer() { } /** * Create a vCalendar String. * @param struct see more from CalendarStruct class * @param vcalversion MUST be VERSION_VCAL10 /VERSION_VCAL20 * @return vCalendar string * @throws VcalException if version is invalid or create failed */ public String createVCal(CalendarStruct struct, int vcalversion) throws VCalException{ StringBuilder returnStr = new StringBuilder(); //Version check if(vcalversion != 1 && vcalversion != 2) throw new VCalException("version not match 1.0 or 2.0."); if (vcalversion == 1) mVersion = VERSION_VCALENDAR10; else mVersion = VERSION_VCALENDAR20; //Build vCalendar: returnStr.append("BEGIN:VCALENDAR").append(mNewLine); if(vcalversion == VERSION_VCAL10_INT) returnStr.append("VERSION:1.0").append(mNewLine); else returnStr.append("VERSION:2.0").append(mNewLine); returnStr.append("PRODID:vCal ID default").append(mNewLine); if(!isNull(struct.timezone)){ if(vcalversion == VERSION_VCAL10_INT) returnStr.append("TZ:").append(struct.timezone).append(mNewLine); else//down here MUST have returnStr.append("BEGIN:VTIMEZONE").append(mNewLine). append("TZID:vCal default").append(mNewLine). append("BEGIN:STANDARD").append(mNewLine). append("DTSTART:16010101T000000").append(mNewLine). append("TZOFFSETFROM:").append(struct.timezone).append(mNewLine). append("TZOFFSETTO:").append(struct.timezone).append(mNewLine). append("END:STANDARD").append(mNewLine). append("END:VTIMEZONE").append(mNewLine); } //Build VEVNET for(int i = 0; i < struct.eventList.size(); i++){ String str = buildEventStr( struct.eventList.get(i) ); returnStr.append(str); } //Build VTODO //TODO returnStr.append("END:VCALENDAR").append(mNewLine).append(mNewLine); return returnStr.toString(); } private String buildEventStr(CalendarStruct.EventStruct stru){ StringBuilder strbuf = new StringBuilder(); strbuf.append("BEGIN:VEVENT").append(mNewLine); if(!isNull(stru.uid)) strbuf.append("UID:").append(stru.uid).append(mNewLine); if(!isNull(stru.description)) strbuf.append("DESCRIPTION:"). append(foldingString(stru.description)).append(mNewLine); if(!isNull(stru.dtend)) strbuf.append("DTEND:").append(stru.dtend).append(mNewLine); if(!isNull(stru.dtstart)) strbuf.append("DTSTART:").append(stru.dtstart).append(mNewLine); if(!isNull(stru.duration)) strbuf.append("DUE:").append(stru.duration).append(mNewLine); if(!isNull(stru.event_location)) strbuf.append("LOCATION:").append(stru.event_location).append(mNewLine); if(!isNull(stru.last_date)) strbuf.append("COMPLETED:").append(stru.last_date).append(mNewLine); if(!isNull(stru.rrule)) strbuf.append("RRULE:").append(stru.rrule).append(mNewLine); if(!isNull(stru.title)) strbuf.append("SUMMARY:").append(stru.title).append(mNewLine); if(!isNull(stru.status)){ String stat = "TENTATIVE"; switch (Integer.parseInt(stru.status)){ case 0://Calendar.Calendars.STATUS_TENTATIVE stat = "TENTATIVE"; break; case 1://Calendar.Calendars.STATUS_CONFIRMED stat = "CONFIRMED"; break; case 2://Calendar.Calendars.STATUS_CANCELED stat = "CANCELLED"; break; } strbuf.append("STATUS:").append(stat).append(mNewLine); } //Alarm if(!isNull(stru.has_alarm) && stru.reminderList != null && stru.reminderList.size() > 0){ if (mVersion.equals(VERSION_VCALENDAR10)){ String prefix = ""; for(String method : stru.reminderList){ switch (Integer.parseInt(method)){ case 0: prefix = "DALARM"; break; case 1: prefix = "AALARM"; break; case 2: prefix = "MALARM"; break; case 3: default: prefix = "DALARM"; break; } strbuf.append(prefix).append(":default").append(mNewLine); } }else {//version 2.0 only support audio-method now. strbuf.append("BEGIN:VALARM").append(mNewLine). append("ACTION:AUDIO").append(mNewLine). append("TRIGGER:-PT10M").append(mNewLine). append("END:VALARM").append(mNewLine); } } strbuf.append("END:VEVENT").append(mNewLine); return strbuf.toString(); } /** Alter str to folding supported format. */ private String foldingString(String str){ return str.replaceAll("\r\n", "\n").replaceAll("\n", "\r\n "); } /** is null */ private boolean isNull(String str){ if(str == null || str.trim().equals("")) return true; return false; } }