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.
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +70 -0
- data/Rakefile +10 -0
- data/doc/ZPL.txt +492 -0
- data/doc/soap-admin.txt +2507 -0
- data/doc/soap-calendar.txt +1357 -0
- data/doc/soap-context-extension.txt +58 -0
- data/doc/soap-im.txt +570 -0
- data/doc/soap-mobile.txt +136 -0
- data/doc/soap-right.txt +806 -0
- data/doc/soap-waitset.txt +347 -0
- data/doc/soap-wiki.txt +290 -0
- data/doc/soap.txt +3554 -0
- data/examples/savon.rb +27 -0
- data/examples/zimbra_authentication_example.rb +3 -0
- data/lib/zimbra.wsdl +1144 -0
- data/lib/zimbra_wsdl/version.rb +3 -0
- data/lib/zimbra_wsdl.rb +19 -0
- data/spec/minitest_helper.rb +8 -0
- data/spec/zimbra_wsdl_spec.rb +11 -0
- data/zimbra_wsdl.gemspec +19 -0
- metadata +87 -0
@@ -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 (") 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.
|