| | Bogomil "Bogo" Shopov | +-------------------------------------------------------------------------+ */ class calendar_ical { private $rc; private $driver; function __construct($rc, $driver) { $this->rc = $rc; $this->driver = $driver; } /** * Import events from iCalendar format * * @param array Associative events array * @access public */ public function import($events) { //TODO // for ($events as $event) // $this->backend->newEvent(...); } /** * Export events to iCalendar format * * @param array Events as array * @return string Events in iCalendar format (http://tools.ietf.org/html/rfc5545) */ public function export($events) { 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"; 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']); } if (!empty($event['location'])) { $ical .= "LOCATION:" . self::escpape($event['location']) . "\r\n"; } if ($event['recurrence']) { $ical .= "RRULE:" . calendar::to_rrule($event['recurrence']) . "\r\n"; } if(!empty($event['categories'])) { $ical .= "CATEGORIES:" . self::escpape(strtoupper($event['categories'])) . "\r\n"; } if ($event['sensitivity'] > 0) { $ical .= "X-CALENDARSERVER-ACCESS:CONFIDENTIAL"; } if ($event['alarms']) { list($trigger, $action) = explode(':', $event['alarms']); $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"; $ical .= "END:VALARM\n"; } $ical .= "TRANSP:" . ($event['free_busy'] == 'free' ? 'TRANSPARENT' : 'OPAQUE') . "\r\n"; // TODO: export attachments $ical .= "END:VEVENT\r\n"; } $ical .= "END:VCALENDAR"; return $ical; } } private function escpape($str) { return preg_replace('/(?