/** * Sends one or more iTip messages through email. * * @param string $originator Originator Email * @param array $recipients Array of email addresses * @param VObject\Component $vObject * @param string $principal Principal Url of the originator * @return void */ public function sendMessage($originator, array $recipients, VObject\Component $vObject, $principal) { foreach ($recipients as $recipient) { $to = $recipient; $replyTo = $originator; $subject = 'SabreDAV iTIP message'; switch (strtoupper($vObject->METHOD)) { case 'REPLY': $subject = 'Response for: ' . $vObject->VEVENT->SUMMARY; break; case 'REQUEST': $subject = 'Invitation for: ' . $vObject->VEVENT->SUMMARY; break; case 'CANCEL': $subject = 'Cancelled event: ' . $vObject->VEVENT->SUMMARY; break; } $headers = array(); $headers[] = 'Reply-To: ' . $replyTo; $headers[] = 'From: ' . $this->senderEmail; $headers[] = 'Content-Type: text/calendar; method=' . (string) $vObject->method . '; charset=utf-8'; if (DAV\Server::$exposeVersion) { $headers[] = 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY; } $vcalBody = $vObject->serialize(); $this->mail($to, $subject, $vcalBody, $headers); } }
/** * Merges all calendar objects, and builds one big ics export * * @param array $nodes * @return string */ public function generateICS(array $nodes) { $calendar = new VObject\Component('vcalendar'); $calendar->version = '2.0'; if (Sabre_DAV_Server::$exposeVersion) { $calendar->prodid = '-//SabreDAV//SabreDAV ' . Sabre_DAV_Version::VERSION . '//EN'; } else { $calendar->prodid = '-//SabreDAV//SabreDAV//EN'; } $calendar->calscale = 'GREGORIAN'; $collectedTimezones = array(); $timezones = array(); $objects = array(); foreach ($nodes as $node) { if (!isset($node[200]['{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}calendar-data'])) { continue; } $nodeData = $node[200]['{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}calendar-data']; $nodeComp = VObject\Reader::read($nodeData); foreach ($nodeComp->children() as $child) { switch ($child->name) { case 'VEVENT': case 'VTODO': case 'VJOURNAL': $objects[] = $child; break; // VTIMEZONE is special, because we need to filter out the duplicates // VTIMEZONE is special, because we need to filter out the duplicates case 'VTIMEZONE': // Naively just checking tzid. if (in_array((string) $child->TZID, $collectedTimezones)) { continue; } $timezones[] = $child; $collectedTimezones[] = $child->TZID; break; } } } foreach ($timezones as $tz) { $calendar->add($tz); } foreach ($objects as $obj) { $calendar->add($obj); } return $calendar->serialize(); }
/** * Repairs a VObject file * * @param Component $vObj * @return int */ protected function repair($vObj) { $returnCode = 0; switch ($vObj->name) { case 'VCALENDAR': $this->log("iCalendar: " . (string) $vObj->VERSION); break; case 'VCARD': $this->log("vCard: " . (string) $vObj->VERSION); break; } $warnings = $vObj->validate(Node::REPAIR); if (!count($warnings)) { $this->log(" No warnings!"); } else { $levels = [1 => 'REPAIRED', 2 => 'WARNING', 3 => 'ERROR']; $returnCode = 2; foreach ($warnings as $warn) { $extra = ''; if ($warn['node'] instanceof Property) { $extra = ' (property: "' . $warn['node']->name . '")'; } $this->log(" [" . $levels[$warn['level']] . '] ' . $warn['message'] . $extra); } } fwrite($this->stdout, $vObj->serialize()); return $returnCode; }
/** * Repairs a VObject file * * @param Component $vObj * @return int */ protected function repair($vObj) { $returnCode = 0; switch ($vObj->name) { case 'VCALENDAR': $this->log("iCalendar: " . (string) $vObj->VERSION); break; case 'VCARD': $this->log("vCard: " . (string) $vObj->VERSION); break; } $warnings = $vObj->validate(Node::REPAIR); if (!count($warnings)) { $this->log(" No warnings!"); } else { foreach ($warnings as $warn) { $returnCode = 2; $this->log(" " . $warn['message']); } } fwrite($this->stdout, $vObj->serialize()); return $returnCode; }
/** * Serializes a vCard or iCalendar object. * * @param Component $component * * @return string */ static function write(Component $component) { return $component->serialize(); }