diff --git a/plugins/calendar/lib/calendar_ical.php b/plugins/calendar/lib/calendar_ical.php index d2e06cb5..06e773ea 100644 --- a/plugins/calendar/lib/calendar_ical.php +++ b/plugins/calendar/lib/calendar_ical.php @@ -25,6 +25,8 @@ class calendar_ical { + const EOL = "\r\n"; + private $rc; private $driver; @@ -53,35 +55,37 @@ class calendar_ical * @param array Events as array * @return string Events in iCalendar format (http://tools.ietf.org/html/rfc5545) */ - public function export($events) + public function export($events, $method = null) { if (!empty($this->rc->user->ID)) { - $ical = "BEGIN:VCALENDAR\r\n"; - $ical .= "VERSION:2.0\r\n"; - $ical .= "PRODID:-//Roundcube Webmail " . RCMAIL_VERSION . "//NONSGML Calendar//EN\r\n"; - $ical .= "CALSCALE:GREGORIAN\r\n"; + $ical = "BEGIN:VCALENDAR" . self::EOL; + $ical .= "VERSION:2.0" . self::EOL; + $ical .= "PRODID:-//Roundcube Webmail " . RCMAIL_VERSION . "//NONSGML Calendar//EN" . self::EOL; + $ical .= "CALSCALE:GREGORIAN" . self::EOL; + + if ($method) + $ical .= "METHOD:" . strtoupper($method) . self::EOL; foreach ($events as $event) { - $ical .= "BEGIN:VEVENT\r\n"; - $ical .= "UID:" . self::escpape($event['uid']) . "\r\n"; - $ical .= "DTSTART:" . gmdate('Ymd\THis\Z', $event['start']) . "\r\n"; - $ical .= "DTEND:" . gmdate('Ymd\THis\Z', $event['end']) . "\r\n"; - $ical .= "SUMMARY:" . self::escpape($event['title']) . "\r\n"; - $ical .= "DESCRIPTION:" . wordwrap(self::escpape($event['description']),75,"\r\n ") . "\r\n"; - - if (!empty($event['attendees'])){ - - $ical .= $this->_get_attendees($event['attendees']); - } - + $ical .= "BEGIN:VEVENT" . self::EOL; + $ical .= "UID:" . self::escpape($event['uid']) . self::EOL; + $ical .= "DTSTART:" . gmdate('Ymd\THis\Z', $event['start']) . self::EOL; + $ical .= "DTEND:" . gmdate('Ymd\THis\Z', $event['end']) . self::EOL; + $ical .= "SUMMARY:" . self::escpape($event['title']) . self::EOL; + $ical .= "DESCRIPTION:" . self::escpape($event['description']) . self::EOL; + + if (!empty($event['attendees'])){ + $ical .= $this->_get_attendees($event['attendees']); + } + if (!empty($event['location'])) { - $ical .= "LOCATION:" . self::escpape($event['location']) . "\r\n"; + $ical .= "LOCATION:" . self::escpape($event['location']) . self::EOL; } if ($event['recurrence']) { - $ical .= "RRULE:" . calendar::to_rrule($event['recurrence']) . "\r\n"; + $ical .= "RRULE:" . calendar::to_rrule($event['recurrence']) . self::EOL; } if(!empty($event['categories'])) { - $ical .= "CATEGORIES:" . self::escpape(strtoupper($event['categories'])) . "\r\n"; + $ical .= "CATEGORIES:" . self::escpape(strtoupper($event['categories'])) . self::EOL; } if ($event['sensitivity'] > 0) { $ical .= "X-CALENDARSERVER-ACCESS:CONFIDENTIAL"; @@ -91,21 +95,22 @@ class calendar_ical $val = calendar::parse_alaram_value($trigger); $ical .= "BEGIN:VALARM\n"; - if ($val[1]) $ical .= "TRIGGER:" . preg_replace('/^([-+])(.+)/', '\\1PT\\2', $trigger) . "\r\n"; - else $ical .= "TRIGGER;VALUE=DATE-TIME:" . gmdate('Ymd\THis\Z', $val[0]) . "\r\n"; - if ($action) $ical .= "ACTION:" . self::escpape(strtoupper($action)) . "\r\n"; + if ($val[1]) $ical .= "TRIGGER:" . preg_replace('/^([-+])(.+)/', '\\1PT\\2', $trigger) . self::EOL; + else $ical .= "TRIGGER;VALUE=DATE-TIME:" . gmdate('Ymd\THis\Z', $val[0]) . self::EOL; + if ($action) $ical .= "ACTION:" . self::escpape(strtoupper($action)) . self::EOL; $ical .= "END:VALARM\n"; } - $ical .= "TRANSP:" . ($event['free_busy'] == 'free' ? 'TRANSPARENT' : 'OPAQUE') . "\r\n"; + $ical .= "TRANSP:" . ($event['free_busy'] == 'free' ? 'TRANSPARENT' : 'OPAQUE') . self::EOL; // TODO: export attachments - $ical .= "END:VEVENT\r\n"; + $ical .= "END:VEVENT" . self::EOL; } - $ical .= "END:VCALENDAR"; + $ical .= "END:VCALENDAR" . self::EOL; - return $ical; + // fold lines to 75 chars + return rcube_vcard::rfc2425_fold($ical); } } @@ -114,44 +119,33 @@ class calendar_ical return preg_replace('/(?