/** * Reads and parses a single line. * * This method receives the full array of lines. The array pointer is used * to traverse. * * @param array $lines * @return Sabre_VObject_Element */ private static function readLine(&$lines) { $line = current($lines); $lineNr = key($lines); next($lines); // Components if (stripos($line, "BEGIN:") === 0) { // This is a component $obj = new Sabre_VObject_Component(strtoupper(substr($line, 6))); $nextLine = current($lines); while (stripos($nextLine, "END:") !== 0) { $obj->add(self::readLine($lines)); $nextLine = current($lines); if ($nextLine === false) { throw new Sabre_VObject_ParseException('Invalid VObject. Document ended prematurely.'); } } // Checking component name of the 'END:' line. if (substr($nextLine, 4) !== $obj->name) { throw new Sabre_VObject_ParseException('Invalid VObject, expected: "END:' . $obj->name . '" got: "' . $nextLine . '"'); } next($lines); return $obj; } // Properties //$result = preg_match('/(?P<name>[A-Z0-9-]+)(?:;(?P<parameters>^(?<!:):))(.*)$/',$line,$matches); $token = '[A-Z0-9-\\.]+'; $parameters = "(?:;(?P<parameters>([^:^\"]|\"([^\"]*)\")*))?"; $regex = "/^(?P<name>{$token}){$parameters}:(?P<value>.*)\$/i"; $result = preg_match($regex, $line, $matches); if (!$result) { throw new Sabre_VObject_ParseException('Invalid VObject, line ' . ($lineNr + 1) . ' did not follow the icalendar/vcard format'); } $propertyName = strtoupper($matches['name']); if (strpos($propertyName, '.') !== false) { list(, $mapName) = explode('.', $propertyName); } else { $mapName = $propertyName; } if (isset(self::$elementMap[$mapName])) { $className = self::$elementMap[$mapName]; } else { $className = 'Sabre_VObject_Property'; } $propertyValue = $className::stripSlashes($matches['value']); $obj = new $className($propertyName, $propertyValue); if ($matches['parameters']) { foreach (self::readParameters($matches['parameters']) as $param) { $obj->add($param); } } return $obj; }
protected function _getCalendarVTimezone() { $timezone = Tinebase_Core::getPreference()->getValueForUser(Tinebase_Preference::TIMEZONE, Tinebase_Core::getUser()->getId()); // create vcalendar object with timezone information $vcalendar = new Sabre_VObject_Component('CALENDAR'); $vcalendar->add(new Sabre_VObject_Component_VTimezone($timezone)); // Taking out \r to not screw up the xml output return str_replace("\r", "", $vcalendar->serialize()); }
function testGetDateTimeBadTimeZone() { $default = date_default_timezone_get(); date_default_timezone_set('Canada/Eastern'); $elem = new Sabre_VObject_Element_DateTime('DTSTART', '19850704T013000'); $elem['TZID'] = 'Moon'; $event = new Sabre_VObject_Component('VEVENT'); $event->add($elem); $timezone = new Sabre_VObject_Component('VTIMEZONE'); $timezone->TZID = 'Moon'; $timezone->{'X-LIC-LOCATION'} = 'Moon'; $calendar = new Sabre_VObject_Component('VCALENDAR'); $calendar->add($event); $calendar->add($timezone); $dt = $elem->getDateTime(); $this->assertInstanceOf('DateTime', $dt); $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s')); $this->assertEquals('Canada/Eastern', $dt->getTimeZone()->getName()); $this->assertEquals(Sabre_VObject_Element_DateTime::LOCALTZ, $elem->getDateType()); date_default_timezone_set($default); }
/** * Merges all calendar objects, and builds one big ics export * * @param array $nodes * @return void */ public function generateICS(array $nodes) { $calendar = new Sabre_VObject_Component('vcalendar'); $calendar->version = '2.0'; $calendar->prodid = '-//SabreDAV//SabreDAV ' . Sabre_DAV_Version::VERSION . '//EN'; $calendar->calscale = 'GREGORIAN'; $collectedTimezones = array(); $timezones = array(); $objects = array(); foreach ($nodes as $node) { $nodeData = $node->get(); $nodeComp = Sabre_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(); }
/** * Parses the input data and returns a correct VFREEBUSY object, wrapped in * a VCALENDAR. * * @return Sabre_VObject_Component */ public function getResult() { $busyTimes = array(); foreach ($this->objects as $object) { foreach ($object->getBaseComponents() as $component) { switch ($component->name) { case 'VEVENT': $FBTYPE = 'BUSY'; if (isset($component->TRANSP) && strtoupper($component->TRANSP) === 'TRANSPARENT') { break; } if (isset($component->STATUS)) { $status = strtoupper($component->STATUS); if ($status === 'CANCELLED') { break; } if ($status === 'TENTATIVE') { $FBTYPE = 'BUSY-TENTATIVE'; } } $times = array(); if ($component->RRULE) { $iterator = new Sabre_VObject_RecurrenceIterator($object, (string) $component->uid); if ($this->start) { $iterator->fastForward($this->start); } $maxRecurrences = 200; while ($iterator->valid() && --$maxRecurrences) { $startTime = $iterator->getDTStart(); if ($this->end && $startTime > $this->end) { break; } $times[] = array($iterator->getDTStart(), $iterator->getDTEnd()); $iterator->next(); } } else { $startTime = $component->DTSTART->getDateTime(); if ($this->end && $startTime > $this->end) { break; } $endTime = null; if (isset($component->DTEND)) { $endTime = $component->DTEND->getDateTime(); } elseif (isset($component->DURATION)) { $duration = Sabre_VObject_DateTimeParser::parseDuration((string) $component->DURATION); $endTime = clone $startTime; $endTime->add($duration); } elseif ($component->DTSTART->getDateType() === Sabre_VObject_Property_DateTime::DATE) { $endTime = clone $startTime; $endTime->modify('+1 day'); } else { // The event had no duration (0 seconds) break; } $times[] = array($startTime, $endTime); } foreach ($times as $time) { if ($this->end && $time[0] > $this->end) { break; } if ($this->start && $time[1] < $this->start) { break; } $busyTimes[] = array($time[0], $time[1], $FBTYPE); } break; case 'VFREEBUSY': foreach ($component->FREEBUSY as $freebusy) { $fbType = isset($freebusy['FBTYPE']) ? strtoupper($freebusy['FBTYPE']) : 'BUSY'; // Skipping intervals marked as 'free' if ($fbType === 'FREE') { continue; } $values = explode(',', $freebusy); foreach ($values as $value) { list($startTime, $endTime) = explode('/', $value); $startTime = Sabre_VObject_DateTimeParser::parseDateTime($startTime); if (substr($endTime, 0, 1) === 'P' || substr($endTime, 0, 2) === '-P') { $duration = Sabre_VObject_DateTimeParser::parseDuration($endTime); $endTime = clone $startTime; $endTime->add($duration); } else { $endTime = Sabre_VObject_DateTimeParser::parseDateTime($endTime); } if ($this->start && $this->start > $endTime) { continue; } if ($this->end && $this->end < $startTime) { continue; } $busyTimes[] = array($startTime, $endTime, $fbType); } } break; } } } if ($this->baseObject) { $calendar = $this->baseObject; } else { $calendar = new Sabre_VObject_Component('VCALENDAR'); $calendar->version = '2.0'; $calendar->prodid = '-//SabreDAV//Sabre VObject ' . Sabre_VObject_Version::VERSION . '//EN'; $calendar->calscale = 'GREGORIAN'; } $vfreebusy = new Sabre_VObject_Component('VFREEBUSY'); $calendar->add($vfreebusy); if ($this->start) { $dtstart = new Sabre_VObject_Property_DateTime('DTSTART'); $dtstart->setDateTime($this->start, Sabre_VObject_Property_DateTime::UTC); $vfreebusy->add($dtstart); } if ($this->end) { $dtend = new Sabre_VObject_Property_DateTime('DTEND'); $dtend->setDateTime($this->start, Sabre_VObject_Property_DateTime::UTC); $vfreebusy->add($dtend); } $dtstamp = new Sabre_VObject_Property_DateTime('DTSTAMP'); $dtstamp->setDateTime(new DateTime('now'), Sabre_VObject_Property_DateTime::UTC); $vfreebusy->add($dtstamp); foreach ($busyTimes as $busyTime) { $busyTime[0]->setTimeZone(new DateTimeZone('UTC')); $busyTime[1]->setTimeZone(new DateTimeZone('UTC')); $prop = new Sabre_VObject_Property('FREEBUSY', $busyTime[0]->format('Ymd\\THis\\Z') . '/' . $busyTime[1]->format('Ymd\\THis\\Z')); $prop['FBTYPE'] = $busyTime[2]; $vfreebusy->add($prop); } return $calendar; }
/** * Returns a Sabre_Vobject_Component representing this object. * * @param subevents All events with the uid of this one. If not given, these will be fetched from the database. * * @return Sabre_VObject_Component representing $this. */ public function asVObject($subevents = null) { $vobject = new Sabre_VObject_Component('vevent'); if ($this->summary) { $vobject->add('summary', $this->summary); } if ($this->description) { $vobject->add('description', $this->description); } if ($this->comments) { $vobject->add('comment', $this->comments); } if ($this->location) { $vobject->add('location', $this->location); } if ($this->recurrenceId) { $recurrenceId = new Datetime($this->recurrenceId); $vobject->add('recurrence-id', $recurrenceId->format('Ymd\\THis\\Z')); } else { if ($this->rrule) { $vobject->add('rrule', $this->rrule); $exdates = array(); foreach ($this->getExcludedDates() as $d) { $exdates[] = $d->format('Ymd\\THis\\Z'); } if (!empty($exdates)) { // The problem here ist that if we change a single occurrence of an recurring event in P6, we mark the // occurrence as excluded in the original event. In caldav, the exclusion takes precedence over the // extracted event, which means that events that have been changed will not show up in caldav clients. // To go around this, we filter these dates out of the excluded dates. if (is_null($subevents)) { $subevents = $this->fetchByUid($this->uid); } $subeventDates = array(); foreach ($subevents as $e) { if ($e->recurrenceId) { $dt = new Datetime($e->recurrenceId); $subeventDates[] = $dt->format('Ymd\\THis\\Z'); } } $exdates = array_diff($exdates, $subeventDates); $vobject->add('exdate', implode(',', $exdates)); } } } $start = new Datetime('@' . Phprojekt_Converter_Time::userToUtc($this->start)); $vobject->add('dtstart', $start->format('Ymd\\THis\\Z')); $end = new Datetime('@' . Phprojekt_Converter_Time::userToUtc($this->end)); $vobject->add('dtend', $end->format('Ymd\\THis\\Z')); $lastMod = new DateTime($this->lastModified); $vobject->add('dtstamp', $lastMod->format('Ymd\\THis\\Z')); $vobject->add('uid', $this->uid); return $vobject; }
/** * As defined in Sabre_CalDAV_Backend_Abstract * * Retrieves a single Calendar object. * * @param string $calendarId The id of the calendar. Corresponds to the id of the user it belongs to. * @param string $objectUri The uri of the calendarobject to retrieve. * * @return array As specified by SabreDAV. */ public function getCalendarObject($calendarId, $objectUri) { $db = Phprojekt::getInstance()->getDb(); $events = new Calendar2_Models_Calendar2(); $events = $events->fetchAll($db->quoteInto('uri = ?', $objectUri)); if (!is_array($events) || empty($events)) { return array(); } $calendarData = new Sabre_VObject_Component('vcalendar'); $calendarData->add('version', '2.0'); $calendarData->add('prodid', 'Phprojekt ' . Phprojekt::getVersion()); $lastModified = $events[0]->lastModified; foreach ($events as $e) { $calendarData->add($e->asVObject($events)); $lastModified = max($lastModified, $e->lastModified); } $lastModified = new Datetime($lastModified); return array('id' => $events[0]->uid, 'uri' => $objectUri, 'lastmodified' => $lastModified->format('Ymd\\THis\\Z'), 'calendarid' => $calendarId, 'calendardata' => $calendarData->serialize()); }
$aid = $_POST['id']; $l10n = new OC_L10N('contacts'); // Check if we are a user OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('contacts'); $addressbook = OC_Contacts_Addressbook::find($aid); if ($addressbook === false || $addressbook['userid'] != OC_USER::getUser()) { OC_JSON::error(array('data' => array('message' => $l10n->t('This is not your addressbook.')))); // Same here (as with the contact error). Could this error be improved? exit; } $fn = $_POST['fn']; $values = $_POST['value']; $parameters = $_POST['parameters']; $vcard = new Sabre_VObject_Component('VCARD'); $vcard->add(new Sabre_VObject_Property('FN', $fn)); $vcard->add(new Sabre_VObject_Property('UID', OC_Contacts_VCard::createUID())); foreach (array('ADR', 'TEL', 'EMAIL', 'ORG') as $propname) { $value = $values[$propname]; if (isset($parameters[$propname])) { $prop_parameters = $parameters[$propname]; } else { $prop_parameters = array(); } OC_Contacts_VCard::addVCardProperty($vcard, $propname, $value, $prop_parameters); } $id = OC_Contacts_VCard::add($aid, $vcard->serialize()); $details = OC_Contacts_VCard::structureContact($vcard); $name = $details['FN'][0]['value']; $tmpl = new OC_Template('contacts', 'part.details'); $tmpl->assign('details', $details);
protected function _addEventAttendee(Sabre_VObject_Component $_vevent, Calendar_Model_Event $_event) { Calendar_Model_Attender::resolveAttendee($_event->attendee, FALSE, $_event); foreach ($_event->attendee as $eventAttendee) { $attendeeEmail = $eventAttendee->getEmail(); $attendee = new Sabre_VObject_Property('ATTENDEE', (strpos($attendeeEmail, '@') !== false ? 'mailto:' : 'urn:uuid:') . $attendeeEmail); $attendee->add('CN', $eventAttendee->getName()); $attendee->add('CUTYPE', Calendar_Convert_Event_VCalendar_Abstract::$cutypeMap[$eventAttendee->user_type]); $attendee->add('PARTSTAT', $eventAttendee->status); $attendee->add('ROLE', "{$eventAttendee->role}-PARTICIPANT"); $attendee->add('RSVP', 'FALSE'); if (strpos($attendeeEmail, '@') !== false) { $attendee->add('EMAIL', $attendeeEmail); } $_vevent->add($attendee); } }
/** * Converts a timecard join project join module row to a vobject string. * * @param array $entry * * @return string */ private function _getDataForEntry(array $entry) { $v = new Sabre_VObject_Component('vevent'); if (1 == $entry['project_id']) { $v->add('summary', Phprojekt::getInstance()->translate('Unassigned')); } else { $v->add('summary', $entry['title'] . ' [' . $entry['project_id'] . ']'); } $notes = trim($entry['notes']); if (!is_null($entry['module_id'])) { if ($notes) { $notes .= "\n"; } $notes .= Phprojekt::getInstance()->translate('There is an attachment of type ') . Phprojekt::getInstance()->translate($entry['label']); } if ($notes) { $v->add('description', $notes); } $start = new DateTime('@' . Phprojekt_Converter_Time::userToUtc($entry['start_datetime'])); $end = substr($entry['start_datetime'], 0, 11) . $entry['end_time']; $end = new DateTime('@' . Phprojekt_Converter_Time::userToUtc($end)); $v->add('dtstart', $start->format('Ymd\\THis\\Z')); $v->add('dtend', $end->format('Ymd\\THis\\Z')); $v->add('uid', 'phprojekt-timecard-entry' . $entry['uid']); $calendarData = new Sabre_VObject_Component('vcalendar'); $calendarData->add('version', '2.0'); $calendarData->add('prodid', 'Phprojekt ' . Phprojekt::getVersion()); $calendarData->add($v); return $calendarData->serialize(); }
/** * Returns free-busy information for a specific address. The returned * data is an array containing the following properties: * * calendar-data : A VFREEBUSY VObject * request-status : an iTip status code. * href: The principal's email address, as requested * * The following request status codes may be returned: * * 2.0;description * * 3.7;description * * @param string $email address * @param DateTime $start * @param DateTime $end * @param Sabre_VObject_Component $request * @return Sabre_VObject_Component */ protected function getFreeBusyForEmailTine20($email, DateTime $start, DateTime $end, Sabre_VObject_Component $request) { if (substr($email, 0, 7) === 'mailto:') { $email = substr($email, 7); } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' serach freebusy of ' . $email); } // resolve email address to contact $filter = new Addressbook_Model_ContactFilter(array(array('field' => 'containerType', 'operator' => 'equals', 'value' => 'all'), array('field' => 'type', 'operator' => 'equals', 'value' => Addressbook_Model_Contact::CONTACTTYPE_USER), array('field' => 'email', 'operator' => 'equals', 'value' => $email))); $contact = Addressbook_Controller_Contact::getInstance()->search($filter)->getFirstRecord(); if ($contact === null) { return array('request-status' => '3.7;Could not find principal', 'href' => 'mailto:' . $email); } $period = array(array('from' => new Tinebase_DateTime($start->format(Tinebase_Record_Abstract::ISO8601LONG), 'UTC'), 'until' => new Tinebase_DateTime($end->format(Tinebase_Record_Abstract::ISO8601LONG), 'UTC'))); $attendees = new Tinebase_Record_RecordSet('Calendar_Model_Attender', array(new Calendar_Model_Attender(array('user_id' => $contact->getId(), 'user_type' => Calendar_Model_Attender::USERTYPE_USER)))); $freeBusyInfo = Calendar_Controller_Event::getInstance()->getFreeBusyInfo($period, $attendees); $vcalendar = new Sabre_VObject_Component('VCALENDAR'); $vcalendar->VERSION = '2.0'; $vcalendar->METHOD = 'REPLY'; $vcalendar->CALSCALE = 'GREGORIAN'; $vcalendar->PRODID = '-//SabreDAV//SabreDAV ' . Sabre_DAV_Version::VERSION . '//EN'; $vfreebusy = new Sabre_VObject_Component('VFREEBUSY'); $vcalendar->add($vfreebusy); $vfreebusy->DTSTAMP = $request->VFREEBUSY->dtstart->value; $vfreebusy->DTSTART = $request->VFREEBUSY->dtstart->value; $vfreebusy->DTEND = $request->VFREEBUSY->dtend->value; #$attendee = new Sabre_VObject_Property('ATTENDEE', 'mailto:' . $contact->email); #$attendee->add('CN', $contact->n_fileas); #$vfreebusy->add($attendee); foreach ($freeBusyInfo as $busyInfo) { $busy = $busyInfo->dtstart->format('Ymd\\THis\\Z') . '/' . $busyInfo->dtend->format('Ymd\\THis\\Z'); $freebusy = new Sabre_VObject_Property('FREEBUSY', $busy); $freebusy->add('FBTYPE', 'BUSY'); $vfreebusy->add($freebusy); } $vcalendar->VFREEBUSY->ATTENDEE = 'mailto:' . $email; $vcalendar->VFREEBUSY->UID = (string) $request->VFREEBUSY->UID; return array('calendar-data' => $vcalendar, 'request-status' => '2.0;Success', 'href' => 'mailto:' . $email); }
/** * @expectedException InvalidArgumentException */ function testAddArgFail3() { $comp = new Sabre_VObject_Component('VCALENDAR'); $comp->add('hello', array()); }
public function setUID() { $uid = substr(md5(rand() . time()), 0, 10); $this->vobject->add('UID', $uid); }
function testSerializeOrder() { $comp = new Sabre_VObject_Component('VCALENDAR'); $comp->add(new Sabre_VObject_Component('VEVENT')); $comp->add('PROP1', 'BLABLA'); $comp->add('VERSION', '2.0'); $comp->add(new Sabre_VObject_Component('VTIMEZONE')); $str = $comp->serialize(); $this->assertEquals("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPROP1:BLABLA\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", $str); }
public static function createVCalendarFromRequest($request) { $vcalendar = new Sabre_VObject_Component('VCALENDAR'); $vcalendar->add('PRODID', 'ownCloud Calendar'); $vcalendar->add('VERSION', '2.0'); $now = new DateTime(); $vevent = new Sabre_VObject_Component('VEVENT'); $vcalendar->add($vevent); $created = new Sabre_VObject_Element_DateTime('CREATED'); $created->setDateTime($now, Sabre_VObject_Element_DateTime::UTC); $vevent->add($created); $uid = self::createUID(); $vevent->add('UID', $uid); return self::updateVCalendarFromRequest($request, $vcalendar); }
/** * converts Addressbook_Model_Contact to vcard * * @param Addressbook_Model_Contact $_record * @return string */ public function fromTine20Model(Tinebase_Record_Abstract $_record) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' contact ' . print_r($_record->toArray(), true)); } $card = new Sabre_VObject_Component('VCARD'); // required vcard fields $card->add(new Sabre_VObject_Property('VERSION', '3.0')); $card->add(new Sabre_VObject_Property('FN', $_record->n_fileas)); $card->add(new Sabre_VObject_Element_MultiValue('N', array($_record->n_family, $_record->n_given))); $card->add(new Sabre_VObject_Property('PRODID', '-//tine20.org//Tine 2.0//EN')); $card->add(new Sabre_VObject_Property('UID', $_record->getId())); // optional fields $card->add(new Sabre_VObject_Element_MultiValue('ORG', array($_record->org_name, $_record->org_unit))); $card->add(new Sabre_VObject_Property('TITLE', $_record->title)); $tel = new Sabre_VObject_Property('TEL', $_record->tel_work); $tel->add('TYPE', 'WORK'); $card->add($tel); $tel = new Sabre_VObject_Property('TEL', $_record->tel_home); $tel->add('TYPE', 'HOME'); $card->add($tel); $tel = new Sabre_VObject_Property('TEL', $_record->tel_cell); $tel->add('TYPE', 'CELL'); $card->add($tel); $tel = new Sabre_VObject_Property('TEL', $_record->tel_pager); $tel->add('TYPE', 'PAGER'); $card->add($tel); $tel = new Sabre_VObject_Property('TEL', $_record->tel_fax); $tel->add('TYPE', 'FAX'); $card->add($tel); #$tel = new Sabre_VObject_Property('TEL', $_record->tel_fax_home); #$tel->add('TYPE', 'FAX'); #$tel->add('TYPE', 'HOME'); #$card->add($tel); $adr = new Sabre_VObject_Element_MultiValue('ADR', array(null, $_record->adr_one_street2, $_record->adr_one_street, $_record->adr_one_locality, $_record->adr_one_region, $_record->adr_one_postalcode, $_record->adr_one_countryname)); $adr->add('TYPE', 'WORK'); $card->add($adr); $adr = new Sabre_VObject_Element_MultiValue('ADR', array(null, $_record->adr_two_street2, $_record->adr_two_street, $_record->adr_two_locality, $_record->adr_two_region, $_record->adr_two_postalcode, $_record->adr_two_countryname)); $adr->add('TYPE', 'HOME'); $card->add($adr); $card->add(new Sabre_VObject_Property('EMAIL;TYPE=work', $_record->email)); $card->add(new Sabre_VObject_Property('EMAIL;TYPE=home', $_record->email_home)); $card->add(new Sabre_VObject_Property('URL;TYPE=work', $_record->url)); $card->add(new Sabre_VObject_Property('URL;TYPE=home', $_record->url_home)); $card->add(new Sabre_VObject_Property('NOTE', $_record->note)); if (!empty($_record->jpegphoto)) { try { $image = Tinebase_Controller::getInstance()->getImage('Addressbook', $_record->getId()); $jpegData = $image->getBlob('image/jpeg'); $photo = new Sabre_VObject_Property('PHOTO', $jpegData); $photo->add('ENCODING', 'b'); $photo->add('TYPE', 'JPEG'); $card->add($photo); } catch (Exception $e) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " Image for contact {$_record->getId()} not found or invalid"); } } if (isset($_record->tags) && count($_record->tags) > 0) { $card->add(new Sabre_VObject_Property('CATEGORIES', Sabre_VObject_Element_List((array) $_record->tags->name))); } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' card ' . $card->serialize()); } return $card; }
/** * @depends testValues */ function testComplexExclusions() { $ev = new Sabre_VObject_Component('VEVENT'); $ev->UID = 'bla'; $ev->RRULE = 'FREQ=YEARLY;COUNT=10'; $dtStart = new Sabre_VObject_Property_DateTime('DTSTART'); $tz = new DateTimeZone('Canada/Eastern'); $dtStart->setDateTime(new DateTime('2011-01-01 13:50:20', $tz), Sabre_VObject_Property_DateTime::LOCALTZ); $exDate1 = new Sabre_VObject_Property_MultiDateTime('EXDATE'); $exDate1->setDateTimes(array(new DateTime('2012-01-01 13:50:20', $tz), new DateTime('2014-01-01 13:50:20', $tz)), Sabre_VObject_Property_DateTime::LOCALTZ); $exDate2 = new Sabre_VObject_Property_MultiDateTime('EXDATE'); $exDate2->setDateTimes(array(new DateTime('2016-01-01 13:50:20', $tz)), Sabre_VObject_Property_DateTime::LOCALTZ); $ev->add($dtStart); $ev->add($exDate1); $ev->add($exDate2); $vcal = Sabre_VObject_Component::create('VCALENDAR'); $vcal->add($ev); $it = new Sabre_VObject_RecurrenceIterator($vcal, (string) $ev->uid); $this->assertEquals('yearly', $it->frequency); $this->assertEquals(1, $it->interval); $this->assertEquals(10, $it->count); $max = 20; $result = array(); foreach ($it as $k => $item) { $result[] = $item; $max--; if (!$max) { break; } } $this->assertEquals(array(new DateTime('2011-01-01 13:50:20', $tz), new DateTime('2013-01-01 13:50:20', $tz), new DateTime('2015-01-01 13:50:20', $tz), new DateTime('2017-01-01 13:50:20', $tz), new DateTime('2018-01-01 13:50:20', $tz), new DateTime('2019-01-01 13:50:20', $tz), new DateTime('2020-01-01 13:50:20', $tz)), $result); }