1351 lines
56 KiB
XML
1351 lines
56 KiB
XML
<?xml version="1.0"?>
|
|
<!-- SYNTHESIS SYNCML CLIENT Version 3.2 Configuration file -->
|
|
|
|
<sysync_config version="1.0">
|
|
|
|
<configvar name="logpath" value="$(defout_path)"/>
|
|
|
|
<!-- this string is output to every session debug logfile to identify the config in use -->
|
|
<configidstring>SyncEvolution client config</configidstring>
|
|
|
|
<!-- information about maximum supported message and object size (in bytes) -->
|
|
<maxmsgsize/>
|
|
<maxobjsize/>
|
|
|
|
<!-- information for DevInf -->
|
|
<model/>
|
|
<manufacturer/>
|
|
<hardwareversion/>
|
|
<firmwareversion/>
|
|
<devicetype/>
|
|
<configdate/>
|
|
|
|
<debug/>
|
|
|
|
<transport type="xpt">
|
|
<!-- allow HTTP 1.1 kepp-alive (multiple request-answer-exchanges in single TCP connection) -->
|
|
<keepconnection>true</keepconnection>
|
|
</transport>
|
|
|
|
|
|
<scripting>
|
|
<looptimeout>5</looptimeout>
|
|
|
|
<function><![CDATA[
|
|
// create a UID
|
|
string newuid() {
|
|
return "syuid" + NUMFORMAT(RANDOM(1000000),6,"0") + "." + (string)MILLISECONDS(NOW());
|
|
}
|
|
]]></function>
|
|
<macro name="VCARD_BEFOREWRITE_SCRIPT_EVOLUTION"><![CDATA[
|
|
// a wordaround for cellphone in evolution. for incoming contacts, if there is only one CELL,
|
|
// strip the HOME or WORK flag from it. Evolution then should show it. */
|
|
INTEGER i, wanted, cell_phones;
|
|
i = 0;
|
|
cell_phones = 0;
|
|
while(i < SIZE(TEL_FLAGS)) {
|
|
// 0x10 is the flag of 'cell' type of telephone
|
|
if(TEL_FLAGS[i] & 0x10) {
|
|
cell_phones = cell_phones + 1;
|
|
wanted = i;
|
|
}
|
|
i = i + 1;
|
|
}
|
|
if(cell_phones == 1) {
|
|
TEL_FLAGS[wanted] = 0x10;
|
|
}
|
|
|
|
// Google sends TYPE=WORK and TYPE=HOME when it means
|
|
// normal VOICE phone numbers. Add that flag when
|
|
// importing into Evolution, because Evolution does not
|
|
// display the numbers without VOICE.
|
|
i = 0;
|
|
while(i < SIZE(TEL_FLAGS)) {
|
|
if(TEL_FLAGS[i] == 1 || TEL_FLAGS[i] == 2) {
|
|
TEL_FLAGS[i] = TEL_FLAGS[i] | 8;
|
|
}
|
|
i = i + 1;
|
|
}
|
|
]]></macro>
|
|
<macro name="VCALENDAR_20TO10_PRIORITY_CONVERSION"><![CDATA[
|
|
//vCalendar10 has different interpretation from iCalendar20 in 'priority'.
|
|
//see mappings:
|
|
// Category vCalendar1.0 iCalendar2.0
|
|
// undefined 0 0
|
|
// high 1 1 ~ 4
|
|
// normal 2 5
|
|
// low 3 6 ~ bigger
|
|
if(PRIORITY<5 && PRIORITY>0) {
|
|
PRIORITY=1;
|
|
}else if(PRIORITY==5){
|
|
PRIORITY=2;
|
|
}else if(PRIORITY>5){
|
|
PRIORITY=3;
|
|
} // 0 is undefined and remains unchanged
|
|
]]></macro>
|
|
<macro name="VCALENDAR_10TO20_PRIORITY_CONVERSION"><![CDATA[
|
|
if(PRIORITY==2) {
|
|
PRIORITY=5;
|
|
}else if(PRIORITY==3){
|
|
PRIORITY=7;
|
|
} //others remain unchanged
|
|
]]></macro>
|
|
<macro name="VCALENDAR10_BEFOREWRITE_SCRIPT"><![CDATA[
|
|
$VCALENDAR_20TO10_PRIORITY_CONVERSION;
|
|
]]></macro>
|
|
<macro name="VCALENDAR10_AFTERREAD_SCRIPT"><![CDATA[
|
|
$VCALENDAR_10TO20_PRIORITY_CONVERSION;
|
|
]]></macro>
|
|
|
|
<!-- define script macros for scripts that are used by both vCalendar 1.0 and iCalendar 2.0 -->
|
|
|
|
<macro name="VCALENDAR_INCOMING_SCRIPT"><![CDATA[
|
|
STRING MATCHES[];
|
|
STRING CAT,CN,EM;
|
|
INTEGER i;
|
|
// make sure we have all trailing and leading spaces eliminated
|
|
DESCRIPTION=NORMALIZED(DESCRIPTION);
|
|
SUMMARY=NORMALIZED(SUMMARY);
|
|
// make sure that we have a DESCRIPTION
|
|
if (DESCRIPTION==EMPTY) DESCRIPTION=SUMMARY;
|
|
// calendar or todo
|
|
if (ISEVENT) {
|
|
// VEVENT
|
|
// - handle duration cases
|
|
if (ISDURATION(DURATION)) {
|
|
if (DTEND==EMPTY) DTEND = DTSTART + DURATION;
|
|
if (DTSTART==EMPTY) DTSTART = DTEND - DURATION;
|
|
}
|
|
// - detect alldays in vCalendar 1.0 (0:00-0:00 or 23:59 localtime)
|
|
i = ALLDAYCOUNT(DTSTART,DTEND,TRUE);
|
|
if (ITEMDATATYPE()=="vCalendar10" && i>0) {
|
|
// DTSTART and DTEND represent allday event, make them date-only values
|
|
// - convert start to user zone (or floating) so it represents midnight
|
|
DTSTART = CONVERTTOUSERZONE(DTSTART);
|
|
MAKEALLDAY(DTSTART,DTEND,i);
|
|
}
|
|
|
|
// Make sure that all EXDATE times are in the same timezone as the start
|
|
// time. Some servers send them as UTC, which is all fine and well, but
|
|
// only if the timezone definition doesn't change. Also, libical does not
|
|
// handle such UTC EXDATEs, so let's convert it while the UTC and
|
|
// time zone definition (hopefully) are in sync.
|
|
if (TIMEZONE(DTSTART) != "UTC" && !ISFLOATING(DTSTART)) {
|
|
i = 0;
|
|
timestamp exdate;
|
|
while (i<SIZE(EXDATES)) {
|
|
exdate = EXDATES[i];
|
|
if (!ISDATEONLY(exdate) &&
|
|
(TIMEZONE(exdate) == "UTC" || ISFLOATING(exdate))) {
|
|
// "unfloat" floating time stamps: not sure whether that occcurs
|
|
// in practice, but it looks as wrong as UTC EXDATEs
|
|
EXDATES[i] = CONVERTTOZONE(exdate,DTSTART,TRUE);
|
|
}
|
|
i=i+1;
|
|
}
|
|
}
|
|
// If vcalendar1.0, rrule is not secondly, minutely, or hourly, we strip time information
|
|
// and only reserve date information
|
|
if (ITEMDATATYPE()=="vCalendar10" && RR_FREQ!="h" && RR_FREQ!="m" && RR_FREQ!="s") {
|
|
timestamp exdate;
|
|
i = 0;
|
|
while (i<SIZE(EXDATES)) {
|
|
exdate = EXDATES[i];
|
|
if (!ISDATEONLY(exdate)) {
|
|
EXDATES[i] = DATEONLY(exdate);
|
|
}
|
|
i=i+1;
|
|
}
|
|
}
|
|
|
|
// - shape attendees (and make sure ATTENDEES[] is assigned even for empty email addresses)
|
|
i=0;
|
|
while(i<SIZE(ATTENDEES) || i<SIZE(ATTENDEE_CNS)) {
|
|
PARSEEMAILSPEC(ATTENDEES[i], CN, EM);
|
|
ATTENDEES[i] = EM; // pure email address
|
|
// in case we have no specific common name, use the one extracted from the email
|
|
// This catches the vCalendar 1.0 case and eventually ill-formed iCalendar 2.0 as well
|
|
if (ATTENDEE_CNS[i]==EMPTY)
|
|
ATTENDEE_CNS[i]=CN;
|
|
// default participation status to needs-action
|
|
if (ATTENDEE_PARTSTATS[i]==EMPTY)
|
|
ATTENDEE_PARTSTATS[i]=1; // 1=needs action
|
|
i=i+1;
|
|
}
|
|
// - shape organizer
|
|
PARSEEMAILSPEC(ORGANIZER, CN, EM);
|
|
ORGANIZER = EM; // pure email address
|
|
if (ORGANIZER_CN==EMPTY)
|
|
ORGANIZER_CN=CN;
|
|
}
|
|
else {
|
|
// VTODO
|
|
// - make sure we have at least a summary
|
|
if (SUMMARY==EMPTY) SUMMARY=DESCRIPTION; // use description if we don't have a summary
|
|
if (SUMMARY==EMPTY) SUMMARY="unnamed"; // set dummy summary if we still don't have one
|
|
// due shaping for non-iCalendar 2.0
|
|
if (ITEMDATATYPE()=="vCalendar10" && ALLDAYCOUNT(DUE,DUE,TRUE,TRUE)>0) {
|
|
DUE = DATEONLY(DUE);
|
|
}
|
|
if (ITEMDATATYPE()=="vCalendar10") {
|
|
$VCALENDAR_10TO20_PRIORITY_CONVERSION;
|
|
}
|
|
}
|
|
// a workaround for funambol: adding 'action' for 'alarm'
|
|
if (ITEMDATATYPE()=="iCalendar20") {
|
|
if (ALARM_TIME!=EMPTY && ALARM_ACTION==EMPTY) {
|
|
ALARM_ACTION = "DISPLAY";
|
|
}
|
|
}
|
|
]]></macro>
|
|
|
|
|
|
<macro name="VCALENDAR_OUTGOING_SCRIPT"><![CDATA[
|
|
// set UTC time of generation for iCalendar 2.0 DTSTAMP
|
|
DGENERATED = NOW();
|
|
// make sure we have all trailing and leading spaces eliminated
|
|
DESCRIPTION=NORMALIZED(DESCRIPTION);
|
|
SUMMARY=NORMALIZED(SUMMARY);
|
|
if (ISEVENT) {
|
|
// VEVENT
|
|
// - combine attendee email address and common name into single string for vCalendar 1.0
|
|
if (ITEMDATATYPE()=="vCalendar10") {
|
|
i=0;
|
|
while(i<SIZE(ATTENDEES)) {
|
|
ATTENDEES[i] = MAKEEMAILSPEC(ATTENDEE_CNS[i], ATTENDEES[i]);
|
|
i=i+1;
|
|
}
|
|
ORGANIZER = MAKEEMAILSPEC(ORGANIZER_CN, ORGANIZER);
|
|
}
|
|
}
|
|
else {
|
|
// VTODO
|
|
// interal representation is iCalendar20
|
|
if (ITEMDATATYPE()=="vCalendar10") {
|
|
$VCALENDAR_20TO10_PRIORITY_CONVERSION;
|
|
}
|
|
}
|
|
// make sure we have at least a summary
|
|
if (SUMMARY==EMPTY) SUMMARY=SUBSTR(DESCRIPTION,0,32); // derive from description
|
|
if (SUMMARY==EMPTY) SUMMARY="unnamed"; // in case description is empty as well
|
|
// make sure that we have a DESCRIPTION
|
|
if (DESCRIPTION==EMPTY) DESCRIPTION=SUMMARY;
|
|
// do NOT send duration (some servers crash when doing so)
|
|
DURATION = UNASSIGNED;
|
|
// shape alarm
|
|
if (ALARM_TIME!=EMPTY) {
|
|
if (ITEMDATATYPE()=="iCalendar20") {
|
|
if (ALARM_ACTION==EMPTY) ALARM_ACTION = "AUDIO";
|
|
}
|
|
else {
|
|
if (ALARM_MSG==EMPTY) ALARM_MSG="alarm";
|
|
}
|
|
}
|
|
]]></macro>
|
|
|
|
</scripting>
|
|
|
|
|
|
<datatypes>
|
|
|
|
<!-- list of internal fields representing vCard data -->
|
|
<fieldlist name="contacts">
|
|
<field name="REV" type="timestamp" compare="never" age="yes"/>
|
|
|
|
<!-- Name elements -->
|
|
<field name="N_LAST" type="string" compare="always"/>
|
|
<field name="N_FIRST" type="string" compare="always"/>
|
|
<field name="N_MIDDLE" type="string" compare="always"/>
|
|
<field name="N_PREFIX" type="string" compare="conflict"/>
|
|
<field name="N_SUFFIX" type="string" compare="conflict"/>
|
|
<field name="NICKNAME" type="string" compare="conflict"/>
|
|
<field name="TITLE" type="string" compare="conflict" merge="fillempty"/>
|
|
|
|
<field name="FN" type="string" compare="conflict" merge="fillempty"/>
|
|
<field name="FILE-AS" type="string" compare="conflict" merge="fillempty"/>
|
|
|
|
<!-- categories and classification -->
|
|
<field name="CATEGORIES" array="yes" type="string" compare="conflict"/>
|
|
|
|
<!-- organisation -->
|
|
<field name="ORG_NAME" type="string" compare="slowsync" merge="fillempty"/>
|
|
<field name="ORG_DIVISION" type="string" compare="conflict" merge="fillempty"/>
|
|
<field name="ORG_OFFICE" type="string" compare="conflict" merge="fillempty"/>
|
|
<field name="ORG_TEAM" type="string" compare="conflict" merge="fillempty"/>
|
|
<field name="ROLE" type="string" compare="conflict" merge="fillempty"/>
|
|
|
|
<!-- birthday and anniversary (not necessarily the same) -->
|
|
<field name="BDAY" type="date" compare="conflict" merge="fillempty"/>
|
|
<field name="ANNIVERSARY" type="date" compare="conflict" merge="fillempty"/>
|
|
|
|
<!-- telephone numbers -->
|
|
<field name="TEL" array="yes" type="telephone" compare="conflict"/>
|
|
<field name="TEL_FLAGS" array="yes" type="integer" compare="conflict"/> <!-- offset 0 -->
|
|
<field name="TEL_LABEL" array="yes" type="string" compare="conflict"/> <!-- offset 1 -->
|
|
<field name="TEL_ID" array="yes" type="integer" compare="conflict"/> <!-- offset 2 -->
|
|
<field name="TEL_SLOT" array="yes" type="integer" compare="never"/> <!-- offset 3 -->
|
|
|
|
<!-- emails -->
|
|
<field name="EMAIL" array="yes" type="multiline" compare="conflict"/>
|
|
<field name="EMAIL_FLAGS" array="yes" type="integer" compare="conflict"/> <!-- offset 0 -->
|
|
<field name="EMAIL_LABEL" array="yes" type="string" compare="conflict"/> <!-- offset 1 -->
|
|
<field name="EMAIL_ID" array="yes" type="integer" compare="conflict"/> <!-- offset 2 -->
|
|
<field name="EMAIL_SLOT" array="yes" type="integer" compare="never"/> <!-- offset 3 -->
|
|
|
|
<!-- web addresses -->
|
|
<field name="WEB" array="yes" type="string" compare="conflict"/>
|
|
<field name="WEB_FLAGS" array="yes" type="integer" compare="conflict"/> <!-- offset 0 -->
|
|
<field name="WEB_LABEL" array="yes" type="string" compare="conflict"/> <!-- offset 1 -->
|
|
<field name="WEB_ID" array="yes" type="integer" compare="conflict"/> <!-- offset 2 -->
|
|
|
|
<!-- would be nicer to have as part of WEB, but parser/encoder does not support mapping
|
|
with more than one property per field -->
|
|
<field name="CALURI" array="yes" type="string" compare="conflict"/>
|
|
<field name="FBURL" array="yes" type="string" compare="conflict"/>
|
|
<field name="BLOGURL" array="yes" type="string" compare="conflict"/>
|
|
<field name="VIDEOURL" array="yes" type="string" compare="conflict"/>
|
|
|
|
<!-- related persons: should be turned into array, like WEB and CALURI/FBURL -->
|
|
<field name="MANAGER" type="string" compare="conflict"/>
|
|
<field name="ASSISTANT" type="string" compare="conflict"/>
|
|
<field name="SPOUSE" type="string" compare="conflict"/>
|
|
|
|
<!-- does this person want HTML mails? Valid values are TRUE/FALSE; a "boolean"
|
|
type would be useful, maybe add that later. -->
|
|
<field name="WANTS_HTML" type="string" compare="conflict"/>
|
|
|
|
<!-- chat handles: should be turned into one array, like WEB and CALURI/FBURL -->
|
|
<field name="AIM_HANDLE" array="yes" type="string" compare="conflict"/>
|
|
<field name="AIM_SLOT" array="yes" type="string" compare="conflict"/>
|
|
<field name="GADUGADU_HANDLE" array="yes" type="string" compare="conflict"/>
|
|
<field name="GADUGADU_SLOT" array="yes" type="string" compare="conflict"/>
|
|
<field name="GROUPWISE_HANDLE" array="yes" type="string" compare="conflict"/>
|
|
<field name="GROUPWISE_SLOT" array="yes" type="string" compare="conflict"/>
|
|
<field name="ICQ_HANDLE" array="yes" type="string" compare="conflict"/>
|
|
<field name="ICQ_SLOT" array="yes" type="string" compare="conflict"/>
|
|
<field name="JABBER_HANDLE" array="yes" type="string" compare="conflict"/>
|
|
<field name="JABBER_SLOT" array="yes" type="string" compare="conflict"/>
|
|
<field name="MSN_HANDLE" array="yes" type="string" compare="conflict"/>
|
|
<field name="MSN_SLOT" array="yes" type="string" compare="conflict"/>
|
|
<field name="YAHOO_HANDLE" array="yes" type="string" compare="conflict"/>
|
|
<field name="YAHOO_SLOT" array="yes" type="string" compare="conflict"/>
|
|
|
|
<!-- home address -->
|
|
<field name="ADR_STREET" array="yes" type="multiline" compare="conflict"/>
|
|
<field name="ADR_ADDTL" array="yes" type="multiline" compare="conflict"/>
|
|
<field name="ADR_STREET_FLAGS" array="yes" type="integer" compare="conflict"/> <!-- offset 0 (from ADR_STREET_FLAGS) -->
|
|
<field name="ADR_STREET_LABEL" array="yes" type="string" compare="conflict"/> <!-- offset 1 -->
|
|
<field name="ADR_STREET_ID" array="yes" type="integer" compare="conflict"/> <!-- offset 2 -->
|
|
<field name="ADR_POBOX" array="yes" type="multiline" compare="conflict"/>
|
|
<field name="ADR_CITY" array="yes" type="multiline" compare="conflict"/>
|
|
<field name="ADR_REG" array="yes" type="multiline" compare="conflict"/>
|
|
<field name="ADR_ZIP" array="yes" type="multiline" compare="conflict"/>
|
|
<field name="ADR_COUNTRY" array="yes" type="multiline" compare="conflict"/>
|
|
|
|
<!-- Note -->
|
|
<field name="NOTE" type="multiline" compare="conflict" merge="lines"/>
|
|
|
|
<!-- Photo -->
|
|
<field name="PHOTO" type="blob" compare="never" merge="fillempty"/>
|
|
<field name="PHOTO_TYPE" type="integer" compare="never" merge="fillempty"/>
|
|
|
|
</fieldlist>
|
|
|
|
<!-- vCard profile -->
|
|
<mimeprofile name="vCard" fieldlist="contacts">
|
|
|
|
<profile name="VCARD" nummandatory="0"> <!-- we allow records without "N" as Address book can store them -->
|
|
<property name="VERSION">
|
|
<value conversion="version"/>
|
|
</property>
|
|
|
|
<property onlyformode="standard" name="PRODID" mandatory="no">
|
|
<value conversion="prodid"/>
|
|
</property>
|
|
|
|
<property name="REV">
|
|
<value field="REV"/>
|
|
</property>
|
|
|
|
<property name="N" values="5" mandatory="yes"> <!-- Note: makes N parse and generate even if not in remote's CTCap -->
|
|
<value index="0" field="N_LAST"/>
|
|
<value index="1" field="N_FIRST"/>
|
|
<value index="2" field="N_MIDDLE"/>
|
|
<value index="3" field="N_PREFIX"/>
|
|
<value index="4" field="N_SUFFIX"/>
|
|
</property>
|
|
|
|
<property name="FN">
|
|
<value field="FN"/>
|
|
</property>
|
|
|
|
<property name="X-EVOLUTION-FILE-AS">
|
|
<value field="FILE-AS"/>
|
|
</property>
|
|
|
|
<!-- onlyformode="standard": not part of vCard 2.1, but some
|
|
peers (like the Funambol server) accept it anyway in
|
|
vCard 2.1 -->
|
|
<property name="NICKNAME">
|
|
<value field="NICKNAME"/>
|
|
</property>
|
|
|
|
<property name="TITLE">
|
|
<value field="TITLE"/>
|
|
</property>
|
|
|
|
<property name="CATEGORIES" values="list" valueseparator="," altvalueseparator=";" > <!-- non-standard, but 1:1 as in vCard 3.0 (NOT like in vCalendar 1.0, where separator is ";") -->
|
|
<value field="CATEGORIES"/>
|
|
<position field="CATEGORIES" repeat="array" increment="1" minshow="0"/>
|
|
</property>
|
|
|
|
<property name="ORG" values="4">
|
|
<value index="0" field="ORG_NAME"/>
|
|
<value index="1" field="ORG_DIVISION"/>
|
|
<value index="2" field="ORG_OFFICE"/>
|
|
<value index="3" field="ORG_TEAM"/>
|
|
</property>
|
|
|
|
<property name="ROLE">
|
|
<value field="ROLE"/>
|
|
</property>
|
|
|
|
<property name="TEL">
|
|
<value field="TEL"/>
|
|
<position field="TEL" repeat="array" increment="1" minshow="1"/>
|
|
<parameter name="TYPE" default="yes" positional="no" show="yes">
|
|
<value field="TEL_FLAGS" conversion="multimix" combine=",">
|
|
<enum name="HOME" value="B0"/>
|
|
<enum name="WORK" value="B1"/>
|
|
<enum mode="ignore" value="B2"/> <!-- OTHER -->
|
|
<enum name="VOICE" value="B3"/>
|
|
<enum name="CELL" value="B4"/>
|
|
<enum name="FAX" value="B5"/>
|
|
<enum name="PAGER" value="B6"/>
|
|
<enum name="PREF" value="B7"/>
|
|
<enum name="CAR" value="B8"/>
|
|
<enum name="X-EVOLUTION-CALLBACK" value="B9"/>
|
|
<enum name="X-EVOLUTION-RADIO" value="B10"/>
|
|
<enum name="X-EVOLUTION-TELEX" value="B11"/>
|
|
<enum name="X-EVOLUTION-TTYTDD" value="B12"/>
|
|
|
|
<enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
|
|
<enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
|
|
</value>
|
|
</parameter>
|
|
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
|
|
<value field="TEL_SLOT"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="EMAIL">
|
|
<value field="EMAIL"/>
|
|
<position field="EMAIL" repeat="array" increment="1" minshow="1"/>
|
|
<parameter name="TYPE" default="yes" positional="no" show="yes">
|
|
<value field="EMAIL_FLAGS" conversion="multimix" combine=",">
|
|
<enum name="HOME" value="B0"/>
|
|
<enum name="WORK" value="B1"/>
|
|
<enum mode="ignore" value="B2"/> <!-- OTHER -->
|
|
<enum name="INTERNET" value="B3"/>
|
|
|
|
<enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
|
|
<enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
|
|
</value>
|
|
</parameter>
|
|
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
|
|
<value field="EMAIL_SLOT"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="URL">
|
|
<value field="WEB"/>
|
|
<position field="WEB" repeat="array" increment="1" minshow="1"/>
|
|
<parameter name="TYPE" default="yes" positional="no" show="yes">
|
|
<value field="WEB_FLAGS" conversion="multimix" combine=",">
|
|
<enum name="HOME" value="B0"/>
|
|
<enum name="WORK" value="B1"/>
|
|
<enum mode="ignore" value="B2"/> <!-- OTHER -->
|
|
<enum name="PREF" value="B3"/>
|
|
|
|
<enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
|
|
<enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
|
|
</value>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="CALURI" suppressempty="yes">
|
|
<value field="CALURI" show="yes"/>
|
|
</property>
|
|
<property name="FBURL" suppressempty="yes">
|
|
<value field="FBURL" show="yes"/>
|
|
</property>
|
|
<property name="X-EVOLUTION-BLOG-URL" suppressempty="yes">
|
|
<value field="BLOGURL" show="yes"/>
|
|
</property>
|
|
<property name="X-EVOLUTION-VIDEO-URL" suppressempty="yes">
|
|
<value field="VIDEOURL" show="yes"/>
|
|
</property>
|
|
|
|
<!-- item for SyncML server: EVOLUTION rule not active,
|
|
both X-EVOLUTION-MANAGER and X-MANAGER are sent.
|
|
|
|
item from SyncML server: EVOLUTION rule not active,
|
|
both X-EVOLUTION-MANAGER and X-MANAGER are checked,
|
|
but X-EVOLUTION-MANAGER later so that it overwrites
|
|
a value set earlier by X-MANAGER (if any). This is
|
|
a more or less arbitrary priority, chosen because
|
|
servers that know about SyncEvolution (ScheduleWorld,
|
|
Memotoo) use the X-EVOLUTION variant.
|
|
|
|
item to/from Evolution: EVOLUTION rule is active,
|
|
only X-EVOLUTION-MANAGER is used. -->
|
|
<property name="X-EVOLUTION-MANAGER" suppressempty="yes" delayedparsing="1">
|
|
<value field="MANAGER" show="yes"/>
|
|
</property>
|
|
<property name="X-MANAGER" suppressempty="yes" rule="EVOLUTION"/> <!-- disables the X-MANAGER for EVOLUTION -->
|
|
<property name="X-MANAGER" suppressempty="yes" rule="other">
|
|
<value field="MANAGER" show="yes"/>
|
|
</property>
|
|
|
|
<property name="X-EVOLUTION-ASSISTANT" suppressempty="yes" delayedparsing="1">
|
|
<value field="ASSISTANT" show="yes"/>
|
|
</property>
|
|
<property name="X-ASSISTANT" suppressempty="yes" rule="EVOLUTION"/>
|
|
<property name="X-ASSISTANT" suppressempty="yes" rule="other">
|
|
<value field="ASSISTANT" show="yes"/>
|
|
</property>
|
|
|
|
<property name="X-EVOLUTION-SPOUSE" suppressempty="yes" delayedparsing="1">
|
|
<value field="SPOUSE" show="yes"/>
|
|
</property>
|
|
<property name="X-SPOUSE" suppressempty="yes" rule="EVOLUTION"/>
|
|
<property name="X-SPOUSE" suppressempty="yes" rule="other">
|
|
<value field="SPOUSE" show="yes"/>
|
|
</property>
|
|
|
|
<property name="X-EVOLUTION-ANNIVERSARY" suppressempty="yes" delayedparsing="1">
|
|
<value field="ANNIVERSARY" show="yes"/>
|
|
</property>
|
|
<property name="X-ANNIVERSARY" suppressempty="yes" rule="EVOLUTION"/>
|
|
<property name="X-ANNIVERSARY" suppressempty="yes" rule="other">
|
|
<value field="ANNIVERSARY" show="yes"/>
|
|
</property>
|
|
|
|
<property name="X-MOZILLA-HTML">
|
|
<value field="WANTS_HTML" show="yes"/>
|
|
</property>
|
|
|
|
<property name="X-AIM" suppressempty="yes">
|
|
<value field="AIM_HANDLE"/>
|
|
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
|
|
<value field="AIM_SLOT"/>
|
|
</parameter>
|
|
</property>
|
|
<property name="X-GADUGADU" suppressempty="yes">
|
|
<value field="GADUGADU_HANDLE"/>
|
|
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
|
|
<value field="GADUGADU_SLOT"/>
|
|
</parameter>
|
|
</property>
|
|
<property name="X-GROUPWISE" suppressempty="yes">
|
|
<value field="GROUPWISE_HANDLE"/>
|
|
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
|
|
<value field="GROUPWISE_SLOT"/>
|
|
</parameter>
|
|
</property>
|
|
<property name="X-ICQ" suppressempty="yes">
|
|
<value field="ICQ_HANDLE"/>
|
|
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
|
|
<value field="ICQ_SLOT"/>
|
|
</parameter>
|
|
</property>
|
|
<property name="X-JABBER" suppressempty="yes">
|
|
<value field="JABBER_HANDLE"/>
|
|
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
|
|
<value field="JABBER_SLOT"/>
|
|
</parameter>
|
|
</property>
|
|
<property name="X-MSN" suppressempty="yes">
|
|
<value field="MSN_HANDLE"/>
|
|
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
|
|
<value field="MSN_SLOT"/>
|
|
</parameter>
|
|
</property>
|
|
<property name="X-YAHOO" suppressempty="yes">
|
|
<value field="YAHOO_HANDLE"/>
|
|
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
|
|
<value field="YAHOO_SLOT"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="ADR" values="7">
|
|
<value index="0" field="ADR_POBOX"/>
|
|
<value index="1" field="ADR_ADDTL"/>
|
|
<value index="2" field="ADR_STREET"/>
|
|
<value index="3" field="ADR_CITY"/>
|
|
<value index="4" field="ADR_REG"/>
|
|
<value index="5" field="ADR_ZIP"/>
|
|
<value index="6" field="ADR_COUNTRY"/>
|
|
<position field="ADR_POBOX" repeat="array" increment="1" minshow="1"/>
|
|
<parameter name="TYPE" default="yes" positional="no" show="yes">
|
|
<value field="ADR_STREET_FLAGS" conversion="multimix" combine=",">
|
|
<enum name="HOME" value="B0"/>
|
|
<enum name="WORK" value="B1"/>
|
|
<enum mode="ignore" value="B2"/> <!-- OTHER -->
|
|
|
|
<enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
|
|
<enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
|
|
</value>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="BDAY">
|
|
<value field="BDAY"/>
|
|
</property>
|
|
|
|
<property name="NOTE" filter="no">
|
|
<value field="NOTE"/>
|
|
</property>
|
|
|
|
<property name="PHOTO" filter="no">
|
|
<value field="PHOTO" conversion="BLOB_B64"/>
|
|
<parameter name="TYPE" default="no" show="yes">
|
|
<value field="PHOTO_TYPE">
|
|
<enum name="JPEG" value="0"/>
|
|
</value>
|
|
</parameter>
|
|
</property>
|
|
|
|
</profile>
|
|
</mimeprofile>
|
|
|
|
<!-- vCard 2.1 datatype, using vCard profile defined above -->
|
|
<datatype name="vCard21" basetype="vcard">
|
|
<version>2.1</version>
|
|
<use mimeprofile="vCard"/>
|
|
</datatype>
|
|
|
|
<!-- vCard 3.0 datatype, using vCard profile defined above -->
|
|
<datatype name="vCard30" basetype="vcard">
|
|
<version>3.0</version>
|
|
<use mimeprofile="vCard"/>
|
|
</datatype>
|
|
|
|
|
|
<!-- common field list for events and todos (both represented by vCalendar/iCalendar) -->
|
|
<fieldlist name="calendar">
|
|
<field name="ISEVENT" type="integer" compare="always"/>
|
|
|
|
<field name="DMODIFIED" type="timestamp" compare="never" age="yes"/>
|
|
<field name="DCREATED" type="timestamp" compare="never"/>
|
|
|
|
<field name="DGENERATED" type="timestamp" compare="never"/>
|
|
|
|
<field name="UID" type="string" compare="never"/>
|
|
|
|
<field name="CATEGORIES" array="yes" type="string" compare="conflict" merge="fillempty"/>
|
|
<field name="CLASS" type="integer" compare="conflict" merge="fillempty"/>
|
|
<field name="TRANSP" type="integer" compare="conflict" merge="fillempty"/>
|
|
|
|
<field name="SUMMARY" type="multiline" compare="always"/>
|
|
<field name="DESCRIPTION" type="multiline" compare="slowsync" merge="lines"/>
|
|
<field name="LOCATION" type="multiline" compare="slowsync" merge="lines"/>
|
|
<field name="URL" type="url" compare="conflict"/>
|
|
|
|
<!-- recurrence rule block, fields must be in that order, including
|
|
DTSTART as last field !! -->
|
|
<field name="RR_FREQ" type="string" compare="conflict"/>
|
|
<field name="RR_INTERVAL" type="integer" compare="conflict"/>
|
|
<field name="RR_FMASK" type="integer" compare="conflict"/>
|
|
<field name="RR_LMASK" type="integer" compare="conflict"/>
|
|
<field name="RR_END" type="timestamp" compare="conflict"/>
|
|
|
|
<!-- Note: DTSTART/DTEND are compared in the <comparescript>,
|
|
therefore compare is set no "never" here -->
|
|
<field name="DTSTART" type="timestamp" compare="never"/>
|
|
<field name="DTEND" type="timestamp" compare="never"/>
|
|
<field name="DURATION" type="timestamp" compare="never"/>
|
|
<field name="COMPLETED" type="timestamp" compare="never"/>
|
|
<field name="DUE" type="timestamp" compare="never"/>
|
|
|
|
<field name="GEO_LAT" type="string" compare="never"/>
|
|
<field name="GEO_LONG" type="string" compare="never"/>
|
|
|
|
<field name="PRIORITY" type="integer" compare="conflict"/>
|
|
<field name="STATUS" type="integer" compare="conflict" merge="fillempty"/>
|
|
<field name="PERCENT_COMPLETE" type="integer" compare="conflict"/>
|
|
|
|
<field name="ALARM_TIME" type="timestamp" compare="conflict"/>
|
|
<field name="ALARM_SNOOZE" type="string" compare="conflict"/>
|
|
<field name="ALARM_REPEAT" type="string" compare="conflict"/>
|
|
<field name="ALARM_MSG" type="string" compare="conflict"/>
|
|
<field name="ALARM_ACTION" type="string" compare="conflict"/>
|
|
<field name="ALARM_REL" type="integer" compare="never"/>
|
|
<field name="ALARM_UID" type="string" compare="conflict"/>
|
|
|
|
<!-- non-standard -->
|
|
<field name="PARENT_UID" type="string" compare="never"/>
|
|
|
|
<!-- for events -->
|
|
<field name="EXDATES" array="yes" type="timestamp" compare="never"/>
|
|
|
|
<field name="ORIGSTART" array="no" type="timestamp" compare="never"/>
|
|
<field name="SEQNO" array="no" type="integer" compare="never"/>
|
|
|
|
<field name="ATTENDEES" array="yes" type="string" compare="never"/>
|
|
<field name="ATTENDEE_CNS" array="yes" type="string" compare="never"/>
|
|
<field name="ATTENDEE_PARTSTATS" array="yes" type="integer" compare="never"/>
|
|
<field name="ATTENDEE_ROLE" array="yes" type="integer" compare="never"/>
|
|
<field name="ATTENDEE_RSVP" array="yes" type="integer" compare="never"/>
|
|
<field name="ATTENDEE_LANG" array="yes" type="string" compare="never"/>
|
|
<field name="ATTENDEE_CUTYPE" array="yes" type="integer" compare="never"/>
|
|
<field name="ORGANIZER" array="no" type="string" compare="never"/>
|
|
<field name="ORGANIZER_CN" array="no" type="string" compare="never"/>
|
|
|
|
</fieldlist>
|
|
|
|
|
|
<!-- vCalendar with VTODO and VEVENT variants -->
|
|
<mimeprofile name="vCalendar" fieldlist="calendar">
|
|
|
|
<vtimezonegenmode>current</vtimezonegenmode>
|
|
<tzidgenmode>olson</tzidgenmode>
|
|
|
|
<profile name="VCALENDAR" nummandatory="1">
|
|
|
|
<property name="VERSION" mandatory="yes">
|
|
<value conversion="version"/>
|
|
</property>
|
|
|
|
<property onlyformode="standard" name="PRODID" mandatory="no">
|
|
<value conversion="prodid"/>
|
|
</property>
|
|
|
|
<property onlyformode="old" name="TZ" filter="false" suppressempty="yes">
|
|
<value field="DTSTART" conversion="tz"/>
|
|
</property>
|
|
|
|
<property onlyformode="old" name="DAYLIGHT" mode="daylight" filter="false" suppressempty="yes">
|
|
<value field="DTSTART" conversion="daylight"/>
|
|
</property>
|
|
|
|
<property name="GEO" values="2" suppressempty="yes" onlyformode="old" valueseparator=",">
|
|
<!-- LON,LAT in vCalendar 1.0 -->
|
|
<value index="0" field="GEO_LAT"/>
|
|
<value index="1" field="GEO_LONG"/>
|
|
</property>
|
|
|
|
<subprofile onlyformode="standard" name="VTIMEZONE" mode="vtimezones"/>
|
|
|
|
<!-- sub-profile for todoz -->
|
|
<subprofile name="VTODO" nummandatory="1" showifselectedonly="yes" field="ISEVENT" value="0">
|
|
|
|
<property name="LAST-MODIFIED" suppressempty="yes">
|
|
<value field="DMODIFIED"/>
|
|
</property>
|
|
|
|
<property name="DTSTAMP" suppressempty="yes" onlyformode="standard">
|
|
<value field="DGENERATED"/>
|
|
</property>
|
|
|
|
<property name="DCREATED" suppressempty="yes" onlyformode="old">
|
|
<value field="DCREATED"/>
|
|
</property>
|
|
<property name="CREATED" suppressempty="yes" onlyformode="standard">
|
|
<value field="DCREATED"/>
|
|
</property>
|
|
|
|
<property name="UID" suppressempty="yes">
|
|
<value field="UID"/>
|
|
</property>
|
|
|
|
<property name="SEQUENCE" suppressempty="yes">
|
|
<value field="SEQNO"/>
|
|
</property>
|
|
|
|
<property name="GEO" values="2" suppressempty="yes" onlyformode="standard" valueseparator=";">
|
|
<!-- LAT;LON in iCalendar 2.0 -->
|
|
<value index="0" field="GEO_LONG"/>
|
|
<value index="1" field="GEO_LAT"/>
|
|
</property>
|
|
|
|
<property onlyformode="standard" name="CATEGORIES" values="list" valueseparator="," suppressempty="yes">
|
|
<value field="CATEGORIES" />
|
|
<position field="CATEGORIES" repeat="array" minshow="0"/>
|
|
</property>
|
|
|
|
<property onlyformode="old" name="CATEGORIES" values="list" valueseparator=";" altvalueseparator="," suppressempty="yes">
|
|
<value field="CATEGORIES" />
|
|
<position field="CATEGORIES" repeat="array" minshow="0"/>
|
|
</property>
|
|
|
|
<property name="CLASS" suppressempty="yes">
|
|
<value field="CLASS">
|
|
<enum name="PUBLIC" value="0"/>
|
|
<enum name="PRIVATE" value="1"/>
|
|
<enum name="CONFIDENTIAL" value="2"/>
|
|
</value>
|
|
</property>
|
|
|
|
<property name="SUMMARY" mandatory="yes">
|
|
<value field="SUMMARY"/>
|
|
</property>
|
|
|
|
<!-- DESCRIPTION is an optional property and libical does not like
|
|
empty properties, so suppress it here. However, in the scripts
|
|
we ensure that the DESCRIPTION field should never be empty. -->
|
|
<property name="DESCRIPTION" suppressempty="yes" mandatory="no">
|
|
<value field="DESCRIPTION"/>
|
|
</property>
|
|
|
|
<property name="LOCATION" suppressempty="yes" mandatory="no">
|
|
<value field="LOCATION"/>
|
|
</property>
|
|
|
|
<property name="URL" suppressempty="yes" mandatory="no">
|
|
<value field="URL"/>
|
|
</property>
|
|
|
|
<property name="DTSTART" suppressempty="yes" delayedparsing="1">
|
|
<value field="DTSTART" conversion="autodate"/>
|
|
<parameter onlyformode="standard" name="TZID" default="no" show="yes">
|
|
<value field="DTSTART" conversion="TZID"/>
|
|
</parameter>
|
|
<parameter onlyformode="standard" name="VALUE" default="no" show="yes">
|
|
<value field="DTSTART" conversion="VALUETYPE"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="COMPLETED" suppressempty="yes" delayedparsing="1">
|
|
<value field="COMPLETED" conversion="autoenddate"/>
|
|
<parameter onlyformode="standard" name="TZID" default="no" show="yes">
|
|
<value field="COMPLETED" conversion="TZID"/>
|
|
</parameter>
|
|
<parameter onlyformode="standard" name="VALUE" default="no" show="yes">
|
|
<value field="COMPLETED" conversion="VALUETYPE"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="DUE" suppressempty="yes" delayedparsing="1">
|
|
<value field="DUE" conversion="autodate"/>
|
|
<parameter onlyformode="standard" name="TZID" default="no" show="yes">
|
|
<value field="DUE" conversion="TZID"/>
|
|
</parameter>
|
|
<parameter onlyformode="standard" name="VALUE" default="no" show="yes">
|
|
<value field="DUE" conversion="VALUETYPE"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="PRIORITY" suppressempty="yes">
|
|
<value field="PRIORITY"/>
|
|
</property>
|
|
|
|
<property name="STATUS" onlyformode="standard" suppressempty="yes">
|
|
<value field="STATUS" conversion="emptyonly">
|
|
<enum name="COMPLETED" value="0"/>
|
|
<enum name="NEEDS-ACTION" value="1"/>
|
|
<enum name="IN-PROCESS" value="2"/>
|
|
<enum name="CANCELLED" value="3"/>
|
|
<enum name="ACCEPTED" value="4"/>
|
|
<enum name="TENTATIVE" value="5"/>
|
|
<enum name="DELEGATED" value="6"/>
|
|
<enum name="DECLINED" value="7"/>
|
|
<enum name="SENT" value="8"/>
|
|
<enum name="CONFIRMED" value="9"/>
|
|
<enum name="DRAFT" value="10"/>
|
|
<enum name="FINAL" value="11"/>
|
|
</value>
|
|
</property>
|
|
|
|
<property name="STATUS" onlyformode="old" suppressempty="yes">
|
|
<value field="STATUS" conversion="emptyonly">
|
|
<enum name="COMPLETED" value="0"/>
|
|
<enum name="NEEDS ACTION" value="1"/>
|
|
<enum mode="defaultvalue" value="1"/> <!-- catch unknown, but also non-conformant NEEDS_ACTION -->
|
|
<enum name="IN PROCESS" value="2"/>
|
|
<enum name="CANCELLED" value="3"/>
|
|
<enum name="ACCEPTED" value="4"/>
|
|
<enum name="TENTATIVE" value="5"/>
|
|
<enum name="DELEGATED" value="6"/>
|
|
<enum name="DECLINED" value="7"/>
|
|
<enum name="SENT" value="8"/>
|
|
<enum name="CONFIRMED" value="9"/>
|
|
<enum name="DRAFT" value="10"/>
|
|
<enum name="FINAL" value="11"/>
|
|
</value>
|
|
</property>
|
|
|
|
<property name="PERCENT-COMPLETE" onlyformode="standard" suppressempty="yes">
|
|
<value field="PERCENT_COMPLETE"/>
|
|
</property>
|
|
|
|
<!-- AALARM and DALARM both use the same fields -->
|
|
<property name="AALARM" onlyformode="old" values="4" suppressempty="yes">
|
|
<value index="0" field="ALARM_TIME" conversion="emptyonly"/>
|
|
<value index="1" field="ALARM_SNOOZE" conversion="emptyonly"/>
|
|
<value index="2" field="ALARM_REPEAT" conversion="emptyonly"/>
|
|
<value index="3" field="ALARM_MSG" conversion="emptyonly"/>
|
|
</property>
|
|
<property name="DALARM" onlyformode="old" values="4" suppressempty="yes">
|
|
<value index="0" field="ALARM_TIME" conversion="emptyonly"/>
|
|
<value index="1" field="ALARM_SNOOZE" conversion="emptyonly"/>
|
|
<value index="2" field="ALARM_REPEAT" conversion="emptyonly"/>
|
|
<value index="3" field="ALARM_MSG" conversion="emptyonly"/>
|
|
</property>
|
|
|
|
<subprofile onlyformode="standard" name="VALARM" nummandatory="1" field="ALARM_TIME">
|
|
<property name="TRIGGER" suppressempty="no" mandatory="yes">
|
|
<value field="ALARM_TIME"/>
|
|
<parameter name="VALUE" default="no" show="yes">
|
|
<value field="ALARM_TIME" conversion="FULLVALUETYPE"/>
|
|
</parameter>
|
|
<parameter name="RELATED" default="no" show="yes">
|
|
<value field="ALARM_REL">
|
|
<enum mode="ignore" value="0"/>
|
|
<enum name="START" value="1"/>
|
|
<enum name="END" value="2"/>
|
|
</value>
|
|
</parameter>
|
|
</property>
|
|
<property name="ACTION" suppressempty="yes" mandatory="yes">
|
|
<value field="ALARM_ACTION"/>
|
|
</property>
|
|
<property name="DESCRIPTION" suppressempty="yes">
|
|
<value field="ALARM_MSG"/>
|
|
</property>
|
|
<property name="REPEAT" suppressempty="yes">
|
|
<value field="ALARM_REPEAT"/>
|
|
</property>
|
|
<property name="X-EVOLUTION-ALARM-UID" suppressempty="yes">
|
|
<value field="ALARM_UID"/>
|
|
</property>
|
|
</subprofile>
|
|
|
|
<property onlyformode="old" name="RELATED-TO" suppressempty="yes">
|
|
<value field="PARENT_UID"/>
|
|
</property>
|
|
|
|
<property onlyformode="standard" name="RELATED-TO" suppressempty="yes">
|
|
<value field="PARENT_UID"/>
|
|
<parameter onlyformode="standard" name="RELTYPE" default="no" positional="yes" show="yes">
|
|
<value>
|
|
<enum name="PARENT"/>
|
|
<enum mode="defaultvalue" name="other"/>
|
|
</value>
|
|
<position hasnot="other" shows="PARENT" field="PARENT_UID"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
</subprofile>
|
|
|
|
<!-- sub-profile for event -->
|
|
<subprofile name="VEVENT" nummandatory="1" showifselectedonly="yes" field="ISEVENT" value="1">
|
|
|
|
<property name="LAST-MODIFIED" suppressempty="yes">
|
|
<value field="DMODIFIED"/>
|
|
</property>
|
|
|
|
<property name="DTSTAMP" suppressempty="yes" onlyformode="standard">
|
|
<value field="DGENERATED"/>
|
|
</property>
|
|
|
|
<property name="DCREATED" suppressempty="yes" onlyformode="old">
|
|
<value field="DCREATED"/>
|
|
</property>
|
|
<property name="CREATED" suppressempty="yes" onlyformode="standard">
|
|
<value field="DCREATED"/>
|
|
</property>
|
|
|
|
|
|
<property name="UID" suppressempty="yes">
|
|
<value field="UID"/>
|
|
</property>
|
|
|
|
<property name="SEQUENCE" suppressempty="yes">
|
|
<value field="SEQNO"/>
|
|
</property>
|
|
|
|
<property name="GEO" values="2" suppressempty="yes" onlyformode="standard" valueseparator=";">
|
|
<!-- LAT;LON in iCalendar 2.0 -->
|
|
<value index="0" field="GEO_LONG"/>
|
|
<value index="1" field="GEO_LAT"/>
|
|
</property>
|
|
|
|
<property onlyformode="standard" name="CATEGORIES" values="list" valueseparator="," suppressempty="yes">
|
|
<value field="CATEGORIES" />
|
|
<position field="CATEGORIES" repeat="array" minshow="0"/>
|
|
</property>
|
|
|
|
<property onlyformode="old" name="CATEGORIES" values="list" valueseparator=";" altvalueseparator="," suppressempty="yes">
|
|
<value field="CATEGORIES" />
|
|
<position field="CATEGORIES" repeat="array" minshow="0"/>
|
|
</property>
|
|
|
|
<property name="CLASS" suppressempty="yes">
|
|
<value field="CLASS">
|
|
<enum name="PUBLIC" value="0"/>
|
|
<enum name="PRIVATE" value="1"/>
|
|
<enum name="CONFIDENTIAL" value="2"/>
|
|
</value>
|
|
</property>
|
|
|
|
|
|
<property name="TRANSP" suppressempty="yes" onlyformode="standard">
|
|
<value field="TRANSP">
|
|
<enum name="OPAQUE" value="0"/>
|
|
<enum name="TRANSPARENT" value="1"/>
|
|
<enum name="TENTATIVE" value="2"/> <!-- according to Oracle de facto usage in vCalendar 1.0 -->
|
|
<enum name="OUT_OF_OFFICE" value="3"/> <!-- according to Oracle de facto usage in vCalendar 1.0 -->
|
|
<enum mode="defaultvalue" value="0"/>
|
|
</value>
|
|
</property>
|
|
<property name="TRANSP" suppressempty="yes" onlyformode="old">
|
|
<value field="TRANSP"/> <!-- directly numeric in vCalendar 1.0 -->
|
|
</property>
|
|
|
|
|
|
<property name="PRIORITY" suppressempty="yes">
|
|
<value field="PRIORITY"/>
|
|
</property>
|
|
|
|
<property name="SUMMARY" mandatory="yes">
|
|
<value field="SUMMARY"/>
|
|
</property>
|
|
|
|
<!-- DESCRIPTION is an optional property and libical does not like
|
|
empty properties, so suppress it here. However, in the scripts
|
|
we ensure that the DESCRIPTION field should never be empty. -->
|
|
<property name="DESCRIPTION" suppressempty="yes" mandatory="no">
|
|
<value field="DESCRIPTION"/>
|
|
</property>
|
|
|
|
<property name="LOCATION" suppressempty="yes" mandatory="no">
|
|
<value field="LOCATION"/>
|
|
</property>
|
|
|
|
<property name="DTSTART" suppressempty="yes" delayedparsing="1">
|
|
<value field="DTSTART" conversion="autodate"/>
|
|
<parameter onlyformode="standard" name="TZID" default="no" show="yes">
|
|
<value field="DTSTART" conversion="TZID"/>
|
|
</parameter>
|
|
<parameter onlyformode="standard" name="VALUE" default="no" show="yes">
|
|
<value field="DTSTART" conversion="VALUETYPE"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
<!-- recurrence rule (with delayed parsing, as it is dependent on DTSTART) -->
|
|
<property name="RRULE" suppressempty="yes" delayedparsing="2">
|
|
<!-- Note: RR_FREQ is the beginning of a block of fields
|
|
suitable for the "rrule" conversion mode -->
|
|
<value field="RR_FREQ" conversion="rrule"/>
|
|
</property>
|
|
|
|
<!-- Symbian uses this, so it might make the client work with symbian-prepared servers better -->
|
|
<property name="X-RECURRENCE-ID" suppressempty="yes" onlyformode="old">
|
|
<value field="ORIGSTART" conversion="autodate"/>
|
|
</property>
|
|
|
|
<property name="RECURRENCE-ID" suppressempty="yes" onlyformode="standard" delayedparsing="1">
|
|
<value field="ORIGSTART" conversion="autodate"/>
|
|
<parameter name="TZID" default="no" show="yes">
|
|
<value field="ORIGSTART" conversion="TZID"/>
|
|
</parameter>
|
|
<parameter name="VALUE" default="no" show="yes">
|
|
<value field="ORIGSTART" conversion="VALUETYPE"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
<!-- ScheduleWorld has a problem (bugzilla.moblin.org #2226)
|
|
with the EXDATE:value1,value2 format (correct in iCalendar 2.0):
|
|
as a workaround, accept all valid formats plus ; but
|
|
generate separate properties with one value each. -->
|
|
<property name="EXDATE" values="expandedlist" suppressempty="yes" onlyformode="standard" delayedparsing="1" valueseparator="," altvalueseparator=";">
|
|
<value field="EXDATES"/>
|
|
<position field="EXDATES" repeat="array" increment="1" minshow="0"/>
|
|
<parameter name="TZID" default="no" show="yes">
|
|
<value field="EXDATES" conversion="TZID"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="EXDATE" values="list" suppressempty="yes" onlyformode="old" delayedparsing="1" valueseparator=";" altvalueseparator=",">
|
|
<value field="EXDATES"/>
|
|
<position field="EXDATES" repeat="array" increment="1" minshow="0"/>
|
|
</property>
|
|
|
|
|
|
<property name="DTEND" suppressempty="yes" delayedparsing="1">
|
|
<value field="DTEND" conversion="autoenddate"/>
|
|
<parameter onlyformode="standard" name="TZID" default="no" show="yes">
|
|
<value field="DTEND" conversion="TZID"/>
|
|
</parameter>
|
|
<parameter onlyformode="standard" name="VALUE" default="no" show="yes">
|
|
<value field="DTEND" conversion="VALUETYPE"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="DURATION" suppressempty="yes" delayedparsing="1" onlyformode="standard">
|
|
<value field="DURATION"/>
|
|
<parameter onlyformode="standard" name="VALUE" default="no" show="no">
|
|
<value field="DURATION" conversion="VALUETYPE"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="ATTENDEE" suppressempty="yes" onlyformode="old">
|
|
<value field="ATTENDEES"/>
|
|
<parameter name="ROLE" default="no" positional="yes" show="yes">
|
|
<value>
|
|
<enum name="ORGANIZER"/>
|
|
</value>
|
|
<position has="ORGANIZER" field="ORGANIZER" overwriteempty="yes"/>
|
|
<position hasnot="ORGANIZER" field="ATTENDEES" repeat="array" increment="1" overwriteempty="yes"/>
|
|
</parameter>
|
|
<parameter name="STATUS" default="no" show="yes">
|
|
<value field="ATTENDEE_PARTSTATS">
|
|
<enum name="NEEDS ACTION" value="1"/>
|
|
<enum mode="defaultvalue" value="1"/> <!-- catch unknown, but also non-conformant NEEDS_ACTION -->
|
|
<enum name="ACCEPTED" value="4"/>
|
|
<enum name="DECLINED" value="7"/>
|
|
<enum name="TENTATIVE" value="5"/>
|
|
<enum name="DELEGATED" value="6"/>
|
|
</value>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="ATTENDEE" suppressempty="yes" onlyformode="standard">
|
|
<value field="ATTENDEES" conversion="mailto"/>
|
|
<position field="ATTENDEES" repeat="array" increment="1" minshow="0"/>
|
|
<parameter name="CN" default="no" show="yes" shownonempty="yes">
|
|
<value field="ATTENDEE_CNS"/>
|
|
</parameter>
|
|
<parameter name="PARTSTAT" default="no" show="yes">
|
|
<value field="ATTENDEE_PARTSTATS">
|
|
<enum name="NEEDS-ACTION" value="1"/>
|
|
<enum mode="defaultvalue" value="1"/> <!-- catch unknown, but also non-conformant NEEDS_ACTION -->
|
|
<enum name="ACCEPTED" value="4"/>
|
|
<enum name="DECLINED" value="7"/>
|
|
<enum name="TENTATIVE" value="5"/>
|
|
<enum name="DELEGATED" value="6"/>
|
|
</value>
|
|
</parameter>
|
|
<parameter name="ROLE" default="no" show="yes">
|
|
<value field="ATTENDEE_ROLE">
|
|
<enum name="CHAIR" value="1"/>
|
|
<enum name="REQ-PARTICIPANT" value="2"/>
|
|
<enum name="OPT-PARTICIPANT" value="3"/>
|
|
<enum name="NON-PARTICIPANT" value="4"/>
|
|
</value>
|
|
</parameter>
|
|
<parameter name="RSVP" default="no" show="yes">
|
|
<value field="ATTENDEE_RSVP">
|
|
<enum name="TRUE" value="1"/>
|
|
<enum name="FALSE" value="0"/>
|
|
</value>
|
|
</parameter>
|
|
<parameter name="LANGUAGE" show="yes">
|
|
<value field="ATTENDEE_LANG"/>
|
|
</parameter>
|
|
<parameter name="CUTYPE" default="no" show="yes">
|
|
<value field="ATTENDEE_CUTYPE">
|
|
<enum name="INDIVIDUAL" value="1"/>
|
|
<enum name="GROUP" value="2"/>
|
|
<enum name="RESOURCE" value="3"/>
|
|
<enum name="ROOM" value="4"/>
|
|
<enum name="UNKNOWN" value="5"/>
|
|
</value>
|
|
</parameter>
|
|
</property>
|
|
|
|
<property name="ORGANIZER" suppressempty="yes" onlyformode="standard">
|
|
<value field="ORGANIZER" conversion="mailto"/>
|
|
<parameter name="CN" default="no" show="yes">
|
|
<value field="ORGANIZER_CN"/>
|
|
</parameter>
|
|
</property>
|
|
|
|
|
|
<!-- AALARM and DALARM both use the same fields -->
|
|
<property name="AALARM" onlyformode="old" values="4" suppressempty="yes">
|
|
<value index="0" field="ALARM_TIME" conversion="emptyonly"/>
|
|
<value index="1" field="ALARM_SNOOZE" conversion="emptyonly"/>
|
|
<value index="2" field="ALARM_REPEAT" conversion="emptyonly"/>
|
|
<value index="3" field="ALARM_MSG" conversion="emptyonly"/>
|
|
</property>
|
|
<property name="DALARM" onlyformode="old" values="4" suppressempty="yes">
|
|
<value index="0" field="ALARM_TIME" conversion="emptyonly"/>
|
|
<value index="1" field="ALARM_SNOOZE" conversion="emptyonly"/>
|
|
<value index="2" field="ALARM_REPEAT" conversion="emptyonly"/>
|
|
<value index="3" field="ALARM_MSG" conversion="emptyonly"/>
|
|
</property>
|
|
|
|
<subprofile onlyformode="standard" name="VALARM" nummandatory="1" field="ALARM_TIME">
|
|
<property name="TRIGGER" suppressempty="no" mandatory="yes">
|
|
<value field="ALARM_TIME"/>
|
|
<parameter name="VALUE" default="no" show="yes">
|
|
<value field="ALARM_TIME" conversion="FULLVALUETYPE"/>
|
|
</parameter>
|
|
<parameter name="RELATED" default="no" show="yes">
|
|
<value field="ALARM_REL">
|
|
<enum mode="ignore" value="0"/>
|
|
<enum name="START" value="1"/>
|
|
<enum name="END" value="2"/>
|
|
</value>
|
|
</parameter>
|
|
</property>
|
|
<property name="ACTION" suppressempty="yes" mandatory="yes">
|
|
<value field="ALARM_ACTION"/>
|
|
</property>
|
|
<property name="DESCRIPTION" suppressempty="yes">
|
|
<value field="ALARM_MSG"/>
|
|
</property>
|
|
<property name="REPEAT" suppressempty="yes">
|
|
<value field="ALARM_REPEAT"/>
|
|
</property>
|
|
<property name="X-EVOLUTION-ALARM-UID" suppressempty="yes">
|
|
<value field="ALARM_UID"/>
|
|
</property>
|
|
</subprofile>
|
|
|
|
</subprofile>
|
|
|
|
</profile>
|
|
</mimeprofile>
|
|
|
|
|
|
<!-- vCalendar 1.0 datatype, using vCalendar profile defined above -->
|
|
<datatype name="vCalendar10" basetype="vcalendar">
|
|
<version>1.0</version>
|
|
<use mimeprofile="vCalendar"/>
|
|
|
|
<incomingscript><![CDATA[
|
|
$VCALENDAR_INCOMING_SCRIPT
|
|
]]></incomingscript>
|
|
|
|
<outgoingscript><![CDATA[
|
|
$VCALENDAR_OUTGOING_SCRIPT
|
|
]]></outgoingscript>
|
|
|
|
</datatype>
|
|
|
|
|
|
<!-- iCalendar 2.0 datatype, using vCalendar profile defined above -->
|
|
<datatype name="iCalendar20" basetype="vcalendar">
|
|
<version>2.0</version>
|
|
<use mimeprofile="vCalendar"/>
|
|
|
|
<incomingscript><![CDATA[
|
|
$VCALENDAR_INCOMING_SCRIPT
|
|
]]></incomingscript>
|
|
|
|
<outgoingscript><![CDATA[
|
|
$VCALENDAR_OUTGOING_SCRIPT
|
|
]]></outgoingscript>
|
|
|
|
</datatype>
|
|
|
|
|
|
<!-- list of internal fields representing plain text note data -->
|
|
<fieldlist name="Note">
|
|
<field name="SYNCLVL" type="integer" compare="never"/>
|
|
<field name="SUBJECT" type="multiline" compare="always"/>
|
|
<field name="TEXT" type="multiline" compare="conflict" merge="lines"/>
|
|
</fieldlist>
|
|
|
|
<textprofile name="Note" fieldlist="Note">
|
|
<linemap field="SUBJECT">
|
|
<numlines>1</numlines>
|
|
<inheader>false</inheader>
|
|
<allowempty>true</allowempty>
|
|
<filterkeyword>SUBJECT</filterkeyword>
|
|
</linemap>
|
|
<linemap field="TEXT">
|
|
<numlines>0</numlines>
|
|
<inheader>false</inheader>
|
|
<allowempty>true</allowempty>
|
|
</linemap>
|
|
</textprofile>
|
|
|
|
<datatype name="note10" basetype="text">
|
|
<use profile="Note"/>
|
|
<typestring>text/plain</typestring>
|
|
<versionstring>1.0</versionstring>
|
|
</datatype>
|
|
|
|
<datatype name="note11" basetype="text">
|
|
<use profile="Note"/>
|
|
<typestring>text/plain</typestring>
|
|
<versionstring>1.1</versionstring>
|
|
</datatype>
|
|
|
|
|
|
<!-- list of internal fields representing vBookmark data -->
|
|
<fieldlist name="bookmarks">
|
|
<field name="REV" type="timestamp" compare="never" age="yes"/>
|
|
<field name="SYNCLVL" type="integer" compare="never"/>
|
|
|
|
<!-- Name -->
|
|
<field name="TITLE" type="string" compare="always"/>
|
|
|
|
<!-- categories and classification -->
|
|
<field name="CATEGORIES" type="string" compare="conflict" merge="fillempty"/>
|
|
<field name="CLASS" type="string" compare="conflict" merge="fillempty"/>
|
|
|
|
<!-- web addresses -->
|
|
<field name="URL" type="url" compare="slowsync" merge="fillempty"/>
|
|
|
|
<!-- Note -->
|
|
<field name="NOTE" type="multiline" compare="conflict" merge="lines"/>
|
|
|
|
</fieldlist>
|
|
|
|
<!-- vBookmark profile -->
|
|
<mimeprofile name="vBookmark" fieldlist="bookmarks">
|
|
|
|
<profile name="VBKM" nummandatory="0">
|
|
<property name="VERSION">
|
|
<value conversion="version"/>
|
|
</property>
|
|
|
|
<property name="X-LAST-MODIFIED">
|
|
<value field="REV"/>
|
|
</property>
|
|
|
|
<property name="TITLE">
|
|
<value field="TITLE"/>
|
|
</property>
|
|
|
|
<property name="URL">
|
|
<value field="URL"/>
|
|
</property>
|
|
|
|
<!-- non-standard properties -->
|
|
|
|
<property name="CATEGORIES">
|
|
<value field="CATEGORIES"/>
|
|
</property>
|
|
|
|
<property name="CLASS" suppressempty="yes">
|
|
<value field="CLASS"/>
|
|
</property>
|
|
|
|
<property name="NOTE" filter="no">
|
|
<value field="NOTE"/>
|
|
</property>
|
|
|
|
</profile>
|
|
</mimeprofile>
|
|
|
|
<!-- vBookmark datatype, using vBookmark profile defined above -->
|
|
<datatype name="vBookmark10" basetype="mimedir">
|
|
<typestring>text/x-vbookmark</typestring>
|
|
<versionstring>1.0</versionstring>
|
|
<use profile="vBookmark"/>
|
|
</datatype>
|
|
|
|
<fieldlists/>
|
|
<profiles/>
|
|
<datatypes/>
|
|
</datatypes>
|
|
|
|
<clientorserver/>
|
|
|
|
</sysync_config>
|