| 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 | |