この文書は CalDAV 仕様の勝手な日本語訳です。内容の正確さは保証いたしかねますので、ご了承ください。原文は以下の URL にあります。

http://greenbytes.de/tech/webdav/rfc4791.html

この翻訳に関するご意見等は、以下のページにコメントしてください。

http://webos-goodies.jp/archives/caldav_spec.html

翻訳者 : 伊藤千光 <http://webos-goodies.jp/>


Network Working Group C. Daboo
Request for Comments: 4791 Apple
Category: Standards Track B. Desruisseaux

Oracle

L.M. Dusseault

CommerceNet

March 2007

Calendaring Extensions to WebDAV (CalDAV)

Status of This Memo

This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the “Internet Official Protocol Standards” (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited.

Copyright Notice

Copyright © The IETF Trust (2007). All Rights Reserved.

Abstract

この文書は iCalendar 形式を基にしたカレンダーとスケジュール情報へのアクセス、管理、共有を行う標準的な方法を規定するための Web Distributed Authoring and Versioning (WebDAV) プロトコルの拡張を定義します。この文書は CalDAV の「カレンダー・アクセス」機能機能を定義します。


Table of Contents


1. Introduction

HTTP [RFC2616] と WebDAV [RFC2518] をカレンダー・アクセス・プロトコルの基盤として使うのは決して新しいものではありません。 1997年か1998年には IETF CALSCH ワーキンググループでそれが議論されました。 iCalendar [RFC2445] オブジェクトのアップロードやダウンロードに HTTP を使い、そしてリソースリストの取得に WebDAV を使用するカレンダー・アクセス・プロトコルをいくつかの企業が実装しました。しかしながら、カレンダー・データを WebDAV リソースとしてモデル化する方法、また WebDAV にない必須機能を実装する方法に大小さまざまな相違があるので、それらの実装は相互運用ができません。この文書は相互運用可能なカレンダー・アクセス・プロトコルを実現する追加機能とともに、カレンダー・データを WebDAV でモデル化する手法を提案します。

1.1 Notational Conventions

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119].

The term "protected" is used in the Conformance field of property definitions as defined in Section 1.4.2 of [RFC3253].

When XML element types in the namespaces "DAV:" and "urn:ietf:params:xml:ns:caldav" are referenced in this document outside of the context of an XML fragment, the string "DAV:" and "CALDAV:" will be prefixed to the element type names, respectively.

1.2 XML Namespaces and Processing

この文書では XML 要素の定義に (XML Document Type Declarations に見られるように) [W3C.REC-xml-20060816]Section 3.2 で記述されている XML element type declarations を使います。

名前空間 "urn:ietf:params:xml:ns:caldav" はこの仕様とそのリビジョン、そして関連する CalDAV 仕様で定義される XML 要素のために予約されています。個々の実装で定義される XML 要素はこの "urn:ietf:params:xml:ns:caldav" 名前空間を使用してはいけません (MUST NOT)。代わりに実装者がコントロールする名前空間を使用するべきです。

この文書で使われている XML 宣言は名前空間情報を含みません。したがって、実装者は有効な CalDAV 属性を作成する、もしくは CalDAV XML 要素型を検証する唯一の方法として、これらの宣言を使用してはいけません。いくつかの宣言は "DAV:" 名前空間を使用する WebDAV [RFC2518] で定義された XML 要素を参照します。混乱を避けるため、それらの要素は常に "DAV:" プリフィクスが付けられています。

また、名前空間は違うものの、いくつかの CalDAV XML 要素名は WebDAV XML 要素名と同じであることに注意してください。これら 2 組の名前に混乱しないよう気をつけなければなりません。

CalDAV クライアントおよびサーバーの XML 処理は、 [RFC2518] 仕様、とくに Section 14 と Appendix 3 に記述されたルールに従わなければなりません (MUST) 。

1.3 Method Preconditions and Postconditions

メソッドの "precondition" はそのメソッドを実行するために真でなければならないサーバーの状態を示します。メソッドの "postcondition" はそのメソッドの実行が完了した後に真でなければならないサーバーの状態を示します。もしリクエストのメソッド precondition または postcondition が満たされていなければ、そのリクエストのレスポンスステータスは、そのリクエストが常に失敗するために繰り返されるべきではないときの 403 (Forbidden) 、 ユーザーが衝突を解消してリクエストを再送信することが予期されるときの 409 (Conflict) 、のどちらかでなければなりません (MUST) 。

クライアントが 403 と 409 のレスポンスをより良くハンドリングできるようにするために、個々の XML 要素型はリクエストのメソッド precondition と postcondition それぞれに関連付けられます。特定の precondition が満たされない、または特定の postcondition が得られないときは、レスポンスボディーのトップレベルの DAV:error 要素の子供として適切な XML 要素が返されなければなりません (MUST) 。


2. Requirements Overview

このセクションでは、 CalDAV サーバーにどのような機能が必要かをリストします。 CalDAV をサポートするには、サーバーは:

加えて、サーバーは:


3. Calendaring Data Model

WebDAV を成功したプロトコルにした特徴のひとつはその堅牢なデータモデルです。この特徴は WebDAV をカレンダーのような他のアプリケーションのための便利なフレームワークにします。よく記述されたデータモデルに基づくすべての特徴を用いることで、この仕様も同じパターンをフォローします。

概要としては、 CalDAV カレンダーは定義済みの構造を持った WebDAV コレクションとしてモデル化されます。それぞれのカレンダー・コレクションはその直接の子リソースとしてカレンダー・オブジェクトを表す多数のリソースを含んでいます。それぞれカレンダー・オブジェクト(イベント、to-do、仕訳、またはカレンダー・コンポーネント)を表すリソースは「カレンダー・オブジェクト・リソース」と呼ばれます。それぞれのカレンダー・オブジェクト・リソースとカレンダー・コレクションは個別にロックができ、個々に WebDAV 属性を持っています。このモデルから派生する要件は Section 4.1 and Section 4.2 で提供されています。

3.1 Calendar Server

CalDAV サーバーは WebDAV リポジトリに結合されたカレンダー指向エンジンです。 WebDAV リポジトリは同じ名前空間の内部に他の WebDAV リソースを含む WebDAV コレクションの集合です。例えば "http://www.example.com/webdav/" リポジトリは WebDAV コレクションとリソースを含み、それら全ての URL は "http://www.example.com/webdav/" で始まるでしょう。ルート URL "http://www.example.com/" 自体は WebDAV リポジトリではないかもしれないことに注意してください(例えば WebDAV サポートがサーブレットやその他の Web サーバー拡張機能で実装されている場合)。

WebDAV リポジトリはその URL 名前空間の一部にカレンダー・データを、その他の部分にカレンダー以外のデータを含むかもしれません (MAY) 。

WebDAV リポジトリは、この仕様で定義される機能をルート以下のすべてのポイントでサポートするなら、自身が CalDAV サーバーとなることができます。これは、カレンダー・データがリポジトリ全体に分散し、コレクションの内部でカレンダー以外のデータと隣接していることを意味するかもしれません(例えば、カレンダー・データが /home/lisa/calendars/ や /home/bernard/calendars/ に、そしてカレンダー以外のデータが /home/lisa/contacts/ にあるかもしれません)。もしくは、カレンダーデータがリポジトリ内のただひとつの特定のセクションにあることを意味するかもしれません(例えば /calendar/)。カレンダー機能はカレンダー・オブジェクト・リソースが存在する、もしくはそれを含むリポジトリ・セクションでのみ必要です。したがって、カレンダー・データを /calendar/ コレクションに限定したリポジトリは、そのコレクションの内部でのみ CalDAV に必要な機能をサポートするでしょう。

CalDAV サーバーもしくはリポジトリはカレンダー・データと状態情報の標準的な位置です。クライアントはデータの変更またはダウンロードの要求を送信するかもしれません。クライアントはカレンダー・オブジェクトをオフラインで保存し、後に同期を試みるかもしれません。しかしながら、カレンダー・コレクション多数のクライアントによってアクセス可能な状態で共有されているかもしれないので、クライアントは前回の同期から次に更新を試みるまでのサーバー上のカレンダーデータの変更に備えなければなりません (MUST) 。

3.2 Recurrence and the Data Model

反復は、どれだけの数のリソースが存在することを予期するかを決定するので、データモデルの重要な部分です。この仕様は反復するカレンダー・コンポーネントとその反復例外をひとつのリソースとしてモデル化します。このモデルでは、反復ルール、反復日付、例外ルール、そして例外日付がすべてひとつのカレンダー・オブジェクト・リソース内のデータです。このモデルはリポジトリ内に保存する反復インスタンスの数の制限、反復するカレンダー・コンポーネントを同期する際に反復インスタンスを維持する方法、そして反復例外を反復するカレンダー・コンポーネントにリンクする方法の問題を回避します。それはまた、クライアントとサーバー間で同期する際のデータを削減し、そしてすべての反復インスタンスや反復ルールへの変更を容易にします。それは反復カレンダー・コンポーネントの作成やすべての反復インスタンスの削除を容易にします。

クライアントは反復するコンポーネントのすべての反復インスタンスに関する情報を取得するようには強制されません。この文書で定義されている CALDAV:calendar-query と CALDAV:calendar-multiget レポートはクライアントが指定された時間範囲と重なる反復インスタンスのみ取得することを可能にします。


4. Calendar Resources

4.1 Calendar Object Resources

iCalendar オブジェクトで指定されたそれぞれユニークな TZID パラメータ値で指定されなければならない (MUST) VTIMEZONE コンポーネントを例外として、カレンダー・コレクションに含まれるカレンダー・オブジェクト・リソースは、複数のタイプのカレンダーコンポーネント(例えば VEVENT, VTODO, VJOURNAL, VFREEBUSY など)を格納することはできません (MUST NOT) 。例えば、カレンダー・オブジェクト・リソースはひとつの VEVENT コンポーネントとひとつの VTIMEZONE コンポーネントを格納できますが、ひとつの VEVENT コンポーネントとひとつの VTODO コンポーネントは格納できません。代わりに VEVENT と VTODO コンポーネントは同じコレクション内の別々のカレンダーオブジェクトとして保存されなければなりません。

カレンダー・コレクション内に含まれるカレンダー・オブジェクト・リソースは iCalendar METHOD 属性を指定できません (MUST NOT) 。

カレンダー・オブジェクト・リソースに含まれるカレンダーコンポーネントのUID 属性値はそれらが保存されているカレンダー・コレクションのスコープ内でユニークでなければなりません (MUST) 。

カレンダー・コレクション内で異なる UID 属性値を持つカレンダーコンポーネントは別々のカレンダー・オブジェクト・リソースに保存されなければなりません (MUST) 。

指定されたカレンダーコレクション内の同じ UID 属性値を持つカレンダー・コンポーネントは、同じカレンダー・オブジェクト・リソースに格納されなければなりません (MUST) 。これは反復「集合」内の全てのコンポーネントが同じカレンダー・オブジェクト・リソースに含まれることを確実にします。カレンダー・オブジェクト・リソースが「マスター」反復コンポーネント(反復「集合」を定義し、いかなる RECURRENCE-ID 属性も持たないもの)を含まずに上書きされるインスタンス(通常インスタンスの振る舞いを変更し、ひいては RECURRENCE-ID 属性を含むもの)を表現するコンポーネントを単に格納することは可能です。

例えば、以下の iCalendar オブジェクトが与えられると:

BEGIN:VCALENDAR
PRODID:-//Example Corp.//CalDAV Client//EN
VERSION:2.0
BEGIN:VEVENT
UID:1@example.com
SUMMARY:One-off Meeting
DTSTAMP:20041210T183904Z
DTSTART:20041207T120000Z
DTEND:20041207T130000Z
END:VEVENT
BEGIN:VEVENT
UID:2@example.com
SUMMARY:Weekly Meeting
DTSTAMP:20041210T183838Z
DTSTART:20041206T120000Z
DTEND:20041206T130000Z
RRULE:FREQ=WEEKLY
END:VEVENT
BEGIN:VEVENT
UID:2@example.com
SUMMARY:Weekly Meeting
RECURRENCE-ID:20041213T120000Z
DTSTAMP:20041210T183838Z
DTSTART:20041213T130000Z
DTEND:20041213T140000Z
END:VEVENT
END:VCALENDAR

UID 値 "1@example.com" を持つ VEVENT コンポーネントそれ自身のカレンダー・オブジェクト・リソースに保存されます。 UID 値 "2@example.com" を持ち、ひとつの反復インスタンスが上書きされる反復イベントを表現する 2 つめの VEVENT コンポーネントも同じカレンダー・オブジェクト・リソースに保存されます。

4.2 Calendar Collection

カレンダー・コレクションはカレンダー内のカレンダー・コンポーネントを表現するカレンダー・オブジェクト・リソースを格納します。 URL によって識別された WebDAV リソース・コレクションのように、カレンダー・コレクションはクライアントに明示されます。カレンダー・コレクションは DAV:resourcetype 属性の値で DAV:collection と CALDAV:calendar XML 要素を報告しなければなりません (MUST) 。 CALDAV:calendar のための要素型宣言は:

    <!ELEMENT calendar EMPTY>

カレンダー・コレクションはプロビジョニング(つまりユーザー・アカウントの支給による自動生成)か、もしくは MKCALENDAR メソッド (Section 5.3.1参照) によって作成できます。このメソッドはユーザーが追加のカレンダー(例えばサッカーの予定)を作成する、もしくはユーザーがカレンダーを共有(例えばチームイベントや会議室の予約)するときに便利です。しかしながら、この文書は追加のカレンダーコレクションの目的を定義しないことに注意してください。ユーザーはカレンダー・コレクションが何のためのものかを発見する非標準の印に依存するか、もしくは Section 5.2.1 で定義される CALDAV:calendar-description をそのような印を提供するために使わなければなりません。

カレンダー・コレクション内のリソースには以下の制約が適用されます:

  1. カレンダー・コレクションはカレンダー・オブジェクト・リソースとカレンダー・コレクションでないコレクションのみを格納しなければなりません (MUST) 。つまり、カレンダー・コレクション内の「最上位」非コレクション・リソースのみが、カレンダー・オブジェクト・リソースとして許容されます。これはカレンダー・クライアントがカレンダー・コレクション内の非カレンダー・データに対処する必要はないことを保証します。とはいえ、コレクションのコンテンツを調べるのに標準 WebDAV の手法を使用するときは、カレンダー・オブジェクト・リソースとコレクションを識別しなければなりません。
  2. カレンダー・コレクション内のコレクションはいかなる階層にもカレンダー・コレクションを含んではなりません (MUST NOT) 。つまり、他のカレンダー・コレクションの内部ではいかなる階層においてもカレンダー・コレクションの「ネスト」は許されません。カレンダーコレクション内に格納されたコレクションがどのように使用されるか、またはそれらがカレンダーコレクション内に格納された任意のカレンダー・オブジェクト・リソースとどのように関係するかについては、この仕様定義しません。

複数のカレンダー・コレクションが同じコレクションの子になるかもしれません (MAY) 。


5. Calendar Access Feature

5.1 Calendar Access Support

この文書で解説されている機能をサポートするサーバーは、任意のカレンダー属性、レポート、メソッド、または権限をサポートする任意のリソースへの OPTIONS リクエストに対する DAV レスポンスヘッダ内に "calendar-access" フィールドを含まなくてはなりません (MUST)。 DAV レスポンスヘッダ内の "calendar-access" の値は、サーバーがこの文書内で指定されている MUST レベルの要件をすべてサポートしていることを示さなければなりません (MUST) 。

5.1.1 Example: Using OPTIONS for the Discovery of Calendar Access Support

>> Request <<

OPTIONS /home/bernard/calendars/ HTTP/1.1
Host: cal.example.com

>> Response <<

HTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE
Allow: PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL
DAV: 1, 2, access-control, calendar-access
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Length: 0

この例では、 OPTIONS メソッドは "/home/bernard/calendars/" コレクションがこの文書で定義されている属性、レポート、メソッド、権限をサポートしていることを示す "calendar-access" 値を DAV レスポンスヘッダで返します。

5.2 Calendar Collection Properties

このセクションではカレンダーコレクションのための属性を定義します。

5.2.1 CALDAV:calendar-description Property

名前:
calendar-description

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・コレクションについての可読な説明を提供します。

適合:
この属性は任意のカレンダー・コレクションで定義される可能性があります (MAY) 。もし定義されたなら、 protected かもしれず (MAY) 、そして([RFC2518]Section 12.14.1 で定義されているように) PROPFIND DAV:allprop リクエストでは返されないべきです (SHOULD NOT)。説明の言語を示す xml:lang アトリビュートは、クライアントによって、またはサーバー・プロビジョニングを通して、この属性に対して設定されるべきです (SHOULD) 。もしこの属性に設定されていれば、サーバーはあらゆる xml:lang アトリビュートを返さなければなりません (MUST) 。

説明:
もし存在すれば、この属性はユーザーに示すのに適したカレンダー・コレクションの説明を格納します。もしなければ、クライアントはカレンダーコレクションの説明はないものと仮定するべきです。

定義:

      <!ELEMENT calendar-description (#PCDATA)>
PCDATA value: string

例:

      <C:calendar-description xml:lang="fr-CA"
xmlns:C="urn:ietf:params:xml:ns:caldav"
>Calendrier de Mathilde Desruisseaux</C:calendar-description>

5.2.2 CALDAV:calendar-timezone Property

名前:
calendar-timezone

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・コレクションにタイムゾーンを指定します。

適合:
この属性はすべてのカレンダーコレクションで定義されるべきです (SHOULD) 。もし定義されたなら、それは([RFC2518]Section 12.14.1 で定義されているように) PROPFIND DAV:allprop リクエストでは返されないべきです (SHOULD NOT)。

説明:
CALDAV:calendar-timezone 属性は "date" 値と "date with local time" 値(すなわち floating time)を "date with UTC time" 値へと解決するためにサーバーが使用するタイムゾーンを指定するのに使用されます。サーバーは CALDAV:calendar-query レポートで指定された CALDAV:time-range と "date" 値や "date with local time" 値でスケジュールされたカレンダー・コンポーネントが重なるかを決定するためにこの情報を必要とします。サーバーはまた、 "date" 値や "date with local time" 値でスケジュールされたカレンダー・コンポーネントを考慮した CALDAV:free-busy-query レポート・リクエストへのレスポンスで返される VFREEBUSY コンポーネント内の "date with UTC time" による正確な FREEBUSY 期間を計算するためにこの情報を必要とします。この属性がないときは、サーバーは自身が選択したタイムゾーンを使用します。

備考:
CALDAV:calendar-timezone XML 要素に埋め込まれた iCalendar データは &lt;, &gt, &amp; など実体エンコーディングの使用または <![CDATA[ ... ]]> 構造の使用を含む標準的な XML キャラクター・データ・エンコーディング規則に従わなければなりません (MUST) 。後者の場合、 iCalendar データは、 CDATA セクションの終端記号である "]]>" というキャラクター・シーケンスを含むことはできません。

定義:

      <!ELEMENT calendar-timezone (#PCDATA)>
PCDATA value: an iCalendar object with exactly one VTIMEZONE
component.

例:

<C:calendar-timezone
xmlns:C="urn:ietf:params:xml:ns:caldav">BEGIN:VCALENDAR
PRODID:-//Example Corp.//CalDAV Client//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:US-Eastern
LAST-MODIFIED:19870101T000000Z
BEGIN:STANDARD
DTSTART:19671029T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:Eastern Standard Time (US &amp; Canada)
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19870405T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:Eastern Daylight Time (US &amp; Canada)
END:DAYLIGHT
END:VTIMEZONE
END:VCALENDAR
</C:calendar-timezone>

5.2.3 CALDAV:supported-calendar-component-set Property

名前:
supported-calendar-component-set

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・オブジェクト・リソースがカレンダー・コレクション内に格納できるカレンダー・コンポーネント型(例えば VEVENT, VTODO など)を指定します。

適合:
この属性は任意のカレンダー・コレクションで定義される可能性があります (MAY) 。もし定義されたら、それは protected でなければならず (MUST) 、([RFC2518]Section 12.14.1 で定義された) PROPFIND DAV:allprop リクエストでは返されないべきです (SHOULD) 。

説明:
CALDAV:supported-calendar-component-set 属性は、カレンダー・オブジェクト・リソースがカレンダー・コレクションに含めるであろうカレンダー・コンポーネント型をの制約を指定するのに使用されます。クライアントによる、この属性にリストされていないコンポーネント型のカレンダー・オブジェクト・リソースを保存するあらゆる試みは、もしそれが存在すれば、 CALDAV:supported-calendar-component precondition (Section 5.3.2.1) の侵害を伴うエラーとならなければなりません (MUST) 。この属性は protected なので、クライアントが PROPPATCH リクエストで変更することはできません。しかしながら、クライアントは MKCALENDAR でカレンダー・コレクションを新規作成するときに、この値を初期化することができます。空要素タグ <C:comp name="VTIMEZONE"/> は、 VTIMEZONE コンポーネントのみを含む calendar object resources サポートを提供するか、望まれているときのみ指定されなければなりません (MUST) 。 VEVENT または VTODO コンポーネントを含むカレンダー・オブジェクト・リソース内の VTIMEZONE コンポーネントは常にサポートされていると仮定されます。この属性がないときは、サーバーはすべてのコンポーネント型を受け入れなければなりません (MUST) 。そして、クライアントはすべてのコンポーネント型が受け入れられると仮定できます。

定義:

      <!ELEMENT supported-calendar-component-set (comp+)>

例:

      <C:supported-calendar-component-set
xmlns:C="urn:ietf:params:xml:ns:caldav">
<C:comp name="VEVENT"/>
<C:comp name="VTODO"/>
</C:supported-calendar-component-set>

5.2.4 CALDAV:supported-calendar-data Property

名前:
supported-calendar-data

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・コレクション内のカレンダー・オブジェクト・リソースが、どんなメディアタイプが受け付るかを指定します。

適合:
この属性は任意のカレンダー・コレクションで定義される可能性があります (MAY) 。もし定義されれば、それは protected でなければならず (MUST) 、([RFC2518]Section 12.14.1 で定義された) PROPFIND DAV:allprop リクエストでは返されないべきです (SHOULD) 。

説明:
CALDAV:supported-calendar-data 属性は、与えられたカレンダー・コレクション(例えば iCalendar version 2.0)内に含まれるカレンダー・オブジェクト・リソースがサポートするメディアタイプを指定するために使われます。クライアントによる、この属性にリストされていないメディアタイプを伴うカレンダー・オブジェクト・リソースを保存する試みは、 CALDAV:supported-calendar-data precondition (Section 5.3.2.1)の侵害エラーにならなければなりません (MUST) 。この属性がない場合は、サーバーは "text/calendar" と iCalendar version 2.0 メディアタイプのみを受け入れなければなりません (MUST) 。そしてクライアントはサーバーがこのデータのみを受け入れると仮定するでしょう。

定義:

      <!ELEMENT supported-calendar-data (calendar-data+)>

例:

      <C:supported-calendar-data
xmlns:C="urn:ietf:params:xml:ns:caldav">
<C:calendar-data content-type="text/calendar" version="2.0"/>
</C:supported-calendar-data>

5.2.5 CALDAV:max-resource-size Property

名前:
max-resource-size

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・オブジェクト・リソースがカレンダー・コレクションに保存されるときにサーバが受け入れられるリソースの最大サイズをオクテットで示す数値を提供します。

適合:
この属性は任意のカレンダー・コレクションで定義される可能性があります (MAY) 。もし定義されたら、それは protected でなければならず (MUST) 、 ([RFC2518]Section 12.14.1 で定義されているように) PROPFIND DAV:allprop リクエストでは返されないべきです (SHOULD NOT) 。

説明:
CALDAV:max-resource-size は、カレンダー・オブジェクト・リソースがカレンダー・コレクションに保存されるときにサーバが受け入れられる最大サイズをオクテットで表す数値を指定するのに使用されます。このサイズを超えるカレンダー・オブジェクト・リソースを保存するあらゆる試みは CALDAV:max-resource-size precondition (Section 5.3.2.1) 侵害のエラーにならなければなりません (MUST) 。この属性がなければ、サーバーがあらゆる妥当なサイズのリソースの保存を受け入れることをクライアントは仮定できます。

定義:

      <!ELEMENT max-resource-size (#PCDATA)>
PCDATA value: a numeric value (positive integer)

例:

      <C:max-resource-size xmlns:C="urn:ietf:params:xml:ns:caldav"
>102400</C:max-resource-size>

5.2.6 CALDAV:min-date-time Property

名前:
min-date-time

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・コレクションに保存されたカレンダー・オブジェクト・リソース内の任意の DATE or DATE-TIME 値としてサーバーが受け入れるもっとも早い日付と時刻を(UTC で)示す DATE-TIME 値を提供します。

適合:
この属性は任意のカレンダー・コレクションで定義される可能性があります (MAY) 。もし定義されたなら、それは protected でなければならず (MUST) 、 ([RFC2518]Section 12.14.1 で定義されているように) PROPFIND DAV:allprop リクエストでは返されないべきです (SHOULD NOT) 。

説明:
CALDAV:min-date-time は、サーバーがカレンダー・コレクションに保存されるカレンダー・オブジェクト・リソース内のすべての明示的な DATE または DATE-TIME 値として受け入れられる最も早い inclusive date を示す iCalendar DATE-TIME 値を UTC で指定するために使われます。この値より前の DATE または DATE-TIME 値を使用するカレンダー・オブジェクト・リソースを保存するあらゆる試みは、 CALDAV:min-date-time precondition (Section 5.3.2.1) 侵害のエラーにならなければなりません (MUST) 。サーバーは、この制限を超えるインスタンスを指定する反復コンポーネントを、それらのインスタンスが上書きされない限り、受け入れなければならない (MUST) ことに注意してください。この場合、カレンダー・オブジェクト・リソースのレポートを処理する際に、サーバーは単純に受け入れ可能な範囲の外側のインスタンスを無視するかもしれません (MAY) 。この属性がないときは、クライアントは、少なくとも(もし定義されているなら) CALDAV:max-date-time 以前のあらゆる有効な iCalendar 日付が使えることを仮定できます。

定義:

      <!ELEMENT min-date-time (#PCDATA)>
PCDATA value: an iCalendar format DATE-TIME value in UTC

例:

      <C:min-date-time xmlns:C="urn:ietf:params:xml:ns:caldav"
>19000101T000000Z</C:min-date-time>

5.2.7 CALDAV:max-date-time Property

名前:
max-date-time

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・コレクションに保存されたカレンダー・オブジェクト・リソース内の任意の DATE or DATE-TIME 値としてサーバーが受け入れるもっとも遅い日付と時刻を(UTC で)示す DATE-TIME 値を提供します。

適合:
この属性は任意のカレンダー・コレクションで定義される可能性があります (MAY) 。もし定義されたなら、それは protected でなければならず (MUST) 、 ([RFC2518]Section 12.14.1 で定義されているように) PROPFIND DAV:allprop リクエストでは返されないべきです (SHOULD NOT) 。

説明:
CALDAV:max-date-time は、サーバーがカレンダー・コレクションに保存されるカレンダー・オブジェクト・リソース内のすべての日付または時刻として受け入れられる最も遅い inclusive date を示す iCalendar DATE-TIME 値を UTC で指定するために使われます。この値より後の DATE または DATE-TIME 値を使用するカレンダー・オブジェクト・リソースを保存するあらゆる試みは、 CALDAV:max-date-time precondition (Section 5.3.2.1) 侵害のエラーにならなければなりません (MUST) 。サーバーは、この制限を超えるインスタンスを指定する反復コンポーネントを、それらのインスタンスが上書きされない限り、受け入れなければならない (MUST) ことに注意してください。この場合、カレンダー・オブジェクト・リソースのレポートを処理する際に、サーバーは単純に受け入れ可能な範囲の外側のインスタンスを無視するかも しれません (MAY) 。この属性がないときは、クライアントは、少なくとも(もし定義されているなら) CALDAV:max-date-time 以降のあらゆる有効な iCalendar 日付が使えることを仮定できます。

定義:

      <!ELEMENT max-date-time (#PCDATA)>
PCDATA value: an iCalendar format DATE-TIME value in UTC

例:

      <C:max-date-time xmlns:C="urn:ietf:params:xml:ns:caldav"
>20491231T235959Z</C:max-date-time>

5.2.8 CALDAV:max-instances Property

名前:
max-instances

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・コレクション内に保存されたカレンダー・オブジェクト・リソースが生成できる反復インスタンスの最大数を示す数値を提供します。

適合:
この属性は任意のカレンダー・コレクションで定義されるかもしれません (MAY) 。もし定義されれば、それは protected でなければならず (MUST) 、 ([RFC2518]Section 12.14.1 で定義されているように) PROPFIND DAV:allprop リクエストでは返されないべきです (SHOULD NOT) 。

説明:
CALDAV:max-instances はカレンダー・コレクション内に保存されたカレンダー・オブジェクト・リソースが生成できる反復インスタンスの最大数を示す数値を指定します。この値を超えるインスタンスを生成する反復パターンを持つカレンダー・オブジェクト・リソースを保存するあらゆる試みは CALDAV:max-instances precondition (Section 5.3.2.1)侵害のエラーにならなければなりません (MUST) 。この属性がない場合、サーバーに反復インスタンスの取り扱いや拡大に制限がないことを、クライアントは仮定できます。

定義:

      <!ELEMENT max-instances (#PCDATA)>
PCDATA value: a numeric value (integer greater than zero)

例:

      <C:max-instances xmlns:C="urn:ietf:params:xml:ns:caldav"
>100</C:max-instances>

5.2.9 CALDAV:max-attendees-per-instance Property

名前:
max-attendees-per-instance

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・コレクションに保存されたカレンダー・オブジェクト・リソースのあらゆるインスタンスの ATTENDEE 属性の最大値を示す数値を提供します。

適合:
この属性は任意のカレンダー・コレクションで定義されるかもしれません (MAY) 。もし定義されれば、それは protected でなければならず (MUST) 、 ([RFC2518]Section 12.14.1 で定義されているように) PROPFIND DAV:allprop リクエストでは返されないべきです (SHOULD NOT) 。

説明:
CALDAV:max-attendees-per-instance は、カレンダー・コレクションに保存されたカレンダー・オブジェクト・リソースのあらゆるインスタンスの ATTENDEE 属性の最大値を示す数値を指定するのに使われます。インスタンスごとにこの値より多くの ATTENDEE を持つカレンダー・オブジェクト・リソースを保存するあらゆる試みは CALDAV:max-attendees-per-instance precondition (Section 5.3.2.1) 侵害のエラーにならなければなりません (MUST) 。この属性がないなら、サーバーがカレンダー・コンポーネントで任意の数の ATTENDEE 属性を取り扱えることを、クライアントは仮定できます。

定義:

      <!ELEMENT max-attendees-per-instance (#PCDATA)>
PCDATA value: a numeric value (integer greater than zero)

例:

      <C:max-attendees-per-instance
xmlns:C="urn:ietf:params:xml:ns:caldav"
>25</C:max-attendees-per-instance>

5.2.10 Additional Precondition for PROPPATCH

この仕様は PROPPATCH メソッドのために追加の Precondition を必要とします。その precondition は:

(CALDAV:valid-calendar-data):
CALDAV:calendar-timezone 属性で指定されるタイムゾーンは、単一の有効な VTIMEZONE コンポーネントを含む、有効な iCalendar オブジェクトでなければなりません (MUST) 。

5.3 Creating Resources

カレンダー・コレクションとカレンダー・オブジェクト・リソースは CalDAV クライアントか CalDAV サーバのどちらかによって作成されるでしょう。この仕様はそのようなカレンダーデータを操るときにクライアントとサーバの両方が固く守らなければならない制限とデータモデルを定義します。

5.3.1 MKCALENDAR Method

MKCALENDAR メソッドを使う HTTP リクエストは、新しいカレンダー・コレクション・リソースを作成します。サーバはカレンダー・コレクション作成を特定のコレクションに制限するかもしれません (MAY) 。

いくつかのカレンダー・ストアはユーザー(もしくは principal)ごとにひとつのカレンダーしかサポートせず、そしてそれらは通常それぞれのアカウント用に事前作成されるため、サーバーの MKCALENDAR サポートは単なる推奨 (RECOMMENDED) であって必須 (REQUIRED) ではありません。しかしながら、ユーザーがデータをより良く整理するための複数のカレンダー・コレクションを作成できるようにサーバーとクライアントは MKCALENDAR をできるだけサポートしてください。

クライアントはカレンダーの可読な名前として DAV:displayname 属性を使うべきです (SHOULD) 。クライアントは DAV:displayname 属性の値を MKCALENDAR リクエストのリクエストボディーで指定するか、その代わりに MKCALENDAR リクエストを発行した直後に DAV:displayname 属性を適切な値に変更する PROPPATCH リクエストを発行できます。クライアントは DAV:displayname 属性を同じ URI 「レベル」にある他のすべてのカレンダー・コレクションと同じにするべきではありません (SHOULD NOT) 。カレンダー・コレクションをユーザーに表示する時、クライアントは DAV:displayname 属性を確認してその値をカレンダー名として使うべきです (SHOULD) 。 DAV:displayname 属性が空のイベントでは、クライアントはカレンダー・コレクション URI の最後の部分を名前として使うかもしれません (MAY); しかしながら、パスセグメントは不明瞭で、そして意味のある可読なテキストを表現しないかもしれません。

もし MKCALENDAR リクエストが失敗したら、サーバーはリクエストの前の状態を復元しなくてはなりません (MUST) 。

Marshalling:

もしリクエストボディーが存在すれば、それは CALDAV:mkcalendar XML 要素でなければなりません (MUST) 。インストラクションは受信した順に(すなわち上から下へ)処理されなければなりません (MUST) 。インストラクションはすべて実行されるかすべて実行されないかのどちらかでなければなりません (MUST) 。したがって、もし処理中になんらかのエラーが発生したら、すべての実行済みインストラクションは取り消され、適切なエラーが返されなければなりません (MUST) 。インストラクションの処理の詳細は [RFC2518]Section 12.13.2 にある DAV:set インストラクションの定義で見つかります。

      <!ELEMENT mkcalendar (DAV:set)>

もし成功リクエストのレスポンスボディーが含まれていれば、それは CALDAV:mkcalendar-response XML 要素でなければなりません (MUST) 。

      <!ELEMENT mkcalendar-response ANY>

このレスポンスは Cache-Control:no-cache ヘッダを含んでいなければなりません (MUST) 。

Preconditions:

(DAV:resource-must-be-null): Request-URI にリソースが存在してはならない (MUST NOT);

(CALDAV:calendar-collection-location-ok): Request-URI はカレンダー・コレクションが作成できる場所を指していなければならない (MUST);

(CALDAV:valid-calendar-data): CALDAV:calendar-timezone 属性で指定されたタイムゾーンは単一の有効な VTIMEZONE コンポーネントを含む有効な iCalendar オブジェクトでなければならない (MUST);

(DAV:needs-privilege): Request-UIR の親コレクションの DAV:bind 権限が現在のユーザーに与えられていなければならない (MUST) 。

Postconditions:

(CALDAV:initialize-calendar-collection): 新しいカレンダー・コレクションが Request-URI に存在する。そのカレンダー・コレクションの DAV:resourcetype は DAV:collection と CALDAV:calendar XML 要素の両方を含んでいなければならない (MUST) 。

5.3.1.1 Status Codes

以下は MKCALENDAR リクエストで返されるレスポンスコードの例です。このリストがすべてを網羅していないことに注意してください。

201 (Created) - カレンダー・コレクション・リソースが完全な状態で作成されました。

207 (Multi-Status) - リクエストボディーで指定された DAV:set インストラクションのいずれかの処理が成功しなかったため、カレンダー・コレクション・リソースは作成されませんでした。以下はこの状況の 207 (Multi-Status) レスポンスで使われると思われるレスポンスコードの例です:

403 (Forbidden) - サーバーが指定されていないものを選ぶため、クライアントは属性のひとつを変更できません。

409 (Conflict) - クライアントがセマンティクス的に適切でない値を属性に与えました。これには読み込み専用の属性に値を設定しようとしたことも含まれます。

424 (Failed Dependency) - リクエストボディーで指定された別の DAV:set インストラクションの失敗がなければ、指定されたリソースの DAV:set インストラクションの実行は成功していたでしょう。

423 (Locked) - 指定されたリソースはロックされており、そしてクライアントがロック所有者ではない、または送信にロック・トークンが必要なロック・タイプでありながらクライアントがそれを送信しなかったかのどちらかです。そして

507 (Insufficient Storage) - サーバーに属性を記録するじゅうぶんなスペースがありません。

403 (Forbidden) - これは少なくとも 2 つの状態のうちひとつを示します: 1) サーバーがその名前空間で与えられた場所へのカレンダー・コレクションの作成を許可しません。 2) Request-URI の親コレクションは存在しますが、メンバーを受け付けることができません。

409 (Conflict) - ひとつ、もしくは複数の中間コレクションが作成されるまで、 Request-URI にコレクションは作れません。

415 (Unsupported Media Type) - サーバーはボディーのリクエストタイプをサポートしていません。そして

507 (Insufficient Storage) - このメソッドを実行した後のリソース状態を記録するのにじゅうぶんなスペースがリソースにありません。

5.3.1.2 Example: Successful MKCALENDAR Request

これは、 cal.example.com サーバーに /home/lisa/calendars/events/ というカレンダーコレクションを、 DAV:displayname, CALDAV:calendar-description, CALDAV:supported-calendar-component-set そして CALDAV:calendar-timezone の属性値を指定して作成する例です。

>> Request <<

MKCALENDAR /home/lisa/calendars/events/ HTTP/1.1
Host: cal.example.com
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:mkcalendar xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:set>
<D:prop>
<D:displayname>Lisa's Events</D:displayname>
<C:calendar-description xml:lang="en"
>Calendar restricted to events.</C:calendar-description>
<C:supported-calendar-component-set>
<C:comp name="VEVENT"/>
</C:supported-calendar-component-set>
<C:calendar-timezone><![CDATA[BEGIN:VCALENDAR
PRODID:-//Example Corp.//CalDAV Client//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:US-Eastern
LAST-MODIFIED:19870101T000000Z
BEGIN:STANDARD
DTSTART:19671029T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:Eastern Standard Time (US & Canada)
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19870405T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:Eastern Daylight Time (US & Canada)
END:DAYLIGHT
END:VTIMEZONE
END:VCALENDAR
]]></C:calendar-timezone>
</D:prop>
</D:set>
</C:mkcalendar>

>> Response <<

HTTP/1.1 201 Created
Cache-Control: no-cache
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Length: 0

5.3.2 Creating Calendar Object Resources

クライアントはカレンダー・コレクション・リソースと共にカレンダー・コレクションを投入します。それぞれのカレンダー・オブジェクト・リソースのための URL は完全に任意であり、カレンダー・オブジェクト・リソースの iCalendar 属性か他のメタデータとの特定の関係を担う必要はありません。新しいカレンダー・オブジェクト・リソースはマップされていない URI をターゲットにした PUT リクエストで作成されなければなりません (MUST) 。マップ済みの URI をターゲットにした PUT リクエストは、既存のカレンダー・オブジェクト・リソースを更新します。

サーバーが新しいリソースを作成する際は、サーバーにとってマップされていない URI を選ぶのは容易です。クライアントはコレクション内の全てのリソースを調査したいことはなく、そして新しいリソースが名前の衝突なしに作成されることを確かにするためにコレクション全体をロックすることも望まないので、クライアントにとっては少し難題です。しかしながら、これを緩和する HTTP の機能があります。もしクライアントが新規 VEVENT のような新しい非コレクション・リソースの作成するつもりなら、そのクライアントは PUT リクエストで "If-None-Match: *" HTTP リクエストヘッダを使うべきです (SHOULD) 。 PUT リクエストの Request-URI はリソースが作成される場所にパス・セグメントの最後にあるリソース名を加えたターゲット・コレクションを含まなければなりません (MUST) 。 "If-None-Match: *" リクエストヘッダは、パス・セグメントの最後が既に使用中だったことが判明しても、クライアントが意図せず既存のリソースを上書きしないことを確実にします。

>> Request <<

PUT /home/lisa/calendars/events/qwue23489.ics HTTP/1.1
If-None-Match: *
Host: cal.example.com
Content-Type: text/calendar
Content-Length: xxxx

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VEVENT
UID:20010712T182145Z-123401@example.com
DTSTAMP:20060712T182145Z
DTSTART:20060714T170000Z
DTEND:20060715T040000Z
SUMMARY:Bastille Day Party
END:VEVENT
END:VCALENDAR

>> Response <<

HTTP/1.1 201 Created
Content-Length: 0
Date: Sat, 11 Nov 2006 09:32:12 GMT
ETag: "123456789-000-111"

既存のイベントを変更するリクエストも同じですが、 "If-None-Match" ヘッダの代わりに "If-Match" ヘッダに特定の Etag があります。

[RFC2445]Section 3.10に示されているように、(任意セットの)カレンダーとスケジュール情報を格納したカレンダー・オブジェクト・リソースの URL は ".ics" 拡張子を持つでしょう。そして空き時間情報を格納したカレンダー・オブジェクト・リソースの URL は拡張子 ".ifb" を持つでしょう。

5.3.2.1 Additional Preconditions for PUT, COPY, and MOVE

この仕様は PUT, COPY そして MOVE メソッドのための追加の Precondition を作成します。それらの precondition はカレンダー・オブジェクト・リソースをカレンダー・コレクションに PUT 操作したとき、カレンダー・オブジェクト・リソースをカレンダーコレクションの中に COPY か MOVE 操作したとき、またはカレンダー・コレクションを COPY か MOVE 操作したときに適用されます。

新しい preconditions は:

(CALDAV:supported-calendar-data): PUT リクエストで送信されたリソースまたは COPY か MOVE リクエストのターゲットは、カレンダー・オブジェクト・リソースのためのメディアタイプ(すなわち iCalendar)をサポートしなければなりません (MUST) 。

(CALDAV:valid-calendar-data): PUT リクエストで送信されたリソースまたは COPY か MOVE リクエストのターゲットは、有効な指定されたメディアタイプのデータでなければなりません (MUST) 。

(CALDAV:valid-calendar-object-resource): PUT リクエストで送信されたリソースまたは COPY か MOVE リクエストのターゲットは、 Section 4.1で指定されているすべての制約(すなわち カレンダー・オブジェクト・リソースは複数のカレンダー・コンポーネント型を含んではならない (MUST) 、カレンダー・オブジェクト・リソースは iCalendar METHOD 属性を指定しては行けない (MUST NOT) など)に従わなければなりません (MUST) 。

(CALDAV:supported-calendar-component): PUT リクエストで送信されたリソースまたは COPY か MOVE リクエストのターゲットは、ターゲットのカレンダー・コレクションがサポートするカレンダー・コンポーネント型を含まなければなりません (MUST) 。

(CALDAV:no-uid-conflict): PUT リクエストで送信されたリソースまたは COPY か MOVE リクエストのターゲットは、 ターゲットのカレンダー・コレクション内で使われている iCalendar UID 属性の値を指定したり、異なった UID 属性値をもつカレンダー・オブジェクト・リソースを上書きしてはいけません (MUST NOT) 。サーバーは DAV:href 要素で既に同じ UID 属性を使っているリソースの URL をレポートすべきです (SHOULD) 。

             <!ELEMENT no-uid-conflict (DAV:href)>

(CALDAV:calendar-collection-location-ok): COPY または MOVE リクエストで、 Request-URI がカレンダー・コレクションである場合、 Destination-URI はカレンダー・コレクションが作成できる場所を示していなければなりません (MUST) 。

(CALDAV:max-resource-size): PUT リクエストで送信されたリソースまたは COPY か MOVE リクエストのターゲットは、オクテットでのサイズがリソースが保存されるカレンダー・コレクションの CALDAV:max-resource-size 属性値 (Section 5.2.5) 以下でなければなりません (MUST) 。

(CALDAV:min-date-time): PUT リクエストで送信されたリソースまたは COPY か MOVE リクエストのターゲットの、すべての(反復インスタンスそれぞれの) iCalendar DATE または DATE-TIME 属性値は、リソースが保存されるカレンダー・コレクションの CALDAV:min-date-time 属性値 (Section 5.2.6)以上でなければなりません (MUST) 。

(CALDAV:max-date-time): PUT リクエストで送信されたリソースまたは COPY か MOVE リクエストのターゲットの、すべての(反復インスタンスそれぞれの) iCalendar DATE または DATE-TIME 属性値は、リソースが保存されるカレンダー・コレクションの CALDAV:max-date-time 属性値 (Section 5.2.6)以下でなければなりません (MUST) 。

(CALDAV:max-instances): PUT リクエストで送信されたリソースまたは COPY か MOVE リクエストのターゲットが生成する反復インスタンスの数は、リソースが保存されるカレンダー・コレクションの CALDAV:max-instances 属性値 (Section 5.2.8) 以下でなければなりません (MUST) 。

(CALDAV:max-attendees-per-instance): PUT リクエストで送信されたリソースまたは COPY か MOVE リクエストのターゲットは、あらゆるインスタンスの ATTENDEE 属性の数が、リソースが保存されるカレンダー・コレクションの CALDAV:max-attendees-per-instance 属性値 (Section 5.2.9) 以下でなければなりません (MUST) 。

5.3.3 Non-Standard Components, Properties, and Parameters

iCalendar は「非標準のことを実現するための標準メカニズム」提供しています。この拡張サポートは、その名前に "X-" プレフィクスを持つ非標準のコンポーネント、属性、そしてパラメータを、実装者が使うことを可能にします。

サーバーは PUT メソッドを介してカレンダー・オブジェクト・リソース内に保存される非標準のコンポーネント、属性、そしてパラメータをサポートしなければなりません (MUST) 。

サーバーは自身の「プライベートな」コンポーネント、属性、またはパラメータにルールを強制する必要があるかもしれないので、サーバーはクライアントがそれらを変更、またはサーバーが持っている制約の外にあるそれらの値を使う、あらゆる試みを拒否するかもしれません (MAY) 。サーバーは任意の「プライベートな」コンポーネント、属性、またはパラメータが、[RFC2445]Section 4.2 で述べられているような "X-" 名にベンダー ID を含む規約(すなわち "X-ABC-PRIVATE")に従っていることを確実にすべきです (SHOULD) 。

5.3.4 Calendar Object Resource Entity Tag

すべてのカレンダー・オブジェクト・リソースには DAV:getetag 属性が定義され、 strong entity tag が設定されなければなりません (MUST) 。

カレンダー・オブジェクト・リソースをターゲットにした GET リクエストのレスポンスは、そのカレンダー・オブジェクト・リソースの strong entity tag の現在値を示す ETag レスポンスヘッダフィールドを含まなければなりません (MUST) 。

サーバーは保存されたカレンダー・オブジェクト・リソースが PUT リクエストのボディーで送信されたカレンダー・オブジェクト・リソースとオクテット比較で同等だった場合、 PUT レスポンスで strong entity tag (ETag ヘッダ)を返さなければなりません。これで、クライアントはデータ同期のために返された strong entity tag を確実に使用できます。例えば、クライアントが保存されたカレンダー・オブジェクト・リソースに PROPFIND リクエストを実行して DAV:getetag 属性が返され、それを PUT レスポンスで受け取った strong entity tag と比較して等しいとわかったなら、サーバーが持っているカレンダー・オブジェクト・リソースは変更されていません。

PUT リクエストの結果としてサーバによって保存されたデータが送信されたカレンダー・オブジェクト・リソースとオクテット比較で同等でない場合の ETag レスポンスヘッダの振る舞いは、 strong entity tag がレスポンスで返されてはいけない (MUST NOT) ということを例外として、ここでは指定されません。結果として、 PUT リクエストで送られたカレンダー・オブジェクト・リソースを使う代わりに、クライアントは変更されたカレンダー・オブジェクト・リソース(および ETag)を今後の変更の基礎として取得する必要があるかもしれません。


6. Calendaring Access Control

6.1 Calendaring Privilege

CalDAV サーバーは WebDAV ACL [RFC3744] の要件を忠実にサポートしなければなりません (MUST) 。 WebDAV ACL は WebDAV コレクションと通常のリソースに適用できる拡張可能な権限セットのためのフレームワークを提供します。 CalDAV サーバーはまた、このセクションで定義されるカレンダー権限もサポートしなければなりません (MUST) 。

6.1.1 CALDAV:read-free-busy Privilege

カレンダーユーザーはしばしば、他の詳細なカレンダー・コンポーネント(例えば場所、要約、参加者)を見せることなしに、彼らの空き時間情報を他のユーザーに見せたいと思います。これは多くのプライバシーを確保しつつ、ユーザーが空いている時間に他のユーザーがミーティングを設定できるようにします。

CALDAV:read-free-busy 権限は、 CALDAV:free-busy-query REPORT リクエスト(Section 7.10 参照)が処理された際に、どのカレンダーコレクション、通常コレクション、そしてカレンダー・オブジェクト・リソースが調査されるかを制御します。この権限はカレンダー・コレクション、通常コレクション、またはカレンダー・オブジェクト・リソースに付与できます。サーバーはすべてのカレンダー・コレクション、通常コレクション、そしてカレンダー・オブジェクト・リソースでこの権限をサポートしなければなりません (MUST) 。

        <!ELEMENT read-free-busy EMPTY>

CALDAV:read-free-busy 権限は DAV:read 権限に集めなければなりません (MUST) 。サーバーは DAV:read 権限を付与することなしに CALDAV:read-free-busy を付与できなければなりません (MUST) 。

クライアントは、リソースに CALDAV:read-free-busy 権限のみが付与されているときに、 GET, HEAD, OPTIONS, そして PROPFIND アクセスはそこに含まれない(これらの操作は DAV:read 権限で管理される)ことに注意すべきです (SHOULD) 。

6.2 Additional Principal Property

[RFC3744] で定義されているように、このセクションは WebDAV principal リソースのための追加の属性を定義します。

6.2.1 CALDAV:calendar-home-set Property

名前:
calendar-home-set

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
関連する principal リソースに関連付けられたカレンダーコレクションを含む任意の WebDAV コレクションの URL を 識別する。

適合:
この属性は principal リソースに定義されるべきです (SHOULD) 。もし定義されれば、それは protected であるかもしれず (MAY) 、そして([RFC2518]Section 12.14.1 で定義されているように) PROPFIND DAV:allprop リクエストでは返されないべきです (SHOULD NOT) 。

説明:
CALDAV:calendar-home-set 属性は、ユーザーが principal 所有のカレンダー・コレクションを容易に見つけられるように意図されています。通常、ユーザーは所有するすべてのカレンダー・コレクションを共通のコレクションの下に分類します。この属性は、カレンダー・コレクションか、 principal が所有するカレンダー・コレクションの子もしくは子孫の通常コレクションの、どちらかのコレクションの URL を指定します。

定義:

      <!ELEMENT calendar-home-set (DAV:href*)>

例:

    <C:calendar-home-set xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:href>http://cal.example.com/home/bernard/calendars/</D:href>
</C:calendar-home-set>


7. Calendaring Reports

このセクションは CalDAV サーバーがカレンダー・コレクションとカレンダー・オブジェクト・リソースでサポートしなければならない (MUST) レポートを定義します。

CalDAV サーバーはすべてのカレンダー・コレクションとカレンダー・オブジェクト・リソースでこれらのレポートをサポートすることを、 [RFC3253]Section 3.1.5 で定義されている DAV:supported-report-set 属性で宣言しなければなりません (MUST) 。 CalDAV サーバーは通常のコレクションでこれらのレポートをサポートすることを宣言することも可能です (MAY) 。

これらのサポートのいくつかはカレンダー・データ(複数のリソースからの場合もあります)を返すこともできます。

7.1 REPORT Method

REPORT メソッド([RFC3253]Section 3.6 で定義されている)はひとつ、あるいは複数のリソースについての情報を取得する拡張可能なメカニズムを提供します。ひとつ、あるいは複数の名前付き属性の値を返す PROPFIND メソッドとは違い、 REPORT メソッドはより複雑な処理が行えます。 REPORT は、サーバーが(問い合わせのような)複雑なリクエストの実行に必要な全ての情報へのアクセスを持ち、そしてクライアントが同じリクエストを実行するのに必要な情報を取得するのに複数のリクエストが必要な場合に有益です。

CalDAV サーバーは [RFC3253]Section 3.8 で定義されている DAV:expand-property REPORT をサポートしなければなりません (MUST) 。

7.2 Ordinary Collections

サーバーは、この文書で定義するレポートをカレンダー・コレクションやカレンダー・オブジェクト・リソースに加えて通常のコレクション(カレンダー・コレクション以外のコレクション)でサポートすることも可能です (MAY) 。通常のコレクションに関するレポートへのレスポンス計算では、サーバーは Depth リクエストヘッダの値に基づいて REPORT リクエストのターゲットであるカレンダー・コレクションに含まれるカレンダー・オブジェクト・リソースだけを考慮しなければなりません (MUST) 。

7.3 Date and Floating Time

iCalendar は、これ以降それぞれ "floating date" と "floating time" と呼ばれる、特定のタイムゾーンに縛られない DATE と DATE-TIME 値を指定する方法を提供します。これらの値は、どのタイムゾーンで見るかに関係なく同じ日、時、分、そして秒の値を表現するのに使われます。例えば、 DATE 値 "20051111" はタイムゾーン指定なしの 2005 年 11 月 11 日を表現し、 DATE-TIME 値 "20051111T111100" はタイムゾーン指定なしの 2005 年 11 月 11 日 午前 11 時 11 分を表現します。

CalDAV サーバーはカレンダーの REPORT リクエスト処理で "floating date" や "floating time" 値を UTC 日時に変換する必要があるかもしれません。

CALDAV:calendar-query REPORT において、 CalDAV サーバーは "floating date" や "floating time" 値を UTC 日時値に正しく変換するために、もしリクエストボディーの一部として指定されたならば、 CALDAV:timezone XML 要素の値を信頼しなければなりません (MUST) 。もしリクエストボディーで CALDAV:timezone XML 要素が指定されていなければ、 CalDAV サーバーは、もし定義されていれば CALDAV:calendar-timezone 属性の値を信頼しなければなりません (MUST) 。いずれも指定されていなければ、 CalDAV サーバーは自身の選んだタイムゾーンを使うことが可能です (MAY) 。

CALDAV:free-busy-query REPORT において、 CalDAV サーバーは、 "floating date" か "floating time" でスケジュールされたカレンダー・コンポーネントの正確な UTC 時刻の空き時間帯を計算するために、もし定義されていれば CALDAV:calendar-timezone 属性の値を信頼しなければなりません (MUST) 。もし CALDAV:calendar-timezone 属性が定義されていなければ、 CalDAV サーバーは自身の選んだタイムゾーンを使うことが可能です (MAY) 。

7.4 Time Range Filtering

このセクションで定義されるいくつかのレポートは、カレンダー・オブジェクト・リソースを指定された時刻範囲と重なるものだけに制限する時刻範囲フィルターを含むことができます。時刻範囲フィルターはカレンダー・コンポーネント全体、もしくは特定の DATE または DATE-TIME 値型カレンダー・コンポーネント属性に適用できます。

カレンダー・オブジェクト・リソースが時刻範囲フィルター要素にマッチするかどうかを判定するために、ターゲットのコンポーネントまたは属性の開始・終了時刻が決定され、リクエストされた時刻範囲と比較されます。もしそれらがリクエストされた時刻範囲と重なれば、そのカレンダー・オブジェクト・リソースはフィルター要素にマッチします。カレンダー・コンポーネントの実際の開始・終了時刻の決定には [RFC2445] で定義された規則を使わなければなりません (MUST) 。それらはこの文書の Section 9.9 に一覧されています。

そのような時刻範囲フィルターが使われるとき、 VEVENT や VTODO のような反復カレンダー・コンポーネントには特別な配慮をしなければなりません。サーバーはすべての反復インスタンスが指定された時刻範囲と重なるかどうかを判定するために、反復コンポーネントを展開しなければなりません (MUST) 。もしひとつ以上の反復インスタンスが時刻範囲と重なったなら、カレンダー・オブジェクト・リソースはフィルター要素にマッチします。

7.5 Searching Text: Collations

このセクションで定義されるいくつかのレポートはクライアントが提供した文字列と保存されたカレンダー・データを比較するテキスト・マッチを行います。 iCalendar データはデフォルトで UTF-8 文字セットによりエンコーディングされ、いくつかの属性やパラメータ値が US-ASCII 文字セットの範囲を超える文字を含むことが可能なので、テキスト・マッチは明確な規則に確実に従う必要があります。

これに対処するために、この仕様は明確な規則でテキスト比較操作をするのに使える照合を指定するために [RFC4790] で定義された IANA Collation Registry を利用します。

CalDAV で使われる比較はすべて [RFC4790], Section 4.2 による部分文字列マッチです。サーバーによる照合は部分文字列マッチ操作をサポートしなければなりません (MUST) 。

CalDAV サーバーは [RFC4790] で解説されている "i;ascii-casemap" と "i;octet" 照合のサポートが必須で (REQUIRED) 、そして他の照合もサポート可能です (MAY) 。

サーバーは、照合を使うレポートをサポートするすべてのリソースで定義される CALDAV:supported-collation-set 属性を介して、サポートする照合のセットを宣言しなければなりません (MUST) 。

クライアントはサーバーが宣言したリストにある照合だけを使わなければなりません (MUST) 。

クライアントが明示的に照合を指定しない場合、またはクライアントが([RFC4790]Section 3.1 で定義されているように) "default" 照合識別子を指定した場合、サーバーは "i;ascii-casemap" を照合として使うことをデフォルトにしなければなりません (MUST) 。

[RFC4790]Section 3.2 で定義されているような)ワイルドカードを照合識別子の中で使用してはいけません (MUST NOT) 。

もしサーバーがサポートしていない照合をクライアントが選択したなら、サーバーは CALDAV:supported-collation precondition エラーレスポンスで応答しなければなりません (MUST) 。

7.5.1 CALDAV:supported-collation-set Property

名前:
supported-collation-set

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
テキスト・マッチ操作のためにサーバーがサポートしている照合のセットを識別します。

適合:
この属性はテキスト・マッチを行うレポートをサポートするあらゆるリソースで定義されなければなりません (MUST) 。もし定義されたら、それは protected でならず、[RFC2518]Section 12.14.1 で定義されているように) PROPFIND DAV:allprop リクエストで返されないべきです (SHOULD NOT) 。

説明:
CALDAV:supported-collation-set 属性はサーバーでサポートされる照合の識別子コレクションを指定する CALDAV:supported-collation 要素をゼロ以上含みます。

定義:

      <!ELEMENT supported-collation-set (supported-collation*)>

<!ELEMENT supported-collation (#PCDATA)>

例:

    <C:supported-collation-set
xmlns:C="urn:ietf:params:xml:ns:caldav">
<C:supported-collation>i;ascii-casemap</C:supported-collation>
<C:supported-collation>i;octet</C:supported-collation>
</C:supported-collation-set>

7.6 Partial Retrieval

この文書で定義されているいくつかのカレンダー・レポートはカレンダー・オブジェクト・リソースの部分的な取得をかのうにします。 CalDAV クライアントはカレンダー REPORT リクエストのボディーで返す情報を指定できます。

CalDAV クライアントは個々の WebDAV 属性値、すべての WebDAV 属性値、またはリソースの WebDAV 属性名リストをリクエストできます。また、 CalDAV クライアントはすべてのカレンダー・コンポーネントと属性を返すか、あるいは個別に返すかを指定して、カレンダー・データをリクエストできます。 Section 9.6 の CALDAV:calendar-data を参照してください。

デフォルトでは、取得したカレンダー・データは、 "master component" と呼ばれる反復集合を定義するコンポーネントと、 "overridden components" と呼ばれる反復集合の例外を定義するコンポーネントを含んでいます。

指定した時間範囲の反復インスタンスのみに関心がある CalDAV クライアントは、 "master component" と指定した時間範囲に影響する "overridden component" のみを受け取るように、つまりサーバーが返すデータを制限して(Section 9.6.6 の CALDAV:limit-recurrence-set 参照)リクエストが可能です。現在の開始・終了時刻が時間範囲と重なるか、またはオリジナルの開始・終了時刻 -- インスタンスが上書きされていなければ使われたであろうもの -- が時間範囲と重なるか、または時間範囲に重なる他のインスタンスに影響するときに、 overridden component は時間範囲に影響を与えます。

反復属性(すなわち EXDATE, EXRULE, RDATE そして RRULE)と場合により VTIMEZONE コンポーネントをサポートしない CalDAVクライアント、または処理性能が制限されているために反復の展開を行いたくないクライアントは、指定した時間範囲に重なる反復インスタンスを、それぞれが正確にひとつの反復インスタンスを定義する分離したカレンダー・コンポーネントとして受け取るようにリクエストできます(Section 9.6.5 の CALDAV:expand 参照)。

最後に、VFREEBUSY コンポーネントの場合、 CalDAV クライアントは指定した時間範囲に重なる FREEBUSY 属性値のみを受け取るようにリクエストできます(Section 9.6.7 の CALDAV:limit-freebusy-set 参照)

7.7 Non-Standard Components, Properties, and Parameters

サーバーは、クライアントが非標準のコンポーネント、属性、そしてパラメータをレスポンスのカレンダー・データで返すことをリクエストできるように、カレンダー REPORT リクエストにおいて CALDAV:calendar-data XML 要素で非標準コンポーネント、属性、またはパラメータ名をサポートしなければなりません (MUST) 。

サーバーは、カレンダー REPORT リクエストの CALDAV:filter XML 要素の中の CALDAV:comp-filter, CALDAV:prop-filter, そして CALDAV:param-filter XML 要素で非標準のコンポーネント、属性、またはパラメータ名の使用をサポートすることも可能です (MAY) 。

カレンダー REPORT リクエストが、サーバーが問い合わせをサポートしていない非標準コンポーネント、属性、またはパラメータ名を参照する CALDAV:comp-filter, CALDAV-prop-filter, または CALDAV:param-filter XML 要素を使っているなら、サーバーは CALDAV:supported-filter precondition で失敗しなければなりません (MUST) 。

7.8 CALDAV:calendar-query REPORT

CALDAV:calendar-query REPORT は指定したフィルターにマッチするすべてのカレンダー・オブジェクト・リソースの検索を実行します。このレポートのレスポンスはリクエストで指定したすべての WebDAV 属性とカレンダー・オブジェクト・リソースを含みます。 CALDAV:calendar-data XML 要素の場合、それはフィルターにマッチするカレンダー・オブジェクト・リソースで返されるべきカレンダー・コンポーネントと属性を明示的に指定します。

このレポートの形式は PROPFILE メソッドでモデル化されます。 CALDAV:calendar-query REPORT のリクエストボディーとレスポンスボディーは PROPFIND でも使われる XML 要素を使います。とくに、リクエストは返される WebDAV 属性をリクエストするための XML 要素を含むことができます。そのとき、レスポンスは特定の属性の結果を返すために使われる DAV:multistatus レスポンス要素を尊重して PROPFIND と同じ動作に従うべきです。例えば、存在しない属性値を取得するためのリクエストはエラーとなり、そして 404 (Not Found) ステータス値を含むレスポンス XML 要素で言及しなければなりません (MUST) 。

CALDAV:calendar-query REPORT のサポートは必須です (REQUIRED) 。

Marshalling:

Section 9.5 で定義されているように、リクエストボディーは CALDAV:calendar-query XML 要素でなければならない (MUST) 。

リクエストは Depth ヘッダを含むことができます (MAY) 。もし Depth ヘッダが含まれていない場合は、 Depth:0 と仮定されます。

成功したリクエストに対するレスポンスボディーは DAV:multistatus XML 要素でなければなりません(つまり PROFIND のレスポンスとと同じ形式を使います) (MUST) 。レスポンス要素がない場合は、返される DAV:multistatus XML 要素は空になります。

成功した CALDAV:calendar-query REPORT のレスポンスボディーはそれぞれの検索フィルターにマッチした iCalendar オブジェクトの DAV:response 要素を含まなければなりません (MUST) 。カレンダー・データは DAV:propstat 要素内の CALDAV:calendar-data XML 要素で返されます。

Preconditions:

(CALDAV:supported-calendar-data): CALDAV:calendar-data XML 要素の "content-type" と "version" アトリビュート(Section 9.6 参照)はサーバーがサポートするカレンダー・オブジェクト・リソースのメディアタイプを指定します。

(CALDAV:valid-filter): REPORT リクエストで指定された CALDAV:filter(Section 9.7 参照)は有効でなければなりません (MUST) 。例えば、 CALDAV:filter は <C:comp name="VTODO"> 要素内の <C:comp name="VEVENT"> をネストできません。そして CALDAV:filter は <C:prop name="SUMMARY"> 要素内の <C:time-range start="..." end="..."> をネストできません。

(CALDAV:supported-filter): REPORT リクエストの CALDAV:filter(Section 9.7 参照)で使われる CALDAV:comp-filter(Section 9.7.1 参照)、 CALDAV:prop-filter(Section 9.7.2 参照)、そして CALDAV:param-filter(Section 9.7.3 参照) XML 要素はサーバーによって問い合わせがサポートされたコンポーネント、属性、パラメータのみを参照します。つまり、もし CALDAV:filter 要素がサポートされていないコンポーネント、属性、パラメータへの参照を試みたら、この precondition は侵害されます。サーバーはサポートが提供されていない CALDAV:comp-filter, CALDAV:prop-filter, CALDAV:param-filter をレポートするべきです (SHOULD) 。

         <!ELEMENT supported-filter (comp-filter*,
prop-filter*,
param-filter*)>

(CALDAV:valid-calendar-data): REPORT リクエストで指定されるタイムゾーンは、単一の有効な VTIMEZONE コンポーネントを含む有効な iCalendar オブジェクトでなければなりません (MUST) 。

(CALDAV:min-date-time): 時間範囲を指定するあらゆる XML 要素が持つ開始または終了の DATE / DATE-TIME 値は、 REPORT リクエストのターゲットになっているカレンダー・コレクションの CALDAV:min-date-time 属性値 (Section 5.2.6) 以上でなければなりません (MUST) 。

(CALDAV:max-date-time): 時間範囲を指定するあらゆる XML 要素が持つ開始または終了の DATE / DATE-TIME 値は、 REPORT リクエストのターゲットになっているカレンダー・コレクションの CALDAV:max-date-time 属性値 (Section 5.2.7) 以下でなければなりません (MUST) 。

(CALDAV:supported-collation): Section 7.5 で解説されているように、照合を指定するあらゆる XML アトリビュートは、サーバーがサポートしている照合を指定しなければなりません。

Postconditions:

(DAV:number-of-matches-within-limits): マッチしたカレンダー・オブジェクト・リソースの数は、サーバー固有の限界値を下回らなければなりません。例えば、もし検索指定が極端に多くのレスポンスを誘発するなら、この条件がトリガーされるかもしれません。

7.8.1 Example: Partial Retrieval of Events by Time Range

この例では、クライアントはサーバーに、特定のコンポーネントと January 4, 2006, at 00:00:00 A.M. UTC から January 5, 2006, at 00:00:00 A.M. UTC までの時間範囲に重なる VEVENT コンポーネントの属性を返すようにリクエストします。加えて、 DAV:getetag 属性もまたリクエストされ、レスポンスの一部として返されます。返される最初のカレンダー・オブジェクトは反復イベントで、その最初のインスタンスはリクエストされた時間範囲の外側にあるものの、3番目のインスタンスが時間範囲と重なることに注意してください。 CALDAV:calendar-data 要素の制約により、 VEVENT コンポーネントの DTSTAMP 属性は返されず、そして VCALENDAR オブジェクトオブジェクトで返される唯一の属性は VERSION であることに注意してください。

この例でターゲットになっているカレンダー・データは Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop>
<D:getetag/>
<C:calendar-data>
<C:comp name="VCALENDAR">
<C:prop name="VERSION"/>
<C:comp name="VEVENT">
<C:prop name="SUMMARY"/>
<C:prop name="UID"/>
<C:prop name="DTSTART"/>
<C:prop name="DTEND"/>
<C:prop name="DURATION"/>
<C:prop name="RRULE"/>
<C:prop name="RDATE"/>
<C:prop name="EXRULE"/>
<C:prop name="EXDATE"/>
<C:prop name="RECURRENCE-ID"/>
</C:comp>
<C:comp name="VTIMEZONE"/>
</C:comp>
</C:calendar-data>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VEVENT">
<C:time-range start="20060104T000000Z"
end="20060105T000000Z"/>
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>

>> Response <<

HTTP/1.1 207 Multi-Status
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd2"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTART;TZID=US/Eastern:20060102T120000
DURATION:PT1H
RRULE:FREQ=DAILY;COUNT=5
SUMMARY:Event #2
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=US/Eastern:20060104T140000
DURATION:PT1H
RECURRENCE-ID;TZID=US/Eastern:20060104T120000
SUMMARY:Event #2 bis
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=US/Eastern:20060106T140000
DURATION:PT1H
RECURRENCE-ID;TZID=US/Eastern:20060106T120000
SUMMARY:Event #2 bis bis
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd3"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTART;TZID=US/Eastern:20060104T100000
DURATION:PT1H
SUMMARY:Event #3
UID:DC6C50A017428C5216A2F1CD@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>

7.8.2 Example: Partial Retrieval of Recurring Events

この例では、クライアントはサーバーに、 January 3, 2006, at 00:00:00 A.M. UTC から January 5, 2006, at 00:00:00 A.M. UTC の時間範囲に重なる VEVENT コンポーネントを返すようにリクエストします。 CALDAV:limit-recurrence-set 要素の使用により、その要素で指定された時間範囲と重なる、または時間範囲に重なる他のインスタンスに影響する上書きされた反復コンポーネント(すなわち THISANDFUTURE の振る舞いの場合)のみをサーバーが返します。この例では、マッチしたリソースの最初の上書きされたコンポーネントは返されますが、2番目は返されません。

この例でターゲットになっているカレンダー・データには Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop>
<C:calendar-data>
<C:limit-recurrence-set start="20060103T000000Z"
end="20060105T000000Z"/>
</C:calendar-data>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VEVENT">
<C:time-range start="20060103T000000Z"
end="20060105T000000Z"/>
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>

>> Response <<

HTTP/1.1 207 Multi-Status
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd2"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20060206T001121Z
DTSTART;TZID=US/Eastern:20060102T120000
DURATION:PT1H
RRULE:FREQ=DAILY;COUNT=5
SUMMARY:Event #2
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
BEGIN:VEVENT
DTSTAMP:20060206T001121Z
DTSTART;TZID=US/Eastern:20060104T140000
DURATION:PT1H
RECURRENCE-ID;TZID=US/Eastern:20060104T120000
SUMMARY:Event #2 bis
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd3"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
DTSTAMP:20060206T001220Z
DTSTART;TZID=US/Eastern:20060104T100000
DURATION:PT1H
LAST-MODIFIED:20060206T001330Z
ORGANIZER:mailto:cyrus@example.com
SEQUENCE:1
STATUS:TENTATIVE
SUMMARY:Event #3
UID:DC6C50A017428C5216A2F1CD@example.com
X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>

7.8.3 Example: Expanded Retrieval of Recurring Events

この例では、クライアントはサーバーに、 January 2, 2006, at 00:00:00 A.M. UTC から January 5, 2006, at 00:00:00 A.M. UTC の時間範囲と重なる VEVENT コンポーネントと、反復カレンダー・コンポーネントを個々の反復するインスタンス・カレンダー・コンポーネントに展開したものを返すようにリクエストします。 CALDAV:expand 要素の使用により、サーバーはその要素で指定された時間範囲と重なる上書きされた反復インスタンスのみを返します。

この例でターゲットになっているカレンダー・データは Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop>
<C:calendar-data>
<C:expand start="20060103T000000Z"
end="20060105T000000Z"/>
</C:calendar-data>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VEVENT">
<C:time-range start="20060103T000000Z"
end="20060105T000000Z"/>
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>

>> Response <<

HTTP/1.1 207 Multi-Status
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd2"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VEVENT
DTSTAMP:20060206T001121Z
DTSTART:20060103T170000
DURATION:PT1H
RECURRENCE-ID:20060103T170000
SUMMARY:Event #2
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
BEGIN:VEVENT
DTSTAMP:20060206T001121Z
DTSTART:20060104T190000
DURATION:PT1H
RECURRENCE-ID:20060104T170000
SUMMARY:Event #2 bis
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd3"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VEVENT
ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
DTSTAMP:20060206T001220Z
DTSTART:20060104T150000
DURATION:PT1H
LAST-MODIFIED:20060206T001330Z
ORGANIZER:mailto:cyrus@example.com
SEQUENCE:1
STATUS:TENTATIVE
SUMMARY:Event #3
UID:DC6C50A017428C5216A2F1CD@example.com
X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>

7.8.4 Example: Partial Retrieval of Stored Free Busy Components

この例では、クライアントはサーバーに、 January 2, 2006, at 00:00:00 A.M. UTC (inclusively) から January 3, 2006, at 00:00:00 A.M. UTC より前の時間範囲に重なる空き時間情報を持つ VFREEBUSY コンポーネントを返すようにリクエストします。 CALDAV:limit-freebusy-set 要素の使用により、サーバーはその要素で指定された時間範囲と重なる FREEBUSY 属性値のみを返します。これはカレンダーの所有者がいつ忙しいのかを見いだす例ではないことに注意してください。

この例でターゲットになっているカレンダー・データは Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop>
<C:calendar-data>
<C:limit-freebusy-set start="20060102T000000Z"
end="20060103T000000Z"/>
</C:calendar-data>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VFREEBUSY">
<C:time-range start="20060102T000000Z"
end="20060103T000000Z"/>
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>

>> Response <<

HTTP/1.1 207 Multi-Status
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd8.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd8"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VFREEBUSY
ORGANIZER;CN="Bernard Desruisseaux":mailto:bernard@example.com
UID:76ef34-54a3d2@example.com
DTSTAMP:20050530T123421Z
DTSTART:20060101T100000Z
DTEND:20060108T100000Z
FREEBUSY;FBTYPE=BUSY-TENTATIVE:20060102T100000Z/20060102T120000Z
END:VFREEBUSY
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>

7.8.5 Example: Retrieval of To-Dos by Alarm Time Range

この例では、クライアントはサーバーに、指定された時間範囲にアラームが指定されている VTODO コンポーネントを返すようにリクエストします。

この例でターゲットになっているカレンダー・データは Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop xmlns:D="DAV:">
<D:getetag/>
<C:calendar-data/>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VTODO">
<C:comp-filter name="VALARM">
<C:time-range start="20060106T100000Z"
end="20060107T100000Z"/>
</C:comp-filter>
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>

>> Response <<

HTTP/1.1 207 Multi-Status
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd4.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd4"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTODO
DTSTAMP:20060205T235300Z
DUE;TZID=US/Eastern:20060106T120000
LAST-MODIFIED:20060205T235308Z
SEQUENCE:1
STATUS:NEEDS-ACTION
SUMMARY:Task #2
UID:E10BA47467C5C69BB74E8720@example.com
BEGIN:VALARM
ACTION:AUDIO
TRIGGER;RELATED=START:-PT10M
END:VALARM
END:VTODO
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>

7.8.6 Example: Retrieval of Event by UID

この例では、クライアントはサーバーに、 UID 属性が "DC6C50A017428C5216A2F1CD@example.com" となっている VEVENT コンポーネントを返すようにリクエストします。

この例でターゲットになっているカレンダー・データは Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop xmlns:D="DAV:">
<D:getetag/>
<C:calendar-data/>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VEVENT">
<C:prop-filter name="UID">
<C:text-match collation="i;octet"
>DC6C50A017428C5216A2F1CD@example.com</C:text-match>
</C:prop-filter>
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>

>> Response <<

HTTP/1.1 207 Multi-Status
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd3"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
DTSTAMP:20060206T001220Z
DTSTART;TZID=US/Eastern:20060104T100000
DURATION:PT1H
LAST-MODIFIED:20060206T001330Z
ORGANIZER:mailto:cyrus@example.com
SEQUENCE:1
STATUS:TENTATIVE
SUMMARY:Event #3
UID:DC6C50A017428C5216A2F1CD@example.com
X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>

7.8.7 Example: Retrieval of Events by PARTSTAT

この例では、クライアントはサーバーに、 ATTENDEE 属性に "mailto:lisa@example.com" を含み、その PARTSTAT パラメータが NEEDS-ACTION に設定されている VEVENT コンポーネントを返すようにリクエストします。

この例でターゲットになっているカレンダー・データは Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop xmlns:D="DAV:">
<D:getetag/>
<C:calendar-data/>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VEVENT">
<C:prop-filter name="ATTENDEE">
<C:text-match collation="i;ascii-casemap"
>mailto:lisa@example.com</C:text-match>
<C:param-filter name="PARTSTAT">
<C:text-match collation="i;ascii-casemap"
>NEEDS-ACTION</C:text-match>
</C:param-filter>
</C:prop-filter>
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>

>> Response <<

HTTP/1.1 207 Multi-Status
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd3"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
DTSTAMP:20060206T001220Z
DTSTART;TZID=US/Eastern:20060104T100000
DURATION:PT1H
LAST-MODIFIED:20060206T001330Z
ORGANIZER:mailto:cyrus@example.com
SEQUENCE:1
STATUS:TENTATIVE
SUMMARY:Event #3
UID:DC6C50A017428C5216A2F1CD@example.com
X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>

7.8.8 Example: Retrieval of Events Only

この例では、クライアントはサーバーにすべての VEVENT コンポーネントを返すようにリクエストします。

この例でターゲットになっているカレンダー・データは Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop xmlns:D="DAV:">
<D:getetag/>
<C:calendar-data/>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VEVENT"/>
</C:comp-filter>
</C:filter>
</C:calendar-query>

>> Response <<

HTTP/1.1 207 Multi-Status
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd1.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd1"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20060206T001102Z
DTSTART;TZID=US/Eastern:20060102T100000
DURATION:PT1H
SUMMARY:Event #1
Description:Go Steelers!
UID:74855313FA803DA593CD579A@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd2"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20060206T001121Z
DTSTART;TZID=US/Eastern:20060102T120000
DURATION:PT1H
RRULE:FREQ=DAILY;COUNT=5
SUMMARY:Event #2
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
BEGIN:VEVENT
DTSTAMP:20060206T001121Z
DTSTART;TZID=US/Eastern:20060104T140000
DURATION:PT1H
RECURRENCE-ID;TZID=US/Eastern:20060104T120000
SUMMARY:Event #2 bis
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
BEGIN:VEVENT
DTSTAMP:20060206T001121Z
DTSTART;TZID=US/Eastern:20060106T140000
DURATION:PT1H
RECURRENCE-ID;TZID=US/Eastern:20060106T120000
SUMMARY:Event #2 bis bis
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd3"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
DTSTAMP:20060206T001220Z
DTSTART;TZID=US/Eastern:20060104T100000
DURATION:PT1H
LAST-MODIFIED:20060206T001330Z
ORGANIZER:mailto:cyrus@example.com
SEQUENCE:1
STATUS:TENTATIVE
SUMMARY:Event #3
UID:DC6C50A017428C5216A2F1CD@example.com
X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>

7.8.9 Example: Retrieval of All Pending To-Dos

この例では、クライアントはサーバーに、 COMPLETED 属性を含まず、かつ CANCELLED にマッチする STATUS 属性値を持たないすべての VTODO コンポーネント(つまり、いまだに取り組みが必要な VTODO)を返すようにリクエストします。

この例でターゲットになっているカレンダー・データは Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop xmlns:D="DAV:">
<D:getetag/>
<C:calendar-data/>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VTODO">
<C:prop-filter name="COMPLETED">
<C:is-not-defined/>
</C:prop-filter>
<C:prop-filter name="STATUS">
<C:text-match
negate-condition="yes">CANCELLED</C:text-match>
</C:prop-filter>
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>

>> Response <<

HTTP/1.1 207 Multi-Status
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd4.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd4"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTODO
DTSTAMP:20060205T235335Z
DUE;VALUE=DATE:20060104
STATUS:NEEDS-ACTION
SUMMARY:Task #1
UID:DDDEEB7915FA61233B861457@example.com
BEGIN:VALARM
ACTION:AUDIO
TRIGGER;RELATED=START:-PT10M
END:VALARM
END:VTODO
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>

<D:response>
<D:href>http://cal.example.com/bernard/work/abcd5.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd5"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTODO
DTSTAMP:20060205T235300Z
DUE;VALUE=DATE:20060106
LAST-MODIFIED:20060205T235308Z
SEQUENCE:1
STATUS:NEEDS-ACTION
SUMMARY:Task #2
UID:E10BA47467C5C69BB74E8720@example.com
BEGIN:VALARM
ACTION:AUDIO
TRIGGER;RELATED=START:-PT10M
END:VALARM
END:VTODO
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>

7.8.10 Example: Attempt to Query Unsupported Property

この例では、クライアントはサーバーに、値が "ABC" にマッチする X-ABC-GUID を含む、すべての VEVENT コンポーネントを返すようにリクエストします。しかしながら、サーバーは非標準属性への問い合わせをサポートしていないので、代わりにエラーレスポンスを返します。

この例でターゲットになっているカレンダー・データは Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop xmlns:D="DAV:">
<D:getetag/>
<C:calendar-data/>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VEVENT">
<C:prop-filter name="X-ABC-GUID">
<C:text-match>ABC</C:text-match>
</C:prop-filter>
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>

>> Response <<

HTTP/1.1 403 Forbidden
Date: Sat, 11 Nov 2005 09:32:12 GMT
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:error>
<C:supported-filter>
<C:prop-filter name="X-ABC-GUID"/>
</C:supported-filter>
</D:error>

7.9 CALDAV:calendar-multiget REPORT

CALDAV:calendar-multiget REPORT は、もし Request-URI がコレクションならコレクション中の特定のカレンダー・オブジェクト・リソースの取得に、もし Request-URI がカレンダー・オブジェクト・リソースなら特定のカレンダー・オブジェクト・リソースの取得に使われます。このレポートは、どのカレンダー・オブジェクト・リソースを返すかを決めるために CALDAV:filter 要素の代わりに DAV:href 要素のリストをとることを除いて、 CALDAV:calendar-query REPORT(Section 7.8 参照)に似ています。

CALDAV:calendar-multiget REPORT のサポートは必須です (REQUIRED) 。

Marshalling:

リクエストボディーは CALDAV:calendar-multiget XML 要素(Section 9.10 参照)でなければなりません (MUST) 。もし Request-URI がコレクション・リソースであれば、 DAV:href 要素はそのコレクション内のカレンダー・オブジェクト・リソースを参照しなければならず (MUST)、そしてそれらは、そのコレクション内の任意の階層にあるカレンダー・オブジェクト・リソースを参照できます (MAY) 。その結果、サーバーは "Depth" ヘッダはを無視しなければならず (MUST) 、そしてクライアントはそれを送らないべきです (SHOULD) 。もし Request-URI が非コレクション・リソースを参照するなら、 Request-URI と同等の単一の DAV:href 要素が指定されなければなりません (MUST) 。成功したレスポンスボディーは DAV:multistatus XML 要素でなければなりません (MUST) 。 CALDAV:calendar-multiget REPORT リクエストに対する成功したレスポンスボディーは、提供された DAV:href 要素が参照するそれぞれのカレンダー・オブジェクト・リソースに対する DAV:response 要素を含まなければなりません (MUST) 。カレンダー・データは DAV:prop 要素内の CALDAV:calendar-data 要素で返されます。提供された DAV:href リソースのアクセスがエラーになった場合、サーバーは関連する DAV:response 要素の DAV:status 要素で適切なエラー・ステータス・コードを返さなければなりません (MUST) 。

Preconditions:

(CALDAV:supported-calendar-data): CALDAV:calendar-data XML 要素(Section 9.6 参照)の "content-type" と "version" アトリビュートには、サーバーがカレンダー・オブジェクト・リソースに対してサポートするメディアタイプを指定します。

(CALDAV:min-date-time): 時間範囲を指定するあらゆる XML 要素が持つ開始または終了の DATE / DATE-TIME 値は、 REPORT リクエストのターゲットになっているカレンダー・コレクションの CALDAV:min-date-time 属性値 (Section 5.2.6) 以上でなければなりません (MUST) 。

(CALDAV:max-date-time): 時間範囲を指定するあらゆる XML 要素が持つ開始または終了の DATE / DATE-TIME 値は、 REPORT リクエストのターゲットになっているカレンダー・コレクションの CALDAV:max-date-time 属性値 (Section 5.2.7) 以下でなければなりません (MUST) 。

Postconditions:

None.

7.9.1 Example: Successful CALDAV:calendar-multiget REPORT

この例では、クライアントはサーバーに、特定の URI で参照される VEVENT コンポーネントの特定の属性を返すようにリクエストします。加えて DAV:getetag 属性もリクエストされ、レスポンスの一部として返されます。この例では、 http://cal.example.com/bernard/work/mtg1.ics のリソースは存在しないので、エラー・ステータス・レスポンスになっています。

この例でターゲットになっているカレンダー・データは Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-multiget xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop>
<D:getetag/>
<C:calendar-data/>
</D:prop>
<D:href>/bernard/work/abcd1.ics</D:href>
<D:href>/bernard/work/mtg1.ics</D:href>
</C:calendar-multiget>

>> Response <<

HTTP/1.1 207 Multi-Status
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:response>
<D:href>http://cal.example.com/bernard/work/abcd1.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd1"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20060206T001102Z
DTSTART;TZID=US/Eastern:20060102T100000
DURATION:PT1H
SUMMARY:Event #1
Description:Go Steelers!
UID:74855313FA803DA593CD579A@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>http://cal.example.com/bernard/work/mtg1.ics</D:href>
<D:status>HTTP/1.1 404 Not Found</D:status>
</D:response>
</D:multistatus>

7.10 CALDAV:free-busy-query REPORT

CALDAV:free-busy-query REPORT は、そのリクエストのターゲットになっていて、かつ現在のユーザーが CALDAV:read-free-busy もしくは DAV:read 権限を持っているすべてのカレンダー・オブジェクト・リソースの空き時間情報を格納した VFREEBUSY コンポーネントを生成します。

空き時間情報の生成時には、 TRANSP 属性を持たないか OPAQUE に設定されている VEVENT コンポーネントと、 VFREEBUSY コンポーネントのみが考慮されるべきです (SHOULD) 。

VEVENT コンポーネントの場合、返される VFREEBUSY コンポーネントの FREEBUSY 属性の空き時間タイプ (FBTYPE) は、以下の表にまとめたように TRANSP 属性と STATUS 属性の値から導きだされるべきです (SHOULD) 。

      +---------------------------++------------------+
| VEVENT || VFREEBUSY |
+-------------+-------------++------------------+
| TRANSP | STATUS || FBTYPE |
+=============+=============++==================+
| | CONFIRMED || BUSY |
| | (default) || |
| OPAQUE +-------------++------------------+
| (default) | CANCELLED || FREE |
| +-------------++------------------+
| | TENTATIVE || BUSY-TENTATIVE |
| +-------------++------------------+
| | x-name || BUSY or |
| | || x-name |
+-------------+-------------++------------------+
| | CONFIRMED || |
| TRANSPARENT | CANCELLED || FREE |
| | TENTATIVE || |
| | x-name || |
+-------------+-------------++------------------+

返される VFREEBUSY コンポーネントでは、同じ FBTYPE パラメータ値で重複した busy time 期間は指定されるべきではありません (SHOULD NOT) 。サーバーは連続していたり重なったりしている同じタイプの busy time 期間は統合するべきです (SHOULD) 。異なる FBTYPE パラメータ値を持つ busy time 期間は重なる可能性があります (MAY) 。

CALDAV:free-busy-query REPORT のサポートは必須です (REQUIRED) 。

Marshalling:

Section 9.9 で定義されているように、リクエストボディーは正確にひとつの CALDAV:time-range XML 要素を格納した (MUST) CALDAV:free-busy-query XML 要素(Section 9.11 参照)でなければなりません (MUST) 。リクエストは Depth ヘッダを含むことも可能です (MAY) 。もし Depth ヘッダがなければ、 Depth:0 が仮定されます。リクエストが成功した際のレスポンスボディーは、現在のユーザーが少なくとも CALDAV:read-free-busy 権限を与えられていて Depth 値を満たす VEVENT または VFREEBUSY コンポーネントを含むカレンダー・オブジェクト・リソースの busy time の間隔を表現する、正確にひとつの VFREEBUSY コンポーネントを含む iCalendar オブジェクトでなければなりません (MUST) 。もしこれらの条件を満たすカレンダー・オブジェクト・リソースが見つからないときは、 FREEBUSY 属性を持たない VFREEBUSY コンポーネントが返されなければなりません (MUST) 。このレポートは busy time 情報のみを返します。空き時間情報は返された busy time 情報から推察することができます。もし現在のユーザーが Request-URI に対して CALDAV:read-free-busy または DAV:read 権限を与えられていなければ、 CALDAV-free-busy-query REPORT リクエストは 404 (Not Found) ステータス値で失敗しなければなりません (MUST) 。この制約はユーザーが CALDAV:read-free-busy 権限しか与えられていないリソースの URL を発見してしまうのを防ぎます。 CALDAV:free-busy-query REPORT リクエストはコレクション(通常のコレクションかカレンダー・コレクションのどちらか)に対してのみ実行できます。このレポートを カレンダー・オブジェクト・リソースに対して実行する試みは 403 (Forbidden) ステータス値で失敗しなければなりません (MUST) 。

Preconditions:

None.

Postconditions:

(DAV:number-of-matches-within-limits): マッチしたカレンダー・オブジェクト・リソースの数は、サーバー固有の限界値を下回らなければなりません。例えば、もし 指定された CALDAV:time-range がレスポンスの計算で極端に多くのカレンダー・オブジェクト・リソースの処理を引き起こすなら、この postcondition は失敗する可能性があります。

7.10.1 Example: Successful CALDAV:free-busy-query REPORT

この例では、クライアントはサーバーに、 /bernard/work/ カレンダー・コレクションの東部標準時で2006年1月4日の午前9:00から午後5:00(UTCで午後2:00から午後10:00)における空き時間情報を返すようにリクエストします。サーバーは、2つの1時間の busy time 間隔(ひとつは仮)をレスポンスしています。

この例のターゲットになっているカレンダー・データは Appendix B を参照してください。

>> Request <<

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:free-busy-query xmlns:C="urn:ietf:params:xml:ns:caldav">
<C:time-range start="20060104T140000Z"
end="20060105T220000Z"/>
</C:free-busy-query>

>> Response <<

HTTP/1.1 200 OK
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: text/calendar
Content-Length: xxxx

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Server//EN
BEGIN:VFREEBUSY
DTSTAMP:20050125T090000Z
DTSTART:20060104T140000Z
DTEND:20060105T220000Z
FREEBUSY;FBTYPE=BUSY-TENTATIVE:20060104T150000Z/PT1H
FREEBUSY:20060104T190000Z/PT1H
END:VFREEBUSY
END:VCALENDAR

8. Guidelines

8.1 Client-to-Client Interoperability

合法(サーバーがエラーを返さない)であっても他のクライアント実装が同じデータをアクセスした際の相互運用性を損なうような、クライアントが行える多数のアクションがあります。例えば、反復ルールは反復した日付の集合で置き換えられる、単一の反復イベントはそれぞれの反復を表現する独立したリソースの集合で置き換えられる、または開始・終了時刻はオリジナルのタイムゾーンから別のタイムゾーンに変換できるなどです。このアドバイスは iCalendar 相互運用性ベスト・プラクティスと同じで、 CalDAV の用途に限定されるものではありませんが、 CalDAV のユースケースでは相互運用性の問題がより顕著になります。

8.2 Synchronization Operations

WebDAV はコレクションやコレクションの集合の同期やオフラインでの変更に必要な機能をすでに提供しており、そして再接続時に衝突を解決する単純な方法を提供しています。 ETag はこの作業の鍵になりますが、それはすべての WebDAV サーバーにおいて必須ではありません。カレンダー・アプリケーションは(他の WebDAV アプリケーションよりも)オフライン機能がより重要であるため、 Section 5.3.4 で示されているように CalDAV サーバーは ETag をサポートしなければなりません (MUST) 。

8.2.1 Use of Reports

8.2.1.1 Restrict the Time Range

CalDAV で提供されているレポートは、ネットワーク帯域とローカル・クライアント・マシンのリソース消費のパフォーマンス最適化に使うことができます。双方とも処理能力が制限されたモバイル機器においては確実に重要な検討事項ですが、カレンダー・コレクションが大量のデータを格納している場合には、デスクトップ・クライアント・アプリケーションにも関係します。

通常、クライアントは有限の期間のカレンダー・データをユーザーに表示するので、クライアントは可能な限り、返されるカレンダー・コンポーネントの集合を現在のビューの表示にちょうど必要な分に制限するために CALDAV:calendar-query REPORT と CALDAV:time-range 要素を組み合わせて使うべきです。

8.2.1.2 Synchronize by Time Range

カレンダーでは通常、過去のデータ(現在の日付よりも前に完了したイベント、to-doなど)は削除されるかもしれませんが、変更はされません。そのため、現在時刻から未来の有意な時刻(すなわち1週間、1ヶ月)までのデータのみを考慮することで、クライアントは同期処理の速度を向上できます。もしユーザーがまだ同期されていない範囲のカレンダーを参照しようとしたなら、クライアントは新しく参照される期間で別の同期操作を実行できます。この "just-in-time" 同期によって、一般的なユーザーの振る舞いにおける帯域幅を最小化できます。

8.2.1.3 Synchronization Process

もしクライアントでカレンダー・データの同期をサポートするなら、カレンダー・データが必要になるたびにダウンロードするのとは対照的に、クライアントは実際のカレンダー・データとともにカレンダー・オブジェクト・リソースの URI と ETag をキャッシュする必要があります。 URI はカレンダー・オブジェクト・リソースのライフタイムの間において不変である一方、 ETag はカレンダー・オブジェクト・リソースの変更が成功するたびに変化します。したがって、ローカル・データ・キャッシュをサーバーと同期するために、クライアントは最初に必要な期間の URI/ETag ペアをフェッチして、その結果をカレンダー・データと比較できます。 ETag がサーバーの者と異なるすべてのキャッシュ・コンポーネントはリフレッシュする必要があります。

サーバー・クライアント間の正確な変更の検出のために、クライアントは最後の同期操作の後にどのカレンダー・オブジェクト・リソースが作成され、変更され、削除されたかの記録を、サーバーのデータと一致できるように維持する必要があります。

これは、それをどのように行うかの例です:

クライアントは特定の時間範囲で CALDAV:calendar-query REPORT リクエストを発行し、 DAV:getetag 属性のみを返すように依頼します。

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop>
<D:getetag/>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VEVENT">
<C:time-range start="20040902T000000Z"
end="20040903T000000Z"/>
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>

それから、クライアントはその結果を利用して、サーバー側でどのカレンダー・オブジェクト・リソースが変更され、作成され、または削除されたか、そしてそれらがローカルにキャッシュされたカレンダー・オブジェクト・リソースとどのように関連するかを決定します。もしサーバーのカレンダー・オブジェクト・リソースをフェッチする必要があると判断したなら、クライアントは CALDAV:calendar-multiget REPORT リクエストを発行してカレンダー・データをフェッチします:

REPORT /bernard/work/ HTTP/1.1
Host: cal.example.com
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-multiget xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop>
<D:getetag/>
<C:calendar-data/>
</D:prop>
<D:href>/bernard/work/abcd1.ics</D:href>
<D:href>/bernard/work/mtg1.ics</D:href>
</C:calendar-multiget>

8.2.2 Restrict the Properties Returned

クライアントはユーザーに情報を提示する際にカレンダー・オブジェクト・リソースのすべてのカレンダー属性を必要とするわけではないかもしれません。いくつかのカレンダー属性値は大きくなることがあるので(例えば ATTACH や ATTENDEE)、クライアントはカレンダー REPORT リクエストで返されるカレンダー属性を使うであろうものだけに制限することができます。

しかしながら、もしクライアントがカレンダー・オブジェクト・リソースを変更する必要があるなら、 PUT リクエストを介してカレンダー・オブジェクト・リソース全体を変更するしかありません。現在はカレンダー・オブジェクト・リソースの一部のカレンダー属性のみを変更する方法はありません。結果的に、クライアントは変更するカレンダー・オブジェクト・リソース全体を取得しなければならないでしょう。

8.3 Use of Locking

WebDAV ロックは同じリソースを変更しようとする2つのクライアントが互いの変更を上書きすることを(これらは ETag を使って解決することもできますが)、また別の変更と衝突する変更をするために時間を浪費することを防ぐために使うことができます。マルチユーザー・カレンダー・システムでは、対話的なカレンダークライアントはユーザーがイベントを編集している間それをロックし、そしてユーザーが編集を完了するかキャンセルしたときにロックを解除することができます。ロックはまた、データが再構成されている間、変更されるのを防ぐのに使うこともできます。例えば、カレンダークライアントはたくさんのカレンダー・リソースを移動するのに先立って2つのカレンダー・コレクションをロックすることも可能です。

クライアントは、そのユースケースで適切なロック・タイムアウト期間をリクエストすることに責任があります。ユーザーがリソースを保留して他の変更を防ぐと明示的に判断したときは、長いタイムアウトが適切かもしれません。しかし、クライアントが自動的にリソースをロックする判断をした場合は、タイムアウトは短くするべきです(そしてクライアントは必要ならロックを常にリフレッシュできます)。短いロック・タイムアウトは、もしクライアントがロックを解除できなくても、他のカレンダーユーザーは変更を妨げられないことを意味します。

8.4 Finding Calendars

たいていの場合、カレンダークライアント(もしくはエージェント)は URL を直接提供されることによって新しいカレンダーの場所を見いだします。例えば、ユーザーはクライアントの設定情報に所有するカレンダーの場所をタイプするか、 URL をメールからカレンダー・アプリケーションにコピー&ペーストするでしょう。クライアントはカレンダー・コレクションのリソースを指していることを確認するだけで済みます。クライアントはまた、カレンダー・コレクションを見つけるために WebDAV コレクションをブラウズすることもできます。

HTTP URL の選択はカレンダー・オブジェクト・リソースに既存のソフトウェアとの後方互換性があることを意味しますが、既存のソフトウェアは一般的に、その URL で何ができるかを決定するために OPTIONS レスポンスを調べる方法を知らないという欠点があります。これは WebDAV の用法と同様に CalDAV の用法にもいくぶんの障害です。この仕様はリクエストされるべき OPTION レスポンスの情報を利用可能にする以外に方法を提案しません。

カレンダーの共有とスケジューリングのユースケースのために、別のユーザーに所属するカレンダーを検索したいかもしれません。もし別のユーザーが同じリポジトリにカレンダーを持っているなら、 WebDAV ACL サポートに必須な principal 名前空間を使うことでそれを見つけることができます。そうでない場合は普遍的な解決方法は存在しませんが、実装者は vCard [RFC2426] 標準か LDAP [RFC4511] 標準のどちらかを calendar attributes [RFC2739] と共に利用することを検討できます。

CalDAV には princimal 名前空間を含む WebDAV ACL [RFC3744] と CalDAV:calendar-home-set 属性のサーバーによるサポートが必須なので、 CalDAV クライアントがユーザー自身のカレンダーや別のユーザーのカレンダーを検索するのに2つの選択肢があります。

この場合、 DAV:principal-match REOPRT は現在のユーザーの Principal-URL の名前付き属性 (CALDAV:calendar-home-set) を見つけるために使われます。これを使うと、 WebDAV クライアントは「自分は誰か」と「自分のカレンダーがどこにあるか」を学ぶことができます。その REPORT リクエストボディーはこのようになります:

<?xml version="1.0" encoding="utf-8" ?>
<D:principal-match xmlns:D="DAV:">
<D:self/>
<D:prop>
<C:calendar-home-set
xmlns:C="urn:ietf:params:xml:ns:caldav"/>
</D:prop>
</D:principal-match>

別のユーザーのカレンダーを見つけるために、 DAV:principal-property-search REPORT はいくつかの属性でフィルターして他を返すために使うことができます。ユーザー名 "Laurie" が所有するカレンダーを検索するためには、 REPORT リクエストボディーは以下のようになります:

<?xml version="1.0" encoding="utf-8" ?>
<D:principal-property-search xmlns:D="DAV:">
<D:property-search>
<D:prop>
<D:displayname/>
</D:prop>
<D:match>Laurie</D:match>
</D:property-search>
<D:prop>
<C:calendar-home-set
xmlns:C="urn:ietf:params:xml:ns:caldav"/>
<D:displayname/>
</D:prop>
</D:principal-property-search>

サーバーは文字列サブセット "Laurie" と DAV:displayname 属性とのマッチをとる case-sensitive か caseless の検索を実行します。したがって、サーバーは DAV:displayname 値とのマッチとして "Laurie Dusseault", "Laurier Desruisseaux", または "Wilfrid Laurier" を返し、そしてそれぞれのカレンダーを返します。

8.5 Storing and Using Attachments

CalDAV クライアントはカレンダーコンポーネント内にインラインもしくは外部の添付ファイルを作成することが可能です (MAY) 。このセクションは添付ファイルの作成と管理のためのいくつかのガイドラインを含みます。

8.5.1 Inline Attachments

CalDAV クライアントは iCalendar [RFC2445] で指定されているようにインライン添付ファイルをサポートしなければなりません (MUST) 。 CalDAV サーバーはインライン添付ファイルをサポートしなければならないので(MUST) 、クライアントはこの方法で添付ファイルが作成できることに依存できます。その一方、インライン添付ファイルにはいくつかの欠点があります:

8.5.2 External Attachments

CalDAV クライアントは、任意の URI スキームで参照された外部添付ファイルのダウンロードを、それらを直接処理するか、もし存在すれば適切な「ヘルパーアプリケーション」に添付ファイル URI を受け渡すかのどちらかでサポートするべきです (SHOULD) 。 CalDAV クライアントは "http" と "https" の URI スキームで参照された外部添付ファイルのダウンロードをサポートしなければなりません (MUST) 。外部添付ファイルは以下があり得ます:

CalDAV サーバーはカレンダー・コレクション内で子コレクションのサポートを提供できます (MAY) 。 CalDAV サーバーカレンダー・コレクション内に子コレクションを作成する MKCOL メソッドを許可できます (MAY) 。カレンダーコレクション内の子コレクションは、カレンダー・コレクションを含めることができない (MUST NOT) ことを除いて、あらゆるタイプのリソースを含めることができます (MAY) 。いくつかの CalDAV サーバーはカレンダー・コレクション内に子コレクションを許可せず、そしてそのようなサーバーは添付ファイルを保存する他の場所を見いだすことも可能です。

クライアントは外部添付ファイルにリンクしているカレンダー・コンポーネントの参照の一貫性を維持する責任全体を負います。外部添付ファイルを持つカレンダー・コンポーネントを削除するクライアントは、もしそれが適切なら、添付ファイルも削除することもできます。しかしながら、適切かどうかを判断するのは非常に困難です。新規コンポーネントは、カレンダー・コンポーネントから独立して存在することを意図した既存の Web リソースを簡単に参照できます(例えば「添付ファイル」はミーティングで議論される主要な提案になり得ます)。おそらく、ベストプラクティスが明らかになり、そしてドキュメント化されるべきでしょう。しかし今のところ、クライアントは外部添付ファイルのアグレッシブな "cleanup" は慎重に行うべきです。クライアントは参照されなくなるドキュメントの削除に関する判断をユーザーに委ねることもできますし、また作成した添付ファイルのみを削除することで保守的な動作をすることもできます。

クライアントはまた、外部添付ファイルを使うときのアクセス許可の一貫性にも責任を負います。サーバーがカレンダー・コレクションの子コレクション内の添付ファイルストレージをサポートする理由のひとつは、 ACL 継承がカレンダー・コレクションに与えられたのと同じアクセス許可を添付ファイルにも与えるのを容易にすることです。一方、同期でアクセス許可を維持することはとても困難になり得ます。別のリポジトリに保存された添付ファイルに対しては、アクセス許可の一貫性を維持することは不可能になり得ます -- 2つのリポジトリは同じアクセス許可をサポートしていないか、同じ principal のセットがないかもしれません。いくつかのシステムは、これらの種類の問題に満足な解決を部分的に提供するために、チケットや他の匿名アクセス・コントロール・メカニズムを持っています。

8.6 Storing and Using Alarms

すべての CalDAV カレンダー・コレクション(ユーザーが公開・グループ内公開するかもしれないものを含む)は、イベントや to-do でアラーム情報を含められることに注意してください。ユーザーは複数の機器の間でカレンダーを同期でき、そしてアラームを作成したのとは別の機器で実行することができます。すべてのアラーム・アクション・タイプが完全に相互運用可能なわけではありません(例えば、再生される音声ファイル名など)。

アクションが AUDIO でクライアントがアラームを実行するように設定sレテイルとき、クライアントは可能ならば指示されたサウンドを再生し、そうでなければ別のサウンドファイルを再生するべきです (SHOULD) 。しかし、アラームを書き換えて単純に指示されたサウンドをローカルで利用可能なサウンドにするべきではありません (SHOULD NOT) 。

アクションが DISPLAY でクライアントがアラームを実行するように設定されているとき、クライアントは指示された詳細かなにか意味のある代替文を表示してアラームを実行するべきです (SHOULD) 。しかし、自身の都合でアラームを書き換えるべきではありません (SHOULD NOT) 。

アクションが EMAIL でクライアントにメールを送信する能力がないときは、アラームを無視するべきです (SHOULD) 。しかし、アラーム自身の同期は続けなければなりません (MUST) 。

この仕様では、 PROCEDURE タイプのアラームの実行について、それを実行することによってセキュリティー・ホールを作ってしまうことを避けるようにというアドバイスを除いて、推奨は行いません。

相互運用性のないアラーム情報(例えば display アラームで使われる色の定義など)は、全てのデバイスで基本的なアラームを利用可能にするために、 VALARM コンポーネント内部の非標準の属性に置かれるべきです。

カレンダー・オブジェクト・リソースの変更ができるクライアントは、リソース内の既存のアラーム・データを同期しなければなりません (MUST) 。クライアントは、おそらくユーザー設定に基づいて、ダウンロードされたアラームを実行できます (MAY) 。もしクライアントがカレンダーの読み込み操作のみを行い、アラーム情報を失う恐れがなければ、クライアントはアラーム情報を破棄するかもしれません (MAY) 。

この仕様は、グループカレンダーでのマルチユーザー・アラームの提供や、誰を意図したアラームかを見つけることは試みません。これらの問題を解決するには iCalendar への拡張が必要です。例えば、アラームをユーザーごとに保存したり、 VARAM がどのユーザーを意図しているかを示すことです。当面の間、クライアントは、公開、グループ、またはリソースカレンダーにアラーム情報をアップロードしないことで相互運用性を最大化できます。


9. XML Element Definitions

9.1 CALDAV:calendar XML Element

名前:
calendar

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・コレクションのリソース型を指定する。

説明:
Section 4.2 参照。

定義:

      <!ELEMENT calendar EMPTY>

9.2 CALDAV:mkcalendar XML Element

名前:
mkcalendar

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・コレクション・リソースの作成時に設定される WebDAV 属性値を含むリクエストを指定する。

説明:
Section 5.3.1 参照。

定義:

      <!ELEMENT mkcalendar (DAV:set)>

9.3 CALDAV:mkcalendar-response XML Element

名前:
mkcalendar-response

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
成功の MKCALENDAR リクエストのレスポンスボディーを指定する。

説明:
Section 5.3.1 参照。

定義:

      <!ELEMENT mkcalendar-response ANY>

9.4 CALDAV:supported-collation XML Element

名前:
supported-collation

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
[RFC4790] で定義されているように、単一の照合をその照合識別子によって識別する。

説明:
CALDAV:supported-collation は Section 7.5.1 で説明されているような照合識別子のテキストを格納しています。

定義:

      <!ELEMENT supported-collation (#PCDATA)>
PCDATA value: collation identifier

9.5 CALDAV:calendar-query XML Element

名前:
calendar-query

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・オブジェクト・リソースに対する問い合わせのためのレポートを定義する。

説明:
Section 7.8 を参照。

定義:

      <!ELEMENT calendar-query ((DAV:allprop |
DAV:propname |
DAV:prop)?, filter, timezone?)>

9.6 CALDAV:calendar-data XML Element

名前:
calendar-data

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
以下のうちのひとつを指定する:

  1. CALDAV:supported-calendar-data 属性内でネストしたときのカレンダー・オブジェクト・リソースでサポートされたメディアタイプ。
  2. カレンダー・レポートで返されるべきカレンダー・オブジェクト・リソースの一部。
  3. カレンダー・レポートへのレスポンス内でのカレンダー・オブジェクト・リソースの内容。

説明:
CALDAV-calendar-data XML 要素が CALDAV:supported-calendar-data 属性内でネストしたときは、カレンダー・オブジェクト・リソースのためにサーバーがサポートするメディアタイプを指定します。
CALDAV:calendar-data XML 要素がカレンダー REPORT リクエスト内で使われたときは、レスポンスでカレンダー・オブジェクト・リソースのどの部分を返す必要があるかを指定します。もし CALDAV:calendar-data XML 要素が CALDAV:comp 要素をまったく含んでいなければ、カレンダー・オブジェクト・リソース全体が返されます。
最後に、 CALDAV:calendar-data XML 要素がカレンダー REPORT レスポンス内で使われたときは、カレンダー・オブジェクト・リソースの内容を指定します。 XML パーサーが2文字シーケンスの CRLF(10進 US-ASCII で 13 10)を単一の LF 文字(10進 US-ASCII で 10)に正規化するなら、 CALDAV:calendar-data XML 要素で指定されたカレンダー・オブジェクト・リソース内の CR 文字(10進 US-ASCII で 13)は省略されるかもしれません (MAY) 。そしてさらに、もしカレンダー REPORT リクエストの一部の CALDAV:calendar-data XML 要素 に必要な属性(例えば UID, DTSTAMP など)が指定されていなかった場合、または CALDAV:prop XML 要素の "novalue" アトリビュートが "yes" に設定されている場合、CALDAV:calendar-data XML 要素はそのメディアタイプごとに無効かもしれません (MAY) 。

備考:
リクエストやレスポンスの DAV:prop XML 要素内で、 CALDAV:calendar-data XML 要素はあたかも WebDAV 属性であるかのように指定されます。しかしながら、 CALDAV:calendar-data XML 要素は WebDAV 属性ではなく、 PROPFIND レスポンス内では返されず、 PROPPATCH リクエスト内では使われません。

備考:
CALDAV:calendar-data XML 要素に埋め込まれた iCalendar データは、 &lt;, &gt;, &amp; などの利用を含む実体エンコーディングか、または <![CDATA[ ... ]]> 構造の使用といった標準的な XML 文字データエンコーディング規則に従わなければなりません (MUST) 。後者の場合、 iCalendar データは CDATA セクションの終了を示す文字シーケンス "]]>" を含むことはできません。

定義:

      <!ELEMENT calendar-data EMPTY>

when nested in the CALDAV:supported-calendar-data property
to specify a supported media type for calendar object
resources;

<!ELEMENT calendar-data (comp?,
(expand | limit-recurrence-set)?,
limit-freebusy-set?)>

when nested in the DAV:prop XML element in a calendaring
REPORT request to specify which parts of calendar object
resources should be returned in the response;

<!ELEMENT calendar-data (#PCDATA)>
PCDATA value: iCalendar object

when nested in the DAV:prop XML element in a calendaring
REPORT response to specify the content of a returned
calendar object resource.

<!ATTLIST calendar-data content-type CDATA "text/calendar"
version CDATA "2.0">
content-type value: a MIME media type
version value: a version string

attributes can be used on all three variants of the
CALDAV:calendar-data XML element.

9.6.1 CALDAV:comp XML Element

名前:
comp

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
どのコンポーネントタイプが返るかを定義する。

説明:
name 値はカレンダー・コンポーネント名です(例えば VEVENT)。

定義:

      <!ELEMENT comp ((allprop | prop*), (allcomp | comp*))>

<!ATTLIST comp name CDATA #REQUIRED>
name value: a calendar component name

備考:
CALDAV:prop と CALDAV:allprop 要素は [RFC2518] で定義されている DAV:prop と DAV:allprop 要素と同じ名前です。しかしながら、 CALDAV:prop と CALDAV:allprop 要素は "DAV:" 名前空間ではなく "urn:ietf:params:xml:ns:caldav" 名前空間で定義されています。

9.6.2 CALDAV:allcomp XML Element

名前:
allcomp

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
すべてのコンポーネントが返されるように指定します。

説明:
CALDAV:allcomp XML 要素は、クライアントがカレンダー REPORT リクエストに対してすべてのタイプのコンポーネントを返してほしいときに使えます。

定義:

      <!ELEMENT allcomp EMPTY>

9.6.3 CALDAV:allprop XML Element

名前:
allprop

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
すべての属性が返されるように指定します。

説明:
CALDAV:allprop XML 要素は、クライアントがカレンダー REPORT リクエストに対してコンポーネントのすべての属性を返してほしいときに使うことができます。

定義:

      <!ELEMENT allprop EMPTY>

備考:
CALDAV:allprop 要素は [RFC2518] で定義されている DAV:allprop 要素と同じ名前です。しかしながら、 CALDAV:allprop 要素は "DAV:" 名前空間ではなく "urn:ietf:params:xml:ns:caldav" 名前空間で定義されています。

9.6.4 CALDAV:prop XML Element

名前:
prop

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
レスポンスでどの属性が返されるかを定義します。

説明:
"name" アトリビュートは返されるカレンダー属性の名前を指定します(例えば ATTENDEE)。クライアントは "novalue" アトリビュートを使って属性の実際の値を返さないようにできます(もし "novalue" アトリビュートが "yes" に設定された場合)。その場合、サーバーは iCalendar 属性名とすべての iCalendar パラメータと最後の ":" のみを返し、それに続く属性値は返しません。

定義:

      <!ELEMENT prop EMPTY>

<!ATTLIST prop name CDATA #REQUIRED
novalue (yes | no) "no">
name value: a calendar property name
novalue value: "yes" or "no"

備考:
CALDAV:prop 要素は [RFC2518] で定義されている DAV:prop 要素と同じ名前です。しかしながら、 CALDAV:prop 要素は "DAV:" 名前空間ではなく "urn:ietf:params:xml:ns:caldav" 名前空間で定義されています。

9.6.5 CALDAV:expand XML Element

名前:
expand

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
サーバーが反復コンポーネントを個々の反復するインスタンスに展開するように強制します。

説明:
CALDAV:expand XML 要素は、与えられたカレンダー REPORT リクエストに対して、サーバーが反復集合を正確にひとつの反復するインスタンスを定義するカレンダー・コンポーネントに展開しなければならないこと (MUST) 、そして指定された時間範囲にスケジュールされた時刻が重なるもののみを返さなければならないこと (MUST) を指定します。
"start" アトリビュートは inclusive な開始時刻を指定し、 "end" アトリビュートは inclusive でない終了時刻を指定します。両アトリビュートは UTC 時刻値を伴う日付として指定されます。 "end" アトリビュートの値は "start" アトリビュートの値よりも大きくなければなりません (MUST) 。
反復インスタンスが指定した時間範囲に重なるかどうかを決定するために、 サーバーはCALDAV:time-range と同じロジックを使わなければなりません。 (MUST) 。
初期インスタンスを除いて、反復コンポーネントはそれがどのインスタンスを参照しているかを示す RECURRENCE-ID 属性を含まなければなりません (MUST) 。返されたカレンダー・コンポーネントは反復属性(すなわち EXDATE, EXRULE, RDATE, RRULE)を使ってはならず (MUST NOT) 、そして VTIMEZONE コンポーネントを含んだり参照したりしてはなりません (MUST NOT) 。タイムゾーン情報を参照するローカルタイムを伴う日付は、UTC 時刻を伴う日付に変換されなければなりません (MUST) 。

定義:

      <!ELEMENT expand EMPTY>

<!ATTLIST expand start CDATA #REQUIRED
end CDATA #REQUIRED>
start value: an iCalendar "date with UTC time"
end value: an iCalendar "date with UTC time"

9.6.6 CALDAV:limit-recurrence-set XML Element

名前:
limit-recurrence-set

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
サーバーが返す "overridden components" の集合を制限するために、時間範囲を指定します。

説明:
CALDAV:limit-recurrence-set XML 要素は、与えられたカレンダーレポートリクエストに対して、 "master component" に加えて指定した時間範囲に影響する "overridden components" も返さなければならない (MUST) ことを指定します。 overridden component は、その開始・終了時刻が時間範囲に重なるか、またはオリジナルの開始・終了時刻 -- もしインスタンスが上書きされなければ使用されるであろうもの -- が時間範囲に重なれば、 overridden component は時間範囲に影響します。
"start" アトリビュートは inclusive な開始時刻を指定し、 "end" アトリビュートは inclusive でない終了時刻を指定します。両アトリビュートは UTC 時刻値を伴う日付として指定されます。 "end" アトリビュートの値は "start" アトリビュートの値よりも大きくなければなりません (MUST) 。
反復インスタンスが指定した時間範囲に重なるかどうかを決定するために、 サーバーはCALDAV:time-range と同じロジックを使わなければなりません。 (MUST) 。
RECURRENCE-ID 属性に RANGE パラメータを持つ overridden component は反復集合の中のひとつ以上のインスタンスを指定している可能性があり、そしてそれらのインスタンスの一部は指定された時間範囲に含まれるかもしれず、または上書きされる前は指定された時間範囲に含まれていたかもしれません。その場合、 overridden component は指定された時間範囲のインスタンスの解釈に直接影響するので、結果に含まれなければなりません (MUST) 。

定義:

      <!ELEMENT limit-recurrence-set EMPTY>

<!ATTLIST limit-recurrence-set start CDATA #REQUIRED
end CDATA #REQUIRED>
start value: an iCalendar "date with UTC time"
end value: an iCalendar "date with UTC time"

9.6.7 CALDAV:limit-freebusy-set XML Element

名前:
limit-freebusy-set

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
サーバーが返す FREEBUSY 値の集合を制限するための時間範囲を指定します。

説明:
CALDAV:limit-freebusy-set XML 要素は、与えられたカレンダー REPORT リクエストに対して、サーバーが指定された時間範囲に重なる VFREEBUSY コンポーネントのFREEBUSY 属性値のみを返さなければならないこと (MUST) を指定します。
"start" 属性は inclusive な開始時刻を指定し、 "end" アトリビュートは inclusive でない終了時刻を指定します。両アトリビュートは UTC 時刻値を伴う日付として指定されます。 "end" アトリビュートの値は "start" アトリビュートの値よりも大きくなければなりません (MUST) 。
反復インスタンスが指定した時間範囲に重なるかどうかを決定するために、 サーバーはCALDAV:time-range と同じロジックを使わなければなりません。 (MUST) 。

定義:

      <!ELEMENT limit-freebusy-set EMPTY>

<!ATTLIST limit-freebusy-set start CDATA #REQUIRED
end CDATA #REQUIRED>
start value: an iCalendar "date with UTC time"
end value: an iCalendar "date with UTC time"

9.7 CALDAV:filter XML Element

名前:
filter

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
サーバーが返すカレンダー・コンポーネントを制限するためのフィルターを指定します。

説明:
CALDAV:filter XML 要素は、カレンダー REPORT リクエストによって返されるカレンダー・コンポーネントを制限するための検索フィルターを指定します。

定義:

      <!ELEMENT filter (comp-filter)>

9.7.1 CALDAV:comp-filter XML Element

名前:
comp-filter

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー・コンポーネントの検索基準を指定します。

説明:
CALDAV:comp-filter XML 要素はカレンダー・オブジェクト(例えば VCALENDAR)か特定のカレンダー・コンポーネント型(例えば VEVENT)をターゲットにした問い合わせを指定します。 CALDAV:filter XML 要素の子として使われたときは、 CALDAV:comp-filter XML 要素のスコープはカレンダー・オブジェクトです。別の CALDAV:comp-filter XML 要素の子として使われたときは、 CALDAV:comp-filter XML 要素のスコープは同封のカレンダー・コンポーネントです。 CALDAV:comp-filter は以下のときにマッチします:

または:

または:

または:

定義:

      <!ELEMENT comp-filter (is-not-defined | (time-range?,
prop-filter*, comp-filter*))>

<!ATTLIST comp-filter name CDATA #REQUIRED>
name value: a calendar object or calendar component
type (e.g., VEVENT)

9.7.2 CALDAV:prop-filter XML Element

名前:
prop-filter

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
カレンダー属性の検索基準を指定する。

説明:
CALDAV:prop-filter XML 要素は、同封のカレンダー・コンポーネント内の特定のカレンダー属性(例えば CATEGORIES)をターゲットにした問い合わせを指定します。カレンダー属性は以下のときに CALDAV:prop-filter にマッチします:

または:

または:

または:

定義:

      <!ELEMENT prop-filter (is-not-defined |
((time-range | text-match)?,
param-filter*))>

<!ATTLIST prop-filter name CDATA #REQUIRED>
name value: a calendar property name (e.g., ATTENDEE)

9.7.3 CALDAV:param-filter XML Element

名前:
param-filter

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
特定のパラメータ値に検索を制限する。

説明:
CALDAV:param-filter XML 要素は特定のそれが定義されたカレンダー属性のスコープ内のカレンダー属性パラメータ(例えば PARTSTAT)をターゲットにした問い合わせを指定します。カレンダー属性パラメータは以下のときに CALDAV:param-filter にマッチします:

または:

定義:

      <!ELEMENT param-filter (is-not-defined | text-match?)>

<!ATTLIST param-filter name CDATA #REQUIRED>
name value: a property parameter name (e.g., PARTSTAT)

9.7.4 CALDAV:is-not-defined XML Element

名前:
is-not-defined

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
同封コンポーネント、属性、またはパラメータが存在しなければマッチすることを指定します。

説明:
CALDAV:is-not-defined XML 要素は、カレンダー REPORT リクエストで指定された同封コンポーネント、属性、またはパラメータ値がテストされるカレンダー・データに存在しなければマッチすることを指定します。

定義:

      <!ELEMENT is-not-defined EMPTY>

9.7.5 CALDAV:text-match XML Element

名前:
text-match

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
属性またはパラメータ値の部分文字列マッチを指定します。

説明:
CALDAV:text-match XML 要素は、カレンダー REPORT リクエストの中で属性またはパラメータ値に対しての部分文字列マッチに使われるテキストを指定します。
"collation" アトリビュートは、サーバーが文字列マッチに使わなければならない (MUST) 照合の選択に使われます。このアトリビュートがなければ、サーバーは "i;ascii-casemap" 照合を使わなければなりません (MUST) 。
"negate-condition" アトリビュートは、その値が "no" に設定されているときはテキストが一致したときにマッチを返し、その値が "yes" に設定されているときはテキストが一致しないときにマッチを返すことを示します。例えば、これは STATUS 属性が CANCELLED に設定されていないコンポーネントにマッチさせるために使うことができます。

定義:

      <!ELEMENT text-match (#PCDATA)>
PCDATA value: string

<!ATTLIST text-match collation CDATA "i;ascii-casemap"
negate-condition (yes | no) "no">

9.8 CALDAV:timezone XML Element

名前:
timezone

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
レポートの結果を決定するときに使うタイムゾーン・コンポーネントを指定します。

説明:
CALDAV:timezone XML 要素は、与えられたカレンダー REPORT リクエストに対して、 "date" 値と "date with localtime" 値(つまり floating time)を "date with UTC time" に解決するためにカレンダー・オブジェクト・リソースが持っている CALDAV:calendar-timezone 属性の代わりに、サーバーが指定した VTIMEZONE コンポーネントに依存しなければならない (MUST) ことを指定します。サーバーは、 "date" 値または "date with local time" 値でスケジュールされたカレンダー・コンポーネントが CALDAV:calendar-query REPORT で指定された CALDAV:time-range と重なるかどうかを決定するために、この情報を必要とします。

備考:
CALDAV:timezone XML 要素に埋め込まれた iCalendar データは、 &lt;, &gt;, &amp; などの利用を含む実体エンコーディングか、または <![CDATA[ ... ]]> 構造の使用といった標準的な XML 文字データエンコーディング規則に従わなければなりません (MUST) 。後者の場合、 iCalendar データは CDATA セクションの終了を示す文字シーケンス "]]>" を含むことはできません。

定義:

      <!ELEMENT timezone (#PCDATA)>
PCDATA value: an iCalendar object with exactly one VTIMEZONE

9.9 CALDAV:time-range XML Element

名前:
time-range

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
サーバーが返すカレンダー・コンポーネントの集合を制限するための時間範囲を指定します。

説明:
CALDAV:time-range XML 要素は、与えられたカレンダー REPORT リクエストに対して、サーバーが指定された時間範囲に重なるコンポーネントか属性(コンテキストに依存)のカレンダー・オブジェクト・リソースのみを返すことを指定します。
"start" 属性は inclusive な開始時刻を指定し、 "end" アトリビュートは inclusive でない終了時刻を指定します。両アトリビュートは "date with UTC time" として指定されなければなりません (MUST) 。片側が開いた時間範囲はアトリビュートをひとつだけ含めることで指定できます。しかしながら、 CALDAV:time-range には最低でも常にひとつのアトリビュートを指定しなければなりません (MUST) 。もし CALDAV:time-range XML 要素に "start" か "end" どちらかのアトリビュートが指定されなかったら、それぞれ「負の無限大」と「正の無限大」が値として仮定されます。もし "start" と "end" の両方が指定されたら、 "end" アトリビュートの値は "start" アトリビュートの値よりも大きくなければなりません。
時間範囲条件をテストする際、時間範囲テストはすべての反復インスタンスを考慮しなければなりません (MUST) 。もし任意のインスタンスがマッチしたら、テストは真を返します。反復インスタンスのテストでは、サーバーは反復パターンと任意の上書きに基づいたインスタンスの DTSTART, DTEND, DURATION, そして DUE 属性の実効値を推論する必要があります。
もし下表で指定されている対応するコンポーネント状態の条件が満たされるなら、VEVENT コンポーネントは与えられた時間範囲に重なると考えられます。 [RFC2445] で指定されているように、 DTSTART 属性は VEVENT コンポーネントに必須 (REQUIRED) なことに注意してください。条件は VEVENT コンポーネントの DTEND と DURATION 属性の存在に依存します。そしてさらに、 DTEND 属性の値は DTSTART 属性の値よりも遅れていなければなりません。 DTEND と DURATION 属性がない VEVENT コンポーネントの duration は、 DTSTART が DATE 値のとき1日 (+P1D) で、 DTSTART が DATE-TIME 値のとき0秒です。

   +---------------------------------------------------------------+
| VEVENT has the DTEND property? |
| +-----------------------------------------------------------+
| | VEVENT has the DURATION property? |
| | +-------------------------------------------------------+
| | | DURATION property value is greater than 0 seconds? |
| | | +---------------------------------------------------+
| | | | DTSTART property is a DATE-TIME value? |
| | | | +-----------------------------------------------+
| | | | | Condition to evaluate |
+---+---+---+---+-----------------------------------------------+
| Y | N | N | * | (start < DTEND AND end > DTSTART) |
+---+---+---+---+-----------------------------------------------+
| N | Y | Y | * | (start < DTSTART+DURATION AND end > DTSTART) |
| | +---+---+-----------------------------------------------+
| | | N | * | (start <= DTSTART AND end > DTSTART) |
+---+---+---+---+-----------------------------------------------+
| N | N | N | Y | (start <= DTSTART AND end > DTSTART) |
+---+---+---+---+-----------------------------------------------+
| N | N | N | N | (start < DTSTART+P1D AND end > DTSTART) |
+---+---+---+---+-----------------------------------------------+

下表で指定された対応する条件が満たされるなら VTODO コンポーネントは与えられた時間範囲と重なると考えられます。条件は VTODO コンポーネントの DTSTART, DURATION, DUE, COMPLETED, そして CREATED 属性の存在に依存します。 [RFC2445] で指定されているように、もし指定されていれば、 DUE 値は DTSTART 値と同じかそれより後の DATE-TIME 値でなければなりません (MUST) 。

+-------------------------------------------------------------------+
| VTODO has the DTSTART property? |
| +---------------------------------------------------------------+
| | VTODO has the DURATION property? |
| | +-----------------------------------------------------------+
| | | VTODO has the DUE property? |
| | | +-------------------------------------------------------+
| | | | VTODO has the COMPLETED property? |
| | | | +---------------------------------------------------+
| | | | | VTODO has the CREATED property? |
| | | | | +-----------------------------------------------+
| | | | | | Condition to evaluate |
+---+---+---+---+---+-----------------------------------------------+
| Y | Y | N | * | * | (start <= DTSTART+DURATION) AND |
| | | | | | ((end > DTSTART) OR |
| | | | | | (end >= DTSTART+DURATION)) |
+---+---+---+---+---+-----------------------------------------------+
| Y | N | Y | * | * | ((start < DUE) OR (start <= DTSTART)) |
| | | | | | AND |
| | | | | | ((end > DTSTART) OR (end >= DUE)) |
+---+---+---+---+---+-----------------------------------------------+
| Y | N | N | * | * | (start <= DTSTART) AND (end > DTSTART) |
+---+---+---+---+---+-----------------------------------------------+
| N | N | Y | * | * | (start < DUE) AND (end >= DUE) |
+---+---+---+---+---+-----------------------------------------------+
| N | N | N | Y | Y | ((start <= CREATED) OR (start <= COMPLETED))|
| | | | | | AND |
| | | | | | ((end >= CREATED) OR (end >= COMPLETED))|
+---+---+---+---+---+-----------------------------------------------+
| N | N | N | Y | N | (start <= COMPLETED) AND (end >= COMPLETED) |
+---+---+---+---+---+-----------------------------------------------+
| N | N | N | N | Y | (end > CREATED) |
+---+---+---+---+---+-----------------------------------------------+
| N | N | N | N | N | TRUE |
+---+---+---+---+---+-----------------------------------------------+

下表で指定された対応する条件が満たされるなら VJOURNAL コンポーネントは与えられた時間範囲と重なります。条件は VJOURNAL コンポーネントの DTSTART 属性の存在と、 DTSTART が DATE-TIME 値か DATE 値かに依存します。 VJOURNAL コンポーネントの実効 "duration" は、 DTSTART が DATE 値なら1日 (+P1D) 、 DTSTART が DATE-TIME 値なら0秒です。

   +----------------------------------------------------+
| VJOURNAL has the DTSTART property? |
| +------------------------------------------------+
| | DTSTART property is a DATE-TIME value? |
| | +--------------------------------------------+
| | | Condition to evaluate |
+---+---+--------------------------------------------+
| Y | Y | (start <= DTSTART) AND (end > DTSTART) |
+---+---+--------------------------------------------+
| Y | N | (start < DTSTART+P1D) AND (end > DTSTART) |
+---+---+--------------------------------------------+
| N | * | FALSE |
+---+---+--------------------------------------------+

下表で指定された対応する条件が満たされるなら VFREEBUSY コンポーネントは与えられた時間範囲と重なります。条件は VFREEBUSY コンポーネントの DTSTART と DTEND 属性、そして DTSTART と DTEND がなければ任意の FREEBUSY 属性の存在に依存します。DURATION 属性は VFREEBUSY コンポーネント内で使われると特別の意味を持つので、すべての DURATION 属性は無視されます。 FREEBUSY 属性のみが使われているときは、この属性で表現される空き時間情報のタイプ (free, busy, busy-tentative, busy-unavailable) に関係なく、それぞれの FREEBUSY 属性の期間が時間範囲と比較されます。

   +------------------------------------------------------+
| VFREEBUSY has both the DTSTART and DTEND properties? |
| +--------------------------------------------------+
| | VFREEBUSY has the FREEBUSY property? |
| | +----------------------------------------------+
| | | Condition to evaluate |
+---+---+----------------------------------------------+
| Y | * | (start <= DTEND) AND (end > DTSTART) |
+---+---+----------------------------------------------+
| N | Y | (start < freebusy-period-end) AND |
| | | (end > freebusy-period-start) |
+---+---+----------------------------------------------+
| N | N | FALSE |
+---+---+----------------------------------------------+

以下の条件が満たされればVALARM コンポーネントは与えられた時間範囲に重なると考えられます:

      (start <= trigger-time) AND (end > trigger-time)

VALARM コンポーネントは繰り返しトリガーされるように定義できます。そのような VALARM コンポーネントは、最低でもひとつのトリガーが時間範囲と重なれば、コンポーネントが時間範囲に重なると考えられます。
以下の条件が満たされれば、カレンダー属性 COMPLETED, CREATED, DTEND, DTSTAMP, DTSTART, DUE, そして LAST-MODIFIED は与えられた時間範囲に重なります。

       (start <= date-time) AND (end > date-time)

もし VEVENT に DTEND が存在せず、かつ DURATION が存在するなら、代わりに「事実上の」DTEND すなわち DTSTART+DURATION でテストが行われるべきです。同様に、もし VTODO に DUE が存在せず、 DTSTART と DURATION が存在するなら、代わりに「事実上の」DUE すなわち DTSTART+DURATION でテスト行われるべきです。
その他全てのカレンダー・コンポーネントおよび属性では、CALDAV:time-range の意味は定義されていません。

定義:

      <!ELEMENT time-range EMPTY>

<!ATTLIST time-range start CDATA #IMPLIED
end CDATA #IMPLIED>
start value: an iCalendar "date with UTC time"
end value: an iCalendar "date with UTC time"

9.10 CALDAV:calendar-multiget XML Element

名前:
calendar-multiget

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
特定のカレンダー・オブジェクト・リソースを取得するために使う CalDAV レポート。

説明:
Section 7.9 を参照

定義:

      <!ELEMENT calendar-multiget ((DAV:allprop |
DAV:propname |
DAV:prop)?, DAV:href+)>

9.11 CALDAV:free-busy-query XML Element

名前:
free-busy-query

名前空間:
urn:ietf:params:xml:ns:caldav

目的:
特定の時間範囲における空き時間情報を決定するための VFREEBUSY を生成するために使う CalDAV レポート。

説明:
Section 7.10 参照。

定義:

      <!ELEMENT free-busy-query (time-range)>


10. Internationalization Considerations

CalDAV では、カレンダー・コレクションの説明(Section 5.2.1 参照)の取得と保存に国際化文字列が許可されています。

CALDAV:calendar-query REPORT (Section 7.8) は、 CALDAV:text-match 要素で制御されるテキスト検索のオプションを持っており、この要素の説明(Section 9.7.5 参照)で文字ハンドリングの詳細が取りあげられています。


11. Security Considerations

HTTP プロトコル・トランザクションは、覗き見防止の取り決めなく、ネットワーク越しにプレーンテキストで送信されます。 [RFC2818] で定義されているように、覗き見防止は TLS の利用によって達成されます。とくに、 HTTP ベーシック認証は事実上 TLS なしに使うことはできません。

サーバーは悪意のあるクライアントが過度のサーバーリソース(CPU, memory, disc など)を消費できないよう、慎重に作られたレポートを通して妥当な予防策をとらなければなりません (MUST) 。例えば、クライアントは今後100年にわたって毎秒ごとに反復する反復ルールを持つイベントをアップロードできます。これは結果として約 3 x 10^9 個のインスタンスを生成します!この全範囲にわたって反復を展開するように依頼するレポートは、サーバーでサービス拒否攻撃を引き起こしかねません。

新しいリソース(カレンダー・コレクションを含む)を作成するとき、クライアントは新しいリソースに割り当てられるリソース名(リソース URI の最後のパス・セグメント)が iCalendar リソース自身のあらゆるデータやカレンダー・コレクションの性質を露出させないように注意しなければなりません (MUST) 。これは、リソースの名前から特定の iCalendar コンポーネントの存在やコンポーネントの性質を推論させないために必要です。

空き時間情報を開放するとき、もし busy 期間が重なったり隣接したりすると(これは、空き時間情報をリクエストしたクライアントに、ただカレンダー所有者が busy 期間内にひとつ以上のイベントを持っているというだけでなく、最低でも2つのイベントを持っていることを教えています)、ユーザーのイベントに関するより多くの情報が露出します。従って、カレンダー・データのプライバシーのための保守的なアプローチは、そのような busy 期間が同じ型だったときは、サーバーが常にそれらを結合することです。

プロシージャ・アラームは、とくにそれが別のエージェントによって作成されたとき、クライアントとサーバーどちらにとっても既知のセキュリティー・リスクです。クライアントとサーバーにとって、そのようなプロシージャ・アラームの実効は必須ではありません。

iCalendar [RFC2445] と iTIP [RFC2446] でのセキュリティーについての考察は、いずれも CalDAV に適用できます。

これらを超えて、 CalDAV は HTTP [RFC2616] と WebDAV [RFC2518], [RFC3253], [RFC3744] で存在していないどんなセキュリティ問題も提起しません。


12. IANA Considerations

This document uses one new URN to identify a new XML namespace. The URN conforms to a registry mechanism described in [RFC3688].

12.1 Namespace Registration

Registration request for the CalDAV namespace:

URI: urn:ietf:params:xml:ns:caldav

Registrant Contact: See the "Authors' Addresses" section of this document.

XML: None. Namespace URIs do not represent an XML specification.


13. Acknowledgements

The authors would like to thank the following individuals for contributing their ideas and support for writing this specification: Michael Arick, Mario Bonin, Chris Bryant, Scott Carr, Andre Courtemanche, Mike Douglass, Ted Hardie, Marten den Haring, Jeffrey Harris, Sam Hartman, Helge Hess, Jeff McCullough, Alexey Melnikov, Dan Mosedale, Brian Moseley, Francois Perrault, Kervin L. Pierre, Julian F. Reschke, Wilfredo Sanchez Vega, Mike Shaver, Jari Urpalainen, Simon Vaillancourt, and Jim Whitehead.

The authors would also like to thank the Calendaring and Scheduling Consortium for advice with this specification, and for organizing interoperability testing events to help refine it.


14. References

14.1 Normative References

[RFC2119]Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, BCP 14, RFC 2119, March 1997.
[RFC2246]Dierks, T. and C. Allen, “The TLS Protocol Version 1.0”, RFC 2246, January 1999.
[RFC2445]Dawson, F., Stenerson, D., “Internet Calendaring and Scheduling Core Object Specification (iCalendar)”, RFC 2445, November 1998.
[RFC2446]Silverberg, S., Mansour, S., Dawson, F., and R. Hopson, “iCalendar Transport-Independent Interoperability Protocol (iTIP) Scheduling Events, BusyTime, To-dos and Journal Entries”, RFC 2446, November 1998.
[RFC2518]Goland, Y., Whitehead, E., Faizi, A., Carter, S.R., and D. Jensen, “HTTP Extensions for Distributed Authoring -- WEBDAV”, RFC 2518, February 1999.
[RFC2616]Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, “Hypertext Transfer Protocol -- HTTP/1.1”, RFC 2616, June 1999.
[RFC2818] Rescorla, E., “HTTP Over TLS”, RFC 2818, May 2000.
[RFC3253]Clemm, G., Amsden, J., Ellison, T., Kaler, C., and J. Whitehead, “Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning)”, RFC 3253, March 2002.
[RFC3688] Mealling, M., “The IETF XML Registry”, BCP 81, RFC 3688, January 2004.
[RFC3744]Clemm, G., Reschke, J. F., Sedlar, E., and J. Whitehead, “Web Distributed Authoring and Versioning (WebDAV) Access Control Protocol”, RFC 3744, May 2004.
[RFC4346] Dierks, T. and E. Rescorla, “The Transport Layer Security (TLS) Protocol Version 1.1”, RFC 4346, April 2006.
[RFC4790] Newman, C., Duerst, M., and A. Gulbrandsen, “Internet Application Protocol Collation Registry”, RFC 4790, March 2007.
[W3C.REC-xml-20060816] Paoli, J., Maler, E., Yergeau, F., Sperberg-McQueen, C., and T. Bray, “Extensible Markup Language (XML) 1.0 (Fourth Edition)”, World Wide Web Consortium Recommendation REC-xml-20060816, August 2006, <http://www.w3.org/TR/2006/REC-xml-20060816>.

14.2 Informative References

[RFC2426]Dawson, F. and T. Howes, “vCard MIME Directory Profile”, RFC 2426, September 1998.
[rfc2518bis] Dusseault, L., “HTTP Extensions for Distributed Authoring - WebDAV”, Work in Progress, December 2006.
[RFC2739] Small, T., Hennessy, D., and F. Dawson, “Calendar Attributes for vCard and LDAP”, RFC 2739, January 2000.
[RFC4331]Korver, B. and L. Dusseault, “Quota and Size Properties for Distributed Authoring and Versioning (DAV) Collections”, RFC 4331, February 2006.
[RFC4511] Sermersheim, J., “Lightweight Directory Access Protocol (LDAP): The Protocol”, RFC 4511, June 2006.

Authors' Addresses

Cyrus DabooApple Inc.1 Infinite LoopCupertino, CA 95014USAEmail: URI: http://www.apple.com/Bernard DesruisseauxOracle Corporation600 Blvd. de Maisonneuve WestSuite 1900Montreal, QC H3A 3J2CANADAEmail: URI: http://www.oracle.com/Lisa DusseaultCommerceNet169 University Ave.Palo Alto, CA 94301USAEmail: URI: http://commerce.net/

A. CalDAV Method Privilege Table (Normative)

以下のテーブルは [RFC3744] の Appendix B で指定された WebDAV Method Privilege Tableの拡張です。

METHOD PRIVILEGES
MKCALENDAR DAV:bind
REPORT DAV:read or CALDAV:read-free-busy (on all referenced resources)

B. Calendar Collections Used in the Examples

この付録はこの文書を通して例での問い合わせに使われたカレンダー・コレクション内のカレンダー・オブジェクト・リソースを示します。

カレンダー・コレクションの内容は、コレクション内のすべてのカレンダー・データを返すように意図された CALDAV:calendar-query REPORT リクエストで返るものとして掲載されています:

>> Request <<

REPORT /bernard/work/ HTTP/1.1  
Host: cal.example.com
Depth: 1
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop>
<D:getetag/>
<C:calendar-data/>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR"/>
</C:filter>
</C:calendar-query>

>> Response <<

HTTP/1.1 207 Multi-Status  
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:"
xmlns:C="urn:ietf:params:xml:ns:caldav">

<D:response>
<D:href>http://cal.example.com/bernard/work/abcd1.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd1"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20060206T001102Z
DTSTART;TZID=US/Eastern:20060102T100000
DURATION:PT1H
SUMMARY:Event #1
Description:Go Steelers!
UID:74855313FA803DA593CD579A@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>

<D:response>
<D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd2"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20060206T001121Z
DTSTART;TZID=US/Eastern:20060102T120000
DURATION:PT1H
RRULE:FREQ=DAILY;COUNT=5
SUMMARY:Event #2
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
BEGIN:VEVENT
DTSTAMP:20060206T001121Z
DTSTART;TZID=US/Eastern:20060104T140000
DURATION:PT1H
RECURRENCE-ID;TZID=US/Eastern:20060104T120000
SUMMARY:Event #2 bis
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>

<D:response>
<D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd3"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
DTSTAMP:20060206T001220Z
DTSTART;TZID=US/Eastern:20060104T100000
DURATION:PT1H
LAST-MODIFIED:20060206T001330Z
ORGANIZER:mailto:cyrus@example.com
SEQUENCE:1
STATUS:TENTATIVE
SUMMARY:Event #3
UID:DC6C50A017428C5216A2F1CD@example.com
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>

<D:response>
<D:href>http://cal.example.com/bernard/work/abcd4.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd4"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTODO
DTSTAMP:20060205T235335Z
DUE;VALUE=DATE:20060104
STATUS:NEEDS-ACTION
SUMMARY:Task #1
UID:DDDEEB7915FA61233B861457@example.com
BEGIN:VALARM
ACTION:AUDIO
TRIGGER;RELATED=START:-PT10M
END:VALARM
END:VTODO
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>

<D:response>
<D:href>http://cal.example.com/bernard/work/abcd5.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd5"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTODO
DTSTAMP:20060205T235300Z
DUE;VALUE=DATE:20060106
LAST-MODIFIED:20060205T235308Z
SEQUENCE:1
STATUS:NEEDS-ACTION
SUMMARY:Task #2
UID:E10BA47467C5C69BB74E8720@example.com
BEGIN:VALARM
ACTION:AUDIO
TRIGGER;RELATED=START:-PT10M
END:VALARM
END:VTODO
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>

<D:response>
<D:href>http://cal.example.com/bernard/work/abcd6.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd6"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTODO
COMPLETED:20051223T122322Z
DTSTAMP:20060205T235400Z
DUE;VALUE=DATE:20051225
LAST-MODIFIED:20060205T235308Z
SEQUENCE:1
STATUS:COMPLETED
SUMMARY:Task #3
UID:E10BA47467C5C69BB74E8722@example.com
END:VTODO
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>

<D:response>
<D:href>http://cal.example.com/bernard/work/abcd7.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd7"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VTODO
DTSTAMP:20060205T235600Z
DUE;VALUE=DATE:20060101
LAST-MODIFIED:20060205T235308Z
SEQUENCE:1
STATUS:CANCELLED
SUMMARY:Task #4
UID:E10BA47467C5C69BB74E8725@example.com
END:VTODO
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>

<D:response>
<D:href>http://cal.example.com/bernard/work/abcd8.ics</D:href>
<D:propstat>
<D:prop>
<D:getetag>"fffff-abcd8"</D:getetag>
<C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VFREEBUSY
ORGANIZER;CN="Bernard Desruisseaux":mailto:bernard@example.com
UID:76ef34-54a3d2@example.com
DTSTAMP:20050530T123421Z
DTSTART:20060101T000000Z
DTEND:20060108T000000Z
FREEBUSY:20050531T230000Z/20050601T010000Z
FREEBUSY;FBTYPE=BUSY-TENTATIVE:20060102T100000Z/20060102T120000Z
FREEBUSY:20060103T100000Z/20060103T120000Z
FREEBUSY:20060104T100000Z/20060104T120000Z
FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20060105T100000Z/20060105T120000Z
FREEBUSY:20060106T100000Z/20060106T120000Z
END:VFREEBUSY
END:VCALENDAR
</C:calendar-data>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>

</D:multistatus>

Full Copyright Statement

Copyright © The IETF Trust (2007).

This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights.

This document and the information contained herein are provided on an “AS IS” basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.


Intellectual Property

The IETF takes no position regarding the validity or scope of any Intellectual Property Rights or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; nor does it represent that it has made any independent effort to identify any such rights. Information on the procedures with respect to rights in RFC documents can be found in BCP 78 and BCP 79.

Copies of IPR disclosures made to the IETF Secretariat and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this specification can be obtained from the IETF on-line IPR repository at <http://www.ietf.org/ipr>.

The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights that may cover technology that may be required to implement this standard. Please address the information to the IETF at ietf-ipr@ietf.org.

Acknowledgement

Funding for the RFC Editor function is provided by the IETF Administrative Support Activity (IASA).


Index

C D M P R W