]>
git.datanom.net - webcal.git/blob - caldav/calendar.class.php
4 require_once 'caldav-client.php';
5 require_once 'awl/iCalendar.php';
6 require_once 'caldavresource.class.php';
7 require_once 'rruleparser.class.php';
8 require_once 'vevent.class.php';
9 require_once 'icomponent.class.php';
11 class CalendarIterator
implements Iterator
{
14 function __construct(array $list) {
19 return current($this->list);
27 return key($this->list);
35 $obj = current($this->list);
36 return ($obj !== FALSE);
41 class Calendar
extends CaldavRessource
{
45 function __construct($url, $uid = '', $pwd = '', $cal = '') {
46 //file_put_contents('/tmp/dump', "$url\n$uid\n$pwd\n$cal\n", FILE_APPEND);
48 throw new Exception("Missing URL");
49 parent
::__construct($url, $uid, $pwd, $cal);
52 private function setComponent(VTYPE
$type, array $item, $new = FALSE) {
56 $item['etag'], $item['href'],
57 $type, $item['ical'], $new);
61 "$thisType: Unsupported iCalendar component");
63 $this->calendar
[$item['etag']] = $ical;
64 //var_dump($this->calendar[$item['etag']]);
65 //print "-------------------------------<br/>";
68 private function setResource($etag, $resource) {
69 if ($resource === NULL)
70 unset($this->calendar
[$etag]);
71 else if (isset($this->calendar
[$etag]))
72 $this->calendar
[$etag]->setResource($resource);
74 $type = new VTYPE($this->getType($resource));
75 $this->setComponent($type, array(
84 private function getType(iCalendar
$iCalendar) {
85 $components = $iCalendar->component
->GetComponents();
86 // Find VCalender component
87 foreach($components as $type) {
89 $vtype = new VTYPE($type->GetType());
90 if ($vtype->ordinal() != VTYPE
::VTIMEZONE
)
93 catch (Exception
$ex) {}
98 private function wrapCalendar($component) {
99 $cal = "BEGIN:VCALENDAR\r\n";
100 $cal .= "PRODID:-//datanom.net//NONSGML WEBCAL Calendar//EN\r\n";
101 $cal .= "VERSION:2.0\r\n";
102 $cal .= "CALSCALE:GREGORIAN\r\n";
104 $cal .= "END:VCALENDAR\r\n";
109 function getComponents($start, $end) {
110 $this->calendar
= array();
112 if (! $this->isDateTime($start) ||
! $this->isDateTime($end))
113 throw new Exception("[$start:$end]: Invalid DateTime format");
114 //print "$start:$end<br/>";
115 //file_put_contents('/tmp/dump', "$start, $end\n", FILE_APPEND);
116 $events = $this->callServer('getEvents', array($start, $end));
117 //var_export($events, FALSE);
118 //file_put_contents('/tmp/dump', var_export($events, TRUE), FILE_APPEND);
119 foreach ($events as $k => $event) {
120 $iCalendar = new iCalendar(
121 array('icalendar' => $event['data']));
122 $vtype = $this->getType($iCalendar);
123 $this->setComponent($vtype, array(
124 'etag' => $event['etag'],
125 'href' => $event['href'],
132 function newComponent($c_type) {
133 switch (strtoupper($c_type)) {
134 case 'VEVENT': $type = 'VEVENT'; break;
137 "$thisType: Unsupported iCalendar component");
139 $start = gmdate("Ymd\THm\Z");
140 $end = strtotime($start) +
(60*60);
141 $end = gmdate("Ymd\THm\Z", $end);
142 //echo "$start:$end<br/>";
143 $uid = sha1(microtime() . $start . $end);
144 $iCalendar = new iCalendar(array(
151 $vtype = $this->getType($iCalendar);
152 $etag = sha1("This is a new component");
153 $this->setComponent($vtype, array(
159 return $this->calendar
[$etag];
162 function reload($start, $end) {
163 $res = $this->update();
164 if (count($res) < 1) {
165 $this->getComponents($start, $end);
170 private function updateEvent($url, $etag) {
172 $resource = $this->calendar
[$etag];
173 if ($resource && $resource->isDirty()) {
175 $component = $resource->getBaseComponent();
176 //print "$etag: update\n";
177 $uid = $component->GetPValue('UID');
178 $ical = $this->wrapCalendar($component->Render());
179 //echo "$uid<br/>".nl2br($ical)."$etag<br/>";
180 $url = $resource->getUrl();
182 $newEtag = $this->callServer('put',
183 array("$uid.ics", $ical, $etag));
186 $newEtag = $this->callServer('put',
187 array("$uid.ics", $ical));
189 if (is_array($newEtag))
190 array_push($res, $newEtag);
192 $resource->setEtag($newEtag);
198 function update($url, $etag = NULL) {
199 //var_dump($this->calendar);
201 foreach($this->calendar
as $id => $resource) {
202 //var_dump($resource);
203 $thisUrl = $resource->getUrl();
204 if ($thisUrl && strcasecmp($url, $thisUrl) == 0) {
211 $res = $this->updateEvent($url, $etag);
213 $res = array($url => 'Event does not exist');
217 function delete($url, $etag = NULL) {
219 $res = $this->callServer('delete', array($url, $etag));
222 $res = $this->callServer('delete', array($url));
227 // inherited abstract methods from parent
228 function offsetExists($etag) {
229 return (is_object($this->calendar
[$etag]) &&
230 $this->calendar
[$etag] instanceof IComponent
);
233 function offsetGet($etag) {
234 if ($this->offsetExists($etag))
235 return $this->calendar
[$etag]->getResource();
238 function offsetSet($etag, $ical) {
239 $this->setResource($etag, $ical);
242 function offsetUnset($etag) {
243 $this->setResource($etag, NULL);
246 function getIterator() {
247 return new CalendarIterator($this->calendar
);
253 'http://calendar.datanom.net/caldav.php/mir/home/',
257 $cal->getComponents("20030830T000000Z","20031201T000000Z");
260 foreach($cal as $obj) {
262 print "========= [$i] =========\n";
264 //print_r ($obj->getAlarm());
265 print_r($obj->getActiveDates("20031014T000000Z","20031114T000000Z"));
266 //print "{$obj->isUTCTime()}\n";
267 //$obj->getActiveDates();
269 print "Found $i event(s)\n";
271 //print_r ($cal->getUrlByEtag($cal->getEtagFromUid('KOrganizer-1670268771.406')));
273 print "time: $time\n";
274 $dt = $cal->timestamp2ICal($time, TRUE);
276 $time = $cal->iCal2Timestamp($dt);
277 print "time: $time\n";
278 $dt = $cal->timestamp2ICal($time, FALSE);
280 $time = $cal->iCal2Timestamp(substr($dt, 0, strpos($dt, 'T')));
281 $dt = $cal->timestamp2ICal($time, TRUE);
283 $r = new RRuleParser(
284 'FREQ=HOURLY;INTERVAL=3;UNTIL=20070101T170000Z',
285 '20070101T090000Z', '20070101T090000Z');
286 $r = new RRuleParser(
287 'FREQ=WEEKLY;COUNT=12;INTERVAL=2',
288 '20070101T140000Z', '20070101T120000Z');
290 print_r($r->getEventDates('20070301T140000Z','20070501T140000Z'));
291 $r = new RRuleParser(
292 'FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1',
293 '20070101T000100Z', '20070101T001100Z');
294 //DTSTART;TZID=US-Eastern:19970105T083000
296 $r = new RRuleParser(
297 'FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;BYMINUTE=30',
298 '20070101T000100Z', '20070101T001100Z');
300 print_r ($r->getEventDates('20060101T000100Z', '20060101T001100Z'));
301 $r = new RRuleParser(
302 'FREQ=DAILY;COUNT=10;INTERVAL=2',
303 '20070101T000100Z', '20070101T001100Z');
305 //foreach ($cal as $obj)
306 // var_dump($obj->getBaseComponent());
307 //$bak = $cal['3ba46312e910765bf7059a53909d149b'];
309 //print_r(new Icalendar(array('SUMMARY' => 'test')));
310 //$cal['3ba46312e910765bf7059a53909d149b'] = new Icalendar(array('SUMMARY' => 'test'));
311 //print_r($cal['3ba46312e910765bf7059a53909d149b']);
312 //unset($cal['3ba46312e910765bf7059a53909d149b']);
313 //var_dump($cal['3ba46312e910765bf7059a53909d149b']);
314 //$cal['3ba46312e910765bf7059a53909d149b'] = $bak;
315 //var_dump($cal['3ba46312e910765bf7059a53909d149b']);
317 //print_r($cal['3ba46312e910765bf7059a53909d149b']);*/
This page took 0.098275 seconds and 6 git commands to generate.