From ebce02d66d9950604c0277f2fe46f2525260d569 Mon Sep 17 00:00:00 2001 From: skeeter Date: Mon, 9 Jul 2001 11:35:13 +0000 Subject: [PATCH] This is a lot better. Still having a problem handling a date-time/date/time type. --- calendar/ical_test.php | 45 +- calendar/inc/class.vCalendar.inc.php | 1919 +++++++++++++++++++++----- 2 files changed, 1586 insertions(+), 378 deletions(-) diff --git a/calendar/ical_test.php b/calendar/ical_test.php index 92a9dfd4f3..8e560e94f8 100755 --- a/calendar/ical_test.php +++ b/calendar/ical_test.php @@ -16,9 +16,11 @@ $phpgw_info['flags']['currentapp'] = 'calendar'; include('../header.inc.php'); - $icsfile=PHPGW_APP_INC.'/vcal1.ics'; + @set_time_limit(0); + + $icsfile=PHPGW_APP_INC.'/small_test.ics'; $fp=fopen($icsfile,'r'); - $contents = explode("\n",fread ($fp, filesize($icsfile))); + $contents = explode("\n",fread($fp, filesize($icsfile))); fclose($fp); $vcal = CreateObject('calendar.vCalendar'); @@ -29,6 +31,18 @@ echo "Method = ".$vcalendar->method->value."
\n"; echo "Version = ".$vcalendar->version->value."
\n"; + for($i=0;$itimezone);$i++) + { + echo "
\nTIMEZONE
\n"; + if($vcalendar->timezone[$i]->tzdata) + { + for($j=0;$jtimezone[$i]->tzdata);$j++) + { + echo "TZDATA #$j
\n"; + } + } + } + for($i=0;$ievent);$i++) { echo "
\nEVENT
\n"; @@ -44,6 +58,13 @@ { echo "Description (Alt Rep) = ".$vcalendar->event[$i]->description->altrep."
\n"; } + if($vcalendar->event[$i]->description->x_type) + { + for($j=0;$jevent[$i]->description->x_type);$j++) + { + echo "Description (X-".$vcalendar->event[$i]->description->x_type[$j]->name.") = ".$vcalendar->event[$i]->description->x_type[$j]->value."
\n"; + } + } if($vcalendar->event[$i]->summary->value) { echo "Summary = ".$vcalendar->event[$i]->summary->value."
\n"; @@ -61,15 +82,25 @@ } echo "Sequence = ".$vcalendar->event[$i]->sequence."
\n"; echo "Date Start : ".$phpgw->common->show_date(mktime($vcalendar->event[$i]->dtstart->hour,$vcalendar->event[$i]->dtstart->min,$vcalendar->event[$i]->dtstart->sec,$vcalendar->event[$i]->dtstart->month,$vcalendar->event[$i]->dtstart->mday,$vcalendar->event[$i]->dtstart->year) - $phpgw->calendar->datatime->tz_offset)."
\n"; + if($vcalendar->event[$i]->dtstart->tzid) + { + echo "Date Start TZID : ".$vcalendar->event[$i]->dtstart->tzid."
\n"; + } if($vcalendar->event[$i]->rrule) { - echo "Recurrence : Frequency = ".$vcalendar->event[$i]->rrule->freq." Count = ".$vcalendar->event[$i]->rrule->count."
\n"; + for($j=0;$jevent[$i]->rrule);$j++) + { + echo "Recurrence : Frequency = ".$vcalendar->event[$i]->rrule[$j]->freq." Count = ".$vcalendar->event[$i]->rrule[$j]->count."
\n"; + } } echo "Class = ".$vcalendar->event[$i]->class->value."
\n"; - echo "Organizer = ".$vcalendar->event[$i]->organizer->mailto->user.'@'.$vcalendar->event[$i]->organizer->mailto->host."
\n"; - if($vcalendar->event[$i]->organizer->dir) + if($vcalendar->event[$i]->organizer) { - echo "Organizer Dir = ".$vcalendar->event[$i]->organizer->dir."
\n"; + echo "Organizer = ".$vcalendar->event[$i]->organizer->mailto->user.'@'.$vcalendar->event[$i]->organizer->mailto->host."
\n"; + if($vcalendar->event[$i]->organizer->dir) + { + echo "Organizer Dir = ".$vcalendar->event[$i]->organizer->dir."
\n"; + } } for($j=0;$jevent[$i]->attendee);$j++) { @@ -78,7 +109,7 @@ { echo "Attendee[$j] Dir = ".$vcalendar->event[$i]->attendee[$j]->dir."
\n"; } - echo "Attendee[$j] Address = ".$vcalendar->event[$i]->attendee[$j]->mailto->user.'@'.$vcalendar->event[0]->attendee[$j]->mailto->host."
\n"; + echo "Attendee[$j] Address = ".$vcalendar->event[$i]->attendee[$j]->mailto->user.'@'.$vcalendar->event[$i]->attendee[$j]->mailto->host."
\n"; echo "Attendee[$j] Role = ".$vcal->switch_role($vcalendar->event[$i]->attendee[$j]->role)."
\n"; echo "Attendee[$j] RSVP = ".$vcal->switch_rsvp($vcalendar->event[$i]->attendee[$j]->rsvp)."
\n"; // echo "Attendee[$j] RSVP = ".$vcalendar->event[$i]->attendee[$j]->rsvp."
\n"; diff --git a/calendar/inc/class.vCalendar.inc.php b/calendar/inc/class.vCalendar.inc.php index d226b66dbe..1b660f0590 100755 --- a/calendar/inc/class.vCalendar.inc.php +++ b/calendar/inc/class.vCalendar.inc.php @@ -37,13 +37,41 @@ define('DELEGATED',4); define('COMPLETED',5); define('IN_PROCESS',6); + /* + * Class + */ define('PRIVATE',0); define('PUBLIC',1); define('CONFIDENTIAL',3); + /* + * Transparency + */ define('TRANSPARENT',0); define('OPAQUE',1); + /* + * Frequency + */ +define('SECONDLY',1); +define('MINUTELY',2); +define('HOURLY',3); +define('DAILY',4); +define('WEEKLY',5); +define('MONTHLY',6); +define('YEARLY',7); + +define('FREE',0); +define('BUSY',1); +define('BUSY_UNAVAILABLE',2); +define('BUSY_TENTATIVE',3); + +define('THISANDPRIOR',0); +define('THISANDFUTURE',1); + +define('START',0); +define('END',1); + define('_8BIT',0); define('_BASE64',1); @@ -70,6 +98,102 @@ class class_address var $partstat = NEEDS_ACTION; } +class class_tzprop +{ + var $type; + var $comment; + var $dtstart; + var $rdate; + var $rrule; + var $tzname; + var $tzoffsetfrom; + var $tzoffsetto; + var $x_type = Array(); +} + +class class_timezone +{ + var $type; + var $tzdata; + var $last_modified; + var $tzid; + var $tzurl; +} + +class class_event +{ + var $type; + var $alarm; + var $attach; + var $attendee; + var $categories; + var $class; + var $comment; + var $contact; + var $created; + var $description; + var $dtend; + var $dtstamp; + var $dtstart; + var $duration; + var $exdate; + var $exrule; + var $geo; + var $last_modified; + var $location; + var $organizer; + var $priority; + var $rdate; + var $recurrence_id; + var $request_status; + var $resources; + var $rrule; + var $sequence; + var $status; + var $summary; + var $transp; + var $uid; + var $url; + var $x_type = Array(); +} + +class class_todo +{ + var $type; + var $alarm; + var $attach; + var $attendee; + var $calscale; + var $class; + var $comment; + var $completed; + var $created; + var $description; + var $dtstamp; + var $dtstart; + var $due; + var $duration; + var $exdate; + var $exrule; + var $geo; + var $last_modified; + var $location; + var $organizer; + var $percent_coplete; + var $priority; + var $rdate; + var $recurrence_id; + var $related_to; + var $request_status; + var $resources; + var $rrule; + var $sequence; + var $summary; + var $uid; + var $url; + var $x_type = Array(); +} + class class_datetime { var $year; @@ -93,12 +217,21 @@ class class_geo class class_recur { - var $freq; - var $enddate; - var $interval; - var $count; - var $wkst; var $byday; + var $byhour; + var $byminute; + var $bymonth; + var $bymonthday; + var $bysecond; + var $bysetpos; + var $byweekno; + var $byyearday; + var $count; + var $freq; + var $interval; + var $until; + var $wkst; + var $x_type = Array(); } class class_text @@ -109,13 +242,25 @@ class class_text var $altrep; var $language; var $value; + var $x_type = Array(); } + class class_x_type { var $name; var $value; } +class class_alarm +{ + var $action; + var $trigger; + var $duration; + var $repeat; + var $attach; + var $x_type = Array(); +} + class vCalendar_item { var $alarm = Array(); @@ -128,9 +273,9 @@ class vCalendar_item var $class; var $created; var $description; - var $dtstart; var $dtend; var $dtstamp; + var $dtstart; var $due; var $duration; var $freebusy; @@ -140,18 +285,20 @@ class vCalendar_item var $organizer; var $percent_complete; var $priority; - var $rrule; + var $rdate; var $resources; var $request_status; + var $rrule; var $sequence; var $status; var $summary; var $transp; var $type; + var $tzdata = Array(); + var $tzid; var $tzname; var $tzoffsetto; var $tzoffsetfrom; - var $tzid; var $uid; var $x_type = Array(); } @@ -161,6 +308,7 @@ class vCal var $prodid; var $version; var $method; + var $calscale; var $event = Array(); var $todo = Array(); var $journal = Array(); @@ -176,7 +324,8 @@ class vCalendar var $journal = Array(); var $freebusy = Array(); var $timezone = Array(); - var $property; + var $property = Array(); + var $parameter= Array(); /* * Base Functions @@ -185,6 +334,14 @@ class vCalendar function vCalendar() { $this->property = Array( + 'action' => Array( + 'type' => 'text', + 'to_text' => True, + 'valarm' => Array( + 'state' => 'required', + 'multiples' => False + ) + ), 'attach' => Array( 'type' => 'uri', 'to_text' => True, @@ -229,36 +386,12 @@ class vCalendar 'multiples' => True ) ), - 'calscale' => Array( - 'type' => 'text', - 'to_text' => True, - 'vevent' => Array( - 'state' => 'optional', - 'multiples' => False - ), - 'vtodo' => Array( - 'state' => 'optional', - 'multiples' => False - ), - 'vjournal' => Array( - 'state' => 'optional', - 'multiples' => False - ), - 'valarm' => Array( - 'state' => 'optional', - 'multiples' => False - ), - 'vfreebusy' => Array( - 'state' => 'optional', - 'multiples' => False - ) - ), 'categories' => Array( 'type' => 'text', 'to_text' => True, 'vevent' => Array( 'state' => 'optional', - 'multiples' => False + 'multiples' => True ), 'vtodo' => Array( 'state' => 'optional', @@ -288,15 +421,11 @@ class vCalendar 'comment' => Array( 'type' => 'text', 'to_text' => True, - 'vevent' => Array( + 'daylight' => Array( 'state' => 'optional', 'multiples' => True ), - 'vtodo' => Array( - 'state' => 'optional', - 'multiples' => True - ), - 'vjournal' => Array( + 'standard' => Array( 'state' => 'optional', 'multiples' => True ), @@ -304,9 +433,21 @@ class vCalendar 'state' => 'optional', 'multiples' => True ), + 'vevent' => Array( + 'state' => 'optional', + 'multiples' => True + ), 'vfreebusy' => Array( 'state' => 'optional', 'multiples' => True + ), + 'vjournal' => Array( + 'state' => 'optional', + 'multiples' => True + ), + 'vtodo' => Array( + 'state' => 'optional', + 'multiples' => True ) ), 'completed' => Array( @@ -317,6 +458,14 @@ class vCalendar 'multiples' => False ) ), + 'contact' => Array( + 'type' => 'text', + 'to_text' => True, + 'vevent' => Array( + 'state' => 'optional', + 'multiples' => True + ) + ), 'created' => Array( 'type' => 'date-time', 'to_text' => False, @@ -388,11 +537,15 @@ class vCalendar 'dtstart' => Array( 'type' => 'date-time', 'to_text' => False, - 'vevent' => Array( + 'daylight' => Array( 'state' => 'required', 'multiples' => False ), - 'vtodo' => Array( + 'standard' => Array( + 'state' => 'required', + 'multiples' => False + ), + 'vevent' => Array( 'state' => 'optional', 'multiples' => False ), @@ -400,9 +553,9 @@ class vCalendar 'state' => 'optional', 'multiples' => False ), - 'vtimezone' => Array( - 'state' => 'required', - 'multiples' => True + 'vtodo' => Array( + 'state' => 'optional', + 'multiples' => False ) ), 'due' => Array( @@ -433,6 +586,30 @@ class vCalendar 'multiples' => False ) ), + 'exdate' => Array( + 'type' => 'date-time', + 'to_text' => False, + 'vevent' => Array( + 'state' => 'optional', + 'multiples' => True + ), + 'vtodo' => Array( + 'state' => 'optional', + 'multiples' => True + ) + ), + 'exrule' => Array( + 'type' => 'recur', + 'to_text' => False, + 'vevent' => Array( + 'state' => 'optional', + 'multiples' => True + ), + 'vtodo' => Array( + 'state' => 'optional', + 'multiples' => True + ) + ), 'freebusy' => Array( 'type' => 'freebusy', 'to_text' => False, @@ -469,7 +646,7 @@ class vCalendar 'multiples' => False ), 'vtimezone' => Array( - 'state' => 'required', + 'state' => 'optional', 'multiples' => False ) ), @@ -487,7 +664,7 @@ class vCalendar ), 'organizer' => Array( 'type' => 'cal-address', - 'to_text' => True, + 'to_text' => False, 'vevent' => Array( 'state' => 'optional', 'multiples' => False @@ -525,7 +702,43 @@ class vCalendar 'multiples' => False ) ), - 'resources' => Array( + 'rdate' => Array( + 'type' => 'date-time', + 'to_text' => False, + 'daylight' => Array( + 'state' => 'optional', + 'multiples' => True + ), + 'standard' => Array( + 'state' => 'optional', + 'multiples' => True + ), + 'vevent' => Array( + 'state' => 'optional', + 'multiples' => True + ), + 'vtodo' => Array( + 'state' => 'optional', + 'multiples' => True + ), + 'vjournal' => Array( + 'state' => 'optional', + 'multiples' => True + ) + ), + 'recurrence_id' => Array( + 'type' => 'date-time', + 'to_text' => False, + 'vevent' => Array( + 'state' => 'optional', + 'multiples' => False + ), + 'vtodo' => Array( + 'state' => 'optional', + 'multiples' => False + ) + ), + 'related_to' => Array( 'type' => 'text', 'to_text' => False, 'vevent' => Array( @@ -534,7 +747,7 @@ class vCalendar ), 'vtodo' => Array( 'state' => 'optional', - 'multiples' => False + 'multiples' => True ) ), 'request_status' => Array( @@ -557,9 +770,29 @@ class vCalendar 'multiples' => False ) ), + 'resources' => Array( + 'type' => 'text', + 'to_text' => False, + 'vevent' => Array( + 'state' => 'optional', + 'multiples' => False + ), + 'vtodo' => Array( + 'state' => 'optional', + 'multiples' => False + ) + ), 'rrule' => Array( 'type' => 'recur', 'to_text' => False, + 'daylight' => Array( + 'state' => 'optional', + 'multiples' => True + ), + 'standard' => Array( + 'state' => 'optional', + 'multiples' => True + ), 'vevent' => Array( 'state' => 'optional', 'multiples' => True @@ -571,10 +804,6 @@ class vCalendar 'vjournal' => Array( 'state' => 'optional', 'multiples' => True - ), - 'vtimezone' => Array( - 'state' => 'optional', - 'multiples' => False ) ), 'sequence' => Array( @@ -637,6 +866,14 @@ class vCalendar 'multiples' => False ) ), + 'trigger' => Array( + 'type' => 'trigger', + 'to_text' => True, + 'valarm' => Array( + 'state' => 'optional', + 'multiples' => False + ) + ), 'tzid' => Array( 'type' => 'text', 'to_text' => True, @@ -648,15 +885,23 @@ class vCalendar 'tzname' => Array( 'type' => 'text', 'to_text' => True, - 'vtimezone' => Array( + 'daylight' => Array( 'state' => 'optional', - 'multiples' => False + 'multiples' => True + ), + 'standard' => Array( + 'state' => 'optional', + 'multiples' => True ) ), 'tzoffsetfrom' => Array( 'type' => 'utc-offset', 'to_text' => True, - 'vtimezone' => Array( + 'daylight' => Array( + 'state' => 'required', + 'multiples' => False + ), + 'standard' => Array( 'state' => 'required', 'multiples' => False ) @@ -664,7 +909,11 @@ class vCalendar 'tzoffsetto' => Array( 'type' => 'utc-offset', 'to_text' => True, - 'vtimezone' => Array( + 'daylight' => Array( + 'state' => 'required', + 'multiples' => False + ), + 'standard' => Array( 'state' => 'required', 'multiples' => False ) @@ -696,8 +945,433 @@ class vCalendar 'state' => 'required', 'multiples' => False ) + ), + 'url' => Array( + 'type' => 'text', + 'to_text' => True, + 'vevent' => Array( + 'state' => 'required', + 'multiples' => False + ), + 'vtodo' => Array( + 'state' => 'required', + 'multiples' => False + ) ) ); + $this->parameter = Array( + 'altrep' => Array( + 'type' => 'uri', + 'quoted' => True, + 'to_text' => True, + 'properties' => Array( + 'comment' => True, + 'description' => True, + 'location' => True, + 'resources' => True, + 'summary' => True, + 'contact' => True + ) + ), + 'byday' => Array( + 'type' => 'text', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'byhour' => Array( + 'type' => 'string', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'byminute' => Array( + 'type' => 'string', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'bymonth' => Array( + 'type' => 'string', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'bymonthday' => Array( + 'type' => 'string', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'bysecond' => Array( + 'type' => 'string', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'bysetpos' => Array( + 'type' => 'string', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'byweekno' => Array( + 'type' => 'string', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'byyearday' => Array( + 'type' => 'string', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'cn' => Array( + 'type' => 'text', + 'quoted' => True, + 'to_text' => False, + 'properties' => Array( + 'attendee' => True, + 'organizer' => True + ) + ), + 'count' => Array( + 'type' => 'integer', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'cu' => Array( + 'type' => 'function', + 'function' => 'switch_cu', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'attendee' => True + ) + ), + 'delegated_from' => Array( + 'type' => 'function', + 'function' => 'switch_mailto', + 'quoted' => True, + 'to_text' => False, + 'properties' => Array( + 'attendee' => True + ) + ), + 'delegated_to' => Array( + 'type' => 'function', + 'function' => 'switch_mailto', + 'quoted' => True, + 'to_text' => False, + 'properties' => Array( + 'attendee' => True + ) + ), + 'dir' => Array( + 'type' => 'dir', + 'quoted' => True, + 'to_text' => True, + 'properties' => Array( + 'attendee' => True, + 'organizer' => True + ) + ), + 'enocding' => Array( + 'type' => 'function', + 'function' => 'switch_encoding', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'attach' => True + ) + ), + 'fmttype' => Array( + 'type' => 'text', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'attach' => True + ) + ), + 'fbtype' => Array( + 'type' => 'function', + 'function' => 'switch_fbtype', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'attach' => True + ) + ), + 'freq' => Array( + 'type' => 'function', + 'function' => 'switch_freq', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'interval' => Array( + 'type' => 'integer', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'language' => Array( + 'type' => 'text', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'categories' => True, + 'comment' => True, + 'description' => True, + 'location' => True, + 'resources' => True, + 'summary' => True, + 'tzname' => True, + 'attendee' => True, + 'contact' => True, + 'organizer' => True, + 'x-type' => True + ) + ), + 'mailto' => Array( + 'type' => 'function', + 'function' => 'switch_mailto', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'attendee' => True, + 'organizer' => True + ) + ), + 'member' => Array( + 'type' => 'function', + 'function' => 'switch_mailto', + 'quoted' => True, + 'to_text' => False, + 'properties' => Array( + 'attendee' => True + ) + ), + 'partstat' => Array( + 'type' => 'function', + 'function' => 'switch_partstat', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'attendee' => True + ) + ), + 'range' => Array( + 'type' => 'function', + 'function' => 'switch_range', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'recurrence_id' => True + ) + ), + 'related' => Array( + 'type' => 'function', + 'function' => 'switch_related', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'related_to' => True + ) + ), + 'role' => Array( + 'type' => 'function', + 'function' => 'switch_role', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'attendee' => True + ) + ), + 'rsvp' => Array( + 'type' => 'function', + 'function' => 'switch_rsvp', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'attendee' => True + ) + ), + 'sent_by' => Array( + 'type' => 'function', + 'function' => 'parse_user_host', + 'quoted' => True, + 'to_text' => False, + 'properties' => Array( + 'attendee' => True, + 'organizer' => True + ) + ), + 'tzid' => Array( + 'type' => 'text', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'dtend' => True, + 'due' => True, + 'dtstart' => True, + 'recurrence_id' => True, + 'exdate' => True, + 'rdate' => True + ) + ), + 'until' => Array( + 'type' => 'function', + 'function' => 'switch_date', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'value' => Array( + 'type' => 'value', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'calscale' => True, + 'method' => True, + 'prodid' => True, + 'version' => True, + 'attach' => True, + 'categories' => True, + 'class' => True, + 'comment' => True, + 'description' => True, + 'geo' => True, + 'location' => True, + 'percent' => True, + 'priority' => True, + 'resources' => True, + 'status' => True, + 'summary' => True, + 'completed' => True, + 'dtend' => True, + 'due' => True, + 'dtstart' => True, + 'duration' => True, + 'freebusy' => True, + 'transp' => True, + 'tzid' => True, + 'tzname' => True, + 'tzoffsetfrom' => True, + 'tzoffsetto' => True, + 'tzurl' => True, + 'attendee' => True, + 'contact' => True, + 'organizer' => True, + 'recurrence_id' => True, + 'url' => True, + 'uid' => True, + 'exdate' => True, + 'exrule' => True, + 'rdate' => True, + 'rrule' => True, + 'action' => True, + 'repeat' => True, + 'trigger' => True, + 'created' => True, + 'dtstamp' => True, + 'last_modified' => True, + 'sequence' => True, + 'x_type' => True, + 'request_status' => True + ) + ), + 'wkst' => Array( + 'type' => 'string', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'rrule' => True + ) + ), + 'x_type' => Array( + 'type' => 'x_type', + 'quoted' => False, + 'to_text' => False, + 'properties' => Array( + 'calscale' => True, + 'method' => True, + 'prodid' => True, + 'version' => True, + 'attach' => True, + 'categories' => True, + 'class' => True, + 'comment' => True, + 'description' => True, + 'geo' => True, + 'location' => True, + 'percent' => True, + 'priority' => True, + 'resources' => True, + 'status' => True, + 'summary' => True, + 'completed' => True, + 'dtend' => True, + 'due' => True, + 'dtstart' => True, + 'duration' => True, + 'freebusy' => True, + 'transp' => True, + 'tzid' => True, + 'tzname' => True, + 'tzoffsetfrom' => True, + 'tzoffsetto' => True, + 'tzurl' => True, + 'attendee' => True, + 'contact' => True, + 'organizer' => True, + 'recurrence_id' => True, + 'url' => True, + 'uid' => True, + 'exdate' => True, + 'exrule' => True, + 'rdate' => True, + 'rrule' => True, + 'action' => True, + 'repeat' => True, + 'trigger' => True, + 'created' => True, + 'dtstamp' => True, + 'last_modified' => True, + 'sequence' => True, + 'x_type' => True, + 'request_status' => True + ) + ) + ); } function set_var(&$event,$type,$value) @@ -747,12 +1421,12 @@ class vCalendar if(ereg("^[\=\:]",$char)) { $found = True; - $ret_str = str_replace('=3D','=',str_replace('%20',' ',substr($str,0,$i))); + $ret_str = substr($str,0,$i); $return_value[] = $ret_str; $ret_array = $this->explode_param(substr($str,$i + 1),'"',False); while(list($key,$value) = each($ret_array)) { - $return_value[] = str_replace('=3D','=',str_replace('%20',' ',$value)); + $return_value[] = $value; } $i = $str_len; } @@ -760,7 +1434,7 @@ class vCalendar } if(!$found) { - $return_value[] = str_replace('=3D','=',str_replace('%20',' ',$str)); + $return_value[] = $str; } } else @@ -817,6 +1491,44 @@ class vCalendar return $str; } + function from_dir($str) + { + return str_replace('=3D','=',str_replace('%20',' ',$str)); + } + + function to_dir($str) + { + return str_replace('=','=3D',str_replace(' ','%20',$str)); + } + + function find_parameters($property) + { + reset($this->parameter); + while(list($key,$param_array) = each($this->parameter)) + { + if($param_array['properties'][$property]) + { + $param[] = $key; + } + } + reset($param); + return $param; + } + + function find_properties($ical_type) + { + reset($this->property); + while(list($key,$param_array) = each($this->property)) + { + if($param_array[$ical_type]) + { + $prop[] = $key; + } + } + reset($prop); + return $prop; + } + function new_vcal() { return new vCal; @@ -842,6 +1554,21 @@ class vCalendar $this->set_var($dtime,'hour',intval(substr($value,9,2))); $this->set_var($dtime,'min',intval(substr($value,11,2))); $this->set_var($dtime,'sec',intval(substr($value,13,2))); + if(strlen($value) > 14) + { + if(substr($value,14,1) != 'Z') + { + + } + } + else + { + /* + * The time provided by the vCal is considered local time. + * + * The implementor will need to consider how to convert that time to UTC. + */ + } } else { @@ -872,28 +1599,6 @@ class vCalendar return $dtime; } - function parse_host_user($address) - { - if(strpos(' '.$address,':')) - { - $parts = explode(':',$address); - $address = $parts[1]; - } - - $parts = explode('@',$address); - if(count($parts) == 2) - { - $temp_address = new class_mailto; - $temp_address->user = $parts[0]; - $temp_address->host = $parts[1]; - return $temp_address; - } - else - { - return False; - } - } - function parse_geo(&$event,$value) { $return_value = $this->explode_param($value,'"',True); @@ -909,38 +1614,76 @@ class vCalendar $temp_x_type = new class_x_type; $temp_x_type->name = strtoupper(substr($majortype,2)); $temp_x_type->value = $value; - $event[] = $temp_x_type; + $event->x_type[] = $temp_x_type; unset($temp_x_type); } - function parse_text(&$event,$value) + function parse_parameters(&$event,$majortype,$value) { $return_value = $this->explode_param($value,'"',True); if(count($return_value) > 0) { for($i=0;$istrip_quotes($return_value[$i+1]); - switch(strtolower($type[0])) + $name = $return_value[$i]; + $value = $this->strip_quotes($return_value[$i+1]); + if(substr($name,0,2) == 'X-') { - case 'altrep': - case 'fmttype': - case 'cid': - case 'language': - $this->set_var($event,strtolower($type[0]),$type[1]); - break; - case 'encoding': - $this->set_var($event,strtolower($type[0]),$this->switch_encoding($type[1])); - break; - case 'value': - break; - default: - if($type[0] <> "\\n") + $param = 'x_type'; + $name = str_replace('-','_',$name); + } + else + { + $param = str_replace('-','_',strtolower($name)); + if(!isset($this->parameter[$param])) + { + if($majortype == 'attendee' || $majortype == 'organizer') { - $this->set_var($event,'value',$type[0]); + $param = 'mailto'; + $value = $name; + $name = $param; } - break; + else + { + $param = 'value'; + } + } + } +// echo "name : $name : Param = $param
\n"; + if(@$this->parameter[$param]['properties'][$majortype]) + { + switch(@$this->parameter[$param]['type']) + { + case 'dir': + $this->set_var($event,$name,$this->from_dir($value)); + break; + case 'text': + $this->set_var($event,$name,$value); + break; + case 'x_type': + $this->parse_xtype($event,$name,$value); + break; + case 'function': + $function = $this->parameter[$param]['function']; + $this->set_var($event,$name,$this->$function($value)); + break; + case 'uri': + if(@$this->parameter[$param]['to_text']) + { + $value = $this->to_text($value); + } + $this->set_var($event,$name,$value); + break; + case 'integer': + $this->set_var($event,$name,intval($value)); + break; + case 'value': + if($name <> "\\n") + { + $this->set_var($event,$param,$name); + } + break; + } } } } @@ -950,42 +1693,6 @@ class vCalendar } } - function parse_address(&$event,$value) - { - $param = $this->explode_param($value,'"',True); - - for($j=0;$jstrip_quotes($param[$j+1]); - switch($type[0]) - { - case 'role': - $val = $this->switch_role($type[1]); - break; - case 'partstat': - $val = $this->switch_partstat($type[1]); - break; - case 'rsvp': - $val = $this->switch_rsvp($type[1]); - break; - case 'delegated-from': - case 'delegated-to': - case 'mailto': - $type[0] = str_replace('-','_',$type[0]); - $val = $this->parse_host_user($type[1]); - break; - case 'dir': - $val = $type[1]; - break; - default: - $val = $type[1]; - break; - } - $this->set_var($event,$type[0],$val); - } - } - function parse_recurrence(&$event,$value) { $return_value = $this->explode_param($value,'"',True); @@ -1004,59 +1711,128 @@ class vCalendar * Build-Card Functions */ - function build_cal_address($event) + function build_xtype($x_type,$seperator='=') + { + $quote = ''; + if($seperator == '=') + { + $quote = '"'; + } + + return $this->fold('X-'.$x_type->name.$seperator.$quote.$x_type->value.$quote); + } + + function build_cal_address($event,$property) { $str = ''; - if(!empty($event->cn) && $event->cn <> 'Unknown') + $include_mailto = False; + $include_datetime = False; + $param = $this->find_parameters($property); + while(list($dumb_key,$key) = each($param)) { - $str .= ';CN="'.$event->cn.'"'; + if($key == 'mailto') + { + $include_mailto = True; + continue; + } + $param_array = @$this->parameter[$key]; + $type = @$param_array['type']; + if($type == 'date-time') + { + $include_datetime = True; + continue; + } + $quote = (@$param_array['quoted']?'"':''); + if(!empty($event->$key) && @$param_array['properties'][$property]) + { + $change_text = @$param_array['to_text']; + $value = $event->$key; + if($change_text && $type == 'text') + { + $value = $this->to_text($value); + } + switch($type) + { + case 'dir': + $str .= ';'.str_replace('_','-',strtoupper($key)).'='.$quote.$this->to_dir($value).$quote; + break; + case 'function': + $str .= ';'.str_replace('_','-',strtoupper($key)).'='; + $function = @$param_array['function']; + $str .= $quote.$this->$function($value).$quote; + break; + case 'text': + $str .= ';'.strtoupper($key).'='.$quote.$value.$quote; + break; + case 'date-time': + $str .= ':'.date('Ymd\THms\Z',mktime($event->hour,$event->min,$event->sec,$event->month,$event->mday,$event->year)); + + } + unset($value); + } } - if(!empty($event->dir)) + + if(!empty($event->x_type)) { - $str .= ';DIR="'.str_replace('=','=3D',str_replace(' ','%20',$event->dir)).'"'; + for($j=0;$jx_type);$j++) + { + $str .= ';'.$this->build_xtype($event->x_type[$j],'='); + } } - if(!empty($event->role)) + if(!empty($event->value)) { - $str .= ';ROLE='.$this->switch_role($event->role); + if($to_text) + { + $event->value = $this->to_text($event->value); + } + $str .= ':'.$event->value; } - if(!empty($event->rsvp)) + if($include_mailto == True) { - $str .= ';RSVP='.$this->switch_rsvp($event->rsvp); + $key = 'mailto'; + $function = $this->parameter[$key]['function']; + $str .= ':'.$this->$function($event->$key); } - if(!empty($event->delegated_from->user) && !empty($event->delegated_from->host)) + if($include_datetime == True || @$this->property[$property]['type'] == 'date-time') { - $str .= ';DELEGATED-FROM="MAILTO:'.$event->delegated_from->user.'@'.$event->delegated_from->host.'"'; - } - if(!empty($event->delegated_to->user) && !empty($event->delegated_to->host)) - { - $str .= ';DELEGATED-TO="MAILTO:'.$event->delegated_to->user.'@'.$event->delegated_to->host.'"'; - } - if(!empty($event->mailto->user) && !empty($event->mailto->host)) - { - $str .= ':MAILTO:'.$event->mailto->user.'@'.$event->mailto->host; + $str .= ':'.date('Ymd\THms\Z',mktime($event->hour,$event->min,$event->sec,$event->month,$event->mday,$event->year)); } return $str; } - function build_text($event,$to_text) + function build_text($event,$property) { $str = ''; - if(!empty($event->cid)) + $param = $this->find_parameters($property); + while(list($dumb_key,$key) = each($param)) { - $str .= ';CID="'.$event->cid.'"'; + if(!empty($event->$key)) + { + $type = @$this->parameter[$key]['type']; + $quote = @$this->parameter[$key]['quote']; + if(@$this->parameter[$key]['to_text'] == True) + { + $value = $this->to_text($event->$key); + } + else + { + $value = $event->$key; + } + switch($type) + { + case 'text': + $str .= ';'.strtoupper($key).'='.$quote.$value.$quote; + break; + } + } } - if(!empty($event->altrep)) + if(!empty($event->x_type)) { - $str .= ';ALTREP="'.$event->altrep.'"'; + for($j=0;$jx_type);$j++) + { + $str .= ';'.$this->build_xtype($event->x_type[$j],'='); + } } - if(!empty($event->fmttype)) - { - $str .= ';FMTTYPE='.$event->fmttype; - } - if(!empty($event->encoding)) - { - $str .= ';ENCODING='.$this->switch_encoding($event->encoding); - } if(!empty($event->value)) { if($to_text) @@ -1092,135 +1868,138 @@ class vCalendar return ':'.date('Ymd\THms\Z',mktime($event->hour,$event->min,$event->sec,$event->month,$event->mday,$event->year)); } - function build_xtype($x_type) - { - return $this->fold('X-'.$x_type->name.':'.$x_type->value); - } - function build_card_internals($ical_item,$event) { - reset($this->property); - while(list($key,$varray) = each($this->property)) + $prop = $this->find_properties($ical_item); + reset($prop); + while(list($dumb_key,$key) = each($prop)) { $value = $key; + $varray = $this->property[$key]; $type = $varray['type']; $to_text = $varray['to_text']; $state = @$varray[$ical_item]['state']; $multiples = @$varray[$ical_item]['multiples']; - if(@$state == 'optional' || @$state == 'required') + switch($type) { - switch($type) - { - case 'date-time': - switch($value) - { - case 'last_modified': - $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':'.gmdate('Ymd\THms\Z')); - break; - default: - if(!empty($event->$value)) - { - if($multiples) - { - for($i=0;$i$value);$i++) - { - $str .= $this->fold(strtoupper($value).$this->build_datetime($event->{$value}[$i])); - } - } - else - { - $str .= $this->fold(strtoupper($value).$this->build_datetime($event->$value)); - } - } - elseif($value == 'dtstamp' || $value == 'created') - { - $str .= $this->fold(strtoupper($value).':'.gmdate('Ymd\THms\Z')); - } - break; - } - break; - case 'uri': - if(!empty($event->$value)) + case 'date-time': + if(!empty($event->$value)) + { + if($multiples) { for($i=0;$i$value);$i++) { - $str .= $this->fold(strtoupper($value).$this->build_text($event->{$value}[$i],$to_text)); +// $str .= $this->fold(strtoupper($value).$this->build_datetime($event->{$value}[$i])); + $str .= $this->fold(strtoupper($value).$this->build_cal_address($event->{$value}[$i],$value)); } } - break; - case 'recur': - if(!empty($event->$value)) + else { - if($multiples) +// $str .= $this->fold(strtoupper($value).$this->build_datetime($event->$value)); + $str .= $this->fold(strtoupper($value).$this->build_cal_address($event->$value,$value)); + } + } + elseif($value == 'dtstamp' || $value == 'created') + { + $str .= $this->fold(strtoupper($value).':'.gmdate('Ymd\THms\Z')); + } + break; + case 'uri': + if(!empty($event->$value)) + { + for($i=0;$i$value);$i++) + { + $str .= $this->fold(strtoupper($value).$this->build_text($event->{$value}[$i],$to_text)); + } + } + break; + case 'recur': + if(!empty($event->$value)) + { + if($multiples) + { + for($i=0;$i$value);$i++) { - for($i=0;$i$value);$i++) - { - $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_recur($event->{$value}[$i])); - } + $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_recur($event->{$value}[$i])); } - else + } + else + { + $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_recur($event->$value)); + } + } + break; + case 'integer': + if(!empty($event->$value)) + { + $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':'.$event->$value); + } + elseif($value == 'sequence' || $value == 'percent_complete') + { + $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':0'); + } + break; + case 'float': + if(!empty($event->$value)) + { + $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':'.$event->$value->lat.';'.$event->$value->lon); + } + break; + case 'text': +// if(empty($event->$value) && $state == 'required') +// { +// return ''; +// } + if(!empty($event->$value)) + { + if($multiples) + { + for($i=0;$i$value);$i++) { - $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_recur($event->$value)); +// $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_text($event->{$value}[$i],$to_text)); + $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_cal_address($event->{$value}[$i],$value)); } } - break; - case 'integer': - if(!empty($event->$value)) + else { - $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':'.$event->$value); +// $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_text($event->$value,$to_text)); + $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_cal_address($event->$value,$value)); } - elseif($value == 'sequence' || $value == 'percent_complete') + } + break; + case 'cal-address': + if(!empty($event->$value)) + { + for($j=0;$j$value);$j++) { - $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':0'); - } - break; - case 'float': - if(!empty($event->$value)) - { - $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':'.$event->$value->lat.';'.$event->$value->lon); - } - break; - case 'text': - if(empty($event->$value) && $state == 'required') - { - return ''; - } - if(!empty($event->$value)) - { - if($multiples) + $temp_output = $this->build_cal_address($event->{$value}[$j],$value); + if($temp_output) { - for($i=0;$i$value);$i++) - { - $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_text($event->{$value}[$i],$to_text)); - } - } - else - { - $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_text($event->$value,$to_text)); + $str .= $this->fold(strtoupper($value).$temp_output); } } - break; - case 'cal-address': - if(!empty($event->$value)) - { - for($j=0;$j$value);$j++) - { - $temp_output = $this->build_cal_address($event->{$value}[$j]); - if($temp_output) - { - $str .= $this->fold(strtoupper($value).$temp_output); - } - } - } - break; - } + } + break; } } if(!empty($event->x_type)) { for($i=0;$ix_type);$i++) { - $str .= $this->build_xtype($event->x_type[$i]); + $str .= $this->build_xtype($event->x_type[$i],':'); + } + } + + if($ical_item == 'vtimezone') + { + if($event->tzdata) + { + for($k=0;$ktzdata);$k++) + { + $str .= 'BEGIN:'.strtoupper($event->tzdata[$k]->type)."\r\n"; + $str .= $this->build_card_internals(strtolower($event->tzdata[$k]->type),$event->tzdata[$k]); + $str .= 'END:'.strtoupper($event->tzdata[$k]->type)."\r\n"; + } } } return $str; @@ -1230,9 +2009,154 @@ class vCalendar * Switching Functions */ - function switch_encoding($var) + function switch_class($var) + { + if(is_string($var)) + { + switch($var) + { + case 'PRIVATE': + return PRIVATE; + break; + case 'PUBLIC': + return PUBLIC; + break; + case 'CONFIDENTIAL': + return CONFIDENTIAL; + break; + } + } + elseif(is_int($var)) + { + switch($var) + { + case PRIVATE: + return 'PRIVATE'; + break; + case PUBLIC: + return 'PUBLIC'; + break; + case CONFIDENTIAL: + return 'CONFIDENTIAL'; + break; + } + } + else + { + return $var; + } + } + + function switch_cu($var) { if(gettype($var) == 'string') + { + switch($var) + { + case 'INDIVIDUAL': + return INDIVIDUAL; + break; + case 'GROUP': + return GROUP; + break; + case 'RESOURCE': + return RESOURCE; + break; + case 'ROOM': + return ROOM; + break; + case 'UNKNOWN': + return UNKNOWN; + break; + default: + return OTHER; + break; + } + } + elseif(gettype($var) == 'integer') + { + switch($var) + { + case INDIVIDUAL: + return 'INDIVIDUAL'; + break; + case GROUP: + return 'GROUP'; + break; + case RESOURCE: + return 'RESOURCE'; + break; + case ROOM: + return 'ROOM'; + break; + case UNKNOWN: + return 'UNKNOWN'; + break; + default: + return 'X-OTHER'; + break; + } + } + else + { + return $var; + } + } + + function switch_date($var) + { + if(is_string($var)) + { + $dtime = new class_datetime; + if(strpos($value,':')) + { + $pos = explode(':',$value); + $value = $pos[1]; + } + $this->set_var($dtime,'year',intval(substr($value,0,4))); + $this->set_var($dtime,'month',intval(substr($value,4,2))); + $this->set_var($dtime,'mday',intval(substr($value,6,2))); + if(substr($value,8,1) == 'T') + { + $this->set_var($dtime,'hour',intval(substr($value,9,2))); + $this->set_var($dtime,'min',intval(substr($value,11,2))); + $this->set_var($dtime,'sec',intval(substr($value,13,2))); + if(strlen($value) > 14) + { + if(substr($value,14,1) != 'Z') + { + } + } + else + { + /* + * The time provided by the vCal is considered local time. + * + * The implementor will need to consider how to convert that time to UTC. + */ + } + } + else + { + $this->set_var($dtime,'hour',0); + $this->set_var($dtime,'min',0); + $this->set_var($dtime,'sec',0); + } + return $dtime; + } + elseif(is_object($var)) + { + return date('Ymd\THms\Z',mktime($var->hour,$var->min,$var->sec,$var->month,$var->mday,$var->year)); + } + else + { + return $var; + } + } + + function switch_encoding($var) + { + if(is_string($var)) { switch($var) { @@ -1247,7 +2171,7 @@ class vCalendar break; } } - elseif(gettype($var) == 'integer') + elseif(is_int($var)) { switch($var) { @@ -1268,26 +2192,82 @@ class vCalendar } } - function switch_role($var) + function switch_fbtype($var) { - if(gettype($var) == 'string') + if(is_string($var)) { switch($var) { - case 'NONE': - return NONE; + case 'FREE': + return FREE; break; - case 'CHAIR': - return CHAIR; + case 'BUSY': + return BUSY; break; - case 'REQ-PARTICIPANT': - return REQ_PARTICIPANT; + case 'BUSY-UNAVAILABLE': + return BUSY_UNAVAILABLE; break; - case 'OPT-PARTICIPANT': - return OPT_PARTICIPANT; + case 'BUSY-TENTATIVE': + return BUSY_TENTATIVE; break; - case 'NON-PARTICIPANT': - return NON_PARTICIPANT; + default: + return OTHER; + break; + } + } + elseif(is_int($var)) + { + switch($var) + { + case FREE: + return 'FREE'; + break; + case BUSY: + return 'BUSY'; + break; + case BUSY_UNAVAILABLE: + return 'BUSY-UNAVAILABLE'; + break; + case BUSY_TENTATIVE: + return 'BUSY-TENTATIVE'; + break; + default: + return 'OTHER'; + break; + } + } + else + { + return $var; + } + } + + function switch_freq($var) + { + if(is_string($var)) + { + switch($var) + { + case 'SECONDLY': + return SECONDLY; + break; + case 'MINUTELY': + return MINUTELY; + break; + case 'HOURLY': + return HOURLY; + break; + case 'DAILY': + return DAILY; + break; + case 'WEEKLY': + return WEEKLY; + break; + case 'MONTHLY': + return MONTHLY; + break; + case 'YEARLY': + return YEARLY; break; } } @@ -1295,20 +2275,26 @@ class vCalendar { switch($var) { - case NONE: - return 'NONE'; + case SECONDLY: + return 'SECONDLY'; break; - case CHAIR: - return 'CHAIR'; + case MINUTELY: + return 'MINUTELY'; break; - case REQ_PARTICIPANT: - return 'REQ-PARTICIPANT'; + case HOURLY: + return 'HOURLY'; break; - case OPT_PARTICIPANT: - return 'OPT-PARTICIPANT'; + case DAILY: + return 'DAILY'; break; - case NON_PARTICIPANT: - return 'NON-PARTICIPANT'; + case WEEKLY: + return 'WEEKLY'; + break; + case MONTHLY: + return 'MONTHLY'; + break; + case YEARLY: + return 'YEARLY'; break; } } @@ -1318,9 +2304,39 @@ class vCalendar } } + function switch_mailto($var) + { + if(is_string($var)) + { + if(strpos(' '.$var,':')) + { + $parts = explode(':',$var); + $var = $parts[1]; + } + + $parts = explode('@',$var); + if(count($parts) == 2) + { + $temp_address = new class_mailto; + $temp_address->user = $parts[0]; + $temp_address->host = $parts[1]; + return $temp_address; + } + else + { + return False; + } + } + elseif(is_object($var)) + { + $str = 'MAILTO:'.$var->user.'@'.$var->host; + return $str; + } + } + function switch_partstat($var) { - if(gettype($var) == 'string') + if(is_string($var)) { switch($var) { @@ -1350,7 +2366,7 @@ class vCalendar break; } } - elseif(gettype($var) == 'integer') + elseif(is_int($var)) { switch($var) { @@ -1386,26 +2402,178 @@ class vCalendar } } + function switch_range($var) + { + if(is_string($var)) + { + switch($var) + { + case 'THISANDPRIOR': + return THISANDPRIOR; + break; + case 'THISANDFUTURE': + return THISANDFUTURE; + break; + } + } + elseif(is_int($var)) + { + switch($var) + { + case THISANDPRIOR: + return 'THISANDPRIOR'; + break; + case THISANDFUTURE: + return 'THISANDFUTURE'; + break; + } + } + else + { + return $var; + } + } + + function switch_related($var) + { + if(is_string($var)) + { + switch($var) + { + case 'START': + return START; + break; + case 'END': + return END; + break; + } + } + elseif(is_int($var)) + { + switch($var) + { + case START: + return 'START'; + break; + case END: + return 'END'; + break; + } + } + else + { + return $var; + } + } + + function switch_reltype($var) + { + if(is_string($var)) + { + switch($var) + { + case 'PARENT': + return PARENT; + break; + case 'CHILD': + return CHILD; + break; + case 'SIBLING': + return SIBLING; + break; + } + } + elseif(is_int($var)) + { + switch($var) + { + case PARENT: + return 'PARENT'; + break; + case CHILD: + return 'CHILD'; + break; + case SIBLING: + return 'SIBLING'; + break; + } + } + else + { + return $var; + } + } + + function switch_role($var) + { + if(is_string($var)) + { + switch($var) + { + case 'NONE': + return NONE; + break; + case 'CHAIR': + return CHAIR; + break; + case 'REQ-PARTICIPANT': + return REQ_PARTICIPANT; + break; + case 'OPT-PARTICIPANT': + return OPT_PARTICIPANT; + break; + case 'NON-PARTICIPANT': + return NON_PARTICIPANT; + break; + } + } + elseif(is_int($var)) + { + switch($var) + { + case NONE: + return 'NONE'; + break; + case CHAIR: + return 'CHAIR'; + break; + case REQ_PARTICIPANT: + return 'REQ-PARTICIPANT'; + break; + case OPT_PARTICIPANT: + return 'OPT-PARTICIPANT'; + break; + case NON_PARTICIPANT: + return 'NON-PARTICIPANT'; + break; + } + } + else + { + return $var; + } + } + function switch_rsvp($var) { - if(gettype($var) == 'string') + if(is_string($var)) { if($var == 'TRUE') { return 1; } - else + elseif($var == 'FALSE') { return 0; } } - elseif(gettype($var) == 'integer') + elseif(is_int($var) || $var == False) { if($var == 1) { return 'TRUE'; } - else + elseif($var == 0) { return 'FALSE'; } @@ -1416,47 +2584,9 @@ class vCalendar } } - function switch_class($var) - { - if(gettype($var) == 'string') - { - switch($var) - { - case 'PRIVATE': - return PRIVATE; - break; - case 'PUBLIC': - return PUBLIC; - break; - case 'CONFIDENTIAL': - return CONFIDENTIAL; - break; - } - } - elseif(gettype($var) == 'integer') - { - switch($var) - { - case PRIVATE: - return 'PRIVATE'; - break; - case PUBLIC: - return 'PUBLIC'; - break; - case CONFIDENTIAL: - return 'CONFIDENTIAL'; - break; - } - } - else - { - return $var; - } - } - function switch_transp($var) { - if(gettype($var) == 'string') + if(is_string($var)) { switch($var) { @@ -1468,7 +2598,7 @@ class vCalendar break; } } - elseif(gettype($var) == 'integer') + elseif(is_int($var)) { switch($var) { @@ -1494,7 +2624,9 @@ class vCalendar { $i = 0; $mode = 'none'; - while(chop($vcal_text[$i]) != '') + $standard = Array(); + $max_lines = count($vcal_text); + while($i < $max_lines) { // if(strlen($vcal_text[$i]) > 75) // { @@ -1502,11 +2634,12 @@ class vCalendar // } $this->unfold($vcal_text,$i); - + $max_lines = count($vcal_text); + $vcal_text[$i] = str_replace("\r\n",'',$vcal_text[$i]); // echo "TEXT : ".$vcal_text[$i]."
\n"; - +// flush(); // Example #1 //vcal_text[$i] = 'BEGIN:VCALENDAR' @@ -1553,11 +2686,6 @@ class vCalendar $value = $vcal_text[$i]; } -// if($majortype == 'begin' || $majortype == 'end') -// { -// $mode = 'none'; -// } - if($mode != 'none' && ($majortype != 'begin' && $majortype != 'end')) { if(isset($this->property[$majortype])) @@ -1590,12 +2718,38 @@ class vCalendar { switch(strtolower($value)) { + case 'daylight': + $mode = 'daylight'; + $t_event = new class_timezone; + $t_event = $event; + unset($event); + $event = new class_tzprop; + $event->type = strtolower($value); + break; + case 'standard': + $mode = 'standard'; + $t_event = new class_timezone; + $t_event = $event; + unset($event); + $event = new class_tzprop; + $event->type = strtolower($value); + break; + case 'valarm': + if($mode == 'vevent' || $mode == 'vtodo') + { + $mode = 'valarm'; + $t_event = $event; + unset($event); + $event = new class_alarm; + $event->type = strtolower($value); + } + break; case 'vcalendar': $vcal = $this->new_vcal(); break; case 'vevent': $mode = 'vevent'; - $event = new vCalendar_item; + $event = new class_event; $event->type = strtolower($value); break; case 'vfreebusy': @@ -1603,7 +2757,6 @@ class vCalendar $event = new vCalendar_item; $event->type = strtolower($value); break; - break; case 'vjournal': $mode = 'vjournal'; $event = new vCalendar_item; @@ -1611,23 +2764,14 @@ class vCalendar break; case 'vtimezone': $mode = 'vtimezone'; - $event = new vCalendar_item; + $event = new class_timezone; $event->type = strtolower($value); break; - break; case 'vtodo': $mode = 'vtodo'; - $event = new vCalendar_item; + $event = new class_todo; $event->type = strtolower($value); break; - case 'valarm': - if($mode == 'vevent' || $mode == 'vtodo') - { - $tmode = $mode; - $mode = 'valarm'; - $alarm = new vCalendar_alarm; - } - break; } } elseif($majortype == 'end') @@ -1635,15 +2779,33 @@ class vCalendar $mode = 'none'; switch(strtolower($value)) { + case 'daylight': + $tzdata[] = $event; + unset($event); + $event = $t_event; + unset($t_event); + $mode = 'vtimezone'; + break; + case 'standard': + $tzdata[] = $event; + unset($event); + $event = $t_event; + unset($t_event); + $mode = 'vtimezone'; + break; case 'valarm': - if($mode == 'valarm') - { - $event->alarm[] = $alarm; - unset($alarm); - $mode = $tmode; - } + $alarm[] = $event; + unset($event); + $event = $t_event; + unset($t_event); + $mode = $tmode; break; case 'vevent': + if(!empty($alarm)) + { + $event->alarm = $alarm; + unset($alarm); + } $this->event[] = $event; unset($event); break; @@ -1656,10 +2818,20 @@ class vCalendar unset($event); break; case 'vtimezone': + if(!empty($tzdata)) + { + $event->tzdata = $tzdata; + unset($tzdata); + } $this->timezone[] = $event; unset($event); break; case 'vtodo': + if(!empty($alarm)) + { + $event->alarm = $alarm; + unset($alarm); + } $this->todo[] = $event; unset($event); break; @@ -1673,9 +2845,9 @@ class vCalendar break 2; } } - elseif($majortype == 'prodid' || $majortype == 'version' || $majortype == 'method') + elseif($majortype == 'prodid' || $majortype == 'version' || $majortype == 'method' || $majortype == 'calscale') { - $this->parse_text($vcal->$majortype,$this->from_text($value)); + $this->parse_parameters($vcal->$majortype,$majortype,$this->from_text($value)); } else @@ -1688,7 +2860,7 @@ class vCalendar { case 'text': $text_class = new class_text; - $this->parse_text($text_class,$value); + $this->parse_parameters($text_class,$majortype,$value); if($multiples) { $event->{$majortype}[] = $text_class; @@ -1725,9 +2897,12 @@ class vCalendar $event->$majortype = new class_geo; $this->parse_geo($event->$majortype,$value); break; + case 'utc-offset': + $this->set_var($event,$majortype,intval($value)); + break; case 'cal-address': $address = new class_address; - $this->parse_address($address,$value); + $this->parse_parameters($address,$majortype,$value); if($multiples) { $event->{$majortype}[] = $address; @@ -1740,7 +2915,7 @@ class vCalendar break; case 'recur': $recur = new class_recur; - $this->parse_recurrence($recur,$value); + $this->parse_parameters($recur,$majortype,$value); if($multiples) { $event->{$majortype}[] = $recur; @@ -1753,7 +2928,7 @@ class vCalendar break; case 'uri': $new_var = new class_text; - $this->parse_text($new_var,$value); + $this->parse_parameters($new_var,$majortype,$value); if($multiples) { switch($mode) @@ -1773,7 +2948,7 @@ class vCalendar unset($new_var); break; case 'xtype': - $this->parse_xtype($event->x_type,$majortype,$value); + $this->parse_xtype($event,$majortype,$value); break; } @@ -1808,6 +2983,8 @@ class vCalendar $str .= $this->build_card_internals('v'.$vtype,$vcal->{$vtype}[$i]); $str .= 'END:V'.strtoupper($vtype)."\r\n"; } +// echo "STR #$i : $str
\n"; +// flush(); } } $str .= 'END:VCALENDAR'."\r\n";