Start of log - SySync SyncML Engine 3.4.0.47
- [-- collapse all --][++ expand all ++]
- [2023-03-07 23:13:29.270] CreateContext SyncEvolution// => 0
- [2023-03-07 23:13:29.270] Module_Capabilities:
PLATFORM:Linux
DLL:true
MINVERSION:V1.0.6.0
MANUFACTURER:SyncEvolution
DESCRIPTION:SyncEvolution Synthesis DB Plugin
plugin_datastore_str:no
plugin_datastore_key:yes
ITEM_AS_KEY:yes
plugin_datablob:no
- [2023-03-07 23:13:29.271] Module_PluginParams
Engine=01090100
+
–
[2023-03-07 23:13:29.282] 'loadSystemZoneDefinitions' - Linux system time zones [--][++] [->end]
- [2023-03-07 23:13:31.800] SyncML server account:
- [2023-03-07 23:13:31.800] client: SyncEvolution 2.0.0 for workstation
- [2023-03-07 23:13:31.800] device ID: syncevolution-3c4689e6-b853-4fc5-be46-38242e7c10fd
- [2023-03-07 23:13:31.800] Scanning backend libraries in /usr/lib/arm-linux-gnueabihf/syncevolution/backends/
Loaded backend library syncxmlrpc
Loaded backend library syncsqlite
Loaded backend library syncqtcontacts
Loaded backend library syncpbap
Loaded backend library syncmaemocal
Loaded backend library synckcalextended
Loaded backend library syncfile
Loaded backend library syncecal
Loaded backend library syncebook
Loaded backend library syncdav
Loaded backend library provideroauth2
Loaded backend library providergoa
Loaded backend library platformgnome
- [2023-03-07 23:13:31.807] @default/addressbook: inactive
- [2023-03-07 23:13:31.808] @default/calendar: inactive
- [2023-03-07 23:13:31.809] @default/contacts: inactive
- [2023-03-07 23:13:31.810] @default/memo: inactive
- [2023-03-07 23:13:31.814] @default/radjournal: inactive
- [2023-03-07 23:13:31.814] @default/radtodo: inactive
- [2023-03-07 23:13:31.815] @default/todo: inactive
- [2023-03-07 23:13:31.817] checking password property 'password' in config 'radicale' with user identity ''
- [2023-03-07 23:13:31.817] checking password property 'databasePassword' in datastore 'radcal' of config 'radicale' with user identity ''
- [2023-03-07 23:13:31.821] sync is starting, catch signals
- [2023-03-07 23:13:31.821] SuspendFlags: (re)activating, currently inactive
- [2023-03-07 23:13:31.821] SuspendFlags: activating signal handler(s) with fds 12->11
- [2023-03-07 23:13:31.821] SuspendFlags: catch signal 2
- [2023-03-07 23:13:31.821] SuspendFlags: catch signal 15
- [2023-03-07 23:13:31.821] ready to sync
- [2023-03-07 23:13:31.834] radicale: ignoring username , it is not needed
- [2023-03-07 23:13:31.834] Module_DeleteContext 'session'
- [2023-03-07 23:13:31.935] internal error, invalid XML configuration (with datastores):
<?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>150000</maxmsgsize>
<maxobjsize>4000000</maxobjsize>
<!-- information for DevInf -->
<model>SyncEvolution</model>
<manufacturer>Patrick Ohly</manufacturer>
<hardwareversion>unknown</hardwareversion>
<firmwareversion>2.0.0</firmwareversion>
<devicetype>workstation</devicetype>
<configdate>20230307T221258Z</configdate>
<debug>
<logpath>$(logpath)</logpath>
<filename>syncevolution-log</filename> <logflushmode>flush</logflushmode>
<logformat>html</logformat>
<folding>auto</folding>
<timestamp>yes</timestamp>
<timestampall>yes</timestampall>
<timedsessionlognames>no</timedsessionlognames>
<subthreadmode>separate</subthreadmode>
<logsessionstoglobal>yes</logsessionstoglobal>
<singlegloballog>yes</singlegloballog>
<sessionlogs>yes</sessionlogs>
<globallogs>yes</globallogs>
<msgdump>no</msgdump>
<xmltranslate>no</xmltranslate>
</debug>
<transport type="xpt">
<!-- allow HTTP 1.1 kepp-alive (multiple request-answer-exchanges in single TCP connection) -->
<keepconnection>true</keepconnection>
</transport>
<scripting><!-- disable endless loop prevention, shouldn't be needed and may abort prematurely -->
<looptimeout>0</looptimeout>
<macro name="VCARD_OUTGOING_PHOTO_INLINING_SCRIPT"><![CDATA[
if (PHOTO_VALUE == "uri") {
string path;
path = URITOPATH(PHOTO);
if (path) {
// try to inline the photo data
string data;
data = READ(path);
if (data != UNASSIGNED) {
PHOTO = data;
PHOTO_VALUE = "binary";
}
}
}
]]></macro>
<macro name="VCARD_INCOMING_PHOTO_VALUE_SCRIPT"><![CDATA[
// Ensure that PHOTO_VALUE is set to "binary" if not set (the default).
// Avoids potential issues when merging.
if (PHOTO_VALUE == EMPTY) {
PHOTO_VALUE = "binary";
}
// same for PHOTO_TYPE, except that we have no good default.
if (PHOTO_TYPE == EMPTY) {
PHOTO_TYPE = "unknown";
}
]]></macro>
<macro name="VCARD_INCOMING_PHOTO_TYPE_SCRIPT"><![CDATA[
// Fix PHOTO TYPE=image/jpeg (sent by Funambol).
INTEGER pos;
pos = RFIND(PHOTO_TYPE, "/", SIZE(PHOTO_TYPE));
if (pos != UNASSIGNED) {
PHOTO_TYPE = SUBSTR(PHOTO_TYPE, pos + 1);
}
]]></macro>
<macro name="VCARD_OUTGOING_PHOTO_VALUE_SCRIPT"><![CDATA[
// Ensure that PHOTO_VALUE == "binary" is not sent (it's the default).
if (PHOTO_VALUE == "binary") {
PHOTO_VALUE = UNASSIGNED;
}
// Hide our internal photo type default.
if (PHOTO_TYPE == "unknown") {
PHOTO_TYPE = UNASSIGNED;
}
]]></macro>
<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;
}
if (N_LAST == EMPTY && N_FIRST == EMPTY && N_MIDDLE == EMPTY) {
// split full name (FN) into first/middle/last components (N)
// when those are empty, because Evolution and MeeGo UX depend on them
integer i;
// split at spaces
string words[];
integer numwords;
string name;
integer start;
integer space;
integer namelen;
name = NORMALIZED(FN);
namelen = SIZE(name);
start = 0;
numwords = 0;
while (TRUE) {
space = FIND(name, " ", start);
if (space) {
words[numwords] = SUBSTR(name, start, space - start);
numwords = numwords + 1;
start = space + 1;
name;
while (SUBSTR(name, start, 1) == " ") {
start = start + 1;
}
} else {
if (start < namelen) {
words[numwords] = SUBSTR(name, start);
numwords = numwords + 1;
}
break;
}
}
if (numwords == 0) {
// use email address, phone number, etc. as fallback
N_FIRST = EMAIL[0];
if (N_FIRST == EMPTY) {
N_FIRST = TEL[0];
}
} else if (numwords == 1) {
N_FIRST = words[0];
} else {
// start and end index of middle name(s), both inclusive
integer startmiddle;
integer endmiddle;
name = words[0];
namelen = SIZE(name);
// last name given first as in "Doe, John"?
if (SUBSTR(name, namelen - 1, 1) == ",") {
N_LAST = SUBSTR(name, 0, namelen - 1);
N_FIRST = words[1];
startmiddle = 2;
endmiddle = numwords - 1;
} else {
N_FIRST = name;
startmiddle = 1;
endmiddle = numwords - 2;
N_LAST = words[numwords - 1];
}
if (endmiddle >= startmiddle) {
N_MIDDLE = words[startmiddle];
startmiddle = startmiddle + 1;
while (endmiddle >= startmiddle) {
N_MIDDLE = N_MIDDLE + " " + words[startmiddle];
startmiddle = startmiddle + 1;
}
}
}
}
// Ensure that FILE-AS is set. Some EDS versions will set it,
// so we need to do the same to ensure that incoming items
// match DB items during a slow sync.
if (FILE_AS == EMPTY) {
FILE_AS = N_LAST;
if (N_FIRST != EMPTY) {
if (FILE_AS != EMPTY) {
FILE_AS = FILE_AS + ", ";
}
FILE_AS = FILE_AS + N_FIRST;
}
}
$VCARD_OUTGOING_PHOTO_VALUE_SCRIPT;
]]></macro>
<macro name="VCARD_AFTERREAD_SCRIPT_EVOLUTION"><![CDATA[
$VCARD_INCOMING_PHOTO_VALUE_SCRIPT;
]]></macro>
<!-- Special treatment of PHOTO data: keep a local file if it has the
same content as the binary data in the winning item.
Use in combination with a PHOTO field of type="string" (not blob,
because we need to be able to compare the field in the MERGEFIELDS()
call to detect when the data really changes) and compare="conflict"
(not used to find matches, changes are relevant).
-->
<macro name="VCARD_MERGESCRIPT"><![CDATA[
integer mode;
mode = MERGEMODE();
INTEGER winningchanged;
INTEGER loosingchanged;
winningchanged = 0;
loosingchanged = 0;
STRING ignorefields;
ignorefields = "";
if (SESSIONVAR("keepPhotoData") &&
WINNING.PHOTO == EMPTY &&
LOOSING.PHOTO != EMPTY) {
// The client's item is always the "winning" one in PBAP syncing,
// but it might not have the photo data that is already on the
// server. Therefore keep the server's photo, if there is
// one and we are not in the phase where the client sends
// its photos.
WINNING.PHOTO = LOOSING.PHOTO;
WINNING.PHOTO_TYPE = LOOSING.PHOTO_TYPE;
WINNING.PHOTO_VALUE = LOOSING.PHOTO_VALUE;
winningchanged = 1;
} else if (mode == 1 && WINNING.PHOTO == EMPTY) {
// Removing photo from loosing item.
if (LOOSING.PHOTO != EMPTY) {
loosingchanged = 1;
}
LOOSING.PHOTO = EMPTY;
LOOSING.PHOTO_TYPE = "";
LOOSING.PHOTO_VALUE = "";
} else if (LOOSING.PHOTO != EMPTY) {
// Updating photo. Might actually be the same!
if (LOOSING.PHOTO_VALUE == "uri" && (WINNING.PHOTO_VALUE == EMPTY || WINNING.PHOTO_VALUE == "binary")) {
string path;
path = URITOPATH(LOOSING.PHOTO);
if (path) {
if (READ(path) == WINNING.PHOTO) {
// Reuse photo file from loosing item.
// If we need to write back for some other reason, we'll inline the data again.
WINNING.PHOTO = LOOSING.PHOTO;
WINNING.PHOTO_TYPE = LOOSING.PHOTO_TYPE;
WINNING.PHOTO_VALUE = LOOSING.PHOTO_VALUE;
}
}
}
} else {
LOOSING.PHOTO_VALUE = EMPTY;
LOOSING.PHOTO_TYPE = EMPTY;
LOOSING.PHOTO = EMPTY;
}
// In cache mode, we don't care about the order of entries, so
// we do our own relaxed comparison and tell the engine to ignore
// fields if the only change is in the ordering.
if (CACHEDATA()) {
ignorefields = ignorefields + RELAXEDCOMPARE("TEL", "", "TEL_FLAGS", "TEL_SLOT", "LABEL");
ignorefields = ignorefields + RELAXEDCOMPARE("XDATE", "", "LABEL");
ignorefields = ignorefields + RELAXEDCOMPARE("EMAIL", "", "EMAIL_FLAGS", "EMAIL_SLOT", "LABEL");
ignorefields = ignorefields + RELAXEDCOMPARE("WEB", "", "WEB_FLAGS", "LABEL");
ignorefields = ignorefields + RELAXEDCOMPARE("CALURI");
ignorefields = ignorefields + RELAXEDCOMPARE("FBURL");
ignorefields = ignorefields + RELAXEDCOMPARE("BLOGURL");
ignorefields = ignorefields + RELAXEDCOMPARE("VIDEOURL");
ignorefields = ignorefields + RELAXEDCOMPARE("RELATEDNAMES", "", "LABEL");
ignorefields = ignorefields + RELAXEDCOMPARE("IMPP", "", "IMPP_SERVICE", "IMPP_SLOT", "LABEL");
ignorefields = ignorefields + RELAXEDCOMPARE("AIM_HANDLE", "", "AIM_SLOT");
ignorefields = ignorefields + RELAXEDCOMPARE("GADUGADU_HANDLE", "", "GADUGADU_SLOT");
ignorefields = ignorefields + RELAXEDCOMPARE("GROUPWISE_HANDLE", "", "GROUPWISE_SLOT");
ignorefields = ignorefields + RELAXEDCOMPARE("ICQ_HANDLE", "", "ICQ_SLOT");
ignorefields = ignorefields + RELAXEDCOMPARE("JABBER_HANDLE", "", "JABBER_SLOT");
ignorefields = ignorefields + RELAXEDCOMPARE("MSN_HANDLE", "", "MSN_SLOT");
ignorefields = ignorefields + RELAXEDCOMPARE("YAHOO_HANDLE", "", "YAHOO_SLOT");
ignorefields = ignorefields + RELAXEDCOMPARE("SKYPE_HANDLE", "", "SKYPE_SLOT");
ignorefields = ignorefields + RELAXEDCOMPARE("SIP_HANDLE", "", "SIP_SLOT");
ignorefields = ignorefields + RELAXEDCOMPARE("EMAIL", "", "EMAIL_FLAGS", "EMAIL_SLOT", "LABEL");
ignorefields = ignorefields + RELAXEDCOMPARE("ADR", "ADR_STREET", "ADR_ADDTL", "ADR_STREET_FLAGS", "ADR_POBOX", "ADR_CITY", "ADR_REG", "ADR_ZIP", "ADR_COUNTRY", "", "LABEL");
// Always ignore the label. Otherwise reordering will cause unnecessary
// writes. We check for reordering more selectively above, but because
// the LABEL field is shared, we cannot do the same for it.
// The downside is that changes in just the label of an entry will not
// cause an update of the cache. Some other value must be modified, too,
// to trigger a write.
ignorefields = ignorefields + " LABEL";
}
// When running in caching mode, we end up executing the merge script,
// but in that case we want to remove data from the loosing item and
// thus need to skip the array merging.
if (!CACHEDATA()) {
// Merge arrays such that the superset remains in the winning item.
// The arrays then get copied wholesale to the loosing item.
// Items which share the label array must avoid conflicts in the label
// array, the others don't.
// See "[SyncEvolution] merging of winning and loosing items"
INTEGER i;
INTEGER num;
TELEPHONE tel;
DATE xdate;
STRING val;
i = SIZE(LOOSING.TEL) - 1;
while (i >= 0) {
tel = LOOSING.TEL[i];
if (tel != EMPTY &&
!CONTAINS(WINNING.TEL, tel)) {
num = SIZE(WINNING.LABEL);
WINNING.TEL[num] = tel;
WINNING.TEL_FLAGS[num] = LOOSING.TEL_FLAGS[i];
WINNING.TEL_SLOT[num] = LOOSING.TEL_SLOT[i];
WINNING.LABEL[num] = LOOSING.LABEL[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.XDATE) - 1;
while (i >= 0) {
xdate = LOOSING.XDATE[i];
if (xdate != EMPTY &&
!CONTAINS(WINNING.XDATE, xdate)) {
num = SIZE(WINNING.LABEL);
WINNING.XDATE[num] = xdate;
WINNING.LABEL[num] = LOOSING.LABEL[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.EMAIL) - 1;
while (i >= 0) {
val = LOOSING.EMAIL[i];
if (val != EMPTY &&
!CONTAINS(WINNING.EMAIL, val)) {
num = SIZE(WINNING.LABEL);
WINNING.EMAIL[num] = val;
WINNING.EMAIL_FLAGS[num] = LOOSING.EMAIL_FLAGS[i];
WINNING.EMAIL_SLOT[num] = LOOSING.EMAIL_SLOT[i];
WINNING.LABEL[num] = LOOSING.LABEL[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.WEB) - 1;
while (i >= 0) {
val = LOOSING.WEB[i];
if (val != EMPTY &&
!CONTAINS(WINNING.WEB, val)) {
num = SIZE(WINNING.LABEL);
WINNING.WEB[num] = val;
WINNING.WEB_FLAGS[num] = LOOSING.WEB_FLAGS[i];
WINNING.LABEL[num] = LOOSING.LABEL[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.CALURI) - 1;
while (i >= 0) {
val = LOOSING.CALURI[i];
if (val != EMPTY &&
!CONTAINS(WINNING.CALURI, val)) {
num = SIZE(WINNING.CALURI);
WINNING.CALURI[num] = val;
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.FBURL) - 1;
while (i >= 0) {
val = LOOSING.FBURL[i];
if (val != EMPTY &&
!CONTAINS(WINNING.FBURL, val)) {
num = SIZE(WINNING.FBURL);
WINNING.FBURL[num] = val;
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.BLOGURL) - 1;
while (i >= 0) {
val = LOOSING.BLOGURL[i];
if (val != EMPTY &&
!CONTAINS(WINNING.BLOGURL, val)) {
num = SIZE(WINNING.BLOGURL);
WINNING.BLOGURL[num] = val;
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.VIDEOURL) - 1;
while (i >= 0) {
val = LOOSING.VIDEOURL[i];
if (val != EMPTY &&
!CONTAINS(WINNING.VIDEOURL, val)) {
num = SIZE(WINNING.VIDEOURL);
WINNING.VIDEOURL[num] = val;
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.RELATEDNAMES) - 1;
while (i >= 0) {
val = LOOSING.RELATEDNAMES[i];
if (val != EMPTY &&
!CONTAINS(WINNING.RELATEDNAMES, val)) {
num = SIZE(WINNING.LABEL);
WINNING.RELATEDNAMES[num] = val;
WINNING.LABEL[num] = LOOSING.LABEL[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.IMPP) - 1;
while (i >= 0) {
val = LOOSING.IMPP[i];
if (val != EMPTY &&
!CONTAINS(WINNING.IMPP, val)) {
num = SIZE(WINNING.LABEL);
WINNING.IMPP[num] = val;
WINNING.IMPP_SERVICE[num] = LOOSING.IMPP_SERVICE[i];
WINNING.IMPP_SLOT[num] = LOOSING.IMPP_SLOT[i];
WINNING.LABEL[num] = LOOSING.LABEL[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.AIM_HANDLE) - 1;
while (i >= 0) {
val = LOOSING.AIM_HANDLE[i];
if (val != EMPTY &&
!CONTAINS(WINNING.AIM_HANDLE, val)) {
num = SIZE(WINNING.AIM_HANDLE);
WINNING.AIM_HANDLE[num] = val;
WINNING.AIM_SLOT[num] = LOOSING.AIM_SLOT[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.GADUGADU_HANDLE) - 1;
while (i >= 0) {
val = LOOSING.GADUGADU_HANDLE[i];
if (val != EMPTY &&
!CONTAINS(WINNING.GADUGADU_HANDLE, val)) {
num = SIZE(WINNING.GADUGADU_HANDLE);
WINNING.GADUGADU_HANDLE[num] = val;
WINNING.GADUGADU_SLOT[num] = LOOSING.GADUGADU_SLOT[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.GROUPWISE_HANDLE) - 1;
while (i >= 0) {
val = LOOSING.GROUPWISE_HANDLE[i];
if (val != EMPTY &&
!CONTAINS(WINNING.GROUPWISE_HANDLE, val)) {
num = SIZE(WINNING.GROUPWISE_HANDLE);
WINNING.GROUPWISE_HANDLE[num] = val;
WINNING.GROUPWISE_SLOT[num] = LOOSING.GROUPWISE_SLOT[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.ICQ_HANDLE) - 1;
while (i >= 0) {
val = LOOSING.ICQ_HANDLE[i];
if (val != EMPTY &&
!CONTAINS(WINNING.ICQ_HANDLE, val)) {
num = SIZE(WINNING.ICQ_HANDLE);
WINNING.ICQ_HANDLE[num] = val;
WINNING.ICQ_SLOT[num] = LOOSING.ICQ_SLOT[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.JABBER_HANDLE) - 1;
while (i >= 0) {
val = LOOSING.JABBER_HANDLE[i];
if (val != EMPTY &&
!CONTAINS(WINNING.JABBER_HANDLE, val)) {
num = SIZE(WINNING.JABBER_HANDLE);
WINNING.JABBER_HANDLE[num] = val;
WINNING.JABBER_SLOT[num] = LOOSING.JABBER_SLOT[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.MSN_HANDLE) - 1;
while (i >= 0) {
val = LOOSING.MSN_HANDLE[i];
if (val != EMPTY &&
!CONTAINS(WINNING.MSN_HANDLE, val)) {
num = SIZE(WINNING.MSN_HANDLE);
WINNING.MSN_HANDLE[num] = val;
WINNING.MSN_SLOT[num] = LOOSING.MSN_SLOT[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.YAHOO_HANDLE) - 1;
while (i >= 0) {
val = LOOSING.YAHOO_HANDLE[i];
if (val != EMPTY &&
!CONTAINS(WINNING.YAHOO_HANDLE, val)) {
num = SIZE(WINNING.YAHOO_HANDLE);
WINNING.YAHOO_HANDLE[num] = val;
WINNING.YAHOO_SLOT[num] = LOOSING.YAHOO_SLOT[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.SKYPE_HANDLE) - 1;
while (i >= 0) {
val = LOOSING.SKYPE_HANDLE[i];
if (val != EMPTY &&
!CONTAINS(WINNING.SKYPE_HANDLE, val)) {
num = SIZE(WINNING.SKYPE_HANDLE);
WINNING.SKYPE_HANDLE[num] = val;
WINNING.SKYPE_SLOT[num] = LOOSING.SKYPE_SLOT[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.SIP_HANDLE) - 1;
while (i >= 0) {
val = LOOSING.SIP_HANDLE[i];
if (val != EMPTY &&
!CONTAINS(WINNING.SIP_HANDLE, val)) {
num = SIZE(WINNING.SIP_HANDLE);
WINNING.SIP_HANDLE[num] = val;
WINNING.SIP_SLOT[num] = LOOSING.SIP_SLOT[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.EMAIL) - 1;
while (i >= 0) {
val = LOOSING.EMAIL[i];
if (val != EMPTY &&
!CONTAINS(WINNING.EMAIL, val)) {
num = SIZE(WINNING.LABEL);
WINNING.EMAIL[num] = val;
WINNING.EMAIL_FLAGS[num] = LOOSING.EMAIL_FLAGS[i];
WINNING.EMAIL_SLOT[num] = LOOSING.EMAIL_SLOT[i];
WINNING.LABEL[num] = LOOSING.LABEL[i];
winningchanged = 1;
}
i = i - 1;
}
i = SIZE(LOOSING.ADR_STREET) - 1;
INTEGER e;
INTEGER contained;
while (i >= 0) {
if (LOOSING.ADR_STREET[i] != EMPTY ||
LOOSING.ADR_ADDTL[i] != EMPTY ||
LOOSING.ADR_STREET_FLAGS[i] != EMPTY ||
LOOSING.ADR_POBOX[i] != EMPTY ||
LOOSING.ADR_CITY[i] != EMPTY ||
LOOSING.ADR_REG[i] != EMPTY ||
LOOSING.ADR_ZIP[i] != EMPTY ||
LOOSING.ADR_COUNTRY[i] != EMPTY) {
contained = 0;
e = SIZE(WINNING.ADR_STREET) - 1;
while (e >= 0) {
if (LOOSING.ADR_STREET[i] == WINNING.ADR_STREET[e] &&
LOOSING.ADR_ADDTL[i] == WINNING.ADR_ADDTL[e] &&
LOOSING.ADR_STREET_FLAGS[i] == WINNING.ADR_STREET_FLAGS[e] &&
LOOSING.ADR_POBOX[i] == WINNING.ADR_POBOX[e] &&
LOOSING.ADR_CITY[i] == WINNING.ADR_CITY[e] &&
LOOSING.ADR_REG[i] == WINNING.ADR_REG[e] &&
LOOSING.ADR_ZIP[i] == WINNING.ADR_ZIP[e] &&
LOOSING.ADR_COUNTRY[i] == WINNING.ADR_COUNTRY[e]) {
contained = 1;
break;
}
e = e - 1;
}
if (!contained) {
num = SIZE(WINNING.LABEL);
WINNING.ADR_STREET[num] = LOOSING.ADR_STREET[i];
WINNING.ADR_ADDTL[num] = LOOSING.ADR_ADDTL[i];
WINNING.ADR_STREET_FLAGS[num] = LOOSING.ADR_STREET_FLAGS[i];
WINNING.ADR_POBOX[num] = LOOSING.ADR_POBOX[i];
WINNING.ADR_CITY[num] = LOOSING.ADR_CITY[i];
WINNING.ADR_REG[num] = LOOSING.ADR_REG[i];
WINNING.ADR_ZIP[num] = LOOSING.ADR_ZIP[i];
WINNING.ADR_COUNTRY[num] = LOOSING.ADR_COUNTRY[i];
WINNING.LABEL[num] = LOOSING.LABEL[i];
winningchanged = 1;
}
}
i = i - 1;
}
}
// Never tell the engine to update the winning client item
// in a caching sync. The engine would send an update to the
// client, which is not what we want when caching!
if (!CACHEDATA() && winningchanged) { SETWINNINGCHANGED(1); }
if (loosingchanged) { SETLOOSINGCHANGED(1); }
// Continue merge.
MERGEFIELDS(mode, ignorefields);
]]></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>
<macro name="VCARD_INCOMING_NAMECHANGE_SCRIPT"><![CDATA[
STRING tmp;
tmp=NORMALIZED(FN);
if (tmp==EMPTY){
tmp=N_FIRST;
if (N_MIDDLE != EMPTY) {
if (tmp != EMPTY) {
tmp = tmp + " ";
}
tmp = tmp + N_MIDDLE;
}
if (N_LAST != EMPTY) {
if (tmp != EMPTY) {
tmp = tmp + " ";
}
tmp = tmp + N_LAST;
}
FN = tmp;
}
]]></macro>
<macro name="VCARD_OUTGOING_ADDREV_SCRIPT"><![CDATA[
if (REV==EMPTY){
REV="2010-03-28T10:34:10Z";
}
]]></macro>
<macro name="VCARD_OUTGOING_EMAILTYPE_SCRIPT"><![CDATA[
if (SESSIONVAR("addInternetEmail")) {
INTEGER i;
i = 0;
while (i < SIZE(EMAIL)) {
if (EMAIL[i]) {
EMAIL_FLAGS[i] = EMAIL_FLAGS[i] | 8; // INTERNET = B3 in vCard profile
}
i = i + 1;
}
}
]]></macro>
<function><![CDATA[
// create a UID
string newuid() {
return "syuid" + NUMFORMAT(RANDOM(1000000),6,"0") + "." + (string)MILLISECONDS(NOW());
}
]]></function>
<!-- 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;
// Remove UID/RECURRENCE-ID from servers which do not support
// the semantic properly (for example, Funambol supports
// UID but drops RECURRENCE-ID, causing conflicts).
if (SESSIONVAR("stripUID")) {
UID = UNASSIGNED;
ORIGSTART = UNASSIGNED;
}
// make sure we have all trailing and leading spaces eliminated
DESCRIPTION=NORMALIZED(DESCRIPTION);
SUMMARY=NORMALIZED(SUMMARY);
// eliminate description that is the same as summary
if (DESCRIPTION==SUMMARY) DESCRIPTION=EMPTY;
// 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);
if (RR_END != EMPTY) {
RR_END = DATEONLY(CONVERTTOUSERZONE(RR_END));
}
}
else {
// iCalendar 2.0 - only if DTSTART is a date-only value this really is an allday
if (ISDATEONLY(DTSTART)) {
// reshape to make sure we don't have invalid zero-duration alldays (old OCS 9 servers)
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;
}
}
// vCalendar1.0 has no VALUE=DATE EXDATEs, so convert back to that if
// the event is all-day.
if (ITEMDATATYPE()=="vCalendar10" && ISDATEONLY(DTSTART)) {
timestamp exdate;
i = 0;
while (i<SIZE(EXDATES)) {
exdate = EXDATES[i];
if (!ISDATEONLY(exdate)) {
exdate = CONVERTTOUSERZONE(exdate);
EXDATES[i] = DATEONLY(exdate);
}
i=i+1;
}
}
// Transform absolute alarm time back to relative time (mirrors the code in
// VCALENDAR_OUTGOING_SCRIPT, see also BMC #11233). This applies to all
// events, recurring or not, if the "alarmTimeToUTC" workaround is applied.
// With a peer which cannot distinguish between absolute and relative
// alarms we better treat all alarms as relative, because that is presented
// more nicely to the user on the local side.
if (ITEMDATATYPE()=="vCalendar10" &&
ALARM_TIME!=EMPTY &&
!ISDURATION(ALARM_TIME) &&
SESSIONVAR("alarmTimeToUTC")) {
ALARM_TIME = ALARM_TIME - DTSTART;
}
// - 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 = CONVERTTOUSERZONE(DUE);
DUE = DATEONLY(DUE);
}
if (ITEMDATATYPE()=="vCalendar10") {
$VCALENDAR_10TO20_PRIORITY_CONVERSION;
}
}
// a workaround for funambol: adding 'action' for 'alarm'
// if item data type is vCalendar1.0, also add 'action' for 'alarm'.
// This is a workaround for Mobical.net, which uses vCalendar1.0.
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, because some peers only support that;
// can be avoided for peers where we are certain (from CtCaps) that they can
// receive the text as part of the summary; don't do this for VJOURNAL
if (ISAVAILABLE(SUMMARY)!=TRUE && DESCRIPTION==EMPTY && ISEVENT != 2) 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";
}
}
// for 'ALARM_TIME', convert duration time to UTC time
// This workaround is for Mobical.net which can't understand duration time.
// Also used with phones. The interpretation at least by Nokia
// is that the absolute alarm time repeats together with the
// event (BMC #11233). VCALENDAR_INCOMING_SCRIPT has the
// corresponding transformation back (important for recurring events).
if (SESSIONVAR("alarmTimeToUTC") && ITEMDATATYPE()=="vCalendar10"
&& ALARM_TIME!=EMPTY && ISDURATION(ALARM_TIME)) {
TIMESTAMP ts;
if (ALARM_REL==2)
ts = DTEND; // relative to end
else {
if (ISEVENT)
ts = DTSTART; // relative to start for events
else
ts = DUE; // relative to due for todos
}
ALARM_TIME = CONVERTTOUSERZONE(POINTINTIME(ts), TRUE) + ALARM_TIME;
ALARM_TIME = CONVERTTOZONE(ALARM_TIME, "UTC");
}
]]></macro>
<macro name="FIX_EXDATE_SCRIPT"><![CDATA[
// Add time zone information to EXDATEs: necessary for
// the Maemo calendar storages because it uses EXDATE
// without TZID.
if (!ISFLOATING(DTSTART)) {
STRING tz;
tz = TIMEZONE(DTSTART);
if (tz != "UTC") {
INTEGER i;
i = 0;
while (i<SIZE(EXDATES)) {
if (ISFLOATING(EXDATES[i])) {
SETTIMEZONE(EXDATES[i], tz);
}
i=i+1;
}
}
}
]]></macro>
<!-- Uses the UID/RECURRENCE-ID fields as the only criteria for
comparing calendar data if the parameter $1 (see GLOBALIDS in <initscript>)
is true, else does a normal comparison of the
fields. That comparison is based on the datatype definition
and ignores UID because it is not trusted to be
preserved and/or implemented by peers.
In case of a UID match, the DMODIFIED fields are compared
to determine the older item.
-->
<macro name="VCALENDAR_COMPARE_SCRIPT"><![CDATA[
INTEGER RES;
if (COMPARISONMODE() != "age" && SYNCMODESUPPORTED("1122583000")) {
if (TARGET.UID == REFERENCE.UID &&
TARGET.ORIGSTART == REFERENCE.ORIGSTART) {
RES = 0;
} else {
RES = -999;
}
} else {
RES = COMPAREFIELDS();
}
return RES;
]]></macro>
<!-- invoked when reading plain text memo from storage or receiving from peer -->
<macro name="MEMO_INCOMING_SCRIPT"><![CDATA[
ISEVENT = 2;
// Copy summary into description. It is not 100% certain whether that is
// necessary (the summary might be completely unrelated to the description text),
// but this way it is consistent with the way how the EDS backend used to handle
// it and symmetric with MEMO_OUTGOING_SCRIPT.
if (SUMMARY != EMPTY && DESCRIPTION != EMPTY) {
DESCRIPTION = SUMMARY + "\n" + DESCRIPTION;
}
]]></macro>
<!-- invoked before writing plain text memo into storage or sending to peer -->
<macro name="MEMO_OUTGOING_SCRIPT"><![CDATA[
// remove SUMMARY from start of DESCRIPTION before writing if text matches,
// because sending as plain text will concatenate them again
integer lensummary, lendescr;
lensummary = LENGTH(SUMMARY);
lendescr = LENGTH(DESCRIPTION);
if (lendescr >= lensummary &&
SUBSTR(DESCRIPTION, 0, lensummary) == SUMMARY &&
(lensummary == lendescr || SUBSTR(DESCRIPTION, lensummary, 1) == "\n")) {
DESCRIPTION = SUBSTR(DESCRIPTION, lensummary + 1, lendescr - lensummary - 1);
}
]]></macro>
<macro name="CALENDAR_BEFOREWRITE_SCRIPT"><![CDATA[
if (UID == EMPTY) { UID = newuid(); }
// set UTC time of generation for iCalendar 2.0 DTSTAMP
DGENERATED = NOW();
// ensure that there is a DMODIFIED = LAST-MODIFIED property,
// not all storages add it
if (!DMODIFIED) {
DMODIFIED = DGENERATED;
}
]]></macro>
<macro name="VCARD_BEFOREWRITE_SCRIPT"><![CDATA[
if (UID == EMPTY) { UID = newuid(); }
$VCARD_OUTGOING_PHOTO_VALUE_SCRIPT;
]]></macro>
<macro name="NEWTAG"><![CDATA[
INTEGER newtag;
newtag = 1;
while (TRUE) {
$1 = "item" + newtag;
if (!CONTAINS($2, $1)) {
break;
}
newtag = newtag + 1;
}
]]></macro>
<macro name="VCARD_AFTERREAD_SCRIPT"><![CDATA[
$VCARD_INCOMING_PHOTO_VALUE_SCRIPT;
]]></macro>
<!-- moves an IMPP value to a specific legacy field -->
<macro name="VCARD_MODERN_TO_LEGACY_IMPP"><![CDATA[
INTEGER impp_index;
impp_index = SIZE($2);
SWAP($1, $2[impp_index]);
SWAP(IMPP_SLOT[$4], $3[impp_index]);
IMPP[$4] = UNASSIGNED;
]]></macro>
<!-- convert from IMPP to X- fields, XDATE to ANNIVERSARY, etc. -->
<macro name="VCARD_MODERN_TO_LEGACY"><![CDATA[
INTEGER i;
STRING s;
// Special X-ABDATE -> X-ANNIVERSARY.
i = SIZE(XDATE) - 1;
while (i >= 0) {
if (GROUP_TAG[i] != EMPTY &&
XDATE[i] != UNASSIGNED &&
LABEL[i] == "Anniversary") {
SWAP(ANNIVERSARY, XDATE[i]);
// XDATE[i] = UNASSIGNED;
break;
}
i = i - 1;
}
// Special X-ABRELATEDNAMES -> X-SPOUSE/MANAGER/ASSISTANT
i = SIZE(RELATEDNAMES) - 1;
while (i >= 0) {
if (GROUP_TAG[i] != EMPTY &&
RELATEDNAMES[i] != UNASSIGNED) {
s = LABEL[i];
if (s == "Spouse") {
if (SPOUSE == EMPTY) {
SWAP(SPOUSE, RELATEDNAMES[i]);
// RELATEDNAMES[i] = UNASSIGNED;
}
} else if (s == "Manager") {
if (MANAGER == EMPTY) {
SWAP(MANAGER, RELATEDNAMES[i]);
// RELATEDNAMES[i] = UNASSIGNED;
}
} else if (s == "Assistant") {
if (ASSISTANT == EMPTY) {
SWAP(ASSISTANT, RELATEDNAMES[i]);
// RELATEDNAMES[i] = UNASSIGNED;
}
}
}
i = i - 1;
}
// IMPP -> X-JABBER/AIM/... depending on service type. Protocol must match.
i = SIZE(IMPP) - 1;
INTEGER offset;
STRING service;
STRING protocol;
STRING value;
while (i >= 0) {
service = IMPP_SERVICE[i];
if (service != UNASSIGNED) {
offset = FIND(IMPP[i], ":");
if (offset != UNASSIGNED) {
protocol = SUBSTR(IMPP[i], 0, offset);
value = URLDECODE(SUBSTR(IMPP[i], offset + 1));
if (service == "AIM" && protocol == "aim") {
$VCARD_MODERN_TO_LEGACY_IMPP(value, AIM_HANDLE, AIM_SLOT, i);
} else if (service == "Gadugadu") {
$VCARD_MODERN_TO_LEGACY_IMPP(value, GADUGADU_HANDLE, GADUGADU_SLOT, i);
} else if (service == "Groupwise") {
$VCARD_MODERN_TO_LEGACY_IMPP(value, GROUPWISE_HANDLE, GROUPWISE_SLOT, i);
} else if (service == "ICQ" && protocol == "aim") {
$VCARD_MODERN_TO_LEGACY_IMPP(value, ICQ_HANDLE, ICQ_SLOT, i);
} else if (service == "Jabber" && protocol == "xmpp") {
$VCARD_MODERN_TO_LEGACY_IMPP(value, JABBER_HANDLE, JABBER_SLOT, i);
} else if (service == "MSN" && protocol == "msnim") {
$VCARD_MODERN_TO_LEGACY_IMPP(value, MSN_HANDLE, MSN_SLOT, i);
} else if (service == "Yahoo" && protocol == "ymsgr") {
$VCARD_MODERN_TO_LEGACY_IMPP(value, YAHOO_HANDLE, YAHOO_SLOT, i);
} else if (service == "Skype" && protocol == "skype") {
$VCARD_MODERN_TO_LEGACY_IMPP(value, SKYPE_HANDLE, SKYPE_SLOT, i);
} else if (service == "Sip") {
$VCARD_MODERN_TO_LEGACY_IMPP(value, SIP_HANDLE, SIP_SLOT, i);
}
}
}
i = i - 1;
}
// Remove labels which are no longer needed (valued moved above,
// stored for a group which has no other properties (Google
// CardDAV server sometimes sends that, editing in Evolution
// might cause it, etc.) or provide no information ("Other").
i = SIZE(LABEL) - 1;
while (i >= 0) {
if (LABEL[i] == "Other" ||
LABEL[i] != UNASSIGNED &&
(GROUP_TAG[i] == EMPTY ||
RELATEDNAMES[i] == UNASSIGNED &&
XDATE[i] == UNASSIGNED &&
TEL[i] == UNASSIGNED &&
EMAIL[i] == UNASSIGNED &&
WEB[i] == UNASSIGNED &&
XDATE[i] == UNASSIGNED &&
IMPP[i] == UNASSIGNED &&
ADR_POBOX[i] == UNASSIGNED &&
ADR_ADDTL[i] == UNASSIGNED &&
ADR_STREET[i] == UNASSIGNED &&
ADR_CITY[i] == UNASSIGNED &&
ADR_REG[i] == UNASSIGNED &&
ADR_ZIP[i] == UNASSIGNED &&
ADR_COUNTRY[i] == UNASSIGNED &&
ADR_STREET_FLAGS[i] == UNASSIGNED)) {
LABEL[i] = UNASSIGNED;
}
i = i - 1;
}
// Remove all group tags. Not used for legacy formats.
GROUP_TAG = UNASSIGNED;
]]></macro>
<!-- The legacy->modern conversion ignores empty property values
because we would not encode them as empty
IMPP/X-ABDATE/X-ABRELATEDNAMES values anyway
(<noemptyproperties>), leaving us with just the redundant labels.
-->
<!-- X-SPOUSE/MANAGER/ASSISTANT -> special X-ABRELATEDNAMES -->
<macro name="VCARD_LEGACY_TO_MODERN_RELATEDNAMES"><![CDATA[
if ($1 != EMPTY) {
// STRING tag;
INTEGER num;
num = SIZE(LABEL);
// $NEWTAG(tag, GROUP_TAG);
SWAP(RELATEDNAMES[num], $1);
LABEL[num] = $2;
// GROUP_TAG[num] = tag;
// $1 = UNASSIGNED;
}
]]></macro>
<!-- X-JABBER/AIM/... -> IMPP -->
<macro name="VCARD_LEGACY_TO_MODERN_IMPP"><![CDATA[
INTEGER impp_index;
impp_index = SIZE($3) - 1;
while (impp_index >= 0) {
if ($3[impp_index] != EMPTY) {
INTEGER num;
num = SIZE(LABEL);
IMPP[num] = $2 + ":" + URLENCODE($3[impp_index]);
$3[impp_index] = UNASSIGNED;
SWAP($4[impp_index], IMPP_SLOT[num]);
IMPP_SERVICE[num] = $1;
LABEL[num] = "Other";
}
impp_index = impp_index - 1;
}
]]></macro>
<!-- convert from X- fields to IMPP, ANNIVERSARY to DATE, etc. -->
<macro name="VCARD_LEGACY_TO_MODERN"><![CDATA[
if (ANNIVERSARY != EMPTY) {
INTEGER i;
i = SIZE(LABEL);
// STRING tag;
// $NEWTAG(tag, GROUP_TAG);
SWAP(XDATE[i], ANNIVERSARY);
LABEL[i] = "Anniversary";
// GROUP_TAG[i] = tag;
// ANNIVERSARY = UNASSIGNED;
}
$VCARD_LEGACY_TO_MODERN_RELATEDNAMES(SPOUSE, "Spouse");
$VCARD_LEGACY_TO_MODERN_RELATEDNAMES(MANAGER, "Manager");
$VCARD_LEGACY_TO_MODERN_RELATEDNAMES(ASSISTANT, "Assistant");
$VCARD_LEGACY_TO_MODERN_IMPP("AIM", "aim", AIM_HANDLE, AIM_SLOT);
$VCARD_LEGACY_TO_MODERN_IMPP("Gadugadu", "x-apple", GADUGADU_HANDLE, GADUGADU_SLOT); // ???
$VCARD_LEGACY_TO_MODERN_IMPP("Groupwise", "x-apple", GROUPWISE_HANDLE, GROUPWISE_SLOT); // ???
$VCARD_LEGACY_TO_MODERN_IMPP("ICQ", "aim", ICQ_HANDLE, ICQ_SLOT);
$VCARD_LEGACY_TO_MODERN_IMPP("Jabber", "xmpp", JABBER_HANDLE, JABBER_SLOT);
$VCARD_LEGACY_TO_MODERN_IMPP("MSN", "msnim", MSN_HANDLE, MSN_SLOT);
$VCARD_LEGACY_TO_MODERN_IMPP("Yahoo", "ymsgr", YAHOO_HANDLE, YAHOO_SLOT);
$VCARD_LEGACY_TO_MODERN_IMPP("Skype", "skype", SKYPE_HANDLE, SKYPE_SLOT);
$VCARD_LEGACY_TO_MODERN_IMPP("Sip", "x-apple", SIP_HANDLE, SIP_SLOT); // ???
// $VCARD_LEGACY_TO_MODERN_IMPP("???", "???", IM_ADDRESS);
// $VCARD_LEGACY_TO_MODERN_IMPP("???", "???", MEANWHILE_HANDLE, MEANWHILE_SLOT);
// $VCARD_LEGACY_TO_MODERN_IMPP("??", "???", SMS_HANDLE, SMS_SLOT);
// Create group tags for all labels. Without them the label won't be
// associated with the corresponding property in the modern vCard.
INTEGER i;
i = SIZE(LABEL) - 1;
// Reset GROUP_TAG. It might contain obsolete tags after
// a read/modify cycle.
GROUP_TAG = EMPTY;
// We don't use group tags internally, so we can simply enumerate them
// here.
INTEGER tagnum;
tagnum = 1;
while (i >= 0) {
if (LABEL[i] != EMPTY) {
GROUP_TAG[i] = "item" + tagnum;
tagnum = tagnum + 1;
}
i = i - 1;
}
]]></macro>
<macro name="VCARD_BEFOREWRITE_SCRIPT_WEBDAV"><![CDATA[
$VCARD_BEFOREWRITE_SCRIPT;
$VCARD_LEGACY_TO_MODERN;
]]></macro>
<macro name="VCARD_AFTERREAD_SCRIPT_WEBDAV"><![CDATA[
$VCARD_MODERN_TO_LEGACY;
$VCARD_AFTERREAD_SCRIPT;
]]></macro> <!-- The following email handling scripts are defined as script MACROS because they
are used in multiple <datatype> definitions below. This avoids duplicating these
script's source code in the config file -->
<macro name="EMAIL_INIT_SCRIPT"><![CDATA[
INTEGER ITEMLIMIT;
// default limit is limit of session
ITEMLIMIT = SIZELIMIT();
]]></macro>
<macro name="EMAIL_PROCESSITEM_SCRIPT"><![CDATA[
// pre-process item
if (UPPERCASE(FOLDER)=="INBOX") {
// In any case, prevent adding to inbox (delete remote items instead)
PREVENTADD();
// server always wins for inbox
CONFLICTSTRATEGY("server-wins");
if (SLOWSYNC()) {
// also prevent modifications in server
IGNOREUPDATE();
}
else {
// normal sync items going to inbox from client need special treatment
if (SYNCOP()=="add" || SYNCOP()=="replace") {
// make sure that existing server item will conflict with this item
if (LIMIT!=EMPTY && (LIMIT<0 || LIMIT>SIZELIMIT())) {
// force conflict only if this is a reload
FORCECONFLICT();
}
// make sure we never overwrite a body in the inbox
BODY = UNASSIGNED;
// delete always wins over replace in inbox (to avoid adds to inbox)
DELETEWINS();
}
}
}
else if (UPPERCASE(FOLDER)=="OUTBOX") {
// never try to change something in outbox
IGNOREUPDATE();
if (SYNCOP()!="delete") {
// - date of mail is NOW, set it such that a correct date is written to the DB
MAILDATE = DBNOW();
// MAILDATE = (INTEGER)DBNOW() - TIMEUNITS(120); // %%% backdate it 2 mins to make sure it does not get retransmitted
// - echo item as replace (to force-move it to the sent folder)
ECHOITEM("replace");
}
CONFLICTSTRATEGY("client-wins");
}
else if (UPPERCASE(FOLDER)=="SENT") {
// never try to change something in sent folder
IGNOREUPDATE();
// Server has precedence in case of conflicts
CONFLICTSTRATEGY("server-wins");
// Implement reload capability for sent items as well
if (SLOWSYNC()) {
// do not add new sent items to the server in slowsync
PREVENTADD(); // causes extra sent items on the client to be deleted
}
else {
// make sure that existing server item will conflict with this item
if (SYNCOP()=="replace") {
if (LIMIT!=EMPTY && (LIMIT<0 || LIMIT>SIZELIMIT())) {
// force conflict only if this is a reload
FORCECONFLICT();
REJECTITEM(200); // but do not process the item further
}
else {
// silently ignore other types of changes
REJECTITEM(200);
}
// make sure we never overwrite a body in the sent folder
BODY = UNASSIGNED;
}
}
}
else {
// Other folder
// - silently discard incoming item for other folder than the above
// except if it is a delete
if (SYNCOP()!="delete")
REJECTITEM(0);
}
]]></macro>
<macro name="EMAIL_MERGE_SCRIPT"><![CDATA[
// pre-process item
if (UPPERCASE(LOOSING.FOLDER)!="OUTBOX") {
// non-outbox (especially inbox) needs special merge to accomplish reload feature
// - loosing item is client's, winning is server's
if (LOOSING.LIMIT!=EMPTY) {
// loosing (remote) item specifies a new limit, override winning's default
WINNING.LIMIT=LOOSING.LIMIT;
SETWINNINGCHANGED(TRUE);
}
// make sure winning has right folder
WINNING.FOLDER=LOOSING.FOLDER;
// make sure a set read-flag gets propagated to server
if (LOOSING.ISREAD=="true") WINNING.ISREAD="true";
// merge other fields normally
MERGEFIELDS();
// make sure body does not get re-written to local DB even if merge would cause local update
LOOSING.BODY=UNASSIGNED;
}
else {
// normal merging in other folders
MERGEFIELDS();
}
]]></macro>
<macro name="EMAIL_OUTGOING_SCRIPT"><![CDATA[
// pre-process item
if (UPPERCASE(FOLDER)=="OUTBOX") {
// writing to outbox is always the ECHOITEM
// - cause item to move into "sent" folder
FOLDER = "sent";
if (!SESSIONVAR("retransfer_body")) {
// - prevent body retransfer, but not for dumb P800/P900/M600/P990 clients
BODY = UNASSIGNED; // prevent body transfer
ATT_COUNT = 0; // prevent attachment transfer
ATT_CONTENTS = UNASSIGNED;
// basically, this item is not limited (already complete on the client)
// even if contents are not sent
LIMIT = -1;
SETSIZELIMIT(-1);
}
}
else {
// outgoing item to any folder of of remote (inbox, sent...)
// - limit body to what is set in the LIMIT field
// %%% probably obsolete, as textitem will handle limit field automatically for >=V1.0.8.21
IF (LIMIT==EMPTY)
LIMIT = SIZELIMIT(); // if none set already, use default for this item (=default of datastore, if not SETSIZELIMIT() called before for this item generation)
}
// set limit for item generator
if (LIMIT!=EMPTY)
SETSIZELIMIT(LIMIT);
]]></macro>
<macro name="EMAIL_FILTERINIT_SCRIPT"><![CDATA[
// check if we need to filter
INTEGER NEEDFILTER;
NEEDFILTER =
!DBHANDLESOPTS() && // only if DB cannot handle it
(STARTDATE()!=EMPTY); // and only if a start date is set (end date not needed as there are never future emails today)
SETFILTERALL(NEEDFILTER);
RETURN NEEDFILTER;
]]></macro>
<macro name="EMAIL_FILTER_SCRIPT"><![CDATA[
INTEGER PASSES;
// check if item passes filter
PASSES=FALSE;
// Emails pass if they have a MAILDATE on or later than start date
PASSES = MAILDATE>=STARTDATE();
RETURN PASSES;
]]></macro>
</scripting>
<datatypes> <!-- list of internal fields representing vCard data -->
<fieldlist name="contacts">
<field name="SYNCLVL" type="integer" compare="never"/>
<field name="REV" type="timestamp" compare="never" age="yes"/>
<!-- If we knew that both sides have reliable UID support, we could use
it for pairing. But we don't know that and thus cannot rely on it. -->
<field name="UID" type="string" compare="never"/>
<!-- The group tags used to combine instances of different repeating properties. -->
<field name="GROUP_TAG" array="yes" type="string" compare="never"/>
<!-- 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"/>
<field name="GENDER" 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). BDAY is always used,
ANNIVERSARY only by some profiles. -->
<field name="BDAY" type="date" compare="conflict" merge="fillempty"/>
<field name="ANNIVERSARY" type="date" compare="conflict" merge="fillempty"/>
<!-- Generic storage for special dates, including anniversary. Mapped to X-ABDATE + X-ABLabel. -->
<!-- Beware, don't use "DATE", it conflicts with builtin function name. -->
<field name="XDATE" array="yes" type="date" compare="conflict"/>
<!-- telephone numbers -->
<field name="TEL" array="yes" type="telephone" compare="conflict"/>
<field name="TEL_FLAGS" array="yes" type="integer" compare="conflict"/>
<field name="TEL_SLOT" array="yes" type="integer" compare="never"/>
<!-- emails -->
<field name="EMAIL" array="yes" type="multiline" compare="conflict"/>
<field name="EMAIL_FLAGS" array="yes" type="integer" compare="conflict"/>
<field name="EMAIL_SLOT" array="yes" type="integer" compare="never"/>
<!-- web addresses -->
<field name="WEB" array="yes" type="string" compare="conflict"/>
<field name="WEB_FLAGS" array="yes" type="integer" compare="conflict"/>
<!-- 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"/>
<!-- generic replacement for MANAGER/ASSISTANT/SPOUSE -->
<field name="RELATEDNAMES" 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"/>
<!-- RFC 4770 chat handles, used internally *instead* of the individual handles below. -->
<field name="IMPP" array="yes" type="string" compare="conflict"/> <!-- includes protocol: xmpp:google%20talk -->
<field name="IMPP_SERVICE" array="yes" type="string" compare="conflict"/> <!-- GoogleTalk -->
<field name="IMPP_SLOT" array="yes" type="string" compare="conflict"/> <!-- Evolution UI slot -->
<!-- Individual chat handles: used as temporary storage when exchanging data via legacy profiles. -->
<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"/>
<field name="SKYPE_HANDLE" array="yes" type="string" compare="conflict"/>
<field name="SKYPE_SLOT" array="yes" type="string" compare="conflict"/>
<field name="SIP_HANDLE" array="yes" type="string" compare="conflict"/>
<field name="SIP_SLOT" array="yes" type="string" compare="conflict"/>
<field name="IM_ADDRESS" array="yes" type="string" compare="conflict"/>
<field name="MEANWHILE_HANDLE" array="yes" type="string" compare="conflict"/>
<field name="IRC_HANDLE" array="yes" type="string" compare="conflict"/>
<field name="SMS_HANDLE" 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"/>
<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="string" compare="conflict" merge="fillempty"/>
<field name="PHOTO_TYPE" type="string" compare="never" merge="fillempty"/>
<field name="PHOTO_VALUE" type="string" compare="never" merge="fillempty"/>
<!-- Location -->
<field name="GEO_LAT" type="string" compare="conflict"/>
<field name="GEO_LONG" type="string" compare="conflict"/>
<!-- Crypto fields for KAddressbook -->
<field name="CRYPTOENCRYPTPREF" type="string" compare="conflict"/>
<field name="CRYPTOPROTOPREF" array="yes" type="string" compare="conflict"/>
<field name="CRYPTOSIGNPREF" type="string" compare="conflict"/>
<field name="OPENPGPFP" type="string" compare="conflict"/>
<!-- Custom labels. Mapped to either X-ABProperty via group tag (WebDAV) or X-ABLabel parameter (internal). -->
<field name="LABEL" array="yes" type="string" compare="conflict"/>
<!-- store extensions that don't match any of the other fields -->
<field name="XPROPS" array="yes" type="string" compare="never"/>
</fieldlist>
<!-- vCard profile for Evolution, KDE, SyncML -->
<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" rule="EXTENDED-DATE-FORMAT" mandatory="yes">
<value field="REV" conversion="DATE+EXTFMT"/>
</property>
<property name="REV" rule="other" mandatory="yes">
<value field="REV"/>
</property>
<property name="UID" rule="HAVE-VCARD-UID" showindevinf="no">
<value field="UID"/>
</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>
<!-- FILE_AS not supported by KDE natively, let's use X-EVOLUTION-FILE-AS as extension -->
<property name="X-EVOLUTION-FILE-AS">
<value field="FILE_AS"/>
</property>
<property name="X-GENDER">
<value field="GENDER"/>
</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>
<!-- ORG property for KDE *and* everyone else; KDE *also* uses X-KADDRESSBOOK-X-Office -->
<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="X-KADDRESSBOOK-X-Office" suppressempty="yes" rule="KDE">
<value field="ORG_OFFICE"/>
</property>
<!-- X-KADDRESSBOOK-X-Profession property for KDE, ROLE for everyone else -->
<property name="ROLE" rule="KDE"/>
<property name="ROLE" rule="other">
<value field="ROLE"/>
</property>
<property name="X-KADDRESSBOOK-X-Profession" suppressempty="yes" show="no" rule="KDE">
<value field="ROLE"/>
</property>
<property name="TEL" groupfield="GROUP_TAG">
<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"/>
</value>
</parameter>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no" rule="HAVE-EVOLUTION-UI-SLOT">
<value field="TEL_SLOT"/>
</parameter>
<parameter name="X-ABLabel" rule="HAVE-ABLABEL-PARAMETER" sharedfield="yes">
<value field="LABEL"/>
</parameter>
</property>
<property name="EMAIL" groupfield="GROUP_TAG">
<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"/>
</value>
</parameter>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no" rule="HAVE-EVOLUTION-UI-SLOT">
<value field="EMAIL_SLOT"/>
</parameter>
<parameter name="X-ABLabel" rule="HAVE-ABLABEL-PARAMETER" sharedfield="yes">
<value field="LABEL"/>
</parameter>
</property>
<property name="URL" groupfield="GROUP_TAG">
<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"/>
</value>
</parameter>
<parameter name="X-ABLabel" rule="HAVE-ABLABEL-PARAMETER" sharedfield="yes">
<value field="LABEL"/>
</parameter>
</property>
<property name="CALURI" suppressempty="yes">
<value field="CALURI"/>
</property>
<property name="FBURL" suppressempty="yes">
<value field="FBURL"/>
</property>
<!-- X-EVOLUTION-BLOG-URL property for everyone except KDE -->
<property name="X-EVOLUTION-BLOG-URL" suppressempty="yes" rule="KDE"/>
<property name="X-EVOLUTION-BLOG-URL" suppressempty="yes" rule="other">
<value field="BLOGURL"/>
</property>
<!-- the KDE way of expressing BLOGURL -->
<property name="X-KADDRESSBOOK-BlogFeed" suppressempty="yes" show="no" rule="KDE">
<value field="BLOGURL"/>
</property>
<!-- VIDEOURL not supported by KDE natively, let's use X-EVOLUTION-VIDEO-URL as extension -->
<property name="X-EVOLUTION-VIDEO-URL" suppressempty="yes" rule="other">
<value field="VIDEOURL"/>
</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.
item to/from KDE: the X-EVOLUTION extensions are disabled,
only exchanged via KDE-only extensions
-->
<property name="X-EVOLUTION-MANAGER" suppressempty="yes" delayedparsing="1" rule="KDE"/> <!-- disable X-EVOLUTION-MANAGER for KDE -->
<property name="X-EVOLUTION-MANAGER" suppressempty="yes" delayedparsing="1" rule="other">
<value field="MANAGER"/>
</property>
<property name="X-MANAGER" suppressempty="yes" rule="EVOLUTION"/> <!-- disables the X-MANAGER for EVOLUTION -->
<property name="X-MANAGER" suppressempty="yes" rule="KDE"/> <!-- disables the X-MANAGER for KDE -->
<property name="X-MANAGER" suppressempty="yes" rule="other">
<value field="MANAGER"/>
</property>
<property name="X-KADDRESSBOOK-X-ManagersName" suppressempty="yes" show="no" rule="KDE">
<value field="MANAGER"/>
</property>
<property name="X-EVOLUTION-ASSISTANT" suppressempty="yes" delayedparsing="1" rule="KDE"/>
<property name="X-EVOLUTION-ASSISTANT" suppressempty="yes" delayedparsing="1" rule="other">
<value field="ASSISTANT"/>
</property>
<property name="X-ASSISTANT" suppressempty="yes" rule="EVOLUTION"/>
<property name="X-ASSISTANT" suppressempty="yes" rule="KDE"/>
<property name="X-ASSISTANT" suppressempty="yes" rule="other">
<value field="ASSISTANT"/>
</property>
<property name="X-KADDRESSBOOK-X-AssistantsName" suppressempty="yes" show="no" rule="KDE">
<value field="ASSISTANT"/>
</property>
<property name="X-ABRELATEDNAMES" suppressempty="yes" groupfield="GROUP_TAG">
<value field="RELATEDNAMES"/>
<position field="RELATEDNAMES" repeat="array" increment="1" minshow="0"/>
<parameter name="X-ABLabel" rule="HAVE-ABLABEL-PARAMETER" sharedfield="yes">
<value field="LABEL"/>
</parameter>
</property>
<property name="X-EVOLUTION-SPOUSE" suppressempty="yes" delayedparsing="1" rule ="KDE"/>
<property name="X-EVOLUTION-SPOUSE" suppressempty="yes" delayedparsing="1" rule ="other">
<value field="SPOUSE" show="yes"/>
</property>
<property name="X-SPOUSE" suppressempty="yes" rule="EVOLUTION"/>
<property name="X-SPOUSE" suppressempty="yes" rule="KDE"/>
<property name="X-SPOUSE" suppressempty="yes" rule="other">
<value field="SPOUSE"/>
</property>
<property name="X-KADDRESSBOOK-X-SpousesName" suppressempty="yes" show="no" rule="KDE">
<value field="SPOUSE"/>
</property>
<property name="X-EVOLUTION-ANNIVERSARY" suppressempty="yes" delayedparsing="1" rule="KDE"/>
<property name="X-EVOLUTION-ANNIVERSARY" suppressempty="yes" delayedparsing="1" rule="other">
<value field="ANNIVERSARY"/>
</property>
<property name="X-ANNIVERSARY" suppressempty="yes" rule="EVOLUTION"/>
<property name="X-ANNIVERSARY" suppressempty="yes" rule="KDE"/>
<property name="X-ANNIVERSARY" suppressempty="yes" rule="other">
<value field="ANNIVERSARY"/>
</property>
<property name="X-KADDRESSBOOK-X-Anniversary" suppressempty="yes" show="no" rule="KDE">
<value field="ANNIVERSARY"/>
</property>
<property name="X-ABDATE" suppressempty="yes" groupfield="GROUP_TAG">
<value field="XDATE" conversion="DATE+EXTFMT"/>
<position field="XDATE" repeat="array" increment="1" minshow="0"/>
<parameter name="X-ABLabel" rule="HAVE-ABLABEL-PARAMETER" sharedfield="yes">
<value field="LABEL"/>
</parameter>
</property>
<property name="IMPP" suppressempty="yes" groupfield="GROUP_TAG">
<value field="IMPP"/>
<position field="IMPP" repeat="array" increment="1" minshow="0"/>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no" rule="HAVE-EVOLUTION-UI-SLOT-IN-IMPP">
<value field="IMPP_SLOT"/>
</parameter>
<parameter name="X-SERVICE-TYPE" positional="no" show="no">
<value field="IMPP_SERVICE"/>
</parameter>
<parameter name="X-ABLabel" rule="HAVE-ABLABEL-PARAMETER" sharedfield="yes">
<value field="LABEL"/>
</parameter>
</property>
<property name="X-AIM" suppressempty="yes" rule="KDE"/>
<property name="X-AIM" suppressempty="yes" rule="other">
<value field="AIM_HANDLE"/>
<position field="AIM_HANDLE" repeat="array" increment="1" minshow="0"/>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no" rule="HAVE-EVOLUTION-UI-SLOT">
<value field="AIM_SLOT"/>
</parameter>
</property>
<property name="X-messaging/aim-All" suppressempty="yes" show="no" rule="KDE">
<value field="AIM_HANDLE"/>
<position field="AIM_HANDLE" repeat="array" increment="1" minshow="0"/>
</property>
<property name="X-GADUGADU" suppressempty="yes" rule="KDE"/>
<property name="X-GADUGADU" suppressempty="yes" rule="other">
<value field="GADUGADU_HANDLE"/>
<position field="GADUGADU_HANDLE" repeat="array" increment="1" minshow="0"/>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no" rule="HAVE-EVOLUTION-UI-SLOT">
<value field="GADUGADU_SLOT"/>
</parameter>
</property>
<property name="X-messaging/gadu-All" suppressempty="yes" show="no" rule="KDE">
<value field="GADUGADU_HANDLE"/>
<position field="GADUGADU_HANDLE" repeat="array" increment="1" minshow="0"/>
</property>
<property name="X-GROUPWISE" suppressempty="yes" rule="KDE"/>
<property name="X-GROUPWISE" suppressempty="yes" rule="other">
<value field="GROUPWISE_HANDLE"/>
<position field="GROUPWISE_HANDLE" repeat="array" increment="1" minshow="0"/>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no" rule="HAVE-EVOLUTION-UI-SLOT">
<value field="GROUPWISE_SLOT"/>
</parameter>
</property>
<property name="X-messaging/groupwise-All" suppressempty="yes" show="no" rule="KDE">
<value field="GROUPWISE_HANDLE"/>
<position field="GROUPWISE_HANDLE" repeat="array" increment="1" minshow="0"/>
</property>
<property name="X-ICQ" suppressempty="yes" rule="KDE"/>
<property name="X-ICQ" suppressempty="yes" rule="other">
<value field="ICQ_HANDLE"/>
<position field="ICQ_HANDLE" repeat="array" increment="1" minshow="0"/>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no" rule="HAVE-EVOLUTION-UI-SLOT">
<value field="ICQ_SLOT"/>
</parameter>
</property>
<property name="X-messaging/icq-All" suppressempty="yes" show="no" rule="KDE">
<value field="ICQ_HANDLE"/>
<position field="ICQ_HANDLE" repeat="array" increment="1" minshow="0"/>
</property>
<property name="X-JABBER" suppressempty="yes" rule="KDE"/>
<property name="X-JABBER" suppressempty="yes" rule="other">
<value field="JABBER_HANDLE"/>
<position field="JABBER_HANDLE" repeat="array" increment="1" minshow="0"/>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
<value field="JABBER_SLOT"/>
</parameter>
</property>
<property name="X-messaging/xmpp-All" suppressempty="yes" show="no" rule="KDE">
<value field="JABBER_HANDLE"/>
<position field="JABBER_HANDLE" repeat="array" increment="1" minshow="0"/>
</property>
<property name="X-MSN" suppressempty="yes" rule="KDE"/>
<property name="X-MSN" suppressempty="yes" rule="other">
<value field="MSN_HANDLE"/>
<position field="MSN_HANDLE" repeat="array" increment="1" minshow="0"/>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no" rule="HAVE-EVOLUTION-UI-SLOT">
<value field="MSN_SLOT"/>
</parameter>
</property>
<property name="X-messaging/msn-All" suppressempty="yes" show="no" rule="KDE">
<value field="MSN_HANDLE"/>
<position field="MSN_HANDLE" repeat="array" increment="1" minshow="0"/>
</property>
<property name="X-YAHOO" suppressempty="yes" rule="KDE"/>
<property name="X-YAHOO" suppressempty="yes" rule="other">
<value field="YAHOO_HANDLE"/>
<position field="YAHOO_HANDLE" repeat="array" increment="1" minshow="0"/>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no" rule="HAVE-EVOLUTION-UI-SLOT">
<value field="YAHOO_SLOT"/>
</parameter>
</property>
<property name="X-messaging/yahoo-All" suppressempty="yes" show="no" rule="KDE">
<value field="YAHOO_HANDLE"/>
<position field="YAHOO_HANDLE" repeat="array" increment="1" minshow="0"/>
</property>
<property name="X-SKYPE" suppressempty="yes" rule="KDE"/>
<property name="X-SKYPE" suppressempty="yes" rule="other">
<value field="SKYPE_HANDLE"/>
<position field="SKYPE_HANDLE" repeat="array" increment="1" minshow="0"/>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no" rule="HAVE-EVOLUTION-UI-SLOT">
<value field="SKYPE_SLOT"/>
</parameter>
</property>
<property name="X-messaging/skype-All" suppressempty="yes" show="no" rule="KDE">
<value field="SKYPE_HANDLE"/>
<position field="SKYPE_HANDLE" repeat="array" increment="1" minshow="0"/>
</property>
<!-- No X-messaging/sip-All in KDE?! Then let's use X-SIP for everyone. -->
<property name="X-SIP" suppressempty="yes">
<value field="SIP_HANDLE"/>
<position field="SIP_HANDLE" repeat="array" increment="1" minshow="0"/>
<parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no" rule="HAVE-EVOLUTION-UI-SLOT">
<value field="SIP_SLOT"/>
</parameter>
</property>
<!--
KDE way of expressing certain extensions that have no
other representations externally. Let's use the same
representation as in KDE for everyone else.
-->
<property name="X-messaging/irc-All" suppressempty="yes">
<value field="IRC_HANDLE"/>
<position field="IRC_HANDLE" repeat="array" increment="1" minshow="0"/>
</property>
<property name="X-messaging/meanwhile-All" suppressempty="yes">
<value field="MEANWHILE_HANDLE"/>
<position field="MEANWHILE_HANDLE" repeat="array" increment="1" minshow="0"/>
</property>
<property name="X-messaging/sms-All" suppressempty="yes">
<value field="SMS_HANDLE"/>
<position field="SMS_HANDLE" repeat="array" increment="1" minshow="0"/>
</property>
<property name="X-KADDRESSBOOK-CRYPTOENCRYPTPREF" suppressempty="yes">
<value field="CRYPTOENCRYPTPREF"/>
</property>
<property name="X-KADDRESSBOOK-CRYPTOPROTOPREF" suppressempty="yes">
<value field="CRYPTOPROTOPREF"/>
</property>
<property name="X-KADDRESSBOOK-CRYPTOSIGNPREF" suppressempty="yes">
<value field="CRYPTOSIGNPREF"/>
</property>
<property name="X-KADDRESSBOOK-OPENPGPFP" suppressempty="yes">
<value field="OPENPGPFP"/>
</property>
<property name="X-KADDRESSBOOK-X-IMAddress" suppressempty="yes">
<value field="IM_ADDRESS"/>
</property>
<property name="X-MOZILLA-HTML">
<value field="WANTS_HTML"/>
</property>
<property name="ADR" values="7" groupfield="GROUP_TAG">
<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 -->
</value>
</parameter>
<parameter name="X-ABLabel" rule="HAVE-ABLABEL-PARAMETER" sharedfield="yes">
<value field="LABEL"/>
</parameter>
</property>
<property name="BDAY" rule="EXTENDED-DATE-FORMAT">
<value field="BDAY" conversion="DATE+EXTFMT"/>
</property>
<property name="BDAY" rule="other">
<value field="BDAY"/>
</property>
<property name="NOTE" filter="no">
<value field="NOTE"/>
</property>
<property name="PHOTO" filter="no">
<value field="PHOTO" conversion="BLOB_AUTO"/>
<parameter name="TYPE" default="no" show="yes">
<value field="PHOTO_TYPE"/>
</parameter>
<parameter name="VALUE" default="no" show="yes">
<value field="PHOTO_VALUE"/>
</parameter>
</property>
<property name="GEO" values="2">
<value index="0" field="GEO_LAT"/>
<value index="1" field="GEO_LONG"/>
</property>
<!-- Label assigned to any of the repeating properties. -->
<property name="X-ABLabel" suppressempty="yes" groupfield="GROUP_TAG" rule="HAVE-ABLABEL-PROPERTY">
<value field="LABEL" repeat="array" increment="1" minshow="0"/>
<position field="LABEL" repeat="array" increment="1" minshow="1"/>
</property>
<property name="X-*" suppressempty="yes" show="false">
<value field="XPROPS"/>
<position field="XPROPS" repeat="array" increment="1" minshow="0"/>
</property>
</profile>
</mimeprofile>
<!-- vCard 2.1 datatype, using vCard profile defined above -->
<datatype name="vCard21" basetype="vcard">
<version>2.1</version>
<use mimeprofile="vCard"/>
<incomingscript><![CDATA[
$VCARD_INCOMING_NAMECHANGE_SCRIPT
$VCARD_INCOMING_PHOTO_VALUE_SCRIPT
$VCARD_INCOMING_PHOTO_TYPE_SCRIPT
]]></incomingscript>
<outgoingscript><![CDATA[
$VCARD_OUTGOING_ADDREV_SCRIPT
$VCARD_OUTGOING_PHOTO_INLINING_SCRIPT
$VCARD_OUTGOING_PHOTO_VALUE_SCRIPT
$VCARD_OUTGOING_EMAILTYPE_SCRIPT
]]></outgoingscript>
<mergescript><![CDATA[
$VCARD_MERGESCRIPT
]]></mergescript>
</datatype>
<!-- vCard 3.0 datatype, using vCard profile defined above -->
<datatype name="vCard30" basetype="vcard">
<version>3.0</version>
<use mimeprofile="vCard"/>
<incomingscript><![CDATA[
$VCARD_INCOMING_NAMECHANGE_SCRIPT
$VCARD_INCOMING_PHOTO_VALUE_SCRIPT
$VCARD_INCOMING_PHOTO_TYPE_SCRIPT
]]></incomingscript>
<outgoingscript><![CDATA[
$VCARD_OUTGOING_ADDREV_SCRIPT
$VCARD_OUTGOING_PHOTO_INLINING_SCRIPT
$VCARD_OUTGOING_PHOTO_VALUE_SCRIPT
$VCARD_OUTGOING_EMAILTYPE_SCRIPT
]]></outgoingscript>
<mergescript><![CDATA[
$VCARD_MERGESCRIPT
]]></mergescript>
</datatype>
<!-- vCard 2.1 datatype for use in EDS backend - same as above plus EDS corrections -->
<datatype name="vCard21EDS" basetype="vcard">
<version>2.1</version>
<use mimeprofile="vCard"/>
<incomingscript><![CDATA[
$VCARD_INCOMING_NAMECHANGE_SCRIPT
$VCARD_INCOMING_PHOTO_VALUE_SCRIPT
$VCARD_INCOMING_PHOTO_TYPE_SCRIPT
$VCARD_BEFOREWRITE_SCRIPT_EVOLUTION
]]></incomingscript>
<outgoingscript><![CDATA[
$VCARD_OUTGOING_ADDREV_SCRIPT
$VCARD_OUTGOING_PHOTO_INLINING_SCRIPT
$VCARD_OUTGOING_PHOTO_VALUE_SCRIPT
$VCARD_OUTGOING_EMAILTYPE_SCRIPT
]]></outgoingscript>
<mergescript><![CDATA[
$VCARD_MERGESCRIPT
]]></mergescript>
</datatype>
<!-- vCard 3.0 datatype, using vCard profile defined above and special merge script -->
<datatype name="vCard30EDS" basetype="vcard">
<version>3.0</version>
<use mimeprofile="vCard"/>
<incomingscript><![CDATA[
$VCARD_INCOMING_NAMECHANGE_SCRIPT
$VCARD_INCOMING_PHOTO_VALUE_SCRIPT
$VCARD_INCOMING_PHOTO_TYPE_SCRIPT
$VCARD_BEFOREWRITE_SCRIPT_EVOLUTION
]]></incomingscript>
<outgoingscript><![CDATA[
$VCARD_OUTGOING_ADDREV_SCRIPT
$VCARD_OUTGOING_PHOTO_INLINING_SCRIPT
$VCARD_OUTGOING_PHOTO_VALUE_SCRIPT
$VCARD_OUTGOING_EMAILTYPE_SCRIPT
]]></outgoingscript>
<mergescript><![CDATA[
$VCARD_MERGESCRIPT
]]></mergescript>
</datatype>
<!-- common field list for events and todos (both represented by vCalendar/iCalendar) -->
<fieldlist name="calendar">
<field name="SYNCLVL" type="integer" compare="never"/>
<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" merge="fillempty"/>
<!-- 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="never" merge="fillempty"/>
<!-- non-standard -->
<field name="PARENT_UID" type="string" compare="never"/>
<!-- for events -->
<field name="EXDATES" array="yes" type="timestamp" compare="never"/>
<!-- EXDATEs for detached recurrences: meant to be used for the
RECURRENCE-IDs of all detached recurrences.
Can be ignored when dealing with only iCalendar 2.0 aware
peers, because these EXDATEs are implied for detached
recurrences and don't have to be specified explicitly. Can
be used to create additional EXDATEs for non-iCalendar 2.0
peers. For that, EXDATES_DETACHED must be populated by the
backend creating the parent event, because the engine
itself doesn't have the necessary
information. X-SYNCEVOLUTION-EXDATE-DETACHED can be used
for that in serialized calendar events. -->
<field name="EXDATES_DETACHED" 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 tasks -->
<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. -->
<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 rule='needsTZinVEVENT' name="TZ" filter="false" suppressempty="yes">
<value field="DTSTART" conversion="tz"/>
</property>
<property name="STATUS" suppressempty="yes" onlyformode="old">
<value field="STATUS" conversion="emptyonly">
<enum name="COMPLETED" value="0"/>
<enum mode="defaultvalue" value="1"/> <!-- catch unknown, but also non-conformant NEEDS_ACTION -->
<enum name="NEEDS ACTION" value="1"/>
<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="FINAL" value="11"/>
</value>
</property>
<property name="STATUS" suppressempty="yes" onlyformode="standard">
<value field="STATUS" conversion="emptyonly">
<enum name="CANCELLED" value="3"/>
<enum name="TENTATIVE" value="5"/>
<enum name="CONFIRMED" value="9"/>
</value>
</property>
<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. -->
<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. -->
<!-- The simplified version of EXDATE is needed by the Maemo Calendar backend
because the calendar storage doesn't parse EXDATE;TZID=...: -->
<property name="EXDATE" values="expandedlist" suppressempty="yes" onlyformode="standard" delayedparsing="1" valueseparator="," altvalueseparator=";" rule="SIMPLE-EXDATE">
<value field="EXDATES"/>
<position field="EXDATES" repeat="array" increment="1" minshow="0"/>
</property>
<property name="EXDATE" values="expandedlist" suppressempty="yes" onlyformode="standard" delayedparsing="1" valueseparator="," altvalueseparator=";" rule="other">
<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>
<parameter name="VALUE" default="no" show="yes">
<value field="EXDATES" conversion="VALUETYPE"/>
</parameter>
</property>
<property name="EXDATE" values="list" suppressempty="yes" onlyformode="old" delayedparsing="1" valueseparator=";" altvalueseparator=",">
<value field="EXDATES" conversion="autodate"/>
<position field="EXDATES" repeat="array" increment="1" minshow="0"/>
</property>
<!-- parse X-SYNCEVOLUTION-EXDATE-DETACHED, but never encode it like this except internally -->
<property name="X-SYNCEVOLUTION-EXDATE-DETACHED" delayedparsing="1" mandatory="no"
show="no" rule="HAVE-SYNCEVOLUTION-EXDATE-DETACHED">
<value field="EXDATES_DETACHED"/>
<parameter name="TZID" default="no" show="yes">
<value field="EXDATES_DETACHED" conversion="TZID"/>
</parameter>
<position field="EXDATES_DETACHED" repeat="array" increment="1" minshow="0"/>
</property>
<!-- encode as normal EXDATE when backend asks for it -->
<property name="EXDATE" show="no" rule="HAVE-EXDATE-DETACHED" mandatory="no">
<value field="EXDATES_DETACHED"/>
<parameter name="TZID" default="no" show="yes">
<value field="EXDATES_DETACHED" conversion="TZID"/>
</parameter>
<position field="EXDATES_DETACHED" repeat="array" increment="1" minshow="0"/>
</property>
<!-- encode as EXDATE without TZID when backend asks for it -->
<property name="EXDATE" show="no" rule="HAVE-EXDATE-DETACHED-NO-TZID" mandatory="no">
<value field="EXDATES_DETACHED"/>
<position field="EXDATES_DETACHED" 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>
<!-- sub-profile for journal: recurrences are allowed by the standard, but
intentionally not supported here -->
<subprofile name="VJOURNAL" nummandatory="1" showifselectedonly="yes" field="ISEVENT" value="2">
<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 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. -->
<property name="DESCRIPTION" suppressempty="yes" mandatory="no">
<value field="DESCRIPTION"/>
</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="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 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>
</profile>
</mimeprofile>
<textprofile name="JournalText" fieldlist="calendar">
<linemap field="SUMMARY">
<numlines>1</numlines>
<inheader>false</inheader>
<allowempty>true</allowempty>
<filterkeyword>SUMMARY</filterkeyword>
</linemap>
<linemap field="DESCRIPTION">
<numlines>0</numlines>
<inheader>false</inheader>
<allowempty>true</allowempty>
</linemap>
</textprofile>
<!-- 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>
<comparescript><![CDATA[
$VCALENDAR_COMPARE_SCRIPT
]]></comparescript>
</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>
<comparescript><![CDATA[
$VCALENDAR_COMPARE_SCRIPT
]]></comparescript>
</datatype>
<datatype name="journaltext10" basetype="text">
<use profile="JournalText"/>
<typestring>text/plain</typestring>
<versionstring>1.0</versionstring>
<incomingscript><![CDATA[
$MEMO_INCOMING_SCRIPT
]]></incomingscript>
<outgoingscript><![CDATA[
$MEMO_OUTGOING_SCRIPT
]]></outgoingscript>
</datatype>
<datatype name="journaltext11" basetype="text">
<use profile="JournalText"/>
<typestring>text/plain</typestring>
<versionstring>1.1</versionstring>
<incomingscript><![CDATA[
$MEMO_INCOMING_SCRIPT
]]></incomingscript>
<outgoingscript><![CDATA[
$MEMO_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 -->
<!-- inherit CATEGORIES from vCard 3.0, i.e. comma separated -->
<property name="CATEGORIES" values="list" valueseparator="," altvalueseparator=";">
<value field="CATEGORIES" combine=","/>
</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>
<!-- list of internal fields representing email data -->
<fieldlist name="email">
<field name="SYNCLVL" type="integer" compare="never"/>
<field name="MODIFIED" type="timestamp" compare="never" age="yes"/>
<field name="SENDER" type="multiline" compare="always"/>
<field name="RECEIVER" type="multiline" compare="always"/>
<field name="CARBONCOPY" type="multiline" compare="always"/>
<field name="BLINDCARBONCOPY" type="multiline" compare="always"/>
<field name="REPLY_TO" type="multiline" compare="never"/>
<field name="SUBJECT" type="multiline" compare="always"/>
<field name="PRIORITY" type="integer" compare="never"/>
<field name="MAILDATE" type="timestamp" compare="never"/>
<field name="STATUS" type="string" compare="never"/>
<field name="FOLDER" type="string" compare="conflict"/>
<field name="ISREAD" type="string" compare="never"/>
<field name="LIMIT" type="integer" compare="never"/>
<field name="BODY" type="multiline" compare="never"/>
<field name="ATT_COUNT" type="integer" compare="never"/>
<field name="ATT_NAMES" array="yes" type="string" compare="never"/>
<field name="ATT_MIMETYPES" array="yes" type="string" compare="never"/>
<field name="ATT_SIZES" array="yes" type="integer" compare="never"/>
<field name="ATT_CONTENTS" array="yes" type="blob" compare="never"/>
</fieldlist>
<!-- list of internal fields representing plain text note data -->
<fieldlist name="Raw">
<field name="ITEMDATA" type="string" compare="always"/>
</fieldlist>
<!-- this is the text profile used to generate and decode RFC2822/MIME-Multipart
email messages. -->
<textprofile name="rfc2822_email" fieldlist="email">
<mimemail>true</mimemail>
<!-- attachment configuration -->
<maxattachments>100</maxattachments>
<attachmentcountfield>ATT_COUNT</attachmentcountfield>
<attachmentmimetypesfield>ATT_MIMETYPES</attachmentmimetypesfield>
<attachmentsfield>ATT_CONTENTS</attachmentsfield>
<attachmentsizesfield>ATT_SIZES</attachmentsizesfield>
<attachmentnamesfield>ATT_NAMES</attachmentnamesfield>
<sizelimitfield>LIMIT</sizelimitfield>
<linemap field="SENDER">
<headertag>From:</headertag>
<valuetype>rfc2047</valuetype>
<inheader>true</inheader>
<filterkeyword>FROM</filterkeyword>
</linemap>
<linemap field="RECEIVER">
<headertag>To:</headertag>
<valuetype>rfc2047</valuetype>
<inheader>true</inheader>
<filterkeyword>TO</filterkeyword>
</linemap>
<linemap field="CARBONCOPY">
<headertag>Cc:</headertag>
<valuetype>rfc2047</valuetype>
<inheader>true</inheader>
<filterkeyword>CC</filterkeyword>
</linemap>
<linemap field="BLINDCARBONCOPY">
<headertag>Bcc:</headertag>
<valuetype>rfc2047</valuetype>
<inheader>true</inheader>
<filterkeyword>BCC</filterkeyword>
</linemap>
<linemap field="REPLY_TO">
<headertag>Reply-To:</headertag>
<valuetype>rfc2047</valuetype>
<inheader>true</inheader>
</linemap>
<linemap field="SUBJECT">
<headertag>Subject:</headertag>
<valuetype>rfc2047</valuetype>
<inheader>true</inheader>
<filterkeyword>SUBJECT</filterkeyword>
</linemap>
<linemap field="PRIORITY">
<headertag>X-Priority:</headertag>
<inheader>true</inheader>
</linemap>
<linemap field="MAILDATE">
<valuetype>date</valuetype>
<headertag>Date:</headertag>
<inheader>true</inheader>
</linemap>
<linemap field="STATUS">
<headertag>Status:</headertag>
<inheader>true</inheader>
</linemap>
<linemap field="FOLDER">
<headertag>X-Sync-Parent-Folder:</headertag>
<inheader>true</inheader>
</linemap>
<linemap field="ISREAD">
<headertag>X-Sync-Message-Read:</headertag>
<inheader>true</inheader>
</linemap>
<linemap field="MODIFIED">
<!-- note that this is a ISO8601 date -->
<headertag>X-Sync-Lastmodified:</headertag>
<inheader>true</inheader>
</linemap>
<linemap field="BODY">
<valuetype>body</valuetype>
<numlines>0</numlines>
<inheader>false</inheader>
<allowempty>true</allowempty>
</linemap>
</textprofile>
<datatype name="raw-vcard" basetype="raw">
<use fieldlist="Raw"/>
<typestring>text/vcard</typestring>
<versionstring>3.0</versionstring>
</datatype>
<datatype name="raw-calendar" basetype="raw">
<use fieldlist="Raw"/>
<typestring>text/calendar</typestring>
<versionstring>2.0</versionstring>
</datatype>
<!-- Note: This is a proprietary extension datatype for Synthesis AG Windows Mobile SyncML clients.
This format is a compressed form of the standard RFC2822 format. For one, the entire data
is compressed using the zip algorithm (<zippedbindata>), and secondly attachments are included
in binary form in the RFC2822 data stream rather than bandwidth wasting B64, adding a
"Content-Length:" header for each MIME part (<binaryparts>). -->
<datatype name="email_zipbin" basetype="text">
<use profile="rfc2822_email"/>
<typestring>application/x-zip-message</typestring> <!-- our own private zipped binary optimized format -->
<versionstring>1.1</versionstring>
<binaryparts>yes</binaryparts>
<zippedbindata>yes</zippedbindata>
<zipcompressionlevel>9</zipcompressionlevel> <!-- -1=default, 0=no compression, 1=fast & least effective ... 9=slow and most effective -->
<initscript><![CDATA[
$EMAIL_INIT_SCRIPT
]]></initscript>
<processitemscript><![CDATA[
$EMAIL_PROCESSITEM_SCRIPT
]]></processitemscript>
<mergescript><![CDATA[
$EMAIL_MERGE_SCRIPT
]]></mergescript>
<outgoingscript><![CDATA[
$EMAIL_OUTGOING_SCRIPT
]]></outgoingscript>
<filterinitscript><![CDATA[
$EMAIL_FILTERINIT_SCRIPT
]]></filterinitscript>
<filterscript><![CDATA[
$EMAIL_FILTER_SCRIPT
]]></filterscript>
</datatype>
<datatype name="email" basetype="text">
<use profile="rfc2822_email"/>
<typestring>text/message</typestring> <!-- this is P800-like -->
<versionstring>1.0</versionstring>
<initscript><![CDATA[
$EMAIL_INIT_SCRIPT
]]></initscript>
<processitemscript><![CDATA[
$EMAIL_PROCESSITEM_SCRIPT
]]></processitemscript>
<mergescript><![CDATA[
$EMAIL_MERGE_SCRIPT
]]></mergescript>
<outgoingscript><![CDATA[
$EMAIL_OUTGOING_SCRIPT
]]></outgoingscript>
<filterinitscript><![CDATA[
$EMAIL_FILTERINIT_SCRIPT
]]></filterinitscript>
<filterscript><![CDATA[
$EMAIL_FILTER_SCRIPT
]]></filterscript>
</datatype>
<datatype name="email_sonyericsson" basetype="text">
<use profile="rfc2822_email"/>
<typestring>message/rfc822</typestring> <!-- this is M600i/P990-like -->
<versionstring>1.0</versionstring>
<initscript><![CDATA[
$EMAIL_INIT_SCRIPT
]]></initscript>
<processitemscript><![CDATA[
$EMAIL_PROCESSITEM_SCRIPT
]]></processitemscript>
<mergescript><![CDATA[
$EMAIL_MERGE_SCRIPT
]]></mergescript>
<outgoingscript><![CDATA[
$EMAIL_OUTGOING_SCRIPT
]]></outgoingscript>
<filterinitscript><![CDATA[
$EMAIL_FILTERINIT_SCRIPT
]]></filterinitscript>
<filterscript><![CDATA[
$EMAIL_FILTER_SCRIPT
]]></filterscript>
</datatype>
<datatype name="email_nokia9500" basetype="text">
<use profile="rfc2822_email"/>
<typestring>message/x-rfc822</typestring> <!-- this is Nokia 9500/9300-like -->
<versionstring>1.0</versionstring>
<initscript><![CDATA[
INTEGER ITEMLIMIT;
// default limit is limit of session
ITEMLIMIT = SIZELIMIT();
]]></initscript>
<processitemscript><![CDATA[
INTEGER n;
// For Nokia Email, we must derive folder ID from source LocURI
// which has form "./somestrangenumber/folder/itemid"
// where folder can be "Inbox" or "Outbox"
if (FIND(REMOTEID(),"Inbox",0)!=UNASSIGNED) {
FOLDER="INBOX";
}
else if (FIND(REMOTEID(),"Outbox",0)!=UNASSIGNED) {
FOLDER="OUTBOX";
}
// pre-process item
if (UPPERCASE(FOLDER)=="INBOX") {
// In any case, prevent adding to inbox (delete remote items instead)
PREVENTADD();
// server always wins for inbox
CONFLICTSTRATEGY("server-wins");
if (SLOWSYNC()) {
// also prevent modifications in server
IGNOREUPDATE();
}
else {
// normal sync items going to inbox from client need special treatment
if (SYNCOP()=="add" || SYNCOP()=="replace") {
// make sure that existing server item will conflict with this item
if (LIMIT!=EMPTY && (LIMIT<0 || LIMIT>SIZELIMIT())) {
// force conflict only if this is a reload
FORCECONFLICT();
}
// make sure we never overwrite a body in the inbox
BODY = UNASSIGNED;
// delete always wins over replace in inbox (to avoid adds to inbox)
DELETEWINS();
}
}
}
else if (UPPERCASE(FOLDER)=="OUTBOX") {
// never try to change something in outbox
IGNOREUPDATE();
if (SYNCOP()!="delete") {
// - date of mail is NOW, set it such that a correct date is written to the DB
MAILDATE = DBNOW();
// MAILDATE = (INTEGER)DBNOW() - TIMEUNITS(120); // %%% backdate it 2 mins to make sure it does not get retransmitted
// - echo item as delete (this causes that it is moved to the "sent" folder in the 9500)
ECHOITEM("delete");
}
CONFLICTSTRATEGY("client-wins");
}
else {
// Other folder
// - silently discard incoming item for other folder than the above
// except if it is a delete
if (SYNCOP()!="delete")
REJECTITEM(0);
}
]]></processitemscript>
<mergescript><![CDATA[
// pre-process item
if (UPPERCASE(LOOSING.FOLDER)!="OUTBOX") {
// non-outbox (especially inbox) needs special merge to accomplish reload feature
// - loosing item is client's, winning is server's
if (LOOSING.LIMIT!=EMPTY) {
// loosing (remote) item specifies a new limit, override winning's default
WINNING.LIMIT=LOOSING.LIMIT;
SETWINNINGCHANGED(TRUE);
}
// make sure winning has right folder
WINNING.FOLDER=LOOSING.FOLDER;
// make sure a set read-flag gets propagated to server
if (LOOSING.ISREAD=="true") WINNING.ISREAD="true";
// merge other fields normally
MERGEFIELDS();
// make sure body does not get re-written to local DB even if merge would cause local update
LOOSING.BODY=UNASSIGNED;
}
else {
// normal merging in other folders
MERGEFIELDS();
}
]]></mergescript>
<outgoingscript><![CDATA[
// we can only send to inbox or outbox
// - If we have no remote ID (=add command) prepare special Target item ID
// containing target folder.
if (REMOTEID()==EMPTY) {
if (UPPERCASE(FOLDER)=="INBOX") {
SETREMOTEID(REMOTEDBNAME()+"/Inbox/");
}
else if (UPPERCASE(FOLDER)=="OUTBOX") {
SETREMOTEID(REMOTEDBNAME()+"/Outbox/");
}
}
]]></outgoingscript>
<filterinitscript><![CDATA[
// check if we need to filter
INTEGER NEEDFILTER;
NEEDFILTER =
!DBHANDLESOPTS() && // only if DB cannot handle it
(STARTDATE()!=EMPTY); // and only if a start date is set (end date not needed as there are never future emails today)
SETFILTERALL(NEEDFILTER);
RETURN NEEDFILTER;
]]></filterinitscript>
<filterscript><![CDATA[
INTEGER PASSES;
// check if item passes filter
PASSES=FALSE;
// Filter out anything not for Inbox or Outbox
if (UPPERCASE(FOLDER)!="INBOX" && UPPERCASE(FOLDER)!="OUTBOX") RETURN FALSE;
// Emails pass if they have a MAILDATE on or later than start date
PASSES = MAILDATE>=STARTDATE();
RETURN PASSES;
]]></filterscript>
</datatype>
</datatypes>
<server type='plugin'>
<plugin_module>SyncEvolution</plugin_module>
<plugin_sessionauth>yes</plugin_sessionauth>
<plugin_deviceadmin>yes</plugin_deviceadmin>
<multithread>no</multithread>
<sessioninitscript><![CDATA[
// these variables are possibly modified by rule scripts
TIMESTAMP mindate; // earliest date remote party can handle
INTEGER retransfer_body; // if set to true, body is re-sent to client when message is moved from outbox to sent
mindate=EMPTY; // no limit by default
retransfer_body=FALSE; // normally, do not retransfer email body (and attachments) when moving items to sent box
INTEGER delayedabort;
delayedabort = FALSE;
INTEGER alarmTimeToUTC;
alarmTimeToUTC = FALSE;
INTEGER addInternetEmail;
addInternetEmail = FALSE;
INTEGER stripUID;
stripUID = FALSE;
INTEGER keepPhotoData;
keepPhotoData = FALSE;
]]></sessioninitscript>
<sessiontimeout>300</sessiontimeout>
<syncmodeextensions>yes</syncmodeextensions>
<logininitscript>return TRUE</logininitscript>
<requestedauth>none</requestedauth>
<requiredauth>none</requiredauth>
<autononce>yes</autononce>
<datastore name='radcal' type='plugin'>
<dbtypeid>417262924</dbtypeid>
<plugin_module>SyncEvolution</plugin_module>
<plugin_datastoreadmin>no</plugin_datastoreadmin>
<fromremoteonlysupport> yes </fromremoteonlysupport>
<canrestart>yes</canrestart>
<!-- conflict strategy: Newer item wins
You can set 'server-wins' or 'client-wins' as well
if you want to give one side precedence
-->
<conflictstrategy>newer-wins</conflictstrategy>
<!-- on slowsync: do not duplicate items even if not fully equal
You can set this to 'duplicate' to avoid possible data loss
resulting from merging
-->
<slowsyncstrategy>newer-wins</slowsyncstrategy>
<!-- text db plugin is designed for UTF-8, make sure data is passed as UTF-8 (and not the ISO-8859-1 default) -->
<datacharset>UTF-8</datacharset>
<!-- use C-language (unix style) linefeeds (
, 0x0A) -->
<datalineends>unix</datalineends>
<!-- set this to 'UTC' if time values should be stored in UTC into the database
rather than local time. 'SYSTEM' denotes local server time zone. -->
<datatimezone>SYSTEM</datatimezone>
<!-- plugin DB may have its own identifiers to determine the point in time of changes, so
we must make sure this identifier is stored (and not only the sync time) -->
<storesyncidentifiers>yes</storesyncidentifiers>
<!-- Mapping of the fields to the fieldlist -->
<fieldmap fieldlist=''>
<automap/>
</fieldmap>
<!-- datatypes supported by this datastore -->
<typesupport>
</typesupport>
<resumesupport>on</resumesupport>
</datastore>
<subrule name="HAVE-ABLABEL-PROPERTY">
<!-- property X-ABLabel is not generated by default,
must be enabled for peers which support it -->
</subrule>
<subrule name="HAVE-ABLABEL-PARAMETER">
<!-- parameter X-ABLabel is not generated by default,
must be enabled for peers which support it -->
</subrule>
<!-- parameter X-EVOLUTION-UI-SLOT is not generated by default,
must be enabled for peers which support it -->
<subrule name="HAVE-EVOLUTION-UI-SLOT">
</subrule>
<subrule name="HAVE-EVOLUTION-UI-SLOT-IN-IMPP">
</subrule>
<subrule name="HAVE-EXDATE-DETACHED"/>
<subrule name="HAVE-EXDATE-DETACHED-NO-TZID"/>
<subrule name="HAVE-SYNCEVOLUTION-EXDATE-DETACHED"/>
<subrule name="needsTZInVEVENT"></subrule>
<remoterule name="Nokia">
<!-- defaults for *all* Nokia phones; can be overridden for specific models later on -->
<manufacturer>NOKIA</manufacturer>
<finalrule>no</finalrule>
<!-- At least the Nokia E55 is only able to deal with alarm times in UTC,
later confirmed for other Nokia models. BMC #1657.
Nokia E51 only handles EMAIL with TYPE=INTERNET. Assume that this
is needed for all Nokia phones - doesn't hurt with a N97, anyway.
FDO #61784.
-->
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
alarmTimeToUTC = TRUE;
addInternetEmail = TRUE;
]]></rulescript>
<!-- 5800 and N97mini are confirmed to report bogus maximum size
256 bytes for PHOTO, seems to be a cut-and-paste error at Nokia.
Ignore size info, BMC #5860 -->
<ignoredevinfmaxsize>yes</ignoredevinfmaxsize>
</remoterule>
<subrule name="SIMPLE-EXDATE"></subrule>
<remoterule name="SonyEricsson">
<!-- defaults for *all* Sony Ericsson phones; can be overridden for
specific models later on -->
<manufacturer>SonyEricsson</manufacturer>
<finalrule>no</finalrule>
<outputcharset>ISO-8859-1</outputcharset>
<inputcharset>ISO-8859-1</inputcharset>
<!-- At least the Sony Ericsson T700 is only able to deal with alarm
times in UTC,
but rejects relative times. BMC #10091 -->
<rulescript><![CDATA[
alarmTimeToUTC = TRUE;
]]></rulescript>
</remoterule>
<remoterule name="SyncEvolution">
<manufacturer>Patrick Ohly</manufacturer>
<model>SyncEvolution</model>
<!-- enable reordering when talking to ourselves, enables asynchronous and batched execution -->
<strictexecordering>no</strictexecordering>
<!-- No need to send empty properties, we don't need them to indicate when
something isn't present because we use CtCap for that. -->
<noemptyproperties>yes</noemptyproperties>
<include rule="HAVE-SYNCEVOLUTION-EXDATE-DETACHED"/>
<include rule="HAVE-EVOLUTION-UI-SLOT"/>
<include rule="HAVE-ABLABEL-PARAMETER"/>
<!-- Merging between SyncEvolution instances is expected to work
well, so allow the engine to update items on both
sides also in the "non-first" slow sync case.
This is turned off by default for other clients
because small changes would propagate to other
clients of the server. Hopefully with SyncEvolution as
client we'll have not much such changes. -->
<updateclientinslowsync>yes</updateclientinslowsync>
<updateserverinslowsync>yes</updateserverinslowsync>
<!--
unconditionally disable the standard-compliant "skip map phase"
behavior in favor of letting the client choose to restart the
sync session if it has more changes
-->
<completefromclientonly>yes</completefromclientonly>
</remoterule>
<remoterule name="t39m">
<!-- Rule for Ericsson T39m client -->
<manufacturer>Ericsson</manufacturer>
<software>R1A</software>
<limitedfieldlengths>yes</limitedfieldlengths>
<inputcharset>ANSI</inputcharset>
<descriptivename>Ericsson T39m</descriptivename>
</remoterule>
<remoterule name="t68">
<!-- Rule for Ericsson T68 client -->
<manufacturer>Ericsson</manufacturer>
<software>R1B</software>
<limitedfieldlengths>yes</limitedfieldlengths>
<inputcharset>ANSI</inputcharset>
<descriptivename>Ericsson T68</descriptivename>
</remoterule>
<remoterule name="V3">
<!-- Rule for Motorola V3 -->
<manufacturer>Motorola*</manufacturer>
<model>V3</model>
<limitedfieldlengths>yes</limitedfieldlengths>
<quote8bitcontent>yes</quote8bitcontent>
<nocontentfolding>yes</nocontentfolding>
<outputcharset>ANSI</outputcharset>
<inputcharset>ANSI</inputcharset>
<descriptivename>Motorola V3</descriptivename>
</remoterule>
<remoterule name="V3i">
<!-- Rule for Motorola V3i -->
<manufacturer>Motorola*</manufacturer>
<model>V3i</model>
<limitedfieldlengths>yes</limitedfieldlengths>
<quote8bitcontent>yes</quote8bitcontent>
<nocontentfolding>yes</nocontentfolding>
<outputcharset>ANSI</outputcharset>
<descriptivename>Motorola V3i</descriptivename>
</remoterule>
<remoterule name="6230">
<manufacturer>NOKIA</manufacturer>
<model>6230</model>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 6230</descriptivename>
</remoterule>
<remoterule name="9210">
<manufacturer>NOKIA</manufacturer>
<model>9210</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 9210</descriptivename>
</remoterule>
<remoterule name="9210i">
<manufacturer>NOKIA</manufacturer>
<model>9210i</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 9210</descriptivename>
</remoterule>
<remoterule name="3220">
<manufacturer>NOKIA</manufacturer>
<model>3220</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 3220</descriptivename>
</remoterule>
<remoterule name="3230">
<manufacturer>NOKIA</manufacturer>
<model>3230</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 3230</descriptivename>
</remoterule>
<remoterule name="3600">
<manufacturer>NOKIA</manufacturer>
<model>3600</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 3600</descriptivename>
</remoterule>
<remoterule name="3620">
<manufacturer>NOKIA</manufacturer>
<model>3620</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 3620</descriptivename>
</remoterule>
<remoterule name="MAEMO-CALENDAR">
<deviceid>none - this rule is activated via its name in MAKE/PARSETEXTWITHPROFILE() macro calls</deviceid>
<include rule="HAVE-EXDATE-DETACHED-NO-TZID"/>
<include rule="SIMPLE-EXDATE"/>
</remoterule>
<remoterule name="3650">
<manufacturer>NOKIA</manufacturer>
<model>3650</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 3650</descriptivename>
</remoterule>
<remoterule name="3660">
<manufacturer>NOKIA</manufacturer>
<model>3660</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 3660</descriptivename>
</remoterule>
<remoterule name="6260">
<manufacturer>NOKIA</manufacturer>
<model>6260</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 6260</descriptivename>
</remoterule>
<remoterule name="6600">
<manufacturer>NOKIA</manufacturer>
<model>6600</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 6600</descriptivename>
</remoterule>
<remoterule name="6620">
<manufacturer>NOKIA</manufacturer>
<model>6620</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 6620</descriptivename>
</remoterule>
<remoterule name="6630">
<manufacturer>NOKIA</manufacturer>
<model>6630</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 6630</descriptivename>
</remoterule>
<remoterule name="6670">
<manufacturer>NOKIA</manufacturer>
<model>6670</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 6670</descriptivename>
</remoterule>
<remoterule name="7250">
<manufacturer>NOKIA</manufacturer>
<model>7250</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 7250</descriptivename>
</remoterule>
<remoterule name="7250i">
<manufacturer>NOKIA</manufacturer>
<model>7250i</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 7250i</descriptivename>
</remoterule>
<remoterule name="7260">
<manufacturer>NOKIA</manufacturer>
<model>7260</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 7260</descriptivename>
</remoterule>
<remoterule name="7610">
<manufacturer>NOKIA</manufacturer>
<model>7610</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 7610</descriptivename>
</remoterule>
<remoterule name="7650">
<manufacturer>NOKIA</manufacturer>
<model>7650</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia 7650</descriptivename>
</remoterule>
<remoterule name="N-Gage">
<manufacturer>NOKIA</manufacturer>
<model>N-Gage</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia N-Gage</descriptivename>
</remoterule>
<remoterule name="N-Gage QD">
<manufacturer>NOKIA</manufacturer>
<model>N-Gage QD</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Nokia N-Gage QD</descriptivename>
</remoterule>
<remoterule name="9300">
<manufacturer>NOKIA</manufacturer>
<model>9300</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<treatasutc>yes</treatasutc> <!-- needs 2.1.1 or later server -->
<descriptivename>Nokia 9300</descriptivename>
</remoterule>
<remoterule name="9500">
<manufacturer>NOKIA</manufacturer>
<model>9500</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<treatasutc>yes</treatasutc> <!-- needs 2.1.1 or later server -->
<descriptivename>Nokia 9500</descriptivename>
</remoterule>
<remoterule name="E90">
<manufacturer>NOKIA</manufacturer>
<model>E90</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<ignoredevinfmaxsize>yes</ignoredevinfmaxsize>
<descriptivename>Nokia E90</descriptivename>
</remoterule>
<remoterule name="X">
<manufacturer>Sendo</manufacturer>
<model>X</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<descriptivename>Sendo X</descriptivename>
</remoterule>
<remoterule name="SX1">
<manufacturer>SIEMENS</manufacturer>
<model>SX1</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
]]></rulescript>
<limitedfieldlengths>yes</limitedfieldlengths>
<forcelocaltime>yes</forcelocaltime>
<!-- Note: SX1 crashes on contacts with empty properties -->
<noemptyproperties>yes</noemptyproperties>
<descriptivename>Siemens SX1</descriptivename>
</remoterule>
<remoterule name="M55">
<manufacturer>SIEMENS</manufacturer>
<model>M55</model>
<forcelocaltime>yes</forcelocaltime>
<limitedfieldlengths>yes</limitedfieldlengths>
<descriptivename>Siemens M55</descriptivename>
</remoterule>
<remoterule name="SL55">
<manufacturer>SIEMENS</manufacturer>
<model>SL55</model>
<forcelocaltime>yes</forcelocaltime>
<limitedfieldlengths>yes</limitedfieldlengths>
<descriptivename>Siemens SL55</descriptivename>
</remoterule>
<remoterule name="S55">
<manufacturer>SIEMENS</manufacturer>
<model>S55</model>
<forcelocaltime>yes</forcelocaltime>
<limitedfieldlengths>yes</limitedfieldlengths>
<descriptivename>Siemens S55</descriptivename>
</remoterule>
<remoterule name="S65">
<manufacturer>SIEMENS</manufacturer>
<model>S65</model>
<forcelocaltime>yes</forcelocaltime>
<limitedfieldlengths>yes</limitedfieldlengths>
<descriptivename>Siemens S65</descriptivename>
</remoterule>
<remoterule name="SL65">
<manufacturer>SIEMENS</manufacturer>
<model>SL65</model>
<forcelocaltime>yes</forcelocaltime>
<limitedfieldlengths>yes</limitedfieldlengths>
<descriptivename>Siemens SL65</descriptivename>
</remoterule>
<remoterule name="K700">
<!-- Rule for SonyEricsson K700 (aka SEMC Phone) client -->
<manufacturer>SonyEricsson</manufacturer>
<model>SEMC Phone</model>
<software>R3B</software>
<!-- is a 1.1 client and claims UTC support, but it seems not to work ok
<forcelocaltime>yes</forcelocaltime>
-->
<limitedfieldlengths>yes</limitedfieldlengths>
<descriptivename>SonyEricsson K700</descriptivename>
</remoterule>
<remoterule name="T610/T630">
<!-- Rule for SonyEricsson T610/T630 client -->
<manufacturer>SonyEricsson</manufacturer>
<software>R2B</software>
<limitedfieldlengths>yes</limitedfieldlengths>
<descriptivename>SonyEricsson T610/T630</descriptivename>
</remoterule>
<!-- Due to a problem in M600i vCalendar implementation,
the device does not calculate time zones correctly
in all cases.
If your M600i is brand new, you need to specify
"calendar?/o(Z)" as database path instead of just
"calendar". If your M600i has already been synced
at least once via the cradle and the software
delivered with the device, you must omit the
"?/o(Z)" appendix and specify just "calendar" instead.
Please also note that the o(Z) option for never-synced
M600i devices only works if your server's config is
derived from a recent version of our sample config.
Otherwise, just make sure the M600i is synced once
in the cradle before using SyncML.
-->
<remoterule name="M600i">
<manufacturer>Sony Ericsson</manufacturer>
<model>M600i</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
// retransfer body when items are moved to sent box
retransfer_body=TRUE;
]]></rulescript>
<treataslocaltime>no</treataslocaltime> <!-- can be set to yes to have /o(Z) mode (see comment above) as default, otherwise /o(z) is default -->
<forcelocaltime>yes</forcelocaltime>
<descriptivename>SonyEricsson M600i</descriptivename>
</remoterule>
<!-- Due to a problem in P800 vCalendar implementation,
the device does not calculate time zones correctly
in all cases.
If your P800 is brand new, you need to specify
"calendar?/o(Z)" as database path instead of just
"calendar". If your P800 has already been synced
at least once via the cradle and the software
delivered with the device, you must omit the
"?/o(Z)" appendix and specify just "calendar" instead.
Please also note that the o(Z) option for never-synced
P800 devices only works if your server's config is
derived from a recent version of our sample config.
Otherwise, just make sure the P800 is synced once
in the cradle before using SyncML.
-->
<remoterule name="P800">
<manufacturer>Sony Ericsson</manufacturer>
<model>P800</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
// retransfer body when items are moved to sent box
retransfer_body=TRUE;
]]></rulescript>
<treataslocaltime>no</treataslocaltime> <!-- can be set to yes to have /o(Z) mode (see comment above) as default, otherwise /o(z) is default -->
<forcelocaltime>yes</forcelocaltime>
<descriptivename>SonyEricsson P800</descriptivename>
</remoterule>
<!-- Due to a problem in P900 vCalendar implementation,
the device does not calculate time zones correctly
in all cases.
If your P900 is brand new, you need to specify
"calendar?/o(Z)" as database path instead of just
"calendar". If your P900 has already been synced
at least once via the cradle and the software
delivered with the device, you must omit the
"?/o(Z)" appendix and specify just "calendar" instead.
Please also note that the o(Z) option for never-synced
P900 devices only works if your server's config is
derived from a recent version of our sample config.
Otherwise, just make sure the P900 is synced once
in the cradle before using SyncML.
-->
<remoterule name="P900">
<manufacturer>Sony Ericsson</manufacturer>
<model>P900</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
// retransfer body when items are moved to sent box
retransfer_body=TRUE;
]]></rulescript>
<treataslocaltime>no</treataslocaltime> <!-- can be set to yes to have /o(Z) mode (see comment above) as default, otherwise /o(z) is default -->
<forcelocaltime>yes</forcelocaltime>
<descriptivename>SonyEricsson P900</descriptivename>
</remoterule>
<!-- Due to a problem in P910 vCalendar implementation,
the device does not calculate time zones correctly
in all cases.
If your P910 is brand new, you need to specify
"calendar?/o(Z)" as database path instead of just
"calendar". If your P910 has already been synced
at least once via the cradle and the software
delivered with the device, you must omit the
"?/o(Z)" appendix and specify just "calendar" instead.
Please also note that the o(Z) option for never-synced
P910 devices only works if your server's config is
derived from a recent version of our sample config.
Otherwise, just make sure the P910 is synced once
in the cradle before using SyncML.
-->
<remoterule name="P910">
<manufacturer>Sony Ericsson</manufacturer>
<model>P910</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
// retransfer body when items are moved to sent box
retransfer_body=TRUE;
]]></rulescript>
<treataslocaltime>no</treataslocaltime> <!-- can be set to yes to have /o(Z) mode (see comment above) as default, otherwise /o(z) is default -->
<forcelocaltime>yes</forcelocaltime>
<descriptivename>SonyEricsson P910</descriptivename>
</remoterule>
<!-- Due to a problem in P910i vCalendar implementation,
the device does not calculate time zones correctly
in all cases.
If your P910i is brand new, you need to specify
"calendar?/o(Z)" as database path instead of just
"calendar". If your P910i has already been synced
at least once via the cradle and the software
delivered with the device, you must omit the
"?/o(Z)" appendix and specify just "calendar" instead.
Please also note that the o(Z) option for never-synced
P910i devices only works if your server's config is
derived from a recent version of our sample config.
Otherwise, just make sure the P910i is synced once
in the cradle before using SyncML.
-->
<remoterule name="P910i">
<manufacturer>Sony Ericsson</manufacturer>
<model>P910i</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
// retransfer body when items are moved to sent box
retransfer_body=TRUE;
]]></rulescript>
<treataslocaltime>no</treataslocaltime> <!-- can be set to yes to have /o(Z) mode (see comment above) as default, otherwise /o(z) is default -->
<forcelocaltime>yes</forcelocaltime>
<descriptivename>SonyEricsson P910i</descriptivename>
</remoterule>
<!-- Due to a problem in P990i vCalendar implementation,
the device does not calculate time zones correctly
in all cases.
If your P990i is brand new, you need to specify
"calendar?/o(Z)" as database path instead of just
"calendar". If your P990i has already been synced
at least once via the cradle and the software
delivered with the device, you must omit the
"?/o(Z)" appendix and specify just "calendar" instead.
Please also note that the o(Z) option for never-synced
P990i devices only works if your server's config is
derived from a recent version of our sample config.
Otherwise, just make sure the P990i is synced once
in the cradle before using SyncML.
-->
<remoterule name="P990i">
<manufacturer>Sony Ericsson</manufacturer>
<model>P990i</model>
<rulescript><![CDATA[
// no dates before 1980
mindate=(TIMESTAMP)"19800101T000000Z";
// retransfer body when items are moved to sent box
retransfer_body=TRUE;
]]></rulescript>
<treataslocaltime>no</treataslocaltime> <!-- can be set to yes to have /o(Z) mode (see comment above) as default, otherwise /o(z) is default -->
<forcelocaltime>yes</forcelocaltime>
<descriptivename>SonyEricsson P990i</descriptivename>
</remoterule>
<remoterule name="t68i">
<!-- Rule for SonyEricsson T68i client -->
<manufacturer>SonyEricsson</manufacturer>
<software>R2A</software>
<limitedfieldlengths>yes</limitedfieldlengths>
<inputcharset>ANSI</inputcharset>
<descriptivename>SonyEricsson T68i</descriptivename>
</remoterule>
<remoterule name="Funambol_Outlook">
<!-- Rule for Funambol Outlook Sync Client -->
<model>Funambol Outlook Sync Client</model>
<lenientmode>yes</lenientmode> <!-- some status messages are missing at end of session -->
<descriptivename>Funambol Outlook Sync Client</descriptivename>
</remoterule>
<remoterule name="N7210c">
<manufacturer>NOKIA</manufacturer>
<model>Nokia 7210c</model>
<descriptivename>Nokia 7210c</descriptivename>
<forceutc>yes</forceutc>
<limitedfieldlengths>yes</limitedfieldlengths>
<include rule= "needsTZInVEVENT"/>
</remoterule>
<remoterule name="SyncJe_Outlook">
<!-- Rule for NextHaus SyncJe Outlook Edition -->
<model>SyncJe Outlook Edition</model>
<ignorectcap>yes</ignorectcap> <!-- can do contact photo sync, but is missing in CTCap -->
<descriptivename>NextHaus SyncJe Outlook Client</descriptivename>
</remoterule>
<!-- rule which enables all optional properties and parameters in the legacy format vCard -->
<remoterule name="ALL">
<deviceid>none - this rule is activated via its name in MAKE/PARSETEXTWITHPROFILE() macro calls</deviceid>
<include rule="HAVE-EVOLUTION-UI-SLOT"/>
<include rule="HAVE-EVOLUTION-UI-SLOT-IN-IMPP"/>
<include rule="HAVE-ABLABEL-PARAMETER"/>
</remoterule>
<remoterule name="EVOLUTION">
<deviceid>none - this rule is activated via its name in MAKE/PARSETEXTWITHPROFILE() macro calls</deviceid>
<include rule="HAVE-EVOLUTION-UI-SLOT"/>
<include rule="HAVE-ABLABEL-PARAMETER"/>
<!-- storing empty properties only wastes space and causes overhead, suppress them -->
<noemptyproperties>yes</noemptyproperties>
</remoterule>
<!-- enable this rule if date fields like BDAY and REV shall use 1999-12-31 instead of 19991231 -->
<subrule name="EXTENDED-DATE-FORMAT"/>
<remoterule name="KDE">
<deviceid>none - this rule is activated via its name in MAKE/PARSETEXTWITHPROFILE() macro calls</deviceid>
</remoterule>
<remoterule name="LOCALSTORAGE">
<deviceid>none - this rule is activated by default via its name in MAKE/PARSETEXTWITHPROFILE() macro calls</deviceid>
<!-- storing empty properties only wastes space and causes overhead, suppress them -->
<noemptyproperties>yes</noemptyproperties>
<!-- enable storing of X-EVOLUTION-UI-SLOT -->
<include rule="HAVE-EVOLUTION-UI-SLOT"/>
<include rule="HAVE-ABLABEL-PARAMETER"/>
</remoterule>
<subrule name="HAVE-VCARD-UID">
<!-- vCard Property UID is not parsed or generated by default,
must be enabled for peers which support it. -->
</subrule>
<remoterule name="LOCALSTORAGE-WITH-UID">
<deviceid>none - this rule is activated by default via its name in MAKE/PARSETEXTWITHPROFILE() macro calls</deviceid>
<!-- storing empty properties only wastes space and causes overhead, suppress them -->
<noemptyproperties>yes</noemptyproperties>
<!-- enable storing of X-EVOLUTION-UI-SLOT -->
<include rule="HAVE-EVOLUTION-UI-SLOT"/>
<include rule="HAVE-VCARD-UID"/>
<include rule="HAVE-ABLABEL-PARAMETER"/>
</remoterule>
</server>
</sysync_config>
- [2023-03-07 23:13:32.006] SuspendFlags: deactivating fds 12->11
- [2023-03-07 23:13:32.007] SuspendFlags: close m_receiverFD 11
- [2023-03-07 23:13:32.007] SuspendFlags: close m_senderFD 12
- [2023-03-07 23:13:32.007] SuspendFlags: done with deactivation
- [2023-03-07 23:13:32.008] error code from Synthesis engine error parsing config file (local, status 20010)