blob: 18b671914aa7323d8399caeb9a7dffa9878dad46 [file] [log] [blame]
/*
* 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;
}
}