zimbra_wsdl 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1357 @@
1
+ //////////////////////////////////////////////////////////////////////
2
+ // DATETIME Elements are specified as follows:
3
+ //
4
+ //
5
+ // <s DATETIME> means:
6
+ //
7
+ // <s d="YYYYMMDD['T'HHMMSS[Z]]" [tz="timezone_identifier"]>
8
+ //
9
+ // YYYY - 4 digit year
10
+ // MM - 2 digit month
11
+ // DD - 2 digit day
12
+ // Optionally:
13
+ // 'T' the literal char "T" then
14
+ // HH - 2 digit hour (00-23)
15
+ // MM - 2 digit minute (00-59)
16
+ // SS - 2 digit second (00-59)
17
+ // ...and finally an optional "Z" meaning that the time is UTC,
18
+ // otherwise the tz="TIMEZONE" param MUST be specified with the DATETIME
19
+ //
20
+ // e.g:
21
+ // 20050612 June 12, 2005
22
+ // 20050315T18302305Z March 15, 2005 6:30:23.05 PM UTC
23
+ //
24
+ //
25
+ // tz="java timezone identifier" (see list at bottom of this file!)
26
+ //
27
+ //
28
+ // NOTE: if DATETIME has a time component (after the 'T') then it must either be specified
29
+ // in UTC (has a trailing 'Z') or else the tz= MUST be specified!!!
30
+ //
31
+
32
+ //////////////////////////////////////////////////////////////////////
33
+ // "DURATION" element (specified-duration)
34
+ //
35
+ // <dur [neg="1|0"] [w="weeks"] [d="days"] [h="hours"] [m="mins"] [s="secs"]>
36
+ //
37
+ // Special note: if WEEKS are specified, NO OTHER OFFSET MAY BE
38
+ // SPECIFIED (weeks must be alone, per RFC2445)
39
+ //
40
+
41
+
42
+ //////////////////////////////////////////////////////////////////////
43
+ //
44
+ // CREATEAPPOINTMENT
45
+ // -----------------
46
+ // This is the API to create a new Appointment, optionally sending out
47
+ // meeting Invitations to other people.
48
+ //
49
+ <CreateAppointmentRequest
50
+ [echo="1"] // if specified, the created appointment is echoed back in the response as if a GetMsgRequest was made
51
+ [max="{max-inlined-length}"] [html="*0|1"] [neuter="0|*1"] // options for echoing
52
+ >
53
+ <m f="{flags}" l="{folder}"> // See soap.txt for complete list of attrs on <m>
54
+ [<e .../>*] // users to send request to
55
+ <su>{subject}</su>
56
+
57
+ <inv>
58
+ [ // Time zone components define the time zones referenced in the
59
+ // rest of the <inv>, for start/end times and recurrence rules.
60
+ // Time zones defined in the LDAP server don't need to be defined
61
+ // here, but all custom time zones must be defined before being
62
+ // referenced.
63
+ <tz
64
+ id="tzid" // this name is referenced in various DATETIME data in the rest of <inv>
65
+ stdoff="<minutes>" // offset from UTC in standard time; local = UTC + offset
66
+ [dayoff="<minutes>"] // offset from UTC in daylight time; present only if DST is used
67
+ [stdname="abbrev"] // abbreviated name for standard time (e.g. PST)
68
+ [dayname="abbrev"] // abbreviated name for daylight time (e.g. PDT)
69
+ >
70
+ [ // If daylight savings time is not used, <standard> and <daylight> must be
71
+ // omitted. If DST is used, both <standard> and <daylight> must be present.
72
+ <standard // time/rule for transitioning from daylight time to standard time
73
+ // Either specify week/wkday combo, or mday.
74
+ [
75
+ week="<number>" // week number; 1=first, 2=second, 3=third, 4=fourth, -1=last
76
+ wkday="<number>" // day of week; 1=Sunday, 2=Monday, etc.
77
+ ]
78
+ mon="<number>" // month; 1=January, 2=February, etc.
79
+ [mday="<number>"] // day of month (1..31)
80
+ hour="<number>" // transition hour (0..23)
81
+ min="<number>" // transition minute (0..59)
82
+ sec="<number>" // transition second; 0..59, usually 0
83
+ />
84
+ <daylight // time/rule for transitioning from standard time to daylight time
85
+ [
86
+ week="<number>"
87
+ wkday="<number>"
88
+ ]
89
+ mon="<number>"
90
+ [mday="<number>"]
91
+ hour="<number>"
92
+ min="<number>"
93
+ sec="<number>"
94
+ />
95
+ ]?
96
+ </tz>
97
+ ]* // always present in responses; optional in requests if all TZs used
98
+ // in <inv> are defined in LDAP
99
+ [
100
+ <comp
101
+ [uid="uid-for-create"] // optional: client can request the UID to use
102
+ [status="TENT|CONF|CANC|NEED|COMP|INPR|WAITING|DEFERRED"]
103
+ // TENTative, CONFirmed, CANCelled, COMPleted,
104
+ // INPRogress, WAITING, DEFERRED
105
+ // Waiting and Deferred are custom values not found
106
+ // in iCalendar spec.
107
+ [fb="F|B|T|O"] // free-busy status:
108
+ Free, Busy (default), busy-Tentative, OutOfOffice (busy-unavailable)
109
+ fba="F|B|T|O" // the "actual" free-busy status of this invite (ie what the client should display) -- this is synthesized taking into account our Attendee's PartStat, the Opacity of the appointment, its Status, etc...
110
+ [transp="O|T"] // transparency: Opaque (default) or Transparent
111
+ [class="PUB|PRI|CON"] // class: PUBlic (default), PRIvate, CONfidential
112
+ [allDay="1|0"]
113
+ [name="NAME"]
114
+ [loc="LOCATION"]
115
+ [isOrg="0|1"] // Am I the organizer? (default = 0)
116
+ [seq="num"] // sequence number (default = 0)
117
+ [priority="num"] // priority (0 - 9; default = 0)
118
+ [percentComplete="num (integer)"] // percent complete for VTODO (0 - 100; default = 0)
119
+ [completed="yyyyMMddThhmmssZ"] // VTODO COMPLETED DATE-TIME
120
+ [url="url"] // URL
121
+ [noBlob="1"] // set if invite has no blob data, i.e. all data is in db metadata
122
+ [changes="comma-separated list of changed data in an updated invite"]
123
+ // Possible values are "subject", "location", "time" (start time, end time, or duration), and "recurrence".
124
+ [draft="0|1"] // set to 1 if invite has changes that haven't been sent to attendees; for organizer only
125
+ [neverSent="0|1"] // set to 1 if attendees have never been notified for this invite; for organizer only, used in SetAppointmentRequest only
126
+ >
127
+
128
+ <s DATETIME> // Start date-time (required)
129
+
130
+ (
131
+ <e DATETIME> // End date-time
132
+ OR
133
+ <dur DURATION> //<dur [neg="1|0"] [w="weeks"] [d="days"] [h="hours"] [m="mins"] [s="secs"]>
134
+ ) // one is required
135
+
136
+ [<desc>DESCRIPTION</desc>] // present if noBlob=1 and invite has plain text description
137
+ [<descHtml>HTML description</descHtml>] // present if noBlob=1 and invite has html description
138
+
139
+ // organizer
140
+ <or a="address" // email address (without "MAILTO:")
141
+ d="friendly name" // CN in iCalendar
142
+ [sentBy="sent-by"] // SENT-BY
143
+ [dir="dir"] // DIR
144
+ [lang="language"] // LANGUAGE (e.g. "en-US")
145
+ [<xparam name="x-name" [value="text"]/>]* // non-standard parameters
146
+ />
147
+ // attendee(s)
148
+ <at a="address" // email address (without "MAILTO:")
149
+ d="friendly name" // CN in iCalendar
150
+ [sentBy="sent-by"] // SENT-BY
151
+ [dir="dir"] // DIR
152
+ [lang="language"] // LANGUAGE (e.g. "en-US")
153
+ role="ROLE" // ROLE
154
+ ptst="participation status" // PARTSTAT
155
+ [rsvp="0|1"] // RSVP
156
+ [cutype="CUTYPE"] // CUTYPE
157
+ [member="MEMBER"] // MEMBER
158
+ [delTo="delegated to"] // DELEGATED-FROM
159
+ [delFrom="delegated from"] // DELEGATED-TO
160
+ [<xparam name="x-name" [value="text"]/>]* // non-standard parameters
161
+ />*
162
+ // role = CHAir, REQuired, OPTional, NON-participant (ie informational)
163
+ // ptst (ParTSTat - participation status) = "NE"eds-action, "TE"ntative, "AC"cept, "DE"clined,
164
+ // "DG" (delegated), "CO"mpleted (todo), "IN"-process (todo),
165
+ // "WA"iting (custom value only for todo), "DF" (deferred; custom value only for todo)
166
+ // cutype (calendar user type) = INDividual, GROup, RESource, ROOm, UNKnown
167
+ // sentBy, member, delTo and delFrom values are email addresses
168
+
169
+ // CATEGORIES
170
+ [<category>CATEGORY</category>]*
171
+ // COMMENTs
172
+ [<comment>COMMENT</comment>]*
173
+ // CONTACTs
174
+ [<contact>CONTACT</contact>]*
175
+ // GEO
176
+ [<geo lat="LATITUDE (float value)" lon="LONGITUDE (float value)"/]
177
+
178
+ [
179
+ <recur> // see below
180
+ [ <add|exclude>
181
+ [ <rule freq="FREQ"
182
+ // FREQ: SEC,MIN,HOU,DAI,WEE,MON,YEA
183
+
184
+ [
185
+ <until d="YYYYMMDD[ThhmmssZ]/> // UNTIL *MUST* be Date value or DateTime in UTC w/ trailing 'Z'
186
+ OR
187
+ <count num="COUNT"/> // count of instances to generate
188
+ ]? // optional UNTIL or COUNT param
189
+
190
+
191
+ [ // each of the following can occur at most once
192
+ <interval ival="COUNT"/> // COUNT: positive integer
193
+ <bysecond seclist="second[,second...]"/> // second: 0 to 59
194
+ <byminute minlist="minute[,minute...]"/> // minute: 0 to 59
195
+ <byhour hrlist="hour[,hour...]"/> // hour: 0 to 23
196
+ <byday>
197
+ <wkday [ordwk="[[+]|-]num"] day="WEEKDAY"/> // num: 1 to 53, WEEKDAY: SU,MO,TU,WE,TH,FR,SA
198
+ [<wkday>...]
199
+ </byday>
200
+ // e.g. <byday>
201
+ // <wkday day="MO"/>
202
+ // <wkday ordwk="3" day="TU"/>
203
+ // <wkday ordwk="+4" day="WE"/>
204
+ // <wkday ordwk="-1" day="SU"/>
205
+ // </byday>
206
+ //
207
+ // means every Monday of the year,
208
+ // plus Tuesday of 3rd week of the year,
209
+ // plus Wednesday of 4th week,
210
+ // plus Sunday of last week of the year.
211
+ <bymonthday modaylist="[[+]|-]num[,...]"/> // num: 1 to 31
212
+ // e.g. <bymonthday modaylist="1,+2,-7"/>
213
+ // means first day of the month, plus the 2nd day of the month,
214
+ // plus the 7th from last day of the month.
215
+ <byyearday yrdaylist="[[+]|-]num[,...]"/> // num: 1 to 366
216
+ // e.g. <byyearday yrdaylist="1,+2,-1"/>
217
+ // means January 1st, January 2nd, and December 31st.
218
+ <byweekno wklist="[[+]|-]num[,...]"/> // num: 1 to 53
219
+ // e.g. <byweekno wklist="1,+2,-1"/>
220
+ // means first week, 2nd week, and last week of the year.
221
+ <bymonth molist="month[,month...]"/> // month: 1 to 12
222
+ <bysetpos poslist="[[+]|-]num[,...]"/> // poslist: 1 to 366
223
+ // <bysetpos> MUST only be used in conjunction with another
224
+ // <byXXX> element.
225
+ <wkst day="WEEKDAY"/> // WEEKDAY: SU,MO,TU,WE,TH,FR,SA
226
+ ]*
227
+ [
228
+ <x-name name="NAME" value="VALUE"/> // custom fields
229
+ ]*
230
+ </rule>]*
231
+
232
+ // RDATE/EXDATE
233
+ [ <dates [tz="TZID"]>
234
+ // Start DATE-TIME only. Instance has same duration as
235
+ // the default duration.
236
+ // RDATE[;VALUE=DATE-TIME][;TZID=...]:val,val,val,...
237
+ <dtval>
238
+ <s d="YYYYMMDDThhmmss[Z]"/>
239
+ </dtval>*
240
+ </dates>
241
+ ]*
242
+ [ <dates [tz="TZID"]>
243
+ // Start DATE only. (all-day) Instance has same
244
+ // duration as the default duration.
245
+ // RDATE;VALUE=DATE[;TZID=...]:val,val,val,...
246
+ <dtval>
247
+ <s d="YYYYMMDD"/>
248
+ </dtval>*
249
+ </dates>
250
+ ]*
251
+ [ <dates [tz="TZID"]>
252
+ // Start date/time and either end date/time or duration.
253
+ // Only DATE-TIME format is allowed for start/end.
254
+ // This format is allowed in <add> only, but not in
255
+ // <exclude>.
256
+ // RDATE;VALUE=PERIOD[;TZID=...]:val,val,val,...
257
+ <dtval>
258
+ <s d="YYYYMMDDThhmmss[Z]"/>
259
+ <e d="YYYYMMDDThhmmss[Z]"/> OR <dur ...>
260
+ </dtval>*
261
+ </dates>
262
+ ]*
263
+ </add|/exclude>
264
+
265
+ ////////////
266
+ //
267
+ // These next two (<except> and <cancel>) are only valid for APIs that deal with the
268
+ // entire appointment such as SetAppointment and GetAppointment: they are IGNORED by
269
+ // other APIs.
270
+ [
271
+ <except recurId="INSTANCE_START_SECS_GMT" rangeType="RANGETYPE">
272
+ <add|exclude>
273
+ ...SAME AS ABOVE...
274
+ </add|/exclude>
275
+ </except>
276
+ ]*
277
+ [
278
+ <cancel recurId="INSTANCE_START_SECS_GMT" rangeType="RANGETYPE"/>
279
+ ]*
280
+ ]*
281
+ </recur>
282
+ ]
283
+
284
+ // VALARMs (RFC2445 Section 4.6.6)
285
+ [
286
+ <alarm action="DISPLAY">
287
+ <trigger>
288
+ // <rel> has the same attributes as <dur> and an optional
289
+ // "related" attribute. Default value of "related" is "START".
290
+ <rel [related="START|END"] .../> OR <abs d="YYYYMMDDThhmmssZ"/>
291
+ </trigger>
292
+ <desc>{reminder text to display}</desc>
293
+ // <repeat> has the same attributes as <dur> and an additional
294
+ // required count attribute. The duration is how often to repeat
295
+ // the alarm, and the count is how many times to trigger the
296
+ // alarm IN ADDITION TO the initial alarm.
297
+ [<repeat count="N" .../>]
298
+ [<xprop name="x-name" [value="text"]>
299
+ [<xparam name="x-name" [value="text"]/>]*
300
+ </xprop>]*
301
+ </alarm>
302
+ ]*
303
+ [
304
+ <alarm action="AUDIO">
305
+ <trigger/> // same as in DISPLAY alarm
306
+ [<repeat/>] // same as in DISPLAY alarm
307
+ [
308
+ <attach ct="{content type}" uri="{uri}"/>
309
+ OR
310
+ <attach>{base64-encoded binary data}</attach>
311
+ ]
312
+ [<xprop name="x-name" [value="text"]>
313
+ [<xparam name="x-name" [value="text"]/>]*
314
+ </xprop>]*
315
+ </alarm>
316
+ ]*
317
+ [
318
+ <alarm action="EMAIL | X-YAHOO-ACTION-IM | X-YAHOO-ACTION-MOBILE">
319
+ <trigger/> // same as in DISPLAY alarm
320
+ [<repeat/>] // same as in DISPLAY alarm
321
+ <desc>{email body}</desc>
322
+ <summary>{email subject}</summary>
323
+ <at .../>+ // attendees (one or more email recipients)
324
+ [<attach ... />] // sam as in AUDIO alarm
325
+ [<xprop name="x-name" [value="text"]>
326
+ [<xparam name="x-name" [value="text"]/>]*
327
+ </xprop>]*
328
+ </alarm>
329
+ ]*
330
+ [
331
+ <alarm action="PROCEDURE">
332
+ <trigger/> // same as in DISPLAY alarm
333
+ [<repeat/>] // same as in DISPLAY alarm
334
+ [<desc>{description test}</desc>]
335
+ <attach ... /> // same as in AUDIO alarm
336
+ [<xprop name="x-name" [value="text"]>
337
+ [<xparam name="x-name" [value="text"]/>]*
338
+ </xprop>]*
339
+ </alarm>
340
+ ]*
341
+
342
+ [
343
+ // non-standard properties (see RFC2445 section 4.8.8.1)
344
+ // e.g.
345
+ // iCalendar:
346
+ //
347
+ // X-FOO-HELLO;X-FOO-WORLD=world:hello
348
+ //
349
+ // SOAP:
350
+ //
351
+ // <xprop name="X-FOO-HELLO" value="hello">
352
+ // <xparam name="X-FOO-WORLD" value="world"/>
353
+ // </xprop>
354
+ <xprop name="x-name" [value="text"]>
355
+ [<xparam name="x-name" [value="text"]/>]*
356
+ </xprop>
357
+ ]*
358
+ </comp>
359
+ ]+
360
+ </inv>
361
+ <mp>...</mp>
362
+ [<content (url="{url}")>...</content>]
363
+ </m>
364
+ </CreateAppointmentRequest>
365
+
366
+
367
+ // CREATING EXCEPTIONS
368
+ // --------------------
369
+ //
370
+ // Just like CreateAppointment, except that instead of specifying a target FOLDER, you
371
+ // specify an existing PID and component-number
372
+ //
373
+ // *** If id= and comp= are set, then you are creating an EXCEPTION:
374
+ //
375
+ // The default invite for the appointment MUST have a recurrence rule....
376
+ // otherwise you should just be using ModifyAppointment!
377
+ //
378
+ // EXCEPTION_ID is start-time for the particular instance you are overriding
379
+ // EXCEPTION_ID MUST be some instance that matches the default-invite for
380
+ // the appointment...that is, it MUST NOT BE the start time of the exception!
381
+ //
382
+ // **The above is important** So let me explain:
383
+ //
384
+ // Given an appointment, happens every Wednesday @ 9am, with an exception that moves
385
+ // it to 10am on 6/22
386
+ //
387
+ // So our instances for June, 2005 are:
388
+ // 6/1 9am
389
+ // 6/8 9am
390
+ // 6/15 9am
391
+ // 6/22 10am (an existing EXCEPTION)
392
+ // 6/29 9am
393
+ //
394
+ // So, if a user clicks on the 6/22 10am appointment and wants to modify it, you MUST NOT
395
+ // try to use <CreateAppointmentExceptionRequest> to modify it!
396
+ // You MUST use ModifyAppointmentRequest instead!!!
397
+ //
398
+ // On the other hand, if a user clicks on the 6/15 9am appointment and wants to modify it,
399
+ // then this is the right API to use.
400
+ //
401
+ <CreateAppointmentException [id="ID_DEFAULT_INVITE" comp="COMP_DEFAULT_INVITE"] >
402
+ <m f="{flags}" l="{folder}">
403
+ ...
404
+ <inv [uid="uid-for-create"]> // optional: client can request the UID to use
405
+ [
406
+ <exceptId DATETIME> // EXCEPTION_ID -- this is the DateTime of some instance in the default appointment
407
+ ...
408
+ </inv>
409
+ </m>
410
+ </CreateAppointmentException>
411
+
412
+
413
+
414
+
415
+
416
+ ----------------------
417
+ RECURRENCE SPECIFIERS!
418
+
419
+ <recur> holds a recurence. Note that the initial instance is NOT specified by <recur>, it is implied
420
+ by the s= and (e=|dur=) parameters. The initial instance may NOT be modified by an <exclude> parameter
421
+ inside a <recur>
422
+ <add> - dates or rules which ADD instances. ADDs are evaluated before EXCLUDEs
423
+ <exclude> - dates or rules which EXCLUDE instances.
424
+ <date> - an SDATE that is added or excluded. D+DATE values may ONLY be used if this is an all-day-event!
425
+ <rule> - a RULE for specifying added/exluded instances
426
+ <freq> - "SEC","MIN","HOU","DAI","WEE","MON","YEA" - event happens every INTERVAL Seconds/Minutes/Hours/etc.
427
+ <ival> - Default is 1. Number of (secs/mins/hours/etc) between occurences.
428
+ <until> - INCLUSIVE date to stop (ie if there is a recurrence on that date, it IS added to list
429
+ <count> - number of occurences to be generated by this rule
430
+ <bymonth>,<byweekno>.... --- TODO
431
+ ----------------------
432
+
433
+ <CreateAppointmentResponse calItemId="APPOINTMENT-ID" invId="invite-message-id" ms="change-sequence" rev="revision">
434
+ [<echo><m .../></echo>] // if echo="1" was specified in the request
435
+ </CreateAppointmentResponse>
436
+
437
+
438
+ //////////////////////////////////////////////////////////////////////
439
+ //
440
+ // Directly set status of an entire appointment. This API is intended
441
+ // for mailbox Migration (ie migrating a mailbox onto this server) and
442
+ // is not used by normal mail clients.
443
+ //
444
+ // need to specifiy folder for appointment
445
+ //
446
+ // need way to add message WITHOUT processing it for calendar parts.
447
+ // need to generate and patch-in the iCalendar for the <inv> but w/o
448
+ // actually processing the <inv> as a new request
449
+ //
450
+ // TODO: need way to link message to appointment after the fact
451
+ //
452
+ //
453
+ <SetAppointmentRequest
454
+ [l="folder_to_create_in"] [f="flags"] [t="tags"]
455
+ [noNextAlarm="1"] // means all alarms have been dismissed; if this is set, nextAlarm should not be set
456
+ [nextAlarm="next alarm will go off at"] // if specified, time when next alarm should go off
457
+ // if missing, two possibilities:
458
+ // 1) if noNextAlarm isn't set, keep current next alarm time
459
+ // (this is backward compatibility case)
460
+ // 2) if noNextAlarm=1, indicates all alarms have been dismissed
461
+ >
462
+ <default
463
+ ptst="NE|AC|TE|DE|DG|CO|IN" // my participation status
464
+ >
465
+ <m [aid="{uploaded-MIME-body-ID}"] > ...see CreateAppointmentRequest...
466
+ **************
467
+ ONE OF:
468
+ 1) XML <inv> format from CreateAppointment
469
+ <inv>
470
+ <comp>
471
+ ...
472
+ <exceptId DATETIME> // EXCEPTION_ID -- this is the DateTime of some instance in the default appointment
473
+ ...
474
+ </comp>
475
+ </inv>
476
+ <mp ct="content type">
477
+ meeting notes parts
478
+ </mp>
479
+ OR
480
+ 2) Raw MimeMessage import:
481
+ <mp ct="content type">
482
+ <content>
483
+ RAW RFC822 MESSAGE (XML-encoded) ***MUST CONTAIN A text/calendar PART***
484
+ </content>
485
+ </mp>
486
+ [<inv> ... </inv] -- optional, overrides the text/calendar from the inlined message body
487
+ OR
488
+ 3) Raw MimeMessage uploaded as attachment ID (see AddMsgRequest in soap.txt)
489
+ [<inv> ... </inv] -- optional, overrides the text/calendar from the referenced uploaded message body
490
+ *************
491
+ </m>
492
+ </default>
493
+ [<except
494
+ ptst="NE|AC|TE|DE|DG|CO|IN" // my participation status
495
+ >
496
+ <m> Same as under <default> above
497
+ ...
498
+ **1 of the 3 forms above**
499
+ </m>
500
+ </except>]*
501
+ [<cancel>
502
+ <m> Same as under <default> above
503
+ ...
504
+ **1 of the 3 forms above**
505
+
506
+ If using <inv> form, these elements and attributes must be present:
507
+
508
+ <inv>
509
+ [<tz>...</tz>]*
510
+ <comp
511
+ d="{date}"
512
+ uid="{UID}"
513
+ seq="{sequence}" // must be incremented from original sequence
514
+ [name="{name}]
515
+ [allDay="{allDay}"]>
516
+ <exceptId ...> // RECURRENCE-ID
517
+ <s ...> // DTSTART
518
+ <or ...> // ORGANIZER
519
+ <at ...>+ // ATTENDEEs
520
+ </comp>
521
+ </inv>
522
+ <mp ct="content type">meeting notes parts</mp>
523
+
524
+ All others are ignored.
525
+ </m>
526
+ </cancel>]*
527
+
528
+ // List of replies received from attendees. If SetAppointmenRequest doesn't contain <replies>
529
+ // block, existing replies will be kept. If <replies/> element is provided with no <reply>
530
+ // elements inside, existing replies will be removed, replaced with an empty set. If <replies>
531
+ // contains one or more <reply> elements, existing replies are replaced with the ones provided.
532
+ [<replies>
533
+ [<reply d="TIMESTAMP_OF_REPLY"
534
+ at="foo@bar.com" // address of attendee who replied
535
+ ptst="AC|DE|TE|NE" // accepted, declined, etc.
536
+ [ // present if reply is to an instance in a recurrence
537
+ recurId="YYMMDD[THHMMSS[Z]]"
538
+ [tz="timezonename"]
539
+ ]
540
+ />]*
541
+ </replies>] // one or more replies which we have sent out
542
+
543
+ </SetAppointmentRequest>
544
+
545
+ <SetAppointmentResponse calItemId="appointment_id">
546
+ <default id="invId_of_default_invite/>
547
+ [<except recurId="recurrence_id_of_exception"
548
+ id="invId_of_exception/>]*
549
+ </SetAppointmentResponse>
550
+
551
+
552
+ //////////////////////////////////////////////////////////////////////
553
+ //
554
+ // AddAppointmentInvite
555
+ //
556
+ // Add an invite. The invite corresponds to a VEVENT component. Based on the UID specified (required),
557
+ // a new appointment is created in the default calendar if necessary. If an appointment with the same UID
558
+ // exists, the appointment is updated with the new invite only if the invite is not outdated, according to
559
+ // the iCalendar sequencing rule (based on SEQUENCE, RECURRENCE-ID and DTSTAMP).
560
+ //
561
+
562
+ <AddAppointmentInviteRequest>
563
+ <m ...> // same as <m> under <default> in SetAppointmentRequest
564
+ </m>
565
+ </AddAppointmentInviteRequest>
566
+
567
+ <AddAppointmentInviteResponse
568
+ // These attributes are returned only if the invite was added successfully. They are omitted if invite
569
+ // was ignored as being outdated.
570
+ [calItemId="calendar item id"]
571
+ [invId="invite id of the added invite"]
572
+ [compNum="compNum of the added invite"]
573
+ />
574
+
575
+
576
+ //////////////////////////////////////////////////////////////////////
577
+ //
578
+ // GetApptSummaries
579
+ //
580
+ // DEPRECATED -- this API is deprectated. Use <SearchRequest> with
581
+ // the calExpandInstStart and calExpandInstEnd parameters
582
+ //
583
+ //<GetApptSummariesRequest s="RANGE_START_MSECS_GMT" e="RANGE_END_MSECS_GMT" [l="{folder-id}"]/>
584
+ //
585
+ // -- folder-id: optional folder to constrain requests to; otherwise, searches all folders but trash and spam
586
+ //
587
+ //<GetApptSummariesResponse>
588
+ // ( <appt id="appointment_mail_item_id"
589
+ // [fba="F|B|T|U"]
590
+ // [transp="O|T"]
591
+ // [class="PUB|PRI|CON"]
592
+ // status="TENT|CONF|CANC"
593
+ // ptst="NE|TE|AC|DE|DG"
594
+ // [allDay="1"] // if set, this is an "all day" appointment
595
+ // [draft="1"] // set if invite has changes that haven't been sent to attendees; for organizer only
596
+ // [neverSent="0|1"] // set if attendees were never notified of this invite; for organizer only
597
+ // [otherAtt="1"] // if set, this appointment has other attendees
598
+ // [alarm="1"]
599
+ // [recur="1"] // if set, this is a recurring appointment
600
+ // [hasEx="1"] // if set, this is a recurring appointment with exceptions
601
+ // [name="NAME"] [loc="LOCATION"]
602
+ // invId="default_invite_mail_item_id" compNum="default_invite_component_number"
603
+ // isOrg="default_am_i_organizer_flag"
604
+ // [priority="num"]
605
+ // [percentComplete="num"]
606
+ // [d="duration"] // default duration
607
+ // [f="flags"]
608
+ // [t="tags"]
609
+ // >
610
+ // <fr>FRAGMENT</fr>
611
+ // [<category>CATEGORY</category>]*
612
+ // [<geo lat="LATITUDE (float value)" lon="LONGITUDE (float value)"/]
613
+ //
614
+ // ( <inst
615
+ // [s="START_SECS_GMT"]
616
+ // [tzo="ms"] // offset from GMT in milliseconds for start time in the
617
+ // // time zone of the instance; this is useful because the
618
+ // // instance time zone may not be the same as the time zone
619
+ // // of the requesting client; when rendering an all-day
620
+ // // appointment, the client must shift the appointment by
621
+ // // the difference between the instance time zone and its
622
+ // // local time zone to determine the correct date to render
623
+ // // the all-day block
624
+ // [ex="1"]
625
+ // [ANY CHANGED PARAMETERS]
626
+ // >
627
+ // [<f>FRAGMENT IF DIFFERENT FROM DEFAULT</f>]
628
+ // [<dur DURATION>] // duration this instance if not same as default
629
+ // [<isOrg>] // isOrg flag if not same as default
630
+ // [<otherAtt>] // otherAtt flag if not same as default
631
+ // [<category>CATEGORY</category>]*
632
+ // [<geo lat="LATITUDE (float value)" lon="LONGITUDE (float value)"/]
633
+ // </inst>
634
+ // )+
635
+ //
636
+ // </appt> )*
637
+ //</GetApptSummariesResponse>
638
+ //
639
+ // -- fba: actual free-busy status: Free, Busy, busy-Tentative, busy-Unavailable (a.k.a. OutOfOffice)
640
+ // While free-busy status is simply a property of an event that
641
+ // is set during creation/update, "actual" free-busy status is the true
642
+ // free-busy state that depends on appt/invite free-busy, event scheduling
643
+ // status (confirmed vs. tentative vs. cancel), and more importantly, the
644
+ // attendee's participation status. For example, actual free-busy is
645
+ // busy-Tentative for an event with Busy free-busy value until the attendee
646
+ // has acted on the invite.
647
+ // -- transp: transparency: Opaque, Transparent
648
+ // -- status: status of event: TENTative, CONFirmed or CANCelled
649
+ // -- ptst: **your** participation status: NEeds-action, TEntative, ACcept, DEclined, DG (delegated)
650
+ // -- get the summary of appointments for a specified time period...
651
+ // -- otherAtt: 1 if there are other attendees to the meeting
652
+ // -- alarm: 1 if there are some alarms
653
+ // -- recur: 1 if this is a recurring appointment
654
+ // -- id is mail_item id of APPOINTMENT object
655
+ // -- invId is mail_item id of invite message with detailed information
656
+ // -- comp is component number (invite # within the message)
657
+ // -- parameters in the apptSum are "defaults" -- are same in instance unless specified
658
+ //
659
+ // END DEPRECATED BLOCK
660
+ //
661
+ //////////////////////////////////////////////////////////////////////
662
+
663
+
664
+ //////////////////////////////////////////////////////////////////////
665
+ //
666
+ // GetFreeBusyRequest
667
+ //
668
+ // (f)ree (b)usy busy-(t)entative busy-(u)navailable or (n)o-data elements
669
+ //
670
+ <GetFreeBusyRequest s="RANGE_START_MSECS_GMT" e="RANGE_END_MSECS_GMT"
671
+ [uid="zimbraId/email,..."] // DEPRECATED
672
+ // comma-separated list of zimraId or email
673
+ // each value can be zimbraId or email
674
+ [id="zimbraId,..."] // comma-separated list of zimbraId
675
+ [name="email,..."] // comma-separated list of email
676
+ // For accounts listed in uid/id/name above, f/b search will be done for all calendar folders.
677
+ // To view free/busy for a single folder in a particular account, use the <usr> format below.
678
+ [excludeUid="UID of appointment to exclude from free/busy search"]
679
+ >
680
+ [<usr [id="zimbraId] [name="email"] // either id or email must be specified
681
+ [l="folder id"] // calendar folder id; if omitted, get f/b on all calendar folders
682
+ />]*
683
+ </GetFreeBusyRequest>
684
+ <GetFreeBusyResponse>
685
+ <usr id="id"> // id is always account email; it is not zimbraId as the attribute name may suggest
686
+ <f s="START_MSECS_GMT" e="END_MSECS_GMT"/>*
687
+ <b s="START_MSECS_GMT" e="END_MSECS_GMT"/>*
688
+ <t s="START_MSECS_GMT" e="END_MSECS_GMT"/>*
689
+ <u s="START_MSECS_GMT" e="END_MSECS_GMT"/>* // a.k.a. out of office
690
+ <n s="START_MSECS_GMT" e="END_MSECS_GMT"/>* // could not retrieve data for that user
691
+ </usr>
692
+ <GetFreeBusyResponse>
693
+
694
+
695
+ //////////////////////////////////////////////////////////////////////
696
+ //
697
+ // GetWorkingHoursRequest
698
+ //
699
+ // (f)ree busy-(u)navailable or (n)o-data elements
700
+ //
701
+ // User's working hours within the given time range are expressed in a similar format as GetFreeBusy.
702
+ // Working hours are indicated as free, non-working hours as unavailable/out of office. The entire time
703
+ // range is marked as unknown if there was an error determining the working hours, e.g. unknown user.
704
+ //
705
+ <GetWorkingHoursRequest s="RANGE_START_MSECS_GMT" e="RANGE_END_MSECS_GMT"
706
+ [id="zimbraId,..."] // comma-separated list of zimbraId
707
+ [name="email,..."] // comma-separated list of email
708
+ />
709
+ <GetWorkingHoursResponse>
710
+ <usr id="id"> // id is always account email; it is not zimbraId as the attribute name may suggest
711
+ <f s="START_MSECS_GMT" e="END_MSECS_GMT"/>* // working hours
712
+ <u s="START_MSECS_GMT" e="END_MSECS_GMT"/>* // non-working hours
713
+ <n s="START_MSECS_GMT" e="END_MSECS_GMT"/>* // could not retrieve data for that user
714
+ </usr>
715
+ <GetWorkingHoursResponse>
716
+
717
+
718
+ //////////////////////////////////////////////////////////////////////
719
+ //
720
+ // CancelAppointment(DEFAULT-INVITE-ID, COMPONENT-NUMBER)
721
+ //
722
+ // NOTE: If canceling an exception, the original instance (ie the one the exception was "excepting") WILL NOT
723
+ // be restored when you cancel this exception.
724
+ //
725
+ // if <inst> is set, then this cancels just the specified instance or range of instances,
726
+ // otherwise it cancels the entire appointment. If <inst> is not set, then id MUST refer to the default
727
+ // invite for the appointment.
728
+ //
729
+ <CancelAppointmentRequest id="ID_OF_DEFAULT_INVITE" comp="COMPONENT_NUM_DEFAULT_INVITE">
730
+ [<tz ...>] // definition for TZID referenced by DATETIME in <inst>
731
+ [<inst [range="THISANDFUTURE|THISANDPRIOR"] DATETTIME/>]?
732
+ [ <m>
733
+ [<e.../>*] // users to send update to
734
+ [<su>{subject of cancellation mail}</su>]
735
+ <mp>...</mp>
736
+ </m> ]
737
+ </CancelAppointmentRequest>
738
+
739
+ <CancelAppointmentResponse>....
740
+
741
+
742
+ //////////////////////////////////////////////////////////////////////
743
+ //
744
+ // GetMsgResponse
745
+ //
746
+ // CALENDAR PART for Invite messages
747
+ //
748
+ <GetMsgResponse> // mesage with invite
749
+ <m id="{message-id}" f="{flags}" t="{tags}" s="{size}" d="{date}" l="{folder}"
750
+ rev="{revision-number}" md="{date-metadata-changed}" ms="{change-sequence}"
751
+ >
752
+ [<e .../>*] // optional users to send request to
753
+
754
+ <inv type="appt|task" id="{invId}">
755
+ [
756
+ <comp status="TENT|CONF|CANC"
757
+ d="{date}"
758
+ fb="F|B|T|U"
759
+ fba="F|B|T|U" // Your current status -- what is returned in FreeBusy for you TODO
760
+ transp="O|T"
761
+ [class="PUB|PRI|CON"]
762
+ [ex="1|0] // 1 if this Invite is an Exception
763
+ [allDay="1|0"] [name="NAME"]
764
+ [loc="LOCATION"]
765
+ [url="URL"]
766
+ [rsvp="1|0"] // rsvp - 1 if response requested, 0 if no response requested
767
+ [calItemId="mail-item-id-of-appointment"]
768
+ [ciFolder="folder of appointment"]
769
+ [updatedMsgId="id" updatedCompNum="compNum"] // if these are set, then this invite has been
770
+ // invalidated because a new update was received that
771
+ // takes precedence over it
772
+ //
773
+ // id=0, compnum=0 is a SPECIAL CASE: it means "we don't know
774
+ // what invite overrides this one, but we do know this one is
775
+ // not referenced. This can happen if this is a
776
+ // recurrence-exception and default-invite is modified in a way
777
+ // that invalidates this one...or it can happen if there is an
778
+ // out-of-order message delivery (the exception invite is received
779
+ // before the initial invite) or if the Appointment object doesn't
780
+ // exist (ie it was deleted) or various other times...
781
+ //
782
+
783
+ [isOrg="1"] // 1 if you are the Organizer of this event
784
+ [ridZ="YYYYMMDD[ThhmmssZ]"] // RECURRENCE-ID in "Z" (UTC) timezone, if this is an exception
785
+ [changes="comma-separated list of changed data in an updated invite"]
786
+ // Possible values are "subject", "location", "time" (start time, end time, or duration), and "recurrence".
787
+ [draft="0|1"] // set to 1 if invite has changes that haven't been sent to attendees; for organizer only
788
+ [neverSent="0|1"] // set if attendees were never notified of this invite; for organizer only
789
+ >
790
+
791
+ <s DATETIME
792
+ [u="millis since epoch"] // set if non-all-day
793
+ /> // Start date-time (required)
794
+ (
795
+ <e DATETIME
796
+ [u="millis since epoch"] // set if non-all-day
797
+ /> // End date-time
798
+ OR
799
+ <dur DURATION/>
800
+ )
801
+
802
+ [<exceptId .../>] // RECURRENCE-ID, if this is an exception
803
+
804
+ <or ...> // organizer
805
+ <at ...>* // attendee
806
+ [
807
+ <recur>
808
+ RECURRENCE PART
809
+ </recur>
810
+ ]
811
+ // CATEGORIES
812
+ [<category>CATEGORY</category>]*
813
+ // COMMENTs
814
+ [<comment>COMMENT</comment>]*
815
+ // CONTACTs
816
+ [<contact>CONTACT</contact>]*
817
+ // GEO
818
+ [<geo lat="LATITUDE (float value)" lon="LONGITUDE (float value)"/]
819
+ </comp>
820
+
821
+
822
+ ]+
823
+ </inv>
824
+ [<mp>...</mp>]
825
+ </m>
826
+ </GetMsgResponse>
827
+
828
+
829
+ //////////////////////////////////////////////////////////////////////
830
+ //
831
+ // ModifyAppointment
832
+ //
833
+ // Modify an appointment, or if the appointment is a recurrence then modify the "default"
834
+ // invites: that is, all instances that do not have exceptions
835
+ //
836
+ // If the appointment has a <recur>, then the following caveats are worth mentioning:
837
+ //
838
+ // -- If any of: START, DURATION, END or RECUR change, then all exceptions are implicitly canceled!
839
+ //
840
+ <ModifyAppointmentRequest id="INVITE_ID_OF_DEFAULT_INVITE" comp="COMPONENT_NUM_DEFAULT_INVITE"
841
+ ms="change-sequence of fetched version" rev="revision of fetched version"
842
+ [echo="1"] // if specified, the modified appointment is echoed back in the response as if a GetMsgRequest was made
843
+ [max="{max-inlined-length}"] [html="*0|1"] [neuter="0|*1"] // options for echoing
844
+ >
845
+ rest is SAME as CreateAppointmentRequest
846
+ </ModifyAppointmentRequest>
847
+
848
+ <ModifyAppointmentResponse calItemId="appointment-id" invId="invite-message-id" ms="change-sequence" rev="revision">
849
+ [<echo><m .../></echo>] // if echo="1" was specified in the request
850
+ </ModifyAppointmentResponse>
851
+
852
+ "ms" and "rev" are used for conflict detection. By setting these, the request indicates
853
+ which version of the appointment it is attempting to modify. If the appointment was updated on
854
+ the server between the fetch and modify, an INVITE_OUT_OF_DATE exception will be thrown.
855
+
856
+
857
+ //////////////////////////////////////////////////////////////////////
858
+ //
859
+ // CreateAppointmentException (invId, compNum, instanceid)
860
+ //
861
+ // The default invite for the appointment MUST have a recurrence rule....
862
+ // otherwise you should just be using ModifyAppointment!
863
+ //
864
+ // EXCEPTION_ID is start-time for the particular instance you are overriding
865
+ // EXCEPTION_ID MUST be some instance that matches the default-invite for
866
+ // the appointment...that is, it MUST NOT BE the start time of the exception!
867
+ //
868
+ // **The above is important** So let me explain:
869
+ //
870
+ // Given an appointment, happens every Wednesday @ 9am, with an exception that moves
871
+ // it to 10am on 6/22
872
+ //
873
+ // So our instances for June, 2005 are:
874
+ // 6/1 9am
875
+ // 6/8 9am
876
+ // 6/15 9am
877
+ // 6/22 10am (an existing EXCEPTION)
878
+ // 6/29 9am
879
+ //
880
+ // So, if a user clicks on the 6/22 10am appointment and wants to modify it, you MUST NOT
881
+ // try to use <CreateAppointmentExceptionRequest> to modify it!
882
+ // You MUST use ModifyAppointmentRequest instead!!!
883
+ //
884
+ // On the other hand, if a user clicks on the 6/15 9am appointment and wants to modify it,
885
+ // then this is the right API to use.
886
+ //
887
+ <CreateAppointmentExceptionRequest id="ID_DEFAULT_INVITE" comp="COMP_DEFAULT_INVITE"
888
+ ms="change-sequence of fetched series" rev="revision of fetched series"
889
+ [echo="1"] // if specified, the created exception is echoed back in the response as if a GetMsgRequest was made
890
+ [max="{max-inlined-length}"] [html="*0|1"] [neuter="0|*1"] // options for echoing
891
+ >
892
+
893
+ Just like CreateAppointmentRequest above:
894
+ <m f="{flags}" l="{folder}">
895
+ ...
896
+ <inv>
897
+ ...
898
+ <exceptId DATETIME> // EXCEPTION_ID -- this is the DateTime of some instance in the default appointment
899
+ ...
900
+ </inv>
901
+ </m>
902
+
903
+ </CreateAppointmentExceptionRequest>
904
+
905
+ <CreateAppointmentExceptionResponse>...
906
+
907
+ "ms" and "rev" are used for conflict detection. The create exception request indicates the baseline
908
+ series version. If the appointment was modified on the server between the series fetch and exception
909
+ creation, an INVITE_OUT_OF_DATE exception will be thrown.
910
+
911
+
912
+ //////////////////////////////////////////////////////////////////////
913
+ //
914
+ // ExpandRecur
915
+ //
916
+
917
+ <ExpandRecurRequest s="start time in millis" e="end time in millis">
918
+ <tz/>*
919
+ [<comp> // series
920
+ <s/> // DTSTART
921
+ [<e/> OR <dur/>] // DTEND/DURATION
922
+ <recur/> // RRULE/RDATE/EXDATE
923
+ </comp>]
924
+ [<except> // modified instances
925
+ <s/> // DTSTART
926
+ [<e/> OR <dur/>] // DTEND/DURATION
927
+ <exceptId/> // RECURRENCE-ID
928
+ </except>]*
929
+ [<cancel> // canceled instances
930
+ <exceptId/> // RECURRENCE-ID
931
+ </cancel>]*
932
+ </ExpandRecurRequest>
933
+
934
+ <ExpandRecurResponse>
935
+ <inst s="start time in millis" dur="duration in millis"
936
+ ridZ="recurrence-id string in UTC timezone"
937
+ [allDay="1"] // if instance is for an all-day appointment
938
+ [tzo="millis"] // GMT offset of start time in millis; returned only when allDay=1
939
+ />*
940
+ </ExpandRecurResponse>
941
+
942
+
943
+ //////////////////////////////////////////////////////////////////////
944
+ //
945
+ // GetRecur
946
+ //
947
+ // Retrieve the recurrence definition of an appointment
948
+ //
949
+ <GetRecurRequest id="calendar item id"/>
950
+
951
+ <GetRecurResponse>
952
+ [same as ExpandRecurRequest content]
953
+ </GetRecurResponse>
954
+
955
+
956
+
957
+ //////////////////////////////////////////////////////////////////////
958
+ //
959
+ // CheckRecurConflicts
960
+ //
961
+ // Check conflicts in recurrence against list of users.
962
+ // Use all=1 to get all instances, even those without conflicts. By default
963
+ // only instances that have conflicts are returned.
964
+ //
965
+
966
+ <CheckRecurConflictsRequest
967
+ [s="start time in millis"] // if not specified, defaults to current time
968
+ [e="end time in millis"] // if not specified, unlimited
969
+ [all="1"]
970
+ [excludeUid="UID of appointment to exclude from free/busy search"]
971
+ >
972
+ tz/comp/except/cancel elements (same as ExpandRecurRequest content)
973
+ [<usr [id="zimbraId] [name="email"] // either id or email must be specified
974
+ [l="folder id"] // calendar folder id; if omitted, get f/b on all calendar folders
975
+ />]*
976
+ </CheckRecurConflictsRequest>
977
+
978
+ <CheckRecurConflictsResponse>
979
+ <inst s="start time in millis" dur="duration in millis"
980
+ ridZ="recurrence-id string in UTC timezone"
981
+ [allDay="1"] // if instance is for an all-day appointment
982
+ [tzo="millis"] // GMT offset of start time in millis; returned only when allDay=1
983
+ >
984
+ <usr name="email" fb="B|T|O"/>* // for all users who have a conflict with the instance
985
+ // fb is free/busy status (Busy, Tentative or Out-of-office)
986
+ </inst>*
987
+ </CheckRecurConflictsResponse>
988
+
989
+
990
+ //////////////////////////////////////////////////////////////////////
991
+ //
992
+ // Retrieve the unparsed (but XML-encoded (&quot) iCalendar data for an Invite
993
+ //
994
+ // This is intended for interfacing with 3rd party programs
995
+ //
996
+ <GetICalRequest [id="invMsgId"] [s="RANGE_START_MSECS_GMT" e="RANGE_END_MSECS_GMT" l="{folder}"/>
997
+
998
+ -- if id is specified, gets iCalendar representation for one
999
+ Invite
1000
+
1001
+ -- if id is not specified, then start/end MUST be, Calendar data
1002
+ is returned for entire specified range
1003
+
1004
+ <GetICalResponse>
1005
+ <ical>
1006
+ ICALENDAR DATA
1007
+ </ical>
1008
+ </GetICalResponse>
1009
+
1010
+
1011
+
1012
+ //////////////////////////////////////////////////////////////////////
1013
+ //
1014
+ // SendInviteReply
1015
+ //
1016
+ //
1017
+ <SendInviteReplyRequest id="mail_item_id" compNum="comp_num"
1018
+ verb="VERB" [updateOrganizer="1|0"]
1019
+ [idnt="{identity-id}"] // use this identity to send reply
1020
+ >
1021
+ [<tz ...>] // definition for TZID referenced by DATETIME in <exceptId>
1022
+ [<exceptId DATETIME>]? // reply to just one instance of the specified Invite (default is all instances)
1023
+ [<m>...</m>]
1024
+ </SendInviteReplyRequest>
1025
+
1026
+ id : unique ID of the invite (and component therein) you are replying to
1027
+ comp : component number of the invite
1028
+ verb : ACCEPT, COMPLETED, DECLINE, DELEGATED, TENTATIVE (Completed/Delegated are NOT supported as of 9/12/2005)
1029
+ m : embedded message, if the user wants to send a custom update message.
1030
+ The client is responsible for setting the message recipient list in
1031
+ this case (which should include Organizer, if the client wants to tell
1032
+ the organizer about this response)
1033
+ updateOrganizer: yes by default, if no then only make the update locally. This parameter
1034
+ has no effect if an <m> element is present.
1035
+
1036
+ <SendInviteReplyResponse status="STATUS"/>
1037
+
1038
+ status: OK, OLD (a newer invite exists for that appointment), ALREADY-REPLIED, FAIL (other failure)
1039
+
1040
+
1041
+ //////////////////////////////////////////////////////////////////////
1042
+ //
1043
+ // CounterAppointment
1044
+ //
1045
+ // Propose a new time/location. Sent by meeting attendee to organizer.
1046
+ // The syntax is very similar to CreateAppointmentRequest.
1047
+ //
1048
+ //
1049
+ <CounterAppointmentRequest>
1050
+ <m>
1051
+ <e t="f" .../> // From
1052
+ <e t="t" .../> // To
1053
+ <su>...</su> // Subject
1054
+ <mp>...</mp> // plain/html texts
1055
+ <inv> // iCalendar COUNTER object
1056
+ [<tz .../>]
1057
+ <comp name="{subject}" uid="{UID}" seq="{SEQUENCE}" ...>
1058
+ [<exceptId .../>] // RECURRENCE-ID if dealing with an instance of a recurrence
1059
+ <s .../> // start time
1060
+ <e .../> // end time
1061
+ <or .../> // organizer (the appointment's organizer who will be receiving the counter proposal)
1062
+ <at .../> // attendee (the attendee sending this counter request)
1063
+ </comp>
1064
+ </inv>
1065
+ </m>
1066
+ </CounterAppointmentRequest>
1067
+
1068
+ <CounterAppointmentResponse/>
1069
+
1070
+
1071
+ //////////////////////////////////////////////////////////////////////
1072
+ //
1073
+ // DeclineCounterAppointment
1074
+ //
1075
+ // Decline a change proposal from an attendee. Sent by organizer to an attendee
1076
+ // who has previously sent a COUNTER message. The syntax is very similar to
1077
+ // CreateAppointmentRequest.
1078
+ //
1079
+ <DeclineCounterAppointmentRequest>
1080
+ <m>
1081
+ <e t="f" .../> // From
1082
+ <e t="t" .../> // To
1083
+ <su>...</su> // Subject
1084
+ <mp>...</mp> // plain/html texts
1085
+ <inv> // iCalendar DECLINECOUNTER object
1086
+ [<tz .../>]
1087
+ // comp should echo the same data
1088
+ <comp name="{subject}" uid="{UID}" seq="{SEQUENCE}" ...>
1089
+ [<exceptId .../>] // RECURRENCE-ID if dealing with an instance of a recurrence
1090
+ <s .../> // start time
1091
+ <e .../> // end time
1092
+ <or .../> // organizer
1093
+ <at .../> // attendee (the attendee whose COUNTER proposal is being declined)
1094
+ </comp>
1095
+ </inv>
1096
+
1097
+ ... // same as sending email; specify subject, recipient, etc.
1098
+ <inv>
1099
+ // equivalent of iCalendar DECLINECOUNTER VEVENT
1100
+ </inv>
1101
+ </m>
1102
+ </DeclineCounterAppointmentRequest>
1103
+
1104
+ <DeclineCounterAppointmentResponse/>
1105
+
1106
+
1107
+ //////////////////////////////////////////////////////////////////////
1108
+ //
1109
+ // ForwardAppointment
1110
+ //
1111
+ // Used by an attendee to forward an instance or entire appointment to
1112
+ // another user who is not already an attendee.
1113
+ //
1114
+ //
1115
+ <ForwardAppointmentRequest id="Appointment item id">
1116
+ [<tz .../>] // definition for TZID referenced by DATETIME in <exceptId>
1117
+ [<exceptId DATETIME/>] // RECURRENCE-ID if forwarding a single instance of a recurring appointment
1118
+ <m>
1119
+ <e t="f" .../> // From
1120
+ <e t="t" .../>+ // To
1121
+ <su>...</su> // Subject
1122
+ <mp>...</mp> // plain/html texts
1123
+ </m>
1124
+ </ForwardAppointmentRequest>
1125
+
1126
+ <ForwardAppointmentResponse/>
1127
+
1128
+
1129
+
1130
+ //////////////////////////////////////////////////////////////////////
1131
+ //
1132
+ // ForwardAppointmentInvite
1133
+ //
1134
+ // Used by an attendee to forward an appointment invite email to
1135
+ // another user who is not already an attendee.
1136
+ //
1137
+ // To forward an appointment item, use ForwardAppointmentRequest instead.
1138
+ //
1139
+ //
1140
+ <ForwardAppointmentInviteRequest id="invite Message item id">
1141
+ <m>
1142
+ <e t="f" .../> // From
1143
+ <e t="t" .../>+ // To
1144
+ <su>...</su> // Subject
1145
+ <mp>...</mp> // plain/html texts
1146
+ </m>
1147
+ </ForwardAppointmentInviteRequest>
1148
+
1149
+ <ForwardAppointmentInviteResponse/>
1150
+
1151
+
1152
+
1153
+ //////////////////////////////////////////////////////////////////////
1154
+ //
1155
+ // GetAppointment
1156
+ //
1157
+ // Returns the metadata info for each Invite that makes up this appointment.
1158
+ //
1159
+ // The content (original email) for each invite is stored within the Appointment itself in
1160
+ // a big multipart/digest containing each invite in the appointment as a sub-mimepart --
1161
+ // it can be retreived from the content servlet:
1162
+ //
1163
+ // http://servername/service/content/get?id=<calItemId>
1164
+ //
1165
+ //
1166
+ // The content for a single Invite can be requested from the content servlet (or from <GetMsg>)
1167
+ // Individual The client can ALSO request just the content for each individual invite using a
1168
+ // compound item-id request:
1169
+ // http://servername/service/content/get?id="calItemId-invite_mail_item_id"
1170
+ // <GetMsgRequest><m id="calItemId-invite_mail_item_id"
1171
+ //
1172
+ //
1173
+ // IMPORTANT NOTE: DO NOT use the raw invite-mail-item-id to fetch the content: it might work
1174
+ // sometimes, however the invite is a standard mail-message it can be deleted by the user at
1175
+ // any time!
1176
+ //
1177
+ <GetAppointmentRequest
1178
+ id="appointment_id" // either id or uid should be specified, but not both
1179
+ uid="iCalendar UID"
1180
+ [sync="1"]
1181
+ [includeContent="0|1"] // if 1, MIME parts for body content are returned; default 0
1182
+ />
1183
+
1184
+ <GetAppointmentResponse>
1185
+ <appt uid="UID" id="appointment_id" [f="{flags}"] [t="{tags}"] s="{size}" d="{date}" l="{folder}"
1186
+ [nextAlarm="next alarm will go off at"]
1187
+ [orphan="1"] // if appointment has exception instances only without the recurrence series
1188
+ >
1189
+ [<inv id="invite-original-mail-item-id" compNum="component-number" seq="num">
1190
+ ...
1191
+ ---See <inv> part of GetMsgResponse---
1192
+ ...
1193
+
1194
+ [<mp> ... </mp>] // body content, if includeContent="1" was specified in the request
1195
+ </inv>]+
1196
+
1197
+ // List of replies received from attendees.
1198
+ [<replies>
1199
+ [<reply d="TIMESTAMP_OF_REPLY"
1200
+ at="foo@bar.com" // address of attendee who replied
1201
+ ptst="AC|DE|TE|NE" // accepted, declined, etc.
1202
+ [ // present if reply is to an instance in a recurrence
1203
+ recurId="YYMMDD[THHMMSS[Z]]"
1204
+ [tz="timezonename"]
1205
+ rangeType="1" // always 1
1206
+ [ridZ="YYMMDDTHHMMSSZ"] // recurrence-id in UTC time zone; used in non-all-day appointments only
1207
+ ]
1208
+ />]*
1209
+ </replies>] // one or more replies which we have sent out
1210
+
1211
+ </appt>
1212
+ </GetAppointmentResponse>
1213
+
1214
+ if sync="1" present, return modified date (md) on appointment.
1215
+
1216
+ -------------------------------------------------------------------------------
1217
+
1218
+ <ImportAppointmentsRequest ct="{content-type}" [l="{folder-id}"]>
1219
+ <content [aid="{attach-upload-id}"] // use an uploaded object
1220
+ [mid="{message-id}" part="{part-identifier}] // use a part in an existing message
1221
+ >
1222
+ ... // or inline the data
1223
+ </content>
1224
+ </ImportAppointmentsRequest>
1225
+
1226
+ <ImportAppointmentsResponse>
1227
+ <appt ids="{list-of-created-ids} n="{num-imported}"/>
1228
+ </ImportAppointmentsResponse>
1229
+
1230
+ {content-type} = only currently supported content type is "text/calendar" (and its nickname "ics")
1231
+ {folder-id} = optional folder id to import appointments into
1232
+
1233
+ {attach-upload-id} = attachment id from upload server. If specified, then body of content is ignored.
1234
+
1235
+ -------------------------------------------------------------------------------
1236
+
1237
+ * <DismissCalendarItemAlarmRequest>
1238
+ * <appt|task id="cal item id" lastAlarm="alarm time in millis"/>+
1239
+ * </DismissCalendarItemAlarmRequest>
1240
+ *
1241
+ * <DismissCalendarItemAlarmResponse>
1242
+ * <appt|task id="cal item id">
1243
+ * <alarmData ...> // so the client knows when to trigger the next alarm
1244
+ * </appt|task>+
1245
+ * </DismissCalendarItemAlarmResponse>
1246
+ <DismissCalendarItemAlarmRequest>
1247
+ <appt|task id="cal item id" dismissedAt="time alarm was dismissed, in millis"/>+
1248
+ </DismissCalendarItemAlarmRequest>
1249
+
1250
+ <DismissCalendarItemAlarmResponse>
1251
+ <appt|task id="cal item id">
1252
+ <alarmData ...> // so the client knows when to trigger the next alarm
1253
+ // See <alarmData> definition under SearchResponse, in soap.txt
1254
+ </appt|task>+ // one for each <appt|task> in the request
1255
+ </DismissCalendarItemAlarmResponse>
1256
+
1257
+ -------------------------------------------------------------------------------
1258
+
1259
+ <GetMiniCalRequest s="range start time in millis" e="range end time in millis">
1260
+ <folder id="folder id"/>+ // local and/or remote calendar folders
1261
+
1262
+ [ // optional timezone specifier
1263
+ <tz id="timezonename"/> // References an existing server-known timezone by ID
1264
+
1265
+ OR
1266
+
1267
+ <tz> ... </tz> // full specification of a custom timezone; see CreateAppointmentRequest
1268
+ ]
1269
+ </GetMiniCalRequest>
1270
+
1271
+ <GetMiniCalResponse>
1272
+ [<date>yyyymmdd</date>]* // e.g. 20080221
1273
+ [<error // error for each calendar folder that couldn't be accessed
1274
+ id="folder id"
1275
+ code="ServiceException error code" // e.g. service.PERM_DENIED, mail.NO_SUCH_FOLDER, account.NO_SUCH_ACCOUNT, etc.
1276
+ >error message from the exception (but no stack trace)</error>]*
1277
+ </GetMiniCalResponse>
1278
+
1279
+ Date is returned if there is at least one appointment on that date. The date computation
1280
+ uses the requesting (authenticated) account's time zone, not the time zone of the account
1281
+ that owns the calendar folder.
1282
+
1283
+
1284
+
1285
+ -------------------------------------------------------------------------------
1286
+ -------------------------------------------------------------------------------
1287
+ -------------------------------------------------------------------------------
1288
+ -------------------------------------------------------------------------------
1289
+ -------------------------------------------------------------------------------
1290
+ -------------------------------------------------------------------------------
1291
+
1292
+ NOTES NOTES (not part of soap proto)
1293
+
1294
+
1295
+
1296
+ Internal Server-Side Calendar Data Model
1297
+ ----------------------------------------
1298
+
1299
+ An INVITE is an email message with an iCal attachment. An INVITE has
1300
+ a mail_item_id, which uniquely identifies it, and a UID which identifies
1301
+ the APPOINTMENT it is about....plus other normal iCal data. An Invite
1302
+ has a START and END time -- which corresponds to the range of time
1303
+ where this invite is relevant.
1304
+
1305
+ Some sample invites:
1306
+
1307
+ INVITE sent on 3/1 with id=5 UID=1234 for an event happening every Monday
1308
+ with subject "Gorilla Discussion" (START=3/1, END=none)
1309
+
1310
+ INVITE with id=7 UID=1234 for an exception on 3/21
1311
+ for the "Left-Handed Gorilla Discussion" (START=3/21 END=3/21)
1312
+
1313
+
1314
+
1315
+ An APPOINTMENT consists of one or more INVITES in the same series --
1316
+ ie that have the same UID. From the appointment you can get the INSTANCES
1317
+ which are the start/end times of each occurence.
1318
+
1319
+ Sample Appointment:
1320
+ APPOINTMENT UID=1234 (two INVITES above)
1321
+ ...Instances on every monday with name "Gorilla Discussion"
1322
+ EXCEPT for the 21st, where we talk about lefties instead.
1323
+
1324
+
1325
+ An INSTANCE is simply a start-end time and a pointer to an INVITE
1326
+ which has detailed information about the meeting (description, etc)
1327
+
1328
+ Instances:
1329
+ 3/1 "Gorilla Discussion" id=5
1330
+ 3/14 "Gorilla Discussion" id=5
1331
+ 3/21 "Left-Handed Gorilla Discussion" id=7
1332
+
1333
+
1334
+
1335
+
1336
+ TIMEZONES:
1337
+ ----------------
1338
+ Each iCalendar object can define custom time zone names. For our own web
1339
+ client, there is a list of well-known time zones. These are stored in
1340
+ LDAP. See conf/ldap/zimbra.ldif for their definition. The time zone ID
1341
+ is the cn attribute.
1342
+
1343
+
1344
+
1345
+
1346
+ TASKS:
1347
+ ----------------
1348
+ For every <DoAction>AppointmentRequest, there is <DoAction>TaskRequest, and
1349
+ corresponding responses. For GetApptSummariesRequest, there is
1350
+ GetTaskSummariesRequest. GetCalendarItemsSummariesRequest is there for
1351
+ retrieving both appointments and tasks in one shot.
1352
+
1353
+ Wherever <appt> element shows up, the corresponding task request/response will
1354
+ use <task> element.
1355
+
1356
+ <appt> element uses apptID for backward compatibility reason. New code should
1357
+ ignore apptID and use calItemID instead. <task> element uses calItemID only.