libsynthesis

Sign in or create your account | Project List | Help

libsynthesis Git Source Tree

Root/src/sysync_SDK/configs/syncclient_sample_config.xml

1<?xml version="1.0"?>
2<!-- SYNTHESIS SYNCML CLIENT Version 3.4 Configuration file -->
3
4<sysync_config version="1.0">
5
6  <!-- this string is output to every session debug logfile to identify the config in use -->
7  <configidstring>Synthesis SyncML Client Engine 3.4 sample config</configidstring>
8
9  <debug>
10    <!-- path where logfiles are stored -->
11    <!-- <logpath platform="linux">/your/log/directory</logpath> -->
12    <logflushmode>buffered</logflushmode> <!-- buffered is fastest mode, but may loose data on process abort. Other options: "flush" (after every line) or "openclose" (safest, slowest, like in 2.x server) -->
13    <!-- per session log -->
14    <sessionlogs>yes</sessionlogs> <!-- by default, create a session log file for every sync session (might be disabled for special users/devices in scripts) -->
15    <!-- debug format options -->
16    <logformat>html</logformat> <!-- html is nicely colored and easily viewable with a web browser. Other options: "xml", "text" -->
17    <folding>auto</folding> <!-- dynamic folding of blocks enabled, automatically expanded or collapsed default. Other options: "none", "expanded", "collapsed" -->
18    <timestamp>yes</timestamp> <!-- show timestamps for structure elements in log -->
19    <timestampall>no</timestampall> <!-- don't show timestamp for every log line -->
20    <timedsessionlognames>yes</timedsessionlognames> <!-- session logs also have the session start timestamp in the filename - makes them more easily sortable -->
21    <!-- thread logging mode -->
22    <subthreadmode>separate</subthreadmode> <!-- write log info from subthreads into separate log files. Other options: "suppress" -->
23    <!-- basic debug level selection -->
24    <enable option="extended"/> <!-- "extended" is a good choice for start testing. For production, use "normal" or "minimal" -->
25    <!-- <enable option="normal"/> --> <!-- "normal" provides rich debug info, but still in reasonable size -->
26    <!-- <enable option="minimal"/> --> <!-- "minimal" just shows basic flow and error. Not suitable for debugging -->
27    <!-- <enable option="maximal"/> --> <!-- "maximal" can create VERY LARGE logs and cause HEAVY SLOWDOWN. Only for detail debugging -->
28    <!-- <enable option="all"/> --> <!-- "all" shows EVERYTHING possible, and way too much for any normal situation. For hardcore debugging ONLY! -->
29    <!-- additional debug info switches -->
30    <enable option="userdata"/> <!-- Make this <disable ...> if you don't want user data in the logs -->
31    <disable option="scripts"/> <!-- Make this <enable ...> to show script execution in logs -->
32    <disable option="match"/> <!-- Make this <enable ...> to show slow sync matching. CAN PRODUCE ENORMOUS LOGS and HEAVILY IMPACT PERFORMANCE for large slow syncs - use with care! -->
33    <disable option="exotic"/> <!-- Make this <enable ...> to include very in-detail info. CAN PRODUCE ENORMOUS LOGS and HEAVILY IMPACT PERFORMANCE for large slow syncs - use with care! -->
34    <!-- see manual for more debug info switches -->
35    <!-- global log options -->
36    <globallogs>no</globallogs> <!-- by default, do not log global session dispatching, creation etc. (not useful in multi-user operation) -->
37    <singlegloballog>no</singlegloballog> <!-- a new global log will be started for every start of the server/application -->
38    <!-- SyncML message dumping options -->
39    <msgdump>no</msgdump> <!-- do not dump syncml traffic 1:1 to files -->
40    <xmltranslate>no</xmltranslate> <!-- do not try to translate syncml traffic into XML (DO NOT SET THIS OPTION IN PRODUCTIVE SERVERS!) -->
41
42  </debug>
43
44  <transport type="xpt">
45    <!-- allow HTTP 1.1 kepp-alive (multiple request-answer-exchanges in single TCP connection) -->
46    <keepconnection>true</keepconnection>
47  </transport>
48
49
50  <scripting>
51    <looptimeout>5</looptimeout>
52
53    <function><![CDATA[
54      // create a UID
55      string newuid() {
56        return "syuid" + NUMFORMAT(RANDOM(1000000),6,"0") + "." + (string)MILLISECONDS(NOW());
57      }
58    ]]></function>
59
60
61    <!-- define script macros for scripts that are used by both vCalendar 1.0 and iCalendar 2.0 -->
62
63    <macro name="VCALENDAR_INCOMING_SCRIPT"><![CDATA[
64      STRING MATCHES[];
65      STRING CAT,CN,EM;
66      INTEGER i;
67      TIMESTAMP ts;
68      // make sure we have all trailing and leading spaces eliminated
69      DESCRIPTION=NORMALIZED(DESCRIPTION);
70      SUMMARY=NORMALIZED(SUMMARY);
71      // eliminate description that is the same as summary
72      if (DESCRIPTION==SUMMARY) DESCRIPTION=EMPTY;
73      // calendar or todo
74      if (ISEVENT) {
75        // VEVENT
76        // - handle duration cases
77        if (ISDURATION(DURATION)) {
78          if (DTEND==EMPTY) DTEND = DTSTART + DURATION;
79          if (DTSTART==EMPTY) DTSTART = DTEND - DURATION;
80        }
81        // - detect alldays in vCalendar 1.0 (0:00-0:00 or 23:59 localtime)
82        i = ALLDAYCOUNT(DTSTART,DTEND,TRUE);
83        if (ITEMDATATYPE()=="vCalendar10" && i>0) {
84          // DTSTART and DTEND represent allday event, make them date-only values
85          // - convert start to user zone (or floating) so it represents midnight
86          DTSTART = CONVERTTOUSERZONE(DTSTART);
87          MAKEALLDAY(DTSTART,DTEND,i);
88        }
89        else {
90          // iCalendar 2.0 - only if DTSTART is a date-only value this really is an allday
91          if (ISDATEONLY(DTSTART)) {
92            // reshape to make sure we don't have invalid zero-duration alldays (old OCS 9 servers)
93            MAKEALLDAY(DTSTART,DTEND,i);
94          }
95        }
96        // - shape attendees (and make sure ATTENDEES[] is assigned even for empty email addresses)
97        i=0;
98        while(i<SIZE(ATTENDEES) || i<SIZE(ATTENDEE_CNS)) {
99          PARSEEMAILSPEC(ATTENDEES[i], CN, EM);
100          ATTENDEES[i] = EM; // pure email address
101          // in case we have no specific common name, use the one extracted from the email
102          // This catches the vCalendar 1.0 case and eventually ill-formed iCalendar 2.0 as well
103          if (ATTENDEE_CNS[i]==EMPTY)
104            ATTENDEE_CNS[i]=CN;
105          // default participation status to needs-action
106          if (ATTENDEE_PARTSTATS[i]==EMPTY)
107            ATTENDEE_PARTSTATS[i]=1; // 1=needs action
108          i=i+1;
109        }
110        // - shape organizer
111        PARSEEMAILSPEC(ORGANIZER, CN, EM);
112        ORGANIZER = EM; // pure email address
113        if (ORGANIZER_CN==EMPTY)
114          ORGANIZER_CN=CN;
115      }
116      else {
117        // VTODO
118        // - make sure we have at least a summary
119        if (SUMMARY==EMPTY) SUMMARY=DESCRIPTION; // use description if we don't have a summary
120        if (SUMMARY==EMPTY) SUMMARY="unnamed"; // set dummy summary if we still don't have one
121        // due shaping for non-iCalendar 2.0
122        if (ITEMDATATYPE()=="vCalendar10" && ALLDAYCOUNT(DUE,DUE,TRUE,TRUE)>0) {
123          DUE = DATEONLY(DUE);
124        }
125      }
126      // Common alarm handling
127      // - handle relative alarm time (as possible with VALARM TRIGGER)
128      if (ISDURATION(ALARM_TIME)) {
129        if (ALARM_REL==2)
130          ts = DTEND; // relative to end
131        else {
132          if (ISEVENT)
133            ts = DTSTART; // relative to start for events
134          else
135            ts = DUE; // relative to due for todos
136        }
137        // for now, make ALARM user(=system) zone in all cases
138        ALARM_TIME = CONVERTTOUSERZONE(POINTINTIME(ts),TRUE) + ALARM_TIME;
139      }
140    ]]></macro>
141
142
143    <macro name="VCALENDAR_OUTGOING_SCRIPT"><![CDATA[
144      // set UTC time of generation for iCalendar 2.0 DTSTAMP
145      DGENERATED = NOW();
146      // make sure we have all trailing and leading spaces eliminated
147      DESCRIPTION=NORMALIZED(DESCRIPTION);
148      SUMMARY=NORMALIZED(SUMMARY);
149      if (ISEVENT) {
150        // VEVENT
151        // - combine attendee email address and common name into single string for vCalendar 1.0
152        if (ITEMDATATYPE()=="vCalendar10") {
153          i=0;
154          while(i<SIZE(ATTENDEES)) {
155            ATTENDEES[i] = MAKEEMAILSPEC(ATTENDEE_CNS[i], ATTENDEES[i]);
156            i=i+1;
157          }
158          ORGANIZER = MAKEEMAILSPEC(ORGANIZER_CN, ORGANIZER);
159        }
160      }
161      else {
162        // VTODO
163        // - Nothing special so far
164      }
165      // make sure we have at least a summary
166      if (SUMMARY==EMPTY) SUMMARY=SUBSTR(DESCRIPTION,0,32); // derive from description
167      if (SUMMARY==EMPTY) SUMMARY="unnamed"; // in case description is empty as well
168      // do NOT send duration (some servers crash when doing so)
169      DURATION = UNASSIGNED;
170      // shape alarm
171      if (ALARM_TIME!=EMPTY) {
172        if (ITEMDATATYPE()=="iCalendar20") {
173          if (ALARM_ACTION==EMPTY) ALARM_ACTION = "AUDIO";
174          ALARM_TIME = CONVERTTOUSERZONE(ALARM_TIME,TRUE); // unfloat into user (system) zone, in case it is floating
175          ALARM_TIME = CONVERTTOZONE(ALARM_TIME,"UTC"); // must always be UTC by iCalendar 2.0 specs
176          // send as duration if we have non-empty non-date DTSTART
177          if (DTSTART!=EMPTY && !ISDATEONLY(DTSTART)) {
178            // make a duration (unfloat DTSTART into system zone in case it is floating first!)
179            ALARM_TIME = ALARM_TIME-CONVERTTOZONE(CONVERTTOUSERZONE(DTSTART,TRUE),"UTC");
180            ALARM_REL = 1; // relative to start
181          }
182        }
183        else {
184          if (ALARM_MSG==EMPTY) ALARM_MSG="alarm";
185        }
186      }
187    ]]></macro>
188
189  </scripting>
190
191
192  <datatypes>
193    <!-- list of internal fields representing vCard data -->
194    <fieldlist name="contacts">
195      <field name="SYNCLVL" type="integer" compare="never"/>
196      <field name="REV" type="timestamp" compare="never" age="yes"/>
197
198      <!-- Name elements -->
199      <field name="N_LAST" type="string" compare="always"/>
200      <field name="N_FIRST" type="string" compare="always"/>
201      <field name="N_MIDDLE" type="string" compare="always"/>
202      <field name="N_PREFIX" type="string" compare="conflict"/>
203      <field name="N_SUFFIX" type="string" compare="conflict"/>
204      <field name="NICKNAME" type="string" compare="conflict"/>
205      <field name="TITLE" type="string" compare="conflict" merge="fillempty"/>
206
207      <field name="FN" type="string" compare="conflict" merge="fillempty"/>
208
209      <!-- categories and classification -->
210      <field name="CATEGORIES" array="yes" type="string" compare="conflict"/>
211
212      <!-- organisation -->
213      <field name="ORG_NAME" type="string" compare="slowsync" merge="fillempty"/>
214      <field name="ORG_DIVISION" type="string" compare="conflict" merge="fillempty"/>
215
216      <!-- birthday -->
217      <field name="BDAY" type="date" compare="conflict" merge="fillempty"/>
218
219      <!-- telephone numbers -->
220      <field name="TEL" array="yes" type="telephone" compare="conflict"/>
221      <field name="TEL_FLAGS" array="yes" type="integer" compare="conflict"/> <!-- offset 0 -->
222      <field name="TEL_LABEL" array="yes" type="string" compare="conflict"/> <!-- offset 1 -->
223      <field name="TEL_ID" array="yes" type="integer" compare="conflict"/> <!-- offset 2 -->
224
225      <!-- emails -->
226      <field name="EMAIL" array="yes" type="multiline" compare="conflict"/>
227      <field name="EMAIL_FLAGS" array="yes" type="integer" compare="conflict"/> <!-- offset 0 -->
228      <field name="EMAIL_LABEL" array="yes" type="string" compare="conflict"/> <!-- offset 1 -->
229      <field name="EMAIL_ID" array="yes" type="integer" compare="conflict"/> <!-- offset 2 -->
230
231      <!-- web addresses -->
232      <field name="WEB" array="yes" type="url" compare="conflict"/>
233      <field name="WEB_FLAGS" array="yes" type="integer" compare="conflict"/> <!-- offset 0 -->
234      <field name="WEB_LABEL" array="yes" type="string" compare="conflict"/> <!-- offset 1 -->
235      <field name="WEB_ID" array="yes" type="integer" compare="conflict"/> <!-- offset 2 -->
236
237      <!-- home address -->
238      <field name="ADR_STREET" array="yes" type="multiline" compare="conflict"/>
239      <field name="ADR_ADDTL" array="yes" type="multiline" compare="conflict"/>
240      <field name="ADR_STREET_FLAGS" array="yes" type="integer" compare="conflict"/> <!-- offset 0 (from ADR_STREET_FLAGS) -->
241      <field name="ADR_STREET_LABEL" array="yes" type="string" compare="conflict"/> <!-- offset 1 -->
242      <field name="ADR_STREET_ID" array="yes" type="integer" compare="conflict"/> <!-- offset 2 -->
243      <field name="ADR_POBOX" array="yes" type="multiline" compare="conflict"/>
244      <field name="ADR_CITY" array="yes" type="multiline" compare="conflict"/>
245      <field name="ADR_REG" array="yes" type="multiline" compare="conflict"/>
246      <field name="ADR_ZIP" array="yes" type="multiline" compare="conflict"/>
247      <field name="ADR_COUNTRY" array="yes" type="multiline" compare="conflict"/>
248
249      <!-- Note -->
250      <field name="NOTE" type="multiline" compare="conflict" merge="lines"/>
251
252      <!-- Photo -->
253      <field name="PHOTO" type="blob" compare="never" merge="fillempty"/>
254      <field name="PHOTO_TYPE" type="integer" compare="never" merge="fillempty"/>
255
256    </fieldlist>
257    <!-- vCard profile -->
258    <mimeprofile name="vCard" fieldlist="contacts">
259
260      <profile name="VCARD" nummandatory="0"> <!-- we allow records without "N" as Address book can store them -->
261        <property name="VERSION">
262          <value conversion="version"/>
263        </property>
264
265        <property onlyformode="standard" name="PRODID" mandatory="no">
266          <value conversion="prodid"/>
267        </property>
268
269        <property name="REV">
270          <value field="REV"/>
271        </property>
272
273        <property name="N" values="5" mandatory="yes"> <!-- Note: makes N parse and generate even if not in remote's CTCap -->
274          <value index="0" field="N_LAST"/>
275          <value index="1" field="N_FIRST"/>
276          <value index="2" field="N_MIDDLE"/>
277          <value index="3" field="N_PREFIX"/>
278          <value index="4" field="N_SUFFIX"/>
279        </property>
280
281        <property name="FN">
282          <value field="FN"/>
283        </property>
284
285        <property name="NICKNAME" onlyformode="standard">
286          <value field="NICKNAME"/>
287        </property>
288
289        <property name="TITLE">
290          <value field="TITLE"/>
291        </property>
292
293        <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 ";") -->
294          <value field="CATEGORIES"/>
295          <position field="CATEGORIES" repeat="array" increment="1" minshow="0"/>
296        </property>
297
298        <property name="ORG" values="2">
299          <value index="0" field="ORG_NAME"/>
300          <value index="1" field="ORG_DIVISION"/>
301        </property>
302
303        <property name="TEL">
304          <value field="TEL"/>
305          <position field="TEL" repeat="array" increment="1" minshow="1"/>
306          <parameter name="TYPE" default="yes" positional="no" show="yes">
307            <value field="TEL_FLAGS" conversion="multimix" combine=",">
308              <enum name="HOME" value="B0"/>
309              <enum name="WORK" value="B1"/>
310              <enum mode="ignore" value="B2"/> <!-- OTHER -->
311              <enum name="VOICE" value="B3"/>
312              <enum name="CELL" value="B4"/>
313              <enum name="FAX" value="B5"/>
314              <enum name="PAGER" value="B6"/>
315              <enum name="PREF" value="B7"/>
316
317              <enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
318              <enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
319            </value>
320          </parameter>
321        </property>
322
323        <property name="EMAIL">
324          <value field="EMAIL"/>
325          <position field="EMAIL" repeat="array" increment="1" minshow="1"/>
326          <parameter name="TYPE" default="yes" positional="no" show="yes">
327            <value field="EMAIL_FLAGS" conversion="multimix" combine=",">
328              <enum name="HOME" value="B0"/>
329              <enum name="WORK" value="B1"/>
330              <enum mode="ignore" value="B2"/> <!-- OTHER -->
331              <enum name="INTERNET" value="B3"/>
332
333              <enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
334              <enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
335            </value>
336          </parameter>
337        </property>
338
339        <property name="URL">
340          <value field="WEB"/>
341          <position field="WEB" repeat="array" increment="1" minshow="1"/>
342          <parameter name="TYPE" default="yes" positional="no" show="yes">
343            <value field="WEB_FLAGS" conversion="multimix" combine=",">
344              <enum name="HOME" value="B0"/>
345              <enum name="WORK" value="B1"/>
346              <enum mode="ignore" value="B2"/> <!-- OTHER -->
347              <enum name="PREF" value="B3"/>
348
349              <enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
350              <enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
351            </value>
352          </parameter>
353        </property>
354
355        <property name="ADR" values="7">
356          <value index="0" field="ADR_POBOX"/>
357          <value index="1" field="ADR_ADDTL"/>
358          <value index="2" field="ADR_STREET"/>
359          <value index="3" field="ADR_CITY"/>
360          <value index="4" field="ADR_REG"/>
361          <value index="5" field="ADR_ZIP"/>
362          <value index="6" field="ADR_COUNTRY"/>
363          <position field="ADR_POBOX" repeat="array" increment="1" minshow="1"/>
364          <parameter name="TYPE" default="yes" positional="no" show="yes">
365            <value field="ADR_STREET_FLAGS" conversion="multimix" combine=",">
366              <enum name="HOME" value="B0"/>
367              <enum name="WORK" value="B1"/>
368              <enum mode="ignore" value="B2"/> <!-- OTHER -->
369
370              <enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
371              <enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
372            </value>
373          </parameter>
374        </property>
375
376        <property name="BDAY">
377          <value field="BDAY"/>
378        </property>
379
380        <property name="NOTE" filter="no">
381          <value field="NOTE"/>
382        </property>
383
384        <property name="PHOTO" filter="no">
385          <value field="PHOTO" conversion="BLOB_B64"/>
386          <parameter name="TYPE" default="no" show="yes">
387            <value field="PHOTO_TYPE">
388              <enum name="JPEG" value="0"/>
389            </value>
390          </parameter>
391        </property>
392
393      </profile>
394    </mimeprofile>
395
396
397    <!-- vCard 2.1 datatype, using vCard profile defined above -->
398    <datatype name="vCard21" basetype="vcard">
399      <version>2.1</version>
400      <use mimeprofile="vCard"/>
401    </datatype>
402
403    <!-- vCard 3.0 datatype, using vCard profile defined above -->
404    <datatype name="vCard30" basetype="vcard">
405      <version>3.0</version>
406      <use mimeprofile="vCard"/>
407    </datatype>
408    <!-- common field list for events and todos (both represented by vCalendar/iCalendar) -->
409    <fieldlist name="calendar">
410      <field name="SYNCLVL" type="integer" compare="never"/>
411      <field name="ISEVENT" type="integer" compare="always"/>
412
413      <field name="DMODIFIED" type="timestamp" compare="never" age="yes"/>
414      <field name="DCREATED" type="timestamp" compare="never"/>
415
416      <field name="DGENERATED" type="timestamp" compare="never"/>
417
418      <field name="UID" type="string" compare="never"/>
419
420      <field name="CATEGORIES" array="yes" type="string" compare="conflict" merge="fillempty"/>
421      <field name="CLASS" type="integer" compare="conflict" merge="fillempty"/>
422      <field name="TRANSP" type="integer" compare="conflict" merge="fillempty"/>
423
424      <field name="SUMMARY" type="multiline" compare="always"/>
425      <field name="DESCRIPTION" type="multiline" compare="slowsync" merge="lines"/>
426      <field name="LOCATION" type="multiline" compare="slowsync" merge="lines"/>
427
428      <!-- recurrence rule block, fields must be in that order, including
429           DTSTART as last field !! -->
430      <field name="RR_FREQ" type="string" compare="conflict"/>
431      <field name="RR_INTERVAL" type="integer" compare="conflict"/>
432      <field name="RR_FMASK" type="integer" compare="conflict"/>
433      <field name="RR_LMASK" type="integer" compare="conflict"/>
434      <field name="RR_END" type="timestamp" compare="conflict"/>
435
436      <!-- Note: DTSTART/DTEND are compared in the <comparescript>,
437                 therefore compare is set no "never" here -->
438      <field name="DTSTART" type="timestamp" compare="never"/>
439      <field name="DTEND" type="timestamp" compare="never"/>
440      <field name="DURATION" type="timestamp" compare="never"/>
441      <field name="COMPLETED" type="timestamp" compare="never"/>
442      <field name="DUE" type="timestamp" compare="never"/>
443
444      <field name="GEO_LAT" type="string" compare="never"/>
445      <field name="GEO_LONG" type="string" compare="never"/>
446
447      <field name="PRIORITY" type="integer" compare="conflict"/>
448      <field name="STATUS" type="integer" compare="conflict" merge="fillempty"/>
449
450      <field name="ALARM_TIME" type="timestamp" compare="conflict"/>
451      <field name="ALARM_SNOOZE" type="string" compare="conflict"/>
452      <field name="ALARM_REPEAT" type="string" compare="conflict"/>
453      <field name="ALARM_MSG" type="string" compare="conflict"/>
454      <field name="ALARM_ACTION" type="string" compare="conflict"/>
455      <field name="ALARM_REL" type="integer" compare="never"/>
456
457      <!-- non-standard -->
458      <field name="PARENT_UID" type="string" compare="never"/>
459
460      <!-- for events -->
461      <field name="EXDATES" array="yes" type="timestamp" compare="never"/>
462
463      <field name="ORIGSTART" array="no" type="timestamp" compare="never"/>
464      <field name="SEQNO" array="no" type="integer" compare="never"/>
465
466      <field name="ATTENDEES" array="yes" type="string" compare="never"/>
467      <field name="ATTENDEE_CNS" array="yes" type="string" compare="never"/>
468      <field name="ATTENDEE_PARTSTATS" array="yes" type="integer" compare="never"/>
469      <field name="ORGANIZER" array="no" type="string" compare="never"/>
470      <field name="ORGANIZER_CN" array="no" type="string" compare="never"/>
471
472    </fieldlist>
473    <!-- vCalendar with VTODO and VEVENT variants -->
474    <mimeprofile name="vCalendar" fieldlist="calendar">
475
476      <vtimezonegenmode>current</vtimezonegenmode>
477      <tzidgenmode>olson</tzidgenmode>
478
479      <profile name="VCALENDAR" nummandatory="1">
480
481        <property name="VERSION" mandatory="yes">
482          <value conversion="version"/>
483        </property>
484
485        <property onlyformode="standard" name="PRODID" mandatory="no">
486          <value conversion="prodid"/>
487        </property>
488
489        <property onlyformode="old" name="TZ" filter="false" suppressempty="yes">
490          <value field="DTSTART" conversion="tz"/>
491        </property>
492
493        <property onlyformode="old" name="DAYLIGHT" mode="daylight" filter="false" suppressempty="yes">
494          <value field="DTSTART" conversion="daylight"/>
495        </property>
496
497        <property name="GEO" values="2" suppressempty="yes" onlyformode="old" valueseparator=",">
498          <!-- LON,LAT in vCalendar 1.0 -->
499          <value index="0" field="GEO_LAT"/>
500          <value index="1" field="GEO_LONG"/>
501        </property>
502
503        <subprofile onlyformode="standard" name="VTIMEZONE" mode="vtimezones"/>
504
505        <!-- sub-profile for tasks -->
506        <subprofile name="VTODO" nummandatory="1" showifselectedonly="yes" field="ISEVENT" value="0">
507
508          <property name="LAST-MODIFIED">
509            <value field="DMODIFIED"/>
510          </property>
511
512          <property name="DTSTAMP" suppressempty="yes" onlyformode="standard">
513            <value field="DGENERATED"/>
514          </property>
515
516          <property name="DCREATED" suppressempty="yes" onlyformode="old">
517            <value field="DCREATED"/>
518          </property>
519          <property name="CREATED" suppressempty="yes" onlyformode="standard">
520            <value field="DCREATED"/>
521          </property>
522
523          <property name="UID" suppressempty="yes">
524            <value field="UID"/>
525          </property>
526
527          <property name="SEQUENCE" suppressempty="yes">
528            <value field="SEQNO"/>
529          </property>
530
531          <property name="GEO" values="2" suppressempty="yes" onlyformode="standard" valueseparator=";">
532            <!-- LAT;LON in iCalendar 2.0 -->
533            <value index="0" field="GEO_LONG"/>
534            <value index="1" field="GEO_LAT"/>
535          </property>
536
537          <property onlyformode="standard" name="CATEGORIES" values="list" valueseparator="," suppressempty="yes">
538            <value field="CATEGORIES" />
539            <position field="CATEGORIES" repeat="array" minshow="0"/>
540          </property>
541
542          <property onlyformode="old" name="CATEGORIES" values="list" valueseparator=";" altvalueseparator="," suppressempty="yes">
543            <value field="CATEGORIES" />
544            <position field="CATEGORIES" repeat="array" minshow="0"/>
545          </property>
546
547          <property name="CLASS" suppressempty="yes">
548            <value field="CLASS">
549              <enum name="PUBLIC" value="0"/>
550              <enum name="PRIVATE" value="1"/>
551              <enum name="CONFIDENTIAL" value="2"/>
552            </value>
553          </property>
554
555          <property name="SUMMARY" mandatory="yes">
556            <value field="SUMMARY"/>
557          </property>
558
559          <property name="DESCRIPTION" mandatory="yes">
560            <value field="DESCRIPTION"/>
561          </property>
562
563          <property name="LOCATION" mandatory="no">
564            <value field="LOCATION"/>
565          </property>
566
567          <property name="DTSTART" suppressempty="yes" delayedparsing="1">
568            <value field="DTSTART" conversion="autodate"/>
569            <parameter onlyformode="standard" name="TZID" default="no" show="yes">
570              <value field="DTSTART" conversion="TZID"/>
571            </parameter>
572            <parameter onlyformode="standard" name="VALUE" default="no" show="yes">
573              <value field="DTSTART" conversion="VALUETYPE"/>
574            </parameter>
575          </property>
576
577          <property name="COMPLETED" suppressempty="yes" delayedparsing="1">
578            <value field="COMPLETED" conversion="autoenddate"/>
579            <parameter onlyformode="standard" name="TZID" default="no" show="yes">
580              <value field="COMPLETED" conversion="TZID"/>
581            </parameter>
582            <parameter onlyformode="standard" name="VALUE" default="no" show="yes">
583              <value field="COMPLETED" conversion="VALUETYPE"/>
584            </parameter>
585          </property>
586
587          <property name="DUE" suppressempty="yes" delayedparsing="1">
588            <value field="DUE" conversion="autodate"/>
589            <parameter onlyformode="standard" name="TZID" default="no" show="yes">
590              <value field="DUE" conversion="TZID"/>
591            </parameter>
592            <parameter onlyformode="standard" name="VALUE" default="no" show="yes">
593              <value field="DUE" conversion="VALUETYPE"/>
594            </parameter>
595          </property>
596
597          <property name="PRIORITY" suppressempty="yes">
598            <value field="PRIORITY"/>
599          </property>
600
601          <property name="STATUS" onlyformode="standard" suppressempty="yes">
602            <value field="STATUS" conversion="emptyonly">
603              <enum name="COMPLETED" value="0"/>
604              <enum name="NEEDS-ACTION" value="1"/>
605              <enum name="IN-PROCESS" value="2"/>
606              <enum name="CANCELLED" value="3"/>
607              <enum name="ACCEPTED" value="4"/>
608              <enum name="TENTATIVE" value="5"/>
609              <enum name="DELEGATED" value="6"/>
610              <enum name="DECLINED" value="7"/>
611              <enum name="SENT" value="8"/>
612              <enum name="CONFIRMED" value="9"/>
613              <enum name="DRAFT" value="10"/>
614              <enum name="FINAL" value="11"/>
615            </value>
616          </property>
617
618          <property name="STATUS" onlyformode="old" suppressempty="yes">
619            <value field="STATUS" conversion="emptyonly">
620              <enum name="COMPLETED" value="0"/>
621              <enum name="NEEDS ACTION" value="1"/>
622              <enum mode="defaultvalue" value="1"/> <!-- catch unknown, but also non-conformant NEEDS_ACTION -->
623              <enum name="IN PROCESS" value="2"/>
624              <enum name="CANCELLED" value="3"/>
625              <enum name="ACCEPTED" value="4"/>
626              <enum name="TENTATIVE" value="5"/>
627              <enum name="DELEGATED" value="6"/>
628              <enum name="DECLINED" value="7"/>
629              <enum name="SENT" value="8"/>
630              <enum name="CONFIRMED" value="9"/>
631              <enum name="DRAFT" value="10"/>
632              <enum name="FINAL" value="11"/>
633            </value>
634          </property>
635
636
637          <!-- AALARM and DALARM both use the same fields -->
638          <property name="AALARM" onlyformode="old" values="4" suppressempty="yes">
639            <value index="0" field="ALARM_TIME" conversion="emptyonly"/>
640            <value index="1" field="ALARM_SNOOZE" conversion="emptyonly"/>
641            <value index="2" field="ALARM_REPEAT" conversion="emptyonly"/>
642            <value index="3" field="ALARM_MSG" conversion="emptyonly"/>
643          </property>
644          <property name="DALARM" onlyformode="old" values="4" suppressempty="yes">
645            <value index="0" field="ALARM_TIME" conversion="emptyonly"/>
646            <value index="1" field="ALARM_SNOOZE" conversion="emptyonly"/>
647            <value index="2" field="ALARM_REPEAT" conversion="emptyonly"/>
648            <value index="3" field="ALARM_MSG" conversion="emptyonly"/>
649          </property>
650
651          <subprofile onlyformode="standard" name="VALARM" nummandatory="1" field="ALARM_TIME">
652            <property name="TRIGGER" suppressempty="no" mandatory="yes">
653              <value field="ALARM_TIME"/>
654              <parameter name="VALUE" default="no" show="yes">
655                <value field="ALARM_TIME" conversion="FULLVALUETYPE"/>
656              </parameter>
657              <parameter name="RELATED" default="no" show="yes">
658                <value field="ALARM_REL">
659                  <enum mode="ignore" value="0"/>
660                  <enum name="START" value="1"/>
661                  <enum name="END" value="2"/>
662                </value>
663              </parameter>
664            </property>
665            <property name="ACTION" suppressempty="yes" mandatory="yes">
666              <value field="ALARM_ACTION"/>
667            </property>
668            <property name="DESCRIPTION" suppressempty="yes">
669              <value field="ALARM_MSG"/>
670            </property>
671            <property name="REPEAT" suppressempty="yes">
672              <value field="ALARM_REPEAT"/>
673            </property>
674          </subprofile>
675
676          <property onlyformode="old" name="RELATED-TO" suppressempty="yes">
677            <value field="PARENT_UID"/>
678          </property>
679
680          <property onlyformode="standard" name="RELATED-TO" suppressempty="yes">
681            <value field="PARENT_UID"/>
682            <parameter onlyformode="standard" name="RELTYPE" default="no" positional="yes" show="yes">
683              <value>
684                <enum name="PARENT"/>
685                <enum mode="defaultvalue" name="other"/>
686              </value>
687              <position hasnot="other" shows="PARENT" field="PARENT_UID"/>
688            </parameter>
689          </property>
690
691        </subprofile>
692
693        <!-- sub-profile for event -->
694        <subprofile name="VEVENT" nummandatory="1" showifselectedonly="yes" field="ISEVENT" value="1">
695
696          <property name="LAST-MODIFIED">
697            <value field="DMODIFIED"/>
698          </property>
699
700          <property name="DTSTAMP" suppressempty="yes" onlyformode="standard">
701            <value field="DGENERATED"/>
702          </property>
703
704          <property name="DCREATED" suppressempty="yes" onlyformode="old">
705            <value field="DCREATED"/>
706          </property>
707          <property name="CREATED" suppressempty="yes" onlyformode="standard">
708            <value field="DCREATED"/>
709          </property>
710
711
712          <property name="UID" suppressempty="yes">
713            <value field="UID"/>
714          </property>
715
716          <property name="SEQUENCE" suppressempty="yes">
717            <value field="SEQNO"/>
718          </property>
719
720          <property name="GEO" values="2" suppressempty="yes" onlyformode="standard" valueseparator=";">
721            <!-- LAT;LON in iCalendar 2.0 -->
722            <value index="0" field="GEO_LONG"/>
723            <value index="1" field="GEO_LAT"/>
724          </property>
725
726          <property onlyformode="standard" name="CATEGORIES" values="list" valueseparator="," suppressempty="yes">
727            <value field="CATEGORIES" />
728            <position field="CATEGORIES" repeat="array" minshow="0"/>
729          </property>
730
731          <property onlyformode="old" name="CATEGORIES" values="list" valueseparator=";" altvalueseparator="," suppressempty="yes">
732            <value field="CATEGORIES" />
733            <position field="CATEGORIES" repeat="array" minshow="0"/>
734          </property>
735
736          <property name="CLASS" suppressempty="yes">
737            <value field="CLASS">
738              <enum name="PUBLIC" value="0"/>
739              <enum name="PRIVATE" value="1"/>
740              <enum name="CONFIDENTIAL" value="2"/>
741            </value>
742          </property>
743
744
745          <property name="TRANSP" suppressempty="yes" onlyformode="standard">
746            <value field="TRANSP">
747              <enum name="OPAQUE" value="0"/>
748              <enum name="TRANSPARENT" value="1"/>
749              <enum name="TENTATIVE" value="2"/> <!-- according to Oracle de facto usage in vCalendar 1.0 -->
750              <enum name="OUT_OF_OFFICE" value="3"/> <!-- according to Oracle de facto usage in vCalendar 1.0 -->
751              <enum mode="defaultvalue" value="0"/>
752            </value>
753          </property>
754          <property name="TRANSP" suppressempty="yes" onlyformode="old">
755            <value field="TRANSP"/> <!-- directly numeric in vCalendar 1.0 -->
756          </property>
757
758
759          <property name="PRIORITY" suppressempty="yes">
760            <value field="PRIORITY"/>
761          </property>
762
763          <property name="SUMMARY" mandatory="yes">
764            <value field="SUMMARY"/>
765          </property>
766
767          <property name="DESCRIPTION" mandatory="yes">
768            <value field="DESCRIPTION"/>
769          </property>
770
771          <property name="LOCATION" mandatory="no">
772            <value field="LOCATION"/>
773          </property>
774
775          <property name="DTSTART" suppressempty="yes" delayedparsing="1">
776            <value field="DTSTART" conversion="autodate"/>
777            <parameter onlyformode="standard" name="TZID" default="no" show="yes">
778              <value field="DTSTART" conversion="TZID"/>
779            </parameter>
780            <parameter onlyformode="standard" name="VALUE" default="no" show="yes">
781              <value field="DTSTART" conversion="VALUETYPE"/>
782            </parameter>
783          </property>
784
785          <!-- recurrence rule (with delayed parsing, as it is dependent on DTSTART) -->
786          <property name="RRULE" suppressempty="yes" delayedparsing="2">
787            <!-- Note: RR_FREQ is the beginning of a block of fields
788                 suitable for the "rrule" conversion mode -->
789            <value field="RR_FREQ" conversion="rrule"/>
790          </property>
791
792          <!-- Symbian uses this, so it might make the client work with symbian-prepared servers better -->
793          <property name="X-RECURRENCE-ID" suppressempty="yes" onlyformode="old">
794            <value field="ORIGSTART" conversion="autodate"/>
795          </property>
796
797          <property name="RECURRENCE-ID" suppressempty="yes" onlyformode="standard" delayedparsing="1">
798            <value field="ORIGSTART" conversion="autodate"/>
799            <parameter name="TZID" default="no" show="yes">
800              <value field="ORIGSTART" conversion="TZID"/>
801            </parameter>
802            <parameter name="VALUE" default="no" show="yes">
803              <value field="ORIGSTART" conversion="VALUETYPE"/>
804            </parameter>
805          </property>
806
807          <property name="EXDATE" values="list" suppressempty="yes" onlyformode="standard" delayedparsing="1" valueseparator="," altvalueseparator=";">
808            <value field="EXDATES"/>
809            <position field="EXDATES" repeat="array" increment="1" minshow="0"/>
810            <parameter name="TZID" default="no" show="yes">
811              <value field="EXDATES" conversion="TZID"/>
812            </parameter>
813          </property>
814
815          <property name="EXDATE" values="list" suppressempty="yes" onlyformode="old" delayedparsing="1" valueseparator=";" altvalueseparator=",">
816            <value field="EXDATES"/>
817            <position field="EXDATES" repeat="array" increment="1" minshow="0"/>
818          </property>
819
820
821          <property name="DTEND" suppressempty="yes" delayedparsing="1">
822            <value field="DTEND" conversion="autoenddate"/>
823            <parameter onlyformode="standard" name="TZID" default="no" show="yes">
824              <value field="DTEND" conversion="TZID"/>
825            </parameter>
826            <parameter onlyformode="standard" name="VALUE" default="no" show="yes">
827              <value field="DTEND" conversion="VALUETYPE"/>
828            </parameter>
829          </property>
830
831          <property name="DURATION" suppressempty="yes" delayedparsing="1" onlyformode="standard">
832            <value field="DURATION"/>
833            <parameter onlyformode="standard" name="VALUE" default="no" show="no">
834              <value field="DURATION" conversion="VALUETYPE"/>
835            </parameter>
836          </property>
837
838          <property name="ATTENDEE" suppressempty="yes" onlyformode="old">
839            <value field="ATTENDEES"/>
840            <parameter name="ROLE" default="no" positional="yes" show="yes">
841              <value>
842                <enum name="ORGANIZER"/>
843              </value>
844              <position has="ORGANIZER" field="ORGANIZER" overwriteempty="yes"/>
845              <position hasnot="ORGANIZER" field="ATTENDEES" repeat="array" increment="1" overwriteempty="yes"/>
846            </parameter>
847            <parameter name="STATUS" default="no" show="yes">
848              <value field="ATTENDEE_PARTSTATS">
849                <enum name="NEEDS ACTION" value="1"/>
850                <enum mode="defaultvalue" value="1"/> <!-- catch unknown, but also non-conformant NEEDS_ACTION -->
851                <enum name="ACCEPTED" value="4"/>
852                <enum name="DECLINED" value="7"/>
853                <enum name="TENTATIVE" value="5"/>
854                <enum name="DELEGATED" value="6"/>
855              </value>
856            </parameter>
857          </property>
858
859          <property name="ATTENDEE" suppressempty="yes" onlyformode="standard">
860            <value field="ATTENDEES" conversion="mailto"/>
861            <position field="ATTENDEES" repeat="array" increment="1" minshow="0"/>
862            <parameter name="CN" default="no" show="yes" shownonempty="yes">
863              <value field="ATTENDEE_CNS"/>
864            </parameter>
865            <parameter name="PARTSTAT" default="no" show="yes">
866              <value field="ATTENDEE_PARTSTATS">
867                <enum name="NEEDS-ACTION" value="1"/>
868                <enum mode="defaultvalue" value="1"/> <!-- catch unknown, but also non-conformant NEEDS_ACTION -->
869                <enum name="ACCEPTED" value="4"/>
870                <enum name="DECLINED" value="7"/>
871                <enum name="TENTATIVE" value="5"/>
872                <enum name="DELEGATED" value="6"/>
873              </value>
874            </parameter>
875          </property>
876
877          <property name="ORGANIZER" suppressempty="yes" onlyformode="standard">
878            <value field="ORGANIZER" conversion="mailto"/>
879            <parameter name="CN" default="no" show="yes">
880              <value field="ORGANIZER_CN"/>
881            </parameter>
882          </property>
883
884
885          <!-- AALARM and DALARM both use the same fields -->
886          <property name="AALARM" onlyformode="old" values="4" suppressempty="yes">
887            <value index="0" field="ALARM_TIME" conversion="emptyonly"/>
888            <value index="1" field="ALARM_SNOOZE" conversion="emptyonly"/>
889            <value index="2" field="ALARM_REPEAT" conversion="emptyonly"/>
890            <value index="3" field="ALARM_MSG" conversion="emptyonly"/>
891          </property>
892          <property name="DALARM" onlyformode="old" values="4" suppressempty="yes">
893            <value index="0" field="ALARM_TIME" conversion="emptyonly"/>
894            <value index="1" field="ALARM_SNOOZE" conversion="emptyonly"/>
895            <value index="2" field="ALARM_REPEAT" conversion="emptyonly"/>
896            <value index="3" field="ALARM_MSG" conversion="emptyonly"/>
897          </property>
898
899          <subprofile onlyformode="standard" name="VALARM" nummandatory="1" field="ALARM_TIME">
900            <property name="TRIGGER" suppressempty="no" mandatory="yes">
901              <value field="ALARM_TIME"/>
902              <parameter name="VALUE" default="no" show="yes">
903                <value field="ALARM_TIME" conversion="FULLVALUETYPE"/>
904              </parameter>
905              <parameter name="RELATED" default="no" show="yes">
906                <value field="ALARM_REL">
907                  <enum mode="ignore" value="0"/>
908                  <enum name="START" value="1"/>
909                  <enum name="END" value="2"/>
910                </value>
911              </parameter>
912            </property>
913            <property name="ACTION" suppressempty="yes" mandatory="yes">
914              <value field="ALARM_ACTION"/>
915            </property>
916            <property name="DESCRIPTION" suppressempty="yes">
917              <value field="ALARM_MSG"/>
918            </property>
919            <property name="REPEAT" suppressempty="yes">
920              <value field="ALARM_REPEAT"/>
921            </property>
922          </subprofile>
923
924        </subprofile>
925
926      </profile>
927    </mimeprofile>
928
929    <!-- vCalendar 1.0 datatype, using vCalendar profile defined above -->
930    <datatype name="vCalendar10" basetype="vcalendar">
931      <version>1.0</version>
932      <use mimeprofile="vCalendar"/>
933
934      <incomingscript><![CDATA[
935        $VCALENDAR_INCOMING_SCRIPT
936      ]]></incomingscript>
937
938      <outgoingscript><![CDATA[
939        $VCALENDAR_OUTGOING_SCRIPT
940      ]]></outgoingscript>
941
942    </datatype>
943
944
945    <!-- iCalendar 2.0 datatype, using vCalendar profile defined above -->
946    <datatype name="iCalendar20" basetype="vcalendar">
947      <version>2.0</version>
948      <use mimeprofile="vCalendar"/>
949
950      <incomingscript><![CDATA[
951        $VCALENDAR_INCOMING_SCRIPT
952      ]]></incomingscript>
953
954      <outgoingscript><![CDATA[
955        $VCALENDAR_OUTGOING_SCRIPT
956      ]]></outgoingscript>
957
958    </datatype>
959
960    <!-- list of internal fields representing plain text note data -->
961    <fieldlist name="Note">
962      <field name="SYNCLVL" type="integer" compare="never"/>
963      <field name="SUBJECT" type="multiline" compare="always"/>
964      <field name="TEXT" type="multiline" compare="conflict" merge="lines"/>
965    </fieldlist>
966
967    <textprofile name="Note" fieldlist="Note">
968      <linemap field="SUBJECT">
969        <numlines>1</numlines>
970        <inheader>false</inheader>
971        <allowempty>true</allowempty>
972        <filterkeyword>SUBJECT</filterkeyword>
973      </linemap>
974      <linemap field="TEXT">
975        <numlines>0</numlines>
976        <inheader>false</inheader>
977        <allowempty>true</allowempty>
978      </linemap>
979    </textprofile>
980
981    <datatype name="note10" basetype="text">
982      <use profile="Note"/>
983      <typestring>text/plain</typestring>
984      <versionstring>1.0</versionstring>
985    </datatype>
986
987    <datatype name="note11" basetype="text">
988      <use profile="Note"/>
989      <typestring>text/plain</typestring>
990      <versionstring>1.1</versionstring>
991    </datatype>
992
993    <!-- list of internal fields representing vBookmark data -->
994    <fieldlist name="bookmarks">
995      <field name="REV" type="timestamp" compare="never" age="yes"/>
996      <field name="SYNCLVL" type="integer" compare="never"/>
997
998      <!-- Name -->
999      <field name="TITLE" type="string" compare="always"/>
1000
1001      <!-- categories and classification -->
1002      <field name="CATEGORIES" type="string" compare="conflict" merge="fillempty"/>
1003      <field name="CLASS" type="string" compare="conflict" merge="fillempty"/>
1004
1005      <!-- web addresses -->
1006      <field name="URL" type="url" compare="slowsync" merge="fillempty"/>
1007
1008      <!-- Note -->
1009      <field name="NOTE" type="multiline" compare="conflict" merge="lines"/>
1010
1011    </fieldlist>
1012
1013    <!-- vBookmark profile -->
1014    <mimeprofile name="vBookmark" fieldlist="bookmarks">
1015
1016      <profile name="VBKM" nummandatory="0">
1017        <property name="VERSION">
1018          <value conversion="version"/>
1019        </property>
1020
1021        <property name="X-LAST-MODIFIED">
1022          <value field="REV"/>
1023        </property>
1024
1025        <property name="TITLE">
1026          <value field="TITLE"/>
1027        </property>
1028
1029        <property name="URL">
1030          <value field="URL"/>
1031        </property>
1032
1033        <!-- non-standard properties -->
1034
1035        <!-- inherit CATEGORIES from vCard 3.0, i.e. comma separated -->
1036        <property name="CATEGORIES" values="list" valueseparator="," altvalueseparator=";">
1037          <value field="CATEGORIES" combine=","/>
1038        </property>
1039
1040        <property name="CLASS" suppressempty="yes">
1041          <value field="CLASS"/>
1042        </property>
1043
1044        <property name="NOTE" filter="no">
1045          <value field="NOTE"/>
1046        </property>
1047
1048      </profile>
1049    </mimeprofile>
1050
1051    <!-- vBookmark datatype, using vBookmark profile defined above -->
1052    <datatype name="vBookmark10" basetype="mimedir">
1053      <typestring>text/x-vbookmark</typestring>
1054      <versionstring>1.0</versionstring>
1055      <use profile="vBookmark"/>
1056    </datatype>
1057
1058
1059  </datatypes>
1060
1061
1062  <client type="plugin">
1063    <plugin_module>[SDK_textdb]</plugin_module>
1064    <plugin_sessionauth>yes</plugin_sessionauth>
1065    <plugin_deviceadmin>yes</plugin_deviceadmin>
1066
1067    <!-- this is how the client identifies itself to the LOCAL database. SDK_textdb
1068         sample has a hard-coded user test/test so the following works out of the box -->
1069    <localdbuser>test</localdbuser>
1070    <localdbpassword>test</localdbpassword>
1071    <!-- we need the local DB login for SDK_textdb to work properly, so we don't disable it here -->
1072    <nolocaldblogin>false</nolocaldblogin>
1073
1074
1075    <!-- IMPORTANT: Note that the following charset, lineend and quoting settings are relevant for session-level data access only.
1076         Most data access takes place in individual <datastores>, which each has the same three settings
1077         again locally (see below in the <datastore> sections). -->
1078
1079    <!-- text db plugin is designed for UTF-8, make sure data is passed as UTF-8 (and not the ISO-8859-1 default) -->
1080    <datacharset>UTF-8</datacharset>
1081    <!-- text db plugin is designed for Unix linefeeds (\n, 0x0A), make data is passed with unix linefeeds (and not the DOS CRLF = 0x0D,0x0A default) -->
1082    <datalineends>unix</datalineends>
1083
1084    <!-- If you want a text logfile, specify its full path here: -->
1085    <!-- <logfile platform="win32">D:\your\log\directory\yourlogfile.txt</logfile> -->
1086    <!-- <logfile platform="linux">/your/log/directory/yourlogfile.txt</logfile> -->
1087    <!-- <logfile platform="macosx">/your/log/directory/yourlogfile.txt</logfile> -->
1088
1089    <logenabled>yes</logenabled> <!-- log enabled by default (session login scripts might disable it for special users/devices) -->
1090
1091    <!-- the logfile format can be customized with <loglabels> and <logformat>
1092         but if these are not specified, a default format will be used
1093    -->
1094    <!-- This sample produces a simplified logfile:
1095    <loglabels>SyncEndTime\tUser\tStatus\tSynctype\tRemoteName\tDatabase\tLocAdded\tLocUpdated\tLocDeleted\n\n</loglabels>
1096    <logformat>%seT\t%U\t%sS\t%tS\t%nR\t%lD\t%laI\t%luI\t%ldI\n</logformat>
1097    -->
1098
1099
1100    <!-- timeout for unfinished sessions in seconds -->
1101    <sessiontimeout>20</sessiontimeout>
1102
1103
1104    <datastore name="contacts" type="plugin">
1105      <plugin_module>[SDK_textdb]</plugin_module>
1106      <plugin_datastoreadmin>yes</plugin_datastoreadmin>
1107
1108      <!-- enable this if you want to enable the free-form user configurable filters
1109      <alertprepscript ifndef="simple"><![CDATA[
1110        // pass on configured filter expressions
1111        setrecordfilter(targetsetting("remoteFilters"),false); // remote, exclusive
1112        ADDFILTER(targetsetting("localFilters")); // local
1113      ]]></alertprepscript>
1114      -->
1115
1116      <!-- text db plugin is designed for UTF-8, make sure data is passed as UTF-8 (and not the ISO-8859-1 default) -->
1117      <datacharset>UTF-8</datacharset>
1118      <!-- text db plugin is designed for Unix linefeeds (\n, 0x0A), make data is passed with unix linefeeds (and not the DOS CRLF = 0x0D,0x0A default) -->
1119      <datalineends>unix</datalineends>
1120
1121      <!-- plugin DB may have its own identifiers to determine the point in time of changes, so
1122           we must make sure this identifier is stored (and not only the sync time) -->
1123      <storesyncidentifiers>yes</storesyncidentifiers>
1124
1125      <!-- TextDB plugin supports resume and resuming partial items, so enable these here -->
1126      <resumesupport>yes</resumesupport>
1127      <resumeitemsupport>yes</resumeitemsupport>
1128
1129
1130      <!-- Mapping of the fields to the fieldlist "contacts" -->
1131      <fieldmap fieldlist="contacts">
1132        <automap indexasname="true"/>
1133      </fieldmap>
1134
1135      <!-- datatypes supported by this datastore -->
1136      <typesupport>
1137        <use datatype="vCard30" mode="rw" preferred="yes"/>
1138        <use datatype="vCard21" mode="rw" preferred="legacy"/>
1139      </typesupport>
1140
1141    </datastore>
1142
1143
1144    <datastore name="events" type="plugin">
1145      <plugin_module>[SDK_textdb]</plugin_module>
1146      <plugin_datastoreadmin>yes</plugin_datastoreadmin>
1147
1148      <!-- enable this if you want to enable date range filter and the free-form user configurable filters
1149      <alertprepscript ifndef="simple"><![CDATA[
1150        // pass on configured filter expressions
1151        setrecordfilter(targetsetting("remoteFilters"),false); // remote, exclusive
1152        ADDFILTER(targetsetting("localFilters")); // local
1153        // If a day range is selected and enabled in the settigs (bit0 in "extras"), apply it for the current sync
1154        if (targetsetting("extras") & 1 == 1) {
1155          setdaysrange(
1156            targetsetting("limit1"),
1157            targetsetting("limit2")
1158          );
1159        }
1160      ]]></alertprepscript>
1161      -->
1162
1163
1164      <!-- text db plugin is designed for UTF-8, make sure data is passed as UTF-8 (and not the ISO-8859-1 default) -->
1165      <datacharset>UTF-8</datacharset>
1166      <!-- text db plugin is designed for Unix linefeeds (\n, 0x0A), make data is passed with unix linefeeds (and not the DOS CRLF = 0x0D,0x0A default) -->
1167      <datalineends>unix</datalineends>
1168
1169      <!-- plugin DB may have its own identifiers to determine the point in time of changes, so
1170           we must make sure this identifier is stored (and not only the sync time) -->
1171      <storesyncidentifiers>yes</storesyncidentifiers>
1172
1173      <!-- TextDB plugin supports resume and resuming partial items, so enable these here -->
1174      <resumesupport>yes</resumesupport>
1175      <resumeitemsupport>yes</resumeitemsupport>
1176
1177
1178      <!-- Mapping of the fields to the fieldlist "calendar" -->
1179      <fieldmap fieldlist="calendar">
1180        <automap indexasname="true"/>
1181      </fieldmap>
1182
1183      <!-- datatypes supported by this datastore -->
1184      <typesupport>
1185        <use datatype="iCalendar20" mode="rw" variant="VEVENT" preferred="yes"/>
1186        <use datatype="vCalendar10" mode="rw" variant="VEVENT" preferred="legacy"/>
1187      </typesupport>
1188
1189    </datastore>
1190
1191
1192    <datastore name="tasks" type="plugin">
1193      <plugin_module>[SDK_textdb]</plugin_module>
1194      <plugin_datastoreadmin>yes</plugin_datastoreadmin>
1195
1196      <!-- enable this if you want to enable the free-form user configurable filters
1197      <alertprepscript ifndef="simple"><![CDATA[
1198        // pass on configured filter expressions
1199        setrecordfilter(targetsetting("remoteFilters"),false); // remote, exclusive
1200        ADDFILTER(targetsetting("localFilters")); // local
1201      ]]></alertprepscript>
1202      -->
1203
1204      <!-- text db plugin is designed for UTF-8, make sure data is passed as UTF-8 (and not the ISO-8859-1 default) -->
1205      <datacharset>UTF-8</datacharset>
1206      <!-- text db plugin is designed for Unix linefeeds (\n, 0x0A), make data is passed with unix linefeeds (and not the DOS CRLF = 0x0D,0x0A default) -->
1207      <datalineends>unix</datalineends>
1208
1209      <!-- plugin DB may have its own identifiers to determine the point in time of changes, so
1210           we must make sure this identifier is stored (and not only the sync time) -->
1211      <storesyncidentifiers>yes</storesyncidentifiers>
1212
1213      <!-- TextDB plugin supports resume and resuming partial items, so enable these here -->
1214      <resumesupport>yes</resumesupport>
1215      <resumeitemsupport>yes</resumeitemsupport>
1216
1217
1218      <!-- Mapping of the fields to the fieldlist "calendar" -->
1219      <fieldmap fieldlist="calendar">
1220        <automap indexasname="true"/>
1221      </fieldmap>
1222
1223      <!-- datatypes supported by this datastore -->
1224      <typesupport>
1225        <use datatype="iCalendar20" mode="rw" variant="VTODO" preferred="yes"/>
1226        <use datatype="vCalendar10" mode="rw" variant="VTODO" preferred="legacy"/>
1227      </typesupport>
1228
1229    </datastore>
1230
1231
1232    <datastore name="notes" type="plugin">
1233      <plugin_module>[SDK_textdb]</plugin_module>
1234      <plugin_datastoreadmin>yes</plugin_datastoreadmin>
1235
1236      <!-- enable this if you want to enable the free-form user configurable filters
1237      <alertprepscript ifndef="simple"><![CDATA[
1238        // pass on configured filter expressions
1239        setrecordfilter(targetsetting("remoteFilters"),false); // remote, exclusive
1240        ADDFILTER(targetsetting("localFilters")); // local
1241      ]]></alertprepscript>
1242      -->
1243
1244      <!-- text db plugin is designed for UTF-8, make sure data is passed as UTF-8 (and not the ISO-8859-1 default) -->
1245      <datacharset>UTF-8</datacharset>
1246      <!-- text db plugin is designed for Unix linefeeds (\n, 0x0A), make data is passed with unix linefeeds (and not the DOS CRLF = 0x0D,0x0A default) -->
1247      <datalineends>unix</datalineends>
1248
1249      <!-- plugin DB may have its own identifiers to determine the point in time of changes, so
1250           we must make sure this identifier is stored (and not only the sync time) -->
1251      <storesyncidentifiers>yes</storesyncidentifiers>
1252
1253      <!-- TextDB plugin supports resume and resuming partial items, so enable these here -->
1254      <resumesupport>yes</resumesupport>
1255      <resumeitemsupport>yes</resumeitemsupport>
1256
1257
1258      <!-- Mapping of the fields to the fieldlist "notes" -->
1259      <fieldmap fieldlist="Note">
1260        <automap indexasname="true"/>
1261      </fieldmap>
1262
1263      <typesupport>
1264        <use datatype="note10" mode="rw" preferred="yes"/>
1265        <use datatype="note11" mode="rw"/>
1266      </typesupport>
1267
1268    </datastore>
1269
1270
1271    <datastore name="bookmarks" type="plugin">
1272      <plugin_module>[SDK_textdb]</plugin_module>
1273      <plugin_datastoreadmin>yes</plugin_datastoreadmin>
1274
1275      <!-- enable this if you want to enable the free-form user configurable filters
1276      <alertprepscript ifndef="simple"><![CDATA[
1277        // pass on configured filter expressions
1278        setrecordfilter(targetsetting("remoteFilters"),false); // remote, exclusive
1279        ADDFILTER(targetsetting("localFilters")); // local
1280      ]]></alertprepscript>
1281      -->
1282
1283      <!-- text db plugin is designed for UTF-8, make sure data is passed as UTF-8 (and not the ISO-8859-1 default) -->
1284      <datacharset>UTF-8</datacharset>
1285      <!-- text db plugin is designed for Unix linefeeds (\n, 0x0A), make data is passed with unix linefeeds (and not the DOS CRLF = 0x0D,0x0A default) -->
1286      <datalineends>unix</datalineends>
1287
1288      <!-- plugin DB may have its own identifiers to determine the point in time of changes, so
1289           we must make sure this identifier is stored (and not only the sync time) -->
1290      <storesyncidentifiers>yes</storesyncidentifiers>
1291
1292      <!-- TextDB plugin supports resume and resuming partial items, so enable these here -->
1293      <resumesupport>yes</resumesupport>
1294      <resumeitemsupport>yes</resumeitemsupport>
1295
1296
1297
1298      <!-- Mapping of the fields to the fieldlist "bookmarks" -->
1299      <fieldmap fieldlist="bookmarks">
1300        <automap indexasname="true"/>
1301      </fieldmap>
1302
1303      <!-- datatypes supported by this datastore -->
1304      <typesupport>
1305        <use datatype="vBookmark10" mode="rw" preferred="yes"/>
1306      </typesupport>
1307
1308    </datastore>
1309
1310
1311  </client>
1312
1313</sysync_config>
1314

Archive Download this file