idnits 2.17.1 draft-daboo-et-al-icalendar-in-xml-11.txt: Checking boilerplate required by RFC 5378 and the IETF Trust (see https://trustee.ietf.org/license-info): ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/1id-guidelines.txt: ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/checklist : ---------------------------------------------------------------------------- == There are 91 instances of lines with non-RFC6890-compliant IPv4 addresses in the document. If these are example addresses, they should be changed. Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the IETF Trust and authors Copyright Line does not match the current year -- The document date (June 14, 2011) is 4662 days in the past. Is this intentional? -- Found something which looks like a code comment -- if you have code sections in the document, please surround them with '' and '' lines. Checking references for intended status: Proposed Standard ---------------------------------------------------------------------------- (See RFCs 3967 and 4897 for information about using normative references to lower-maturity documents in RFCs) ** Obsolete normative reference: RFC 3023 (Obsoleted by RFC 7303) Summary: 1 error (**), 0 flaws (~~), 2 warnings (==), 2 comments (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 Network Working Group C. Daboo 3 Internet-Draft Apple, Inc. 4 Intended status: Standards Track M. Douglass 5 Expires: December 16, 2011 RPI 6 S. Lees 7 Microsoft 8 June 14, 2011 10 xCal: The XML format for iCalendar 11 draft-daboo-et-al-icalendar-in-xml-11 13 Abstract 15 This specification defines "xCal", an XML format for iCalendar data. 17 Status of This Memo 19 This Internet-Draft is submitted in full conformance with the 20 provisions of BCP 78 and BCP 79. 22 Internet-Drafts are working documents of the Internet Engineering 23 Task Force (IETF). Note that other groups may also distribute 24 working documents as Internet-Drafts. The list of current Internet- 25 Drafts is at http://datatracker.ietf.org/drafts/current/. 27 Internet-Drafts are draft documents valid for a maximum of six months 28 and may be updated, replaced, or obsoleted by other documents at any 29 time. It is inappropriate to use Internet-Drafts as reference 30 material or to cite them other than as "work in progress." 32 This Internet-Draft will expire on December 16, 2011. 34 Copyright Notice 36 Copyright (c) 2011 IETF Trust and the persons identified as the 37 document authors. All rights reserved. 39 This document is subject to BCP 78 and the IETF Trust's Legal 40 Provisions Relating to IETF Documents 41 (http://trustee.ietf.org/license-info) in effect on the date of 42 publication of this document. Please review these documents 43 carefully, as they describe your rights and restrictions with respect 44 to this document. Code Components extracted from this document must 45 include Simplified BSD License text as described in Section 4.e of 46 the Trust Legal Provisions and are provided without warranty as 47 described in the Simplified BSD License. 49 Table of Contents 51 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 52 2. Conventions Used in This Document . . . . . . . . . . . . . . 4 53 3. Converting from iCalendar to xCal . . . . . . . . . . . . . . 5 54 3.1. Pre-processing . . . . . . . . . . . . . . . . . . . . . . 5 55 3.2. iCalendar stream (RFC5545 section 3.4) . . . . . . . . . . 5 56 3.3. Components (RFC5545 section 3.6) . . . . . . . . . . . . . 7 57 3.4. Properties (RFC5545 section 3.7 and 3.8) . . . . . . . . . 7 58 3.4.1. Special Cases for Properties . . . . . . . . . . . . . 9 59 3.4.1.1. Multi-valued Properties . . . . . . . . . . . . . 9 60 3.4.1.2. GEO Property . . . . . . . . . . . . . . . . . . . 10 61 3.4.1.3. REQUEST-STATUS Property . . . . . . . . . . . . . 10 62 3.5. Parameters (RFC5545 section 3.2) . . . . . . . . . . . . . 11 63 3.5.1. VALUE parameter . . . . . . . . . . . . . . . . . . . 12 64 3.6. Values (RFC5545 section 3.3) . . . . . . . . . . . . . . . 12 65 3.6.1. Binary (RFC5545 section 3.3.1) . . . . . . . . . . . . 12 66 3.6.2. Boolean (RFC5545 section 3.3.2) . . . . . . . . . . . 13 67 3.6.3. Calendar User Address (RFC5545 section 3.3.3) . . . . 13 68 3.6.4. Date (RFC5545 section 3.3.4) . . . . . . . . . . . . . 13 69 3.6.5. Date-Time (RFC5545 section 3.3.5) . . . . . . . . . . 14 70 3.6.6. Duration (RFC5545 section 3.3.6) . . . . . . . . . . . 14 71 3.6.7. Float (RFC5545 section 3.3.7) . . . . . . . . . . . . 14 72 3.6.8. Integer (RFC5545 section 3.3.8) . . . . . . . . . . . 15 73 3.6.9. Period of Time (RFC5545 section 3.3.9) . . . . . . . . 15 74 3.6.10. Recurrence Rule (RFC5545 section 3.3.10) . . . . . . . 15 75 3.6.11. Text (RFC5545 section 3.3.11) . . . . . . . . . . . . 16 76 3.6.12. Time (RFC5545 section 3.3.12) . . . . . . . . . . . . 16 77 3.6.13. URI (RFC5545 section 3.3.13) . . . . . . . . . . . . . 16 78 3.6.14. UTC Offset (RFC5545 section 3.3.14) . . . . . . . . . 16 79 3.7. Extensions . . . . . . . . . . . . . . . . . . . . . . . . 17 80 4. Converting from xCal into iCalendar . . . . . . . . . . . . . 17 81 4.1. Converting XML Extensions into iCalendar . . . . . . . . . 17 82 4.2. The XML property for iCalendar . . . . . . . . . . . . . . 18 83 5. Handling Unrecognized Properties or Parameters . . . . . . . . 19 84 6. Security Considerations . . . . . . . . . . . . . . . . . . . 20 85 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 86 7.1. Namespace Registration . . . . . . . . . . . . . . . . . . 21 87 7.2. Media Type . . . . . . . . . . . . . . . . . . . . . . . . 21 88 7.3. iCalendar Property Registrations . . . . . . . . . . . . . 22 89 8. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 22 90 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 23 91 9.1. Normative References . . . . . . . . . . . . . . . . . . . 23 92 9.2. Informative References . . . . . . . . . . . . . . . . . . 23 93 Appendix A. Relax NG Schema . . . . . . . . . . . . . . . . . . . 24 94 Appendix B. Examples . . . . . . . . . . . . . . . . . . . . . . 49 95 B.1. Example 1 . . . . . . . . . . . . . . . . . . . . . . . . 49 96 B.1.1. iCalendar Data . . . . . . . . . . . . . . . . . . . . 49 97 B.1.2. XML Data . . . . . . . . . . . . . . . . . . . . . . . 50 98 B.2. Example 2 . . . . . . . . . . . . . . . . . . . . . . . . 50 99 B.2.1. iCalendar Data . . . . . . . . . . . . . . . . . . . . 51 100 B.2.2. XML Data . . . . . . . . . . . . . . . . . . . . . . . 51 101 Appendix C. Change History (to be removed prior to 102 publication as an RFC) . . . . . . . . . . . . . . . 55 104 1. Introduction 106 The iCalendar data format [RFC5545] is a widely deployed interchange 107 format for calendaring and scheduling data. While many applications 108 and services consume and generate calendar data, iCalendar is a 109 specialized format that requires its own parser/generator. In 110 contrast, XML-based formats are widely used for interoperability 111 between applications, and the many tools that generate, parse, and 112 manipulate XML make it easier to work with than iCalendar. 114 The purpose of this specification is to define "xCal", an XML format 115 for iCalendar data. xCal is defined as a straightforward mapping into 116 XML from iCalendar, so that iCalendar data can be converted to XML, 117 and then back to iCalendar, without losing any semantic meaning in 118 the data. Anyone creating xCal calendar data according to this 119 specification will know that their data can be converted to a valid 120 iCalendar representation as well. 122 Key design considerations are: 124 Round-tripping (converting an iCalendar instance to xCal and back) 125 will give the same semantic result as the starting point. i.e., 126 all components, properties and property parameters are guaranteed 127 to be preserved, with the exception of those which have default 128 values. 130 Preserve the semantics of the iCalendar data. While a simple 131 consumer can easily browse the calendar data in xCal, a full 132 understanding of iCalendar is still required in order to modify 133 and/or fully comprehend the calendar data. 135 Ability to handle many extensions to the underlying iCalendar 136 specification without requiring an update to this document. 138 2. Conventions Used in This Document 140 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", 141 "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this 142 document are to be interpreted as described in [RFC2119]. 144 When XML element types in the namespace 145 "urn:ietf:params:xml:ns:icalendar-2.0" are referenced in this 146 document outside of the context of an XML fragment, the string "IC:" 147 will be prefixed to the element types. 149 Some examples in this document contain "partial" XML documents used 150 for illustrative purposes. In these examples, three periods "..." 151 are used to indicate a portion of the document that has been removed 152 for compactness. 154 3. Converting from iCalendar to xCal 156 This section describes how iCalendar data is converted to xCal using 157 a simple mapping between the iCalendar data model and XML elements. 159 3.1. Pre-processing 161 iCalendar uses a line folding mechanism to limit lines of data to a 162 maximum line length (typically 72 characters) to ensure maximum 163 likelihood of preserving data integrity as it is transported via 164 various means (e.g., email) - see Section 3.1 of [RFC5545]. Prior to 165 converting iCalendar data into xCal all folded lines MUST be 166 unfolded. 168 iCalendar data uses an "escape" character sequence for text values 169 and property parameter values. When such text elements are converted 170 into xCal the escaping MUST be removed. 172 iCalendar uses a base64 encoding for binary data. However, it does 173 not restrict the encoding from being applied to non-binary value 174 types. So the following rules MUST be applied when processing a 175 property with the "ENCODING" property parameter set to "BASE64": 177 o If the property value type is "BINARY", the base64 encoding MUST 178 be preserved. 180 o If the value type is not "BINARY", the "ENCODING" property 181 parameter MUST be removed, and the value MUST be base64 decoded. 183 When base64 encoding and decoding is used, it MUST conform to Section 184 4 of [RFC4648], which is the base64 method used in [RFC5545]. 186 One key difference in the formatting of values used in iCalendar and 187 xCal is that in xCal the specification uses date/time and utc-offset 188 values aligned with the syntax of [W3C.REC-xmlschema-2-20041028] to 189 aid with XML processing. 191 3.2. iCalendar stream (RFC5545 section 3.4) 193 At the top level of the iCalendar object model is an "iCalendar 194 stream". This object encompasses multiple "iCalendar objects". In 195 xCal, the entire stream is contained in the root IC:icalendar XML 196 element. 198 An iCalendar stream can contain one or more iCalendar objects. Each 199 iCalendar object, delimited by "BEGIN:VCALENDAR" and "END:VCALENDAR", 200 is enclosed by the IC:vcalendar XML element. 202 Example: 204 205 206 207 ... 208 209 211 iCalendar objects are comprised of a set of "components", 212 "properties", "parameters" and "values". A "component" can contain 213 other "components" or "properties". A "property" has a value and a 214 set of zero or more "parameters". 216 In xCal, component elements, for example IC:vevent, IC:vtodo, are 217 contained within an IC:components XML element. Within the component 218 element, another IC:components element could appear (representing 219 components nested within components) or the IC:properties XML element 220 could appear. IC:properties is used to encapsulate iCalendar 221 properties. 223 Each iCalendar property will be mapped to its own XML element as 224 described below. Within each of these elements there is zero or one 225 IC:parameters XML element used to encapsulate any iCalendar property 226 parameters. Additionally there will be one or more XML elements 227 representing the value of the iCalendar property. 229 Example: 231 232 233 234 235 ... 236 237 238 ... 239 240 241 242 +------------------+--------------+------------------+ 243 | Item | XML element | XML Definition | 244 +------------------+--------------+------------------+ 245 | iCalendar Stream | IC:icalendar | Appendix A # 3.4 | 246 | VCALENDAR | IC:vcalendar | Appendix A # 3.6 | 247 +------------------+--------------+------------------+ 249 3.3. Components (RFC5545 section 3.6) 251 Each calendar component in the "VCALENDAR" object, delimited by 252 "BEGIN" and "END", will be converted to an enclosing XML element with 253 the same name, but in lowercase. As an example, the table below 254 shows iCalendar to xCal mappings for current iCalendar components. 255 Any new iCalendar components added in the future will be converted in 256 the same way. 258 +-----------+--------------+--------------------+ 259 | Component | XML element | XML Definition | 260 +-----------+--------------+--------------------+ 261 | VEVENT | IC:vevent | Appendix A # 3.6.1 | 262 | VTODO | IC:vtodo | Appendix A # 3.6.2 | 263 | VJOURNAL | IC:vjournal | Appendix A # 3.6.3 | 264 | VFREEBUSY | IC:vfreebusy | Appendix A # 3.6.4 | 265 | VTIMEZONE | IC:vtimezone | Appendix A # 3.6.5 | 266 | STANDARD | IC:standard | Appendix A # 3.6.5 | 267 | DAYLIGHT | IC:daylight | Appendix A # 3.6.5 | 268 | VALARM | IC:valarm | Appendix A # 3.6.6 | 269 +-----------+--------------+--------------------+ 271 3.4. Properties (RFC5545 section 3.7 and 3.8) 273 iCalendar properties , whether they apply to the "VCALENDAR" object 274 or to a component, are handled in a consistent way in the xCal 275 format. 277 iCalendar properties are enclosed in the XML element IC:properties. 279 Each individual iCalendar property is represented in xCal by an 280 element of the same name as the iCalendar property, but in lowercase. 281 For example, the "CALSCALE" property is represented in xCal by the 282 IC:calscale element. 284 Example: 286 287 288 289 290 ... 291 ... 292 ... 293 294 295 ... 296 297 298 300 Each property can contain an IC:parameters XML element encapsulating 301 any iCalendar property parameters associated with the iCalendar 302 property. 304 Each property will contain one or more "value" XML elements as 305 described below representing the value of the iCalendar property. 307 As an example, the table below shows iCalendar to xCal mappings for 308 current iCalendar properties. Any new iCalendar properties added in 309 the future will be converted in the same way. 311 +------------------+---------------------+-----------------------+ 312 | Property | XML element | XML Definition | 313 +------------------+---------------------+-----------------------+ 314 | CALSCALE | IC:calscale | Appendix A # 3.7.1 | 315 | METHOD | IC:method | Appendix A # 3.7.2 | 316 | PRODID | IC:prodid | Appendix A # 3.7.3 | 317 | VERSION | IC:version | Appendix A # 3.7.4 | 318 | ATTACH | IC:attach | Appendix A # 3.8.1.1 | 319 | CATEGORIES | IC:categories | Appendix A # 3.8.1.2 | 320 | CLASS | IC:class | Appendix A # 3.8.1.3 | 321 | COMMENT | IC:comment | Appendix A # 3.8.1.4 | 322 | DESCRIPTION | IC:description | Appendix A # 3.8.1.5 | 323 | GEO | IC:geo | Appendix A # 3.8.1.6 | 324 | LOCATION | IC:location | Appendix A # 3.8.1.7 | 325 | PERCENT-COMPLETE | IC:percent-complete | Appendix A # 3.8.1.8 | 326 | PRIORITY | IC:priority | Appendix A # 3.8.1.9 | 327 | RESOURCES | IC:resources | Appendix A # 3.8.1.10 | 328 | STATUS | IC:status | Appendix A # 3.8.1.11 | 329 | SUMMARY | IC:summary | Appendix A # 3.8.1.12 | 330 | COMPLETED | IC:completed | Appendix A # 3.8.2.1 | 331 | DTEND | IC:dtend | Appendix A # 3.8.2.2 | 332 | DUE | IC:due | Appendix A # 3.8.2.3 | 333 | DTSTART | IC:dtstart | Appendix A # 3.8.2.4 | 334 | DURATION | IC:duration | Appendix A # 3.8.2.5 | 335 | FREEBUSY | IC:freebusy | Appendix A # 3.8.2.6 | 336 | TRANSP | IC:transp | Appendix A # 3.8.2.7 | 337 | TZID | IC:tzid | Appendix A # 3.8.3.1 | 338 | TZNAME | IC:tzname | Appendix A # 3.8.3.2 | 339 | TZOFFSETFROM | IC:tzoffsetfrom | Appendix A # 3.8.3.3 | 340 | TZOFFSETTO | IC:tzoffsetto | Appendix A # 3.8.3.4 | 341 | TZURL | IC:tzurl | Appendix A # 3.8.3.5 | 342 | ATTENDEE | IC:attendee | Appendix A # 3.8.4.1 | 343 | CONTACT | IC:contact | Appendix A # 3.8.4.2 | 344 | ORGANIZER | IC:organizer | Appendix A # 3.8.4.3 | 345 | RECURRENCE-ID | IC:recurrence-id | Appendix A # 3.8.4.4 | 346 | RELATED-TO | IC:related-to | Appendix A # 3.8.4.5 | 347 | URL | IC:url | Appendix A # 3.8.4.6 | 348 | UID | IC:uid | Appendix A # 3.8.4.7 | 349 | EXDATE | IC:exdate | Appendix A # 3.8.5.1 | 350 | RDATE | IC:rdate | Appendix A # 3.8.5.2 | 351 | RRULE | IC:rrule | Appendix A # 3.8.5.3 | 352 | ACTION | IC:action | Appendix A # 3.8.6.1 | 353 | REPEAT | IC:repeat | Appendix A # 3.8.6.2 | 354 | TRIGGER | IC:trigger | Appendix A # 3.8.6.3 | 355 | CREATED | IC:created | Appendix A # 3.8.7.1 | 356 | DTSTAMP | IC:dtstamp | Appendix A # 3.8.7.2 | 357 | LAST-MODIFIED | IC:last-modified | Appendix A # 3.8.7.3 | 358 | SEQUENCE | IC:sequence | Appendix A # 3.8.7.4 | 359 | REQUEST-STATUS | IC:request-status | Appendix A # 3.8.8.3 | 360 +------------------+---------------------+-----------------------+ 362 3.4.1. Special Cases for Properties 364 This section describes some properties that have special handling 365 when converting to xCal. 367 3.4.1.1. Multi-valued Properties 369 The following iCalendar properties can have values that consist of a 370 list of "standard" iCalendar values separated by a specific 371 delimiter. In xCal these properties are represented by an XML 372 element that contains multiple "value" elements (Section 3.6). 374 +------------+---------------+-----------------------+ 375 | Property | XML element | XML Definition | 376 +------------+---------------+-----------------------+ 377 | CATEGORIES | IC:categories | Appendix A # 3.8.1.2 | 378 | RESOURCES | IC:resources | Appendix A # 3.8.1.10 | 379 | FREEBUSY | IC:freebusy | Appendix A # 3.8.2.6 | 380 | EXDATE | IC:exdate | Appendix A # 3.8.5.1 | 381 | RDATE | IC:rdate | Appendix A # 3.8.5.2 | 382 +------------+---------------+-----------------------+ 384 3.4.1.2. GEO Property 386 In iCalendar, the "GEO" property value is defined as a semi-colon 387 separated list of two "FLOAT" values, the first representing latitude 388 and the second longitude. 390 In xCal, the value for the IC:geo element is represented by two XML 391 elements. These are an IC:latitude element and an IC:longitude 392 element, each of which contain float values. See Appendix A # 393 3.8.1.6. 395 Example: 397 398 399 ... 400 401 37.386013 402 -122.082932 403 404 ... 405 407 3.4.1.3. REQUEST-STATUS Property 409 In iCalendar, the "REQUEST-STATUS" property value is defined as a 410 semi-colon separated list of two or three "TEXT" values. The first 411 represents a code, the second a description, and the third any 412 additional data. 414 In xCal, the value for the IC:request-status element is represented 415 by two or three XML elements. These are an IC:code element, an IC: 416 description element, and an IC:data element, each of which contain 417 the corresponding "TEXT" values. If there is no additional data in 418 the iCalendar value, the IC:data element (which would be empty) 419 SHOULD NOT be present. See Appendix A # 3.8.8.3. 421 Example: 423 424 425 ... 426 427 2.0 428 Success 429 430 ... 431 433 3.5. Parameters (RFC5545 section 3.2) 435 iCalendar property parameters are enclosed in the XML element IC: 436 parameters which occurs in each property XML element. If there are 437 no iCalendar property parameters, the IC:parameters element (which 438 would be empty) SHOULD NOT be present. 440 Each individual iCalendar property parameter is represented in xCal 441 by an element of the same name as the iCalendar property parameter, 442 but in lowercase. For example, the "PARTSTAT" property parameter is 443 represented in xCal by the IC:partstat element. 445 Example: 447 448 449 450 ... 451 452 ... 453 454 455 NEEDS-ACTION 456 457 ... 458 459 ... 460 461 462 464 Each XML parameter element contains one or more child XML elements 465 representing iCalendar value types. 467 As an example, the table below shows iCalendar to xCal mappings for 468 current iCalendar parameters. Any new iCalendar parameters added in 469 the future will be converted in the same way. 471 +----------------+-------------------+---------------------+ 472 | Parameter | XML element | XML Definition | 473 +----------------+-------------------+---------------------+ 474 | ALTREP | IC:altrep | Appendix A # 3.2.1 | 475 | CN | IC:cn | Appendix A # 3.2.2 | 476 | CUTYPE | IC:cutype | Appendix A # 3.2.3 | 477 | DELEGATED-FROM | IC:delegated-from | Appendix A # 3.2.4 | 478 | DELEGATED-TO | IC:delegated-to | Appendix A # 3.2.5 | 479 | DIR | IC:dir | Appendix A # 3.2.6 | 480 | ENCODING | IC:encoding | Appendix A # 3.2.7 | 481 | FMTTYPE | IC:fmttype | Appendix A # 3.2.8 | 482 | FBTYPE | IC:fbtype | Appendix A # 3.2.9 | 483 | LANGUAGE | IC:language | Appendix A # 3.2.10 | 484 | MEMBER | IC:member | Appendix A # 3.2.11 | 485 | PARTSTAT | IC:partstat | Appendix A # 3.2.12 | 486 | RANGE | IC:range | Appendix A # 3.2.13 | 487 | RELATED | IC:related | Appendix A # 3.2.14 | 488 | RELTYPE | IC:reltype | Appendix A # 3.2.15 | 489 | ROLE | IC:role | Appendix A # 3.2.16 | 490 | RSVP | IC:rsvp | Appendix A # 3.2.17 | 491 | SENT-BY | IC:sent-by | Appendix A # 3.2.18 | 492 | TZID | IC:tzid | Appendix A # 3.2.19 | 493 +----------------+-------------------+---------------------+ 495 3.5.1. VALUE parameter 497 iCalendar defines a "VALUE" property parameter (Section 3.2.20 of 498 [RFC5545]). This property parameter is not mapped to an xCal XML 499 element. Instead, the value type is handled by having different XML 500 elements for each value, and these appear inside of IC:property 501 elements. Thus, when converting from iCalendar to xCal, any "VALUE" 502 property parameters are skipped. When converting from xCal into 503 iCalendar, the appropriate "VALUE" property parameter MUST be 504 included in the iCalendar property if the value type is not the 505 default value type for that property. 507 3.6. Values (RFC5545 section 3.3) 509 In the typical case, iCalendar value types are mapped into XML 510 elements with a matching name in all lowercase. In the case of the 511 value for a recurrence rule (see below), iCalendar defines 512 "structured" values and these are mapped into separate child elements 513 for each value element. 515 3.6.1. Binary (RFC5545 section 3.3.1) 516 Description: iCalendar "BINARY" property values are represented by 517 the IC:binary XML element. The content of the element is base64 518 encoded data, conforming to Section 4 of [RFC4648], which is the 519 base64 method used in [RFC5545]. Whitespace MAY be inserted into 520 the data at any point to "wrap" the data to reasonable line 521 lengths. When converting back to iCalendar the whitespace MUST 522 first be removed. 524 XML Definition: Appendix A # 3.3.1 526 Example: 528 SGVsbG8gV29ybGQh 530 3.6.2. Boolean (RFC5545 section 3.3.2) 532 Description: iCalendar "BOOLEAN" property values are represented by 533 the IC:boolean XML element. The content of the element is a 534 boolean value. 536 XML Definition: Appendix A # 3.3.2 538 Example: 540 true 542 3.6.3. Calendar User Address (RFC5545 section 3.3.3) 544 Description: iCalendar "CAL-ADDRESS" property values are represented 545 by the IC:cal-address XML element. The content of the element is 546 a URI. 548 XML Definition: Appendix A # 3.3.3 550 Example: 552 mailto:cyrus@example.com 554 3.6.4. Date (RFC5545 section 3.3.4) 556 Description: iCalendar "DATE" property values are represented by the 557 IC:date XML element. The content of the element is the same date 558 value specified by [RFC5545], with the exception that the date 559 components are separated by "-" characters, for consistency with 560 [W3C.REC-xmlschema-2-20041028]. 562 XML Definition: Appendix A # 3.3.4 564 Example: 566 2011-05-17 568 3.6.5. Date-Time (RFC5545 section 3.3.5) 570 Description: iCalendar "DATE-TIME" property values are represented 571 by the IC:date-time XML element. The content of the element is 572 the same date-time value specified by [RFC5545], with the 573 exception that the date components are separated by "-" 574 characters, and the time components are separated by ":" 575 characters, for consistency with [W3C.REC-xmlschema-2-20041028]. 576 Note that while [W3C.REC-xmlschema-2-20041028] allows for a UTC 577 offset to be included in date/time values, xCal does not use that, 578 and instead follows the iCalendar behavior of using timezone 579 definitions via the "TZID" property parameter. 581 XML Definition: Appendix A # 3.3.5 583 Example: 585 2011-05-17T12:00:00 587 3.6.6. Duration (RFC5545 section 3.3.6) 589 Description: iCalendar "DURATION" property values are represented by 590 the IC:duration XML element. The content of the element is the 591 same duration value specified by [RFC5545]. 593 XML Definition: Appendix A # 3.3.6 595 Example: 597 P1D 599 3.6.7. Float (RFC5545 section 3.3.7) 601 Description: iCalendar "FLOAT" property values are represented by 602 the IC:float XML element. The content of the element is a text 603 representation of a floating point number. 605 XML Definition: Appendix A # 3.3.7 606 Example: 608 0.5 610 3.6.8. Integer (RFC5545 section 3.3.8) 612 Description: iCalendar "INTEGER" property values are represented by 613 the IC:integer XML element. The content of the element is a text 614 representation of an integer number. 616 XML Definition: Appendix A # 3.3.8 618 Examples: 620 50 621 -100 623 3.6.9. Period of Time (RFC5545 section 3.3.9) 625 Description: iCalendar "PERIOD" property values are represented by 626 the IC:period XML element. The content of the element is child 627 elements representing the start, end or duration components of the 628 period. 630 XML Definition: Appendix A # 3.3.9 632 Example: 634 635 2011-05-17T12:00:00 636 P1H 637 639 3.6.10. Recurrence Rule (RFC5545 section 3.3.10) 641 Description: iCalendar "RECUR" property values are represented by 642 the IC:recur XML element. The content of the element is child 643 elements representing the various components of a recurrence rule. 645 XML Definition: Appendix A # 3.3.10 647 Example: 649 650 YEARLY 651 5 652 -1SU 653 10 655 657 3.6.11. Text (RFC5545 section 3.3.11) 659 Description: iCalendar "TEXT" property values are represented by the 660 IC:text XML element. The content of the element is simple text. 662 XML Definition: Appendix A # 3.3.11 664 Example: 666 Hello World! 668 3.6.12. Time (RFC5545 section 3.3.12) 670 Description: iCalendar "TIME" property values are represented by the 671 IC:time XML element. The content of the element is the same time 672 value specified by [RFC5545], with the exception that the time 673 components are separated by ":" characters, for consistency with 674 [W3C.REC-xmlschema-2-20041028]. Note that while [W3C.REC- 675 xmlschema-2-20041028] allows for a UTC offset to be included in 676 date/time values, xCal does not use that, and instead follows the 677 iCalendar behavior of using timezone definitions via the "TZID" 678 property parameter. 680 XML Definition: Appendix A # 3.3.12 682 Example: 684 686 3.6.13. URI (RFC5545 section 3.3.13) 688 Description: iCalendar "URI" property values are represented by the 689 IC:uri XML element. The content of the element is a URI. 691 XML Definition: Appendix A # 3.3.13 693 Example: 695 http://calendar.example.com 697 3.6.14. UTC Offset (RFC5545 section 3.3.14) 698 Description: iCalendar "UTC-OFFSET" property values are represented 699 by the IC:utc-offset XML element. The content of the element is 700 the same UTC offset value specified by [RFC5545], with the 701 exception that the hour and minute components are separated by a 702 ":" character, for consistency with 703 [W3C.REC-xmlschema-2-20041028]. 705 XML Definition: Appendix A # 3.3.14 707 Example: 709 -05:00 711 3.7. Extensions 713 iCalendar extension properties and property parameters (those with an 714 "X-" prefix in their name) are handled in the same way as other 715 properties and property parameters: the property or property 716 parameter is represented by an XML element with the same name, but in 717 lowercase. e.g., the "X-FOO" property in iCalendar turns into the IC: 718 x-foo element in xCal. But see Section 5 for how to deal with 719 default values for unrecognized extension properties or property 720 parameters. 722 4. Converting from xCal into iCalendar 724 When converting component, property and property parameter values, 725 the names SHOULD be converted to uppercase. Although iCalendar names 726 are case insensitive, common practice is to keep them all uppercase 727 following the actual definitions in [RFC5545]. 729 Backslash escaping and line folding MUST be applied to the resulting 730 iCalendar data as required by [RFC5545]. 732 Non-binary value types MUST NOT be base64 encoded. 734 4.1. Converting XML Extensions into iCalendar 736 XML extensions are converted back to iCalendar in one of two ways, 737 depending on whether the extensions are in the iCalendar XML 738 namespace, or in an external namespace. 740 Extensions that are part of the iCalendar XML namespace MUST have 741 element names that begin with "x-", and will be converted back to the 742 equivalent extension property in iCalendar. For example, the "x-foo" 743 element will convert to the "X-FOO" iCalendar property. 745 Extensions that are in a namespace other than the iCalendar XML 746 namespace SHOULD be preserved in the iCalendar representation using 747 the "XML" iCalendar property described in Section 4.2. Only those 748 extension elements that are immediate child elements of the IC: 749 properties element are converted, any others are ignored. 751 4.2. The XML property for iCalendar 753 This section describes an extension property for iCalendar, as 754 covered in section 8.2.3 of [RFC5545]. 756 Property name: XML 758 Purpose: To embed extended XML-encoded iCalendar data in the 759 iCalendar format. 761 Value type: The default value type is "TEXT". The value type can 762 also be set to "BINARY" to indicate base64 encoded content. 764 Property parameters: IANA, non-standard, inline encoding, and value 765 data type property parameters can be specified on this property. 767 Conformance: The property can be specified multiple times in any 768 calendar component. 770 Description: The value of this property is a single XML 1.0 771 [W3C.REC-xml-20081126] element. The "XML" property MUST NOT be used 772 to contain properties that are already defined in iCalendar. Since 773 all elements in the urn:ietf:params:xml:ns:icalendar-2.0 namespace 774 convert to a well-defined iCalendar object, the elements in this 775 property MUST NOT be in the urn:ietf:params:xml:ns:icalendar-2.0 776 namespace. The XML element which is the value of this property MUST 777 have an XML namespace declaration. 779 The default value type for this property is "TEXT", and normal 780 BACKSLASH escaping rules for that value MUST be applied. Note that 781 the source XML can contain characters not allowed in "TEXT" property 782 values. If this is the case, then the XML data MUST be base64 783 encoded. As required by [RFC5545], the "ENCODING" property parameter 784 MUST be present and set to "BASE64", and the "VALUE" property 785 parameter MUST be present and set to "BINARY". 787 The ordering of "XML" properties is not preserved in the conversion 788 between xCal and iCalendar. 790 Format definition: This property is defined by the following 791 notation: 793 xml = "XML" xmlparam ( ":" text ) / 794 ( 795 ";" "ENCODING" "=" "BASE64" 796 ";" "VALUE" "=" "BINARY" 797 ":" binary 798 ) 799 CRLF 801 xmlparam = *(";" other-param) 803 Example: The following is an example of a location embedded in KML 804 markup inside the "XML" property. 806 XML:\n 807 \n 808 KML Sample\n 809 1\n 810 An incomplete example of a KML docum 811 ent - used as an example!\n 812 814 5. Handling Unrecognized Properties or Parameters 816 In iCalendar, properties have a default value type specified by their 817 definition, e.g. "SUMMARY"'s value type is "TEXT" and "DURATION"'s 818 is "DURATION". When a property uses its default value type, the 819 "VALUE" property parameter does not need to be specified on the 820 property. 822 When new properties are defined or "X-" properties used, an 823 iCalendar<->xCal converter might not recognize them, and know what 824 the appropriate default value types are, yet they need to be able to 825 preserve the values. A similar issue arises for unrecognized 826 property parameters. As a result, the following rules are applied 827 when dealing with unrecognized properties and property parameters: 829 o When converting iCalendar into xCal: 831 * Any property that does not include a "VALUE" property parameter 832 and whose default value type is not known, MUST be converted 833 using the value type XML element IC:unknown. The content of 834 that element is the unprocessed value text. 836 * Any unrecognized property parameter MUST be converted using the 837 value type XML element IC:unknown, with its content set to the 838 property parameter value text, treated as if it were a "TEXT" 839 value, or list of "TEXT" values. 841 o When converting xCal into iCalendar: 843 * Any IC:unknown property value XML elements are converted 844 directly into iCalendar values. The containing property MUST 845 NOT have a "VALUE" property parameter. 847 * Any IC:unknown parameter value XML elements are converted as if 848 they were IC:text value type XML elements. 850 Example: The following is an example of an unrecognized iCalendar 851 property (that uses a "DATE-TIME" value as its default), and the 852 equivalent xCal representation of that property. 854 iCalendar: 856 X-PROPERTY:20110512T120000Z 858 xCal: 860 861 20110512T120000Z 862 864 Example: The following is an example of an unrecognized iCalendar 865 property parameter (that uses a "DURATION" value as its default) 866 specified on a recognized iCalendar property, and the equivalent xCal 867 representation of that property and property parameter. 869 iCalendar: 871 DTSTART;X-PARAM=PT30M:20110512T130000Z 873 xCal: 875 876 877 PT30M 878 879 2011-05-12T13:00:00Z 880 882 6. Security Considerations 884 For security considerations specific to calendar data, see Section 7 885 of [RFC5545]. Since this specification is a mapping from iCalendar, 886 no new security concerns are introduced related to calendar data. 888 The use of XML as a format does have security risks. Section 7 of 890 [RFC3470] discusses these risks. See also the security discussion 891 for the application/xml type in [RFC3023]. 893 7. IANA Considerations 895 This document defines a new URN to identify a new XML namespace for 896 iCalendar data. The URN conforms to a registry mechanism described 897 in [RFC3688]. 899 This document defines a new media type. The registration is in 900 Section 7.2. 902 This document defines a new property for iCalendar. The registration 903 is in Section 7.3. 905 7.1. Namespace Registration 907 Registration request for the iCalendar namespace: 909 URI: urn:ietf:params:xml:ns:icalendar-2.0 911 Registrant Contact: See the "Authors' Addresses" section of this 912 document. 914 XML: None. Namespace URIs do not represent an XML specification. 916 7.2. Media Type 918 This section defines the MIME media type for use with iCalendar in 919 XML data. 921 Type name: application 923 Subtype name: calendar+xml 925 Required parameters: none 927 Optional parameters: method, component and optinfo as defined for 928 the text/calendar media type in [RFC5545]; charset as defined for 929 application/xml in [RFC3023]; per [RFC3023], use of the charset 930 property parameter with the value "utf-8" is "STRONGLY 931 RECOMMENDED" 933 Encoding considerations: Same as encoding considerations of 934 application/xml as specified in [RFC3023] 936 Security considerations: See Section 6. 938 Interoperability considerations: This media type provides an 939 alternative format for iCalendar data based on XML. 941 Published specification: This specification. 943 Applications which use this media type: Applications that currently 944 make use of the text/calendar media type can use this as an 945 alternative. 947 Additional information: 949 Magic number(s): None 951 File extension(s): xcs 953 Macintosh file type code(s): None specified. 955 Person & email address to contact for further information: 956 calsify@ietf.org 958 Intended usage: COMMON 960 Restrictions on usage: There are no restrictions on where this media 961 type can be used. 963 Author: See the "Author's Address" section of this document. 965 Change controller: IETF 967 7.3. iCalendar Property Registrations 969 This document defines the following new iCalendar property to be 970 added to the registry defined in Section 8.2.3 of [RFC5545]: 972 +----------+---------+----------------------+ 973 | Property | Status | Reference | 974 +----------+---------+----------------------+ 975 | XML | Current | RFCXXXX, Section 4.2 | 976 +----------+---------+----------------------+ 978 8. Acknowledgments 980 The authors would like to thank the following for their valuable 981 contributions: Toby Considine, Bernard Desruisseaux, Keith Moore, 982 Filip Navara, Simon Perreault, Arnaud Quillaud, Peter Saint-Andre, 983 and Dave Thewlis. This specification originated from the work of the 984 XML technical committee of the Calendaring and Scheduling Consortium. 986 9. References 988 9.1. Normative References 990 [RFC2119] Bradner, S., "Key words for use in 991 RFCs to Indicate Requirement Levels", 992 BCP 14, RFC 2119, March 1997. 994 [RFC3023] Murata, M., St. Laurent, S., and D. 995 Kohn, "XML Media Types", RFC 3023, 996 January 2001. 998 [RFC3470] Hollenbeck, S., Rose, M., and L. 999 Masinter, "Guidelines for the Use of 1000 Extensible Markup Language (XML) 1001 within IETF Protocols", BCP 70, 1002 RFC 3470, January 2003. 1004 [RFC3688] Mealling, M., "The IETF XML 1005 Registry", BCP 81, RFC 3688, 1006 January 2004. 1008 [RFC4648] Josefsson, S., "The Base16, Base32, 1009 and Base64 Data Encodings", RFC 4648, 1010 October 2006. 1012 [RFC5545] Desruisseaux, B., "Internet 1013 Calendaring and Scheduling Core 1014 Object Specification (iCalendar)", 1015 RFC 5545, September 2009. 1017 [W3C.REC-xml-20081126] Paoli, J., Yergeau, F., Bray, T., 1018 Sperberg-McQueen, C., and E. Maler, 1019 "Extensible Markup Language (XML) 1.0 1020 (Fifth Edition)", World Wide Web 1021 Consortium Recommendation REC-xml- 1022 20081126, November 2008, . 1025 9.2. Informative References 1027 [W3C.REC-xmlschema-2-20041028] Biron, P. and A. Malhotra, "XML 1028 Schema Part 2: Datatypes Second 1029 Edition", World Wide Web Consortium R 1030 ecommendation REC-xmlschema-2- 1031 20041028, October 2004, . 1035 Appendix A. Relax NG Schema 1037 Below is a Relax NG schema for iCalendar in XML. The schema is non- 1038 normative and given for reference only. 1040 This schema uses the compact notation of Relax NG. The numeric 1041 section numbers given in the comments refer to section in [RFC5545]. 1042 The ordering of elements follows the section ordering of [RFC5545]. 1044 The Relax NG compact notation "?" operator is used to indicate an 1045 unordered list of items. However, that operator, as defined, allows 1046 "mixing" each element that it operates on at any depth within the 1047 other elements, rather than just allowing "mixing" of siblings only. 1048 As a result, the schema provided allows certain constructs that are 1049 not allowed in iCalendar. Given that there is no sibling-only 1050 unordered list operator in RelaxNG, this is the best representation 1051 that can be given. 1053 Patterns for date/time, duration and utc-offset values are given 1054 because those differ from the values used in iCalendar. More 1055 restrictive schema with patterns and numerical limits could be 1056 derived from the example schema here if more comprehensive schema 1057 validation is required. 1059 # Relax NG Schema for iCalendar in XML 1061 default namespace = "urn:ietf:params:xml:ns:icalendar-2.0" 1063 # 3.2 Property Parameters 1065 # 3.2.1 Alternate Text Representation 1067 altrepparam = element altrep { 1068 value-uri 1069 } 1071 # 3.2.2 Common Name 1073 cnparam = element cn { 1074 value-text 1075 } 1077 # 3.2.3 Calendar User Type 1079 cutypeparam = element cutype { 1080 element text { 1081 "INDIVIDUAL" | 1082 "GROUP" | 1083 "RESOURCE" | 1084 "ROOM" | 1085 "UNKNOWN" 1086 } 1087 } 1089 # 3.2.4 Delegators 1091 delfromparam = element delegated-from { 1092 value-cal-address+ 1093 } 1095 # 3.2.5 Delegatees 1097 deltoparam = element delegated-to { 1098 value-cal-address+ 1099 } 1101 # 3.2.6 Directory Entry Reference 1103 dirparam = element dir { 1104 value-uri 1105 } 1107 # 3.2.7 Inline Encoding 1109 encodingparam = element encoding { 1110 element text { 1111 "8BIT" | 1112 "BASE64" 1113 } 1114 } 1116 # 3.2.8 Format Type 1118 fmttypeparam = element fmttype { 1119 value-text 1120 } 1122 # 3.2.9 Free/Busy Time Type 1124 fbtypeparam = element fbtype { 1125 element text { 1126 "FREE" | 1127 "BUSY" | 1128 "BUSY-UNAVAILABLE" | 1129 "BUSY-TENTATIVE" 1130 } 1131 } 1133 # 3.2.10 Language 1135 languageparam = element language { 1136 value-text 1137 } 1139 # 3.2.11 Group or List Membership 1141 memberparam = element member { 1142 value-cal-address+ 1143 } 1145 # 3.2.12 Participation Status 1147 partstatparam = element partstat { 1148 type-partstat-event | 1149 type-partstat-todo | 1150 type-partstat-jour 1151 } 1153 type-partstat-event = ( 1154 element text { 1155 "NEEDS-ACTION" | 1156 "ACCEPTED" | 1157 "DECLINED" | 1158 "TENTATIVE" | 1159 "DELEGATED" 1160 } 1161 ) 1163 type-partstat-todo = ( 1164 element text { 1165 "NEEDS-ACTION" | 1166 "ACCEPTED" | 1167 "DECLINED" | 1168 "TENTATIVE" | 1169 "DELEGATED" | 1170 "COMPLETED" | 1171 "IN-PROCESS" 1172 } 1173 ) 1174 type-partstat-jour = ( 1175 element text { 1176 "NEEDS-ACTION" | 1177 "ACCEPTED" | 1178 "DECLINED" 1179 } 1180 ) 1182 # 3.2.13 Recurrence Identifier Range 1184 rangeparam = element range { 1185 element text { 1186 "THISANDFUTURE" 1187 } 1188 } 1190 # 3.2.14 Alarm Trigger Relationship 1192 trigrelparam = element related { 1193 element text { 1194 "START" | 1195 "END" 1196 } 1197 } 1199 # 3.2.15 Relationship Type 1201 reltypeparam = element reltype { 1202 element text { 1203 "PARENT" | 1204 "CHILD" | 1205 "SIBLING" 1206 } 1207 } 1209 # 3.2.16 Participation Role 1211 roleparam = element role { 1212 element text { 1213 "CHAIR" | 1214 "REQ-PARTICIPANT" | 1215 "OPT-PARTICIPANT" | 1216 "NON-PARTICIPANT" 1217 } 1218 } 1220 # 3.2.17 RSVP Expectation 1221 rsvpparam = element rsvp { 1222 value-boolean 1223 } 1225 # 3.2.18 Sent By 1227 sentbyparam = element sent-by { 1228 value-cal-address 1229 } 1231 # 3.2.19 Time Zone Identifier 1233 tzidparam = element tzid { 1234 value-text 1235 } 1237 # 3.3 Property Value Data Types 1239 # 3.3.1 BINARY 1241 value-binary = element binary { 1242 xsd:string 1243 } 1245 # 3.3.2 BOOLEAN 1247 value-boolean = element boolean { 1248 xsd:boolean 1249 } 1251 # 3.3.3 CAL-ADDRESS 1253 value-cal-address = element cal-address { 1254 xsd:anyURI 1255 } 1257 # 3.3.4 DATE 1259 pattern-date = xsd:string { 1260 pattern = "\d\d\d\d-\d\d-\d\d" 1261 } 1263 value-date = element date { 1264 pattern-date 1265 } 1267 # 3.3.5 DATE-TIME 1268 pattern-date-time = xsd:string { 1269 pattern = "\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ?" 1270 } 1272 value-date-time = element date-time { 1273 pattern-date-time 1274 } 1276 # 3.3.6 DURATION 1278 pattern-duration = xsd:string { 1279 pattern = "[+\-]?P(\d+W)|(\d+D)?" 1280 ~ "(T(\d+H(\d+M)?(\d+S)?)|" 1281 ~ "(\d+M(\d+S)?)|" 1282 ~ "(\d+S))?" 1283 } 1285 value-duration = element duration { 1286 pattern-duration 1287 } 1289 # 3.3.7 FLOAT 1291 value-float = element float { 1292 xsd:float 1293 } 1295 # 3.3.8 INTEGER 1297 value-integer = element integer { 1298 xsd:integer 1299 } 1301 # 3.3.9 PERIOD 1303 value-period = element period { 1304 element start { 1305 pattern-date-time 1306 }, 1307 ( 1308 element end { 1309 pattern-date-time 1310 } | 1311 element duration { 1312 pattern-duration 1313 } 1314 ) 1315 } 1316 # 3.3.10 RECUR 1318 value-recur = element recur { 1319 type-freq, 1320 (type-until | type-count)?, 1321 element interval { 1322 xsd:positiveInteger 1323 }?, 1324 type-bysecond*, 1325 type-byminute*, 1326 type-byhour*, 1327 type-byday*, 1328 type-bymonthday*, 1329 type-byyearday*, 1330 type-byweekno*, 1331 type-bymonth*, 1332 type-bysetpos*, 1333 element wkst { type-weekday }? 1334 } 1336 type-freq = element freq { 1337 "SECONDLY" | 1338 "MINUTELY" | 1339 "HOURLY" | 1340 "DAILY" | 1341 "WEEKLY" | 1342 "MONTHLY" | 1343 "YEARLY" 1344 } 1346 type-until = element until { 1347 type-date | 1348 type-date-time 1349 } 1351 type-count = element count { 1352 xsd:positiveInteger 1353 } 1355 type-bysecond = element bysecond { 1356 xsd:positiveInteger 1357 } 1359 type-byminute = element byminute { 1360 xsd:positiveInteger 1361 } 1363 type-byhour = element byhour { 1364 xsd:positiveInteger 1365 } 1367 type-weekday = ( 1368 "SU" | 1369 "MO" | 1370 "TU" | 1371 "WE" | 1372 "TH" | 1373 "FR" | 1374 "SA" 1375 ) 1377 type-byday = element byday { 1378 xsd:integer?, 1379 type-weekday 1380 } 1382 type-bymonthday = element bymonthday { 1383 xsd:integer 1384 } 1386 type-byyearday = element byyearday { 1387 xsd:integer 1388 } 1390 type-byweekno = element byweekno { 1391 xsd:integer 1392 } 1394 type-bymonth = element bymonth { 1395 xsd:positiveInteger 1396 } 1398 type-bysetpos = element bysetpos { 1399 xsd:integer 1400 } 1402 # 3.3.11 TEXT 1404 value-text = element text { 1405 xsd:string 1406 } 1408 # 3.3.12 TIME 1410 pattern-time = xsd:string { 1411 pattern = "\d\d:\d\d:\d\dZ?" 1413 } 1415 value-time = element time { 1416 pattern-time 1417 } 1419 # 3.3.13 URI 1421 value-uri = element uri { 1422 xsd:anyURI 1423 } 1425 # 3.3.14 UTC-OFFSET 1427 value-utc-offset = element utc-offset { 1428 xsd:string { pattern = "[+\-]\d\d:\d\d" } 1429 } 1431 # UNKNOWN 1433 value-unknown = element unknown { 1434 xsd:string 1435 } 1437 # 3.4 iCalendar Stream 1439 start = element icalendar { 1440 vcalendar+ 1441 } 1443 # 3.6 Calendar Components 1445 vcalendar = element vcalendar { 1446 type-calprops, 1447 type-component 1448 } 1450 type-calprops = element properties { 1451 property-prodid & 1452 property-version & 1453 property-calscale? & 1454 property-method? 1455 } 1457 type-component = element components { 1458 ( 1459 component-vevent | 1460 component-vtodo | 1461 component-vjournal | 1462 component-vfreebusy | 1463 component-vtimezone 1464 )* 1465 } 1467 # 3.6.1 Event Component 1469 component-vevent = element vevent { 1470 type-eventprop, 1471 element components { 1472 component-valarm+ 1473 }? 1474 } 1476 type-eventprop = element properties { 1477 property-dtstamp & 1478 property-dtstart & 1479 property-uid & 1481 property-class? & 1482 property-created? & 1483 property-description? & 1484 property-geo? & 1485 property-last-mod? & 1486 property-location? & 1487 property-organizer? & 1488 property-priority? & 1489 property-seq? & 1490 property-status-event? & 1491 property-summary? & 1492 property-transp? & 1493 property-url? & 1494 property-recurid? & 1496 property-rrule? & 1498 (property-dtend | property-duration)? & 1500 property-attach* & 1501 property-attendee* & 1502 property-categories* & 1503 property-comment* & 1504 property-contact* & 1505 property-exdate* & 1506 property-rstatus* & 1507 property-related* & 1508 property-resources* & 1509 property-rdate* 1510 } 1512 # 3.6.2 To-do Component 1514 component-vtodo = element vtodo { 1515 type-todoprop, 1516 element components { 1517 component-valarm+ 1518 }? 1519 } 1521 type-todoprop = element properties { 1522 property-dtstamp & 1523 property-uid & 1525 property-class? & 1526 property-completed? & 1527 property-created? & 1528 property-description? & 1529 property-geo? & 1530 property-last-mod? & 1531 property-location? & 1532 property-organizer? & 1533 property-percent? & 1534 property-priority? & 1535 property-recurid? & 1536 property-seq? & 1537 property-status-todo? & 1538 property-summary? & 1539 property-url? & 1541 property-rrule? & 1543 ( 1544 (property-dtstart?, property-dtend? ) | 1545 (property-dtstart, property-duration)? 1546 ) & 1548 property-attach* & 1549 property-attendee* & 1550 property-categories* & 1551 property-comment* & 1552 property-contact* & 1553 property-exdate* & 1554 property-rstatus* & 1555 property-related* & 1556 property-resources* & 1557 property-rdate* 1558 } 1560 # 3.6.3 Journal Component 1562 component-vjournal = element vjournal { 1563 type-jourprop 1564 } 1566 type-jourprop = element properties { 1567 property-dtstamp & 1568 property-uid & 1570 property-class? & 1571 property-created? & 1572 property-dtstart? & 1573 property-last-mod? & 1574 property-organizer? & 1575 property-recurid? & 1576 property-seq? & 1577 property-status-jour? & 1578 property-summary? & 1579 property-url? & 1581 property-rrule? & 1583 property-attach* & 1584 property-attendee* & 1585 property-categories* & 1586 property-comment* & 1587 property-contact* & 1588 property-description? & 1589 property-exdate* & 1590 property-related* & 1591 property-rdate* & 1592 property-rstatus* 1593 } 1595 # 3.6.4 Free/Busy Component 1597 component-vfreebusy = element vfreebusy { 1598 type-fbprop 1599 } 1601 type-fbprop = element properties { 1602 property-dtstamp & 1603 property-uid & 1604 property-contact? & 1605 property-dtstart? & 1606 property-dtend? & 1607 property-duration? & 1608 property-organizer? & 1609 property-url? & 1611 property-attendee* & 1612 property-comment* & 1613 property-freebusy* & 1614 property-rstatus* 1615 } 1617 # 3.6.5 Time Zone Component 1619 component-vtimezone = element vtimezone { 1620 element properties { 1621 property-tzid & 1623 property-last-mod? & 1624 property-tzuurl? 1625 }, 1626 element components { 1627 (component-standard | component-daylight) & 1628 component-standard* & 1629 component-daylight* 1630 } 1631 } 1633 component-standard = element standard { 1634 type-tzprop 1635 } 1637 component-daylight = element daylight { 1638 type-tzprop 1639 } 1641 type-tzprop = element properties { 1642 property-dtstart & 1643 property-tzoffsetto & 1644 property-tzoffsetfrom & 1646 property-rrule? & 1648 property-comment* & 1649 property-rdate* & 1650 property-tzname* 1651 } 1652 # 3.6.6 Alarm Component 1654 component-valarm = element valarm { 1655 audioprop | dispprop | emailprop 1656 } 1658 type-audioprop = element properties { 1659 property-action & 1660 property-trigger & 1662 (property-duration, property-repeat)? & 1664 property-attach? 1665 } 1667 type-dispprop = element properties { 1668 property-action & 1669 property-description & 1670 property-trigger & 1671 property-summary & 1673 property-attendee+ & 1675 (property-duration, property-repeat)? & 1677 property-attach* 1678 } 1680 type-emailprop = element properties { 1681 property-action & 1682 property-description & 1683 property-trigger & 1685 (property-duration, property-repeat)? 1686 } 1688 # 3.7 Calendar Properties 1690 # 3.7.1 Calendar Scale 1692 property-calscale = element calscale { 1694 element parameters { empty }?, 1696 element text { "GREGORIAN" } 1697 } 1699 # 3.7.2 Method 1700 property-method = element method { 1702 element parameters { empty }?, 1704 value-text 1705 } 1707 # 3.7.3 Product Identifier 1709 property-prodid = element prodid { 1711 element parameters { empty }?, 1713 value-text 1714 } 1716 # 3.7.4 Version 1718 property-version = element version { 1720 element parameters { empty }?, 1722 element text { "2.0" } 1723 } 1725 # 3.8 Component Properties 1727 # 3.8.1 Descriptive Component Properties 1729 # 3.8.1.1 Attachment 1731 property-attach = element attach { 1733 element parameters { 1734 fmttypeparam? & 1735 encodingparam? 1736 }?, 1738 value-uri | value-binary 1739 } 1741 # 3.8.1.2 Categories 1743 property-categories = element categories { 1745 element parameters { 1746 languageparam? & 1747 }?, 1748 value-text+ 1749 } 1751 # 3.8.1.3 Classification 1753 property-class = element class { 1755 element parameters { empty }?, 1757 element text { 1758 "PUBLIC" | 1759 "PRIVATE" | 1760 "CONFIDENTIAL" 1761 } 1762 } 1764 # 3.8.1.4 Comment 1766 property-comment = element comment { 1768 element parameters { 1769 altrepparam? & 1770 languageparam? 1771 }?, 1773 value-text 1774 } 1776 # 3.8.1.5 Description 1778 property-description = element description { 1780 element parameters { 1781 altrepparam? & 1782 languageparam? 1783 }?, 1785 value-text 1786 } 1788 # 3.8.1.6 Geographic Position 1790 property-geo = element geo { 1792 element parameters { empty }?, 1794 element latitude { xsd:float }, 1795 element longitude { xsd:float } 1797 } 1799 # 3.8.1.7 Location 1801 property-location = element location { 1803 element parameters { 1804 altrepparam? & 1805 languageparam? 1806 }?, 1808 value-text 1809 } 1811 # 3.8.1.8 Percent Complete 1813 property-percent = element percent-complete { 1815 element parameters { empty }?, 1817 value-integer 1818 } 1820 # 3.8.1.9 Priority 1822 property-priority = element priority { 1824 element parameters { empty }?, 1826 value-integer 1827 } 1829 # 3.8.1.10 Resources 1831 property-resources = element resources { 1833 element parameters { 1834 altrepparam? & 1835 languageparam? 1836 }?, 1838 value-text+ 1839 } 1841 # 3.8.1.11 Status 1843 property-status-event = element status { 1844 element parameters { empty }?, 1846 element text { 1847 "TENTATIVE" | 1848 "CONFIRMED" | 1849 "CANCELLED" 1850 } 1851 } 1853 property-status-todo = element status { 1855 element parameters { empty }?, 1857 element text { 1858 "NEEDS-ACTION" | 1859 "COMPLETED" | 1860 "IN-PROCESS" | 1861 "CANCELLED" 1862 } 1863 } 1865 property-status-jour = element status { 1867 element parameters { empty }?, 1869 element text { 1870 "DRAFT" | 1871 "FINAL" | 1872 "CANCELLED" 1873 } 1874 } 1876 # 3.8.1.12 Summary 1878 property-summary = element summary { 1880 element parameters { 1881 altrepparam? & 1882 languageparam? 1883 }?, 1885 value-text 1886 } 1888 # 3.8.2 Date and Time Component Properties 1890 # 3.8.2.1 Date/Time Completed 1891 property-completed = element completed { 1893 element parameters { empty }?, 1895 value-date-time 1896 } 1898 # 3.8.2.2 Date/Time End 1900 property-dtend = element dtend { 1902 element parameters { 1903 tzidparam? 1904 }?, 1906 value-date-time | 1907 value-date 1908 } 1910 # 3.8.2.3 Date/Time Due 1912 property-due = element due { 1914 element parameters { 1915 tzidparam? 1916 }?, 1918 value-date-time | 1919 value-date 1920 } 1922 # 3.8.2.4 Date/Time Start 1924 property-dtstart = element dtstart { 1926 element parameters { 1927 tzidparam? 1928 }?, 1930 value-date-time | 1931 value-date 1932 } 1934 # 3.8.2.5 Duration 1936 property-duration = element duration { 1938 element parameters { empty }?, 1939 value-duration 1940 } 1942 # 3.8.2.6 Free/Busy Time 1944 property-freebusy = element freebusy { 1946 element parameters { 1947 fbtypeparam? 1948 }?, 1950 value-period+ 1951 } 1953 # 3.8.2.7 Time Transparency 1955 property-transp = element transp { 1957 element parameters { empty }?, 1959 element text { 1960 "OPAQUE" | 1961 "TRANSPARENT" 1962 } 1963 } 1965 # 3.8.3 Time Zone Component Properties 1967 # 3.8.3.1 Time Zone Identifier 1969 property-tzid = element tzid { 1971 element parameters { empty }?, 1973 value-text 1974 } 1976 # 3.8.3.2 Time Zone Name 1978 property-tzname = element tzname { 1980 element parameters { 1981 languageparam? 1982 }?, 1984 value-text 1985 } 1986 # 3.8.3.3 Time Zone Offset From 1988 property-tzoffsetfrom = element tzoffsetfrom { 1990 element parameters { empty }?, 1992 value-utc-offset 1993 } 1995 # 3.8.3.4 Time Zone Offset To 1997 property-tzoffsetto = element tzoffsetto { 1999 element parameters { empty }?, 2001 value-utc-offset 2002 } 2004 # 3.8.3.5 Time Zone URL 2006 property-tzurl = element tzurl { 2008 element parameters { empty }?, 2010 value-uri 2011 } 2013 # 3.8.4 Relationship Component Properties 2015 # 3.8.4.1 Attendee 2017 property-attendee = element attendee { 2019 element parameters { 2020 cutypeparam? & 2021 memberparam? & 2022 roleparam? & 2023 partstatparam? & 2024 rsvpparam? & 2025 deltoparam? & 2026 delfromparam? & 2027 sentbyparam? & 2028 cnparam? & 2029 dirparam? & 2030 languageparam? 2031 }?, 2033 value-cal-address 2035 } 2037 # 3.8.4.2 Contact 2039 property-contact = element contact { 2041 element parameters { 2042 altrepparam? & 2043 languageparam? 2044 }?, 2046 value-text 2047 } 2049 # 3.8.4.3 Organizer 2051 property-organizer = element organizer { 2053 element parameters { 2054 cnparam? & 2055 dirparam? & 2056 sentbyparam? & 2057 languageparam? 2058 }?, 2060 value-cal-address 2061 } 2063 # 3.8.4.4 Recurrence ID 2065 property-recurid = element recurrence-id { 2067 element parameters { 2068 tzidparam? & 2069 rangeparam? 2070 }?, 2072 value-date-time | 2073 value-date 2074 } 2076 # 3.8.4.5 Related-To 2078 property-related = element related-to { 2080 element parameters { 2081 reltypeparam? 2082 }?, 2083 value-text 2084 } 2086 # 3.8.4.6 Uniform Resource Locator 2088 property-url = element url { 2090 element parameters { empty }?, 2092 value-uri 2093 } 2095 # 3.8.4.7 Unique Identifier 2097 property-uid = element uid { 2099 element parameters { empty }?, 2101 value-text 2102 } 2104 # 3.8.5 Recurrence Component Properties 2106 # 3.8.5.1 Exception Date/Times 2108 property-exdate = element exdate { 2110 element parameters { 2111 tzidparam? 2112 }?, 2114 value-date-time+ | 2115 value-date+ 2116 } 2118 # 3.8.5.2 Recurrence Date/Times 2120 property-rdate = element rdate { 2122 element parameters { 2123 tzidparam? 2124 }?, 2126 value-date-time+ | 2127 value-date+ | 2128 value-period+ 2129 } 2130 # 3.8.5.3 Recurrence Rule 2132 property-rrule = element rrule { 2134 element parameters { empty }?, 2136 value-recur 2137 } 2139 # 3.8.6 Alarm Component Properties 2141 # 3.8.6.1 Action 2143 property-action = element action { 2145 element parameters { empty }?, 2147 element text { 2148 "AUDIO" | 2149 "DISPLAY" | 2150 "EMAIL" 2151 } 2152 } 2154 # 3.8.6.2 Repeat Count 2156 property-repeat = element repeat { 2158 element parameters { empty }?, 2160 value-integer 2161 } 2163 # 3.8.6.3 Trigger 2165 property-trigger = element trigger { 2167 ( 2168 element parameters { 2169 trigrelparam? 2170 }?, 2172 value-duration 2173 ) | 2174 ( 2175 element parameters { empty }?, 2177 value-date-time 2179 ) 2180 } 2182 # 3.8.7 Change Management Component Properties 2184 # 3.8.7.1 Date/Time Created 2186 property-created = element created { 2188 element parameters { empty }?, 2190 value-date-time 2191 } 2193 # 3.8.7.2 Date/Time Stamp 2195 property-dtstamp = element dtstamp { 2197 element parameters { empty }?, 2199 value-date-time 2200 } 2202 # 3.8.7.3 Last Modified 2204 property-last-mod = element last-modified { 2206 element parameters { empty }?, 2208 value-date-time 2209 } 2211 # 3.8.7.4 Sequence Number 2213 property-seq = element sequence { 2215 element parameters { empty }?, 2217 value-integer 2218 } 2220 # 3.8.8 Miscellaneous Component Properties 2222 # 3.8.8.3 Request Status 2224 property-rstatus = element request-status { 2226 element parameters { 2227 languageparam? 2228 }?, 2230 element code { xsd:string }, 2231 element description { xsd:string }, 2232 element data { xsd:string }? 2233 } 2235 Appendix B. Examples 2237 This section contains two examples of iCalendar objects with their 2238 xCal representation. 2240 B.1. Example 1 2242 B.1.1. iCalendar Data 2244 BEGIN:VCALENDAR 2245 CALSCALE:GREGORIAN 2246 PRODID:-//Example Inc.//Example Calendar//EN 2247 VERSION:2.0 2248 BEGIN:VEVENT 2249 DTSTAMP:20080205T191224Z 2250 DTSTART:20081006 2251 SUMMARY:Planning meeting 2252 UID:4088E990AD89CB3DBB484909 2253 END:VEVENT 2254 END:VCALENDAR 2256 B.1.2. XML Data 2258 2259 2260 2261 2262 2263 GREGORIAN 2264 2265 2266 -//Example Inc.//Example Calendar//EN 2267 2268 2269 2.0 2270 2271 2272 2273 2274 2275 2276 2008-02-05T19:12:24Z 2277 2278 2279 2008-10-06 2280 2281 2282 Planning meeting 2283 2284 2285 4088E990AD89CB3DBB484909 2286 2287 2288 2289 2290 2291 2293 B.2. Example 2 2294 B.2.1. iCalendar Data 2296 VERSION:2.0 2297 PRODID:-//Example Corp.//Example Client//EN 2298 BEGIN:VTIMEZONE 2299 LAST-MODIFIED:20040110T032845Z 2300 TZID:US/Eastern 2301 BEGIN:DAYLIGHT 2302 DTSTART:20000404T020000 2303 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 2304 TZNAME:EDT 2305 TZOFFSETFROM:-0500 2306 TZOFFSETTO:-0400 2307 END:DAYLIGHT 2308 BEGIN:STANDARD 2309 DTSTART:20001026T020000 2310 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 2311 TZNAME:EST 2312 TZOFFSETFROM:-0400 2313 TZOFFSETTO:-0500 2314 END:STANDARD 2315 END:VTIMEZONE 2316 BEGIN:VEVENT 2317 DTSTAMP:20060206T001121Z 2318 DTSTART;TZID=US/Eastern:20060102T120000 2319 DURATION:PT1H 2320 RRULE:FREQ=DAILY;COUNT=5 2321 RDATE;TZID=US/Eastern;VALUE=PERIOD:20060102T150000/PT2H 2322 SUMMARY:Event #2 2323 DESCRIPTION:We are having a meeting all this week at 12 pm fo 2324 r one hour\, with an additional meeting on the first day 2 h 2325 ours long.\nPlease bring your own lunch for the 12 pm meetin 2326 gs. 2327 UID:00959BC664CA650E933C892C@example.com 2328 END:VEVENT 2329 BEGIN:VEVENT 2330 DTSTAMP:20060206T001121Z 2331 DTSTART;TZID=US/Eastern:20060104T140000 2332 DURATION:PT1H 2333 RECURRENCE-ID;TZID=US/Eastern:20060104T120000 2334 SUMMARY:Event #2 bis 2335 UID:00959BC664CA650E933C892C@example.com 2336 END:VEVENT 2337 END:VCALENDAR 2339 B.2.2. XML Data 2341 2342 2343 2344 2345 2346 -//Example Inc.//Example Client//EN 2347 2348 2349 2.0 2350 2351 2352 2353 2354 2355 2356 2004-01-10T03:28:45Z 2357 2358 US/Eastern 2359 2360 2361 2362 2363 2364 2000-04-04T02:00:00 2365 2366 2367 2368 YEARLY 2369 1SU 2370 4 2371 2372 2373 2374 EDT 2375 2376 2377 -05:00 2378 2379 2380 -04:00 2381 2382 2383 2384 2385 2386 2387 2000-10-26T02:00:00 2388 2389 2390 2391 YEARLY 2392 -1SU 2393 10 2394 2395 2396 2397 EST 2398 2399 2400 -04:00 2401 2402 2403 -05:00 2404 2405 2406 2407 2408 2409 2410 2411 2412 2006-02-06T00:11:21Z 2413 2414 2415 2416 US/Eastern 2417 2418 2006-01-02T12:00:00 2419 2420 2421 PT1H 2422 2423 2424 2425 DAILY 2426 5 2427 2428 2429 2430 2431 US/Eastern 2432 2433 2434 2006-01-02T15:00:00 2435 PT2H 2436 2437 2438 2439 Event #2 2440 2441 2442 We are having a meeting all this week at 12 2443 pm for one hour, with an additional meeting on the first day 2444 2 hours long. Please bring your own lunch for the 12 pm 2445 meetings. 2446 2447 2448 00959BC664CA650E933C892C@example.com 2449 2450 2451 2452 2453 2454 2455 2006-02-06T00:11:21Z 2456 2457 2458 2459 US/Eastern 2460 2461 2006-01-04T14:00:00 2462 2463 2464 PT1H 2465 2466 2467 2468 US/Eastern 2469 2470 2006-01-04T12:00:00 2471 2472 2473 Event #2 bis 2474 2475 2476 00959BC664CA650E933C892C@example.com 2477 2478 2479 2480 2481 2482 2484 Appendix C. Change History (to be removed prior to publication as an 2485 RFC) 2487 Changes in -11: 2489 1. Fixed date-time schema pattern. 2491 2. Tweaked XML property definition based on expert review 2493 Changes in -10: 2495 1. IESG: Added more XML schema references in value descriptions. 2497 2. IESG: Added reference to RFC4648 for base64 definition. 2499 3. IESG: Rephrased various uses of "optional". 2501 4. IESG: Clarified round-tripping design consideration. 2503 5. IESG: Use "As an example" rather than "non-normative" for tables. 2505 6. IESG: Added a few more examples. 2507 7. IESG: Added a note that UTC-offset is not used with time values. 2509 Changes in -09: 2511 1. LC: Changed namespace prefix to IC:. 2513 2. LC: Clarified what needs to happen with base64 encoding. 2515 3. LC: Changed "XML" to "xCal" in various places. 2517 4. LC: Schema now uses xsd types where appropriate. 2519 5. LC: GEO value fixed to be two floats. 2521 6. LC: Fix use of within parameters. 2523 7. LC: Add IC:unknown value element to deal with unrecognized 2524 properties or parameters. 2526 8. LC: Added escaped/folded text example property. 2528 9. Removed wrapper element for GEO and REQUEST-STATUS. 2530 10. Date/time, duration and utc-offset values defined in terms of 2531 patterns. Some now align with xsd patterns rather than 2532 iCalendar ones. 2534 11. Period schema value defined in terms of child elements. 2536 12. Added more examples. 2538 Changes in -08: 2540 1. Updated optional parameters section of media type registration 2541 (feedback from ietf-types) 2543 2. Corrected the schema for the trigger element 2545 3. Updated to ietf.org mailing list 2547 4. Updated definition of iCalendar XML property 2549 Changes in -07: 2551 1. Updated XML reference to latest version. 2553 2. Corrected dtstamp elements in samples. 2555 3. Removed empty informative references section. 2557 4. Changed media type registration file extension to "xcs" (feedback 2558 from ietf-types) 2560 5. Changed media type registration follow up email to ietf-calsify 2561 (feedback from ietf-types) 2563 6. Updated several parts of the specification to show how future 2564 extensions to iCalendar can be handled without changing this 2565 specification (feedback from ietf-types) 2567 7. Updated security concerns in section 5 (feedback from ietf-types) 2569 8. Updated encoding considerations in section 5 (feedback from ietf- 2570 types) 2572 Changes in -06: 2574 1. Removed the ordwk and weekday elements from the byday element in 2575 a recurrence rule. The byday element now takes a text value 2576 which is the same as the value used in [RFC5545]. 2578 2. Added another example of an iCalendar object converted to xCal. 2580 3. Fixed the MIME type registration (another instance of xml+ 2581 calendar corrected to calendar+xml). 2583 Changes in -05: 2585 1. Added description to XML extension discussing how to handle 2586 binary data in XML. 2588 2. Removed empty Appendix B. 2590 Changes in -04: 2592 1. Changed the proposed MIME type from xml+calendar to calendar+xml. 2594 2. Fixed several references to sections of RFC5545. 2596 3. Updated example in Appendix C. 2598 4. Corrected the definition and grammar for TIME and UTC-OFFSET 2599 properties. 2601 Changes in -03: 2603 1. Removed the LINK extension and related sections. The concept 2604 will be addressed in a separate specification. 2606 2. Various minor edits for clarity and consistency. 2608 Changes in -02: 2610 1. Added LINK extension to iCalendar and section discussing links in 2611 XML format. 2613 2. Adopted "xCal" as the short name for the specification. 2615 Changes in -01: 2617 1. Changed 2445bis references to RFC5545. 2619 2. Added a version number to the XML namespace for iCalendar. 2621 3. Changed the values for the date, date-time, period, and duration 2622 elements to exactly match the values specified in RFC5545. 2623 Previously these were broken out into separate elements for day, 2624 month, year, etc. 2626 4. Added specification for XML property in iCalendar. 2628 Authors' Addresses 2630 Cyrus Daboo 2631 Apple Inc. 2632 1 Infinite Loop 2633 Cupertino, CA 95014 2634 USA 2636 EMail: cyrus@daboo.name 2637 URI: http://www.apple.com/ 2639 Mike Douglass 2640 Rensselaer Polytechnic Institute 2641 110 8th Street 2642 Troy, NY 12180 2643 USA 2645 EMail: douglm@rpi.edu 2646 URI: http://www.rpi.edu/ 2648 Steven Lees 2649 Microsoft Corporation 2650 One Microsoft Way 2651 Redmond, WA 98052 2652 USA 2654 EMail: steven.lees@microsoft.com 2655 URI: http://www.microsoft.com/