diff options
Diffstat (limited to 'vendor/eluceo/ical/src/Eluceo/iCal/Component')
5 files changed, 1529 insertions, 0 deletions
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Component/Alarm.php b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Alarm.php new file mode 100644 index 00000000..9e0f0c1b --- /dev/null +++ b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Alarm.php @@ -0,0 +1,151 @@ +<?php + +/* + * This file is part of the eluceo/iCal package. + * + * (c) Markus Poerschke <markus@eluceo.de> + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Eluceo\iCal\Component; + +use Eluceo\iCal\Component; +use Eluceo\iCal\PropertyBag; +use Eluceo\iCal\Property; + +/** + * Implementation of the VALARM component. + */ +class Alarm extends Component +{ + /** + * Alarm ACTION property. + * + * According to RFC 5545: 3.8.6.1. Action + * + * @link http://tools.ietf.org/html/rfc5545#section-3.8.6.1 + */ + const ACTION_AUDIO = 'AUDIO'; + const ACTION_DISPLAY = 'DISPLAY'; + const ACTION_EMAIL = 'EMAIL'; + + protected $action; + protected $repeat; + protected $duration; + protected $description; + protected $attendee; + protected $trigger; + + public function getType() + { + return 'VALARM'; + } + + public function getAction() + { + return $this->action; + } + + public function getRepeat() + { + return $this->repeat; + } + + public function getDuration() + { + return $this->duration; + } + + public function getDescription() + { + return $this->description; + } + + public function getAttendee() + { + return $this->attendee; + } + + public function getTrigger() + { + return $this->trigger; + } + + public function setAction($action) + { + $this->action = $action; + + return $this; + } + + public function setRepeat($repeat) + { + $this->repeat = $repeat; + + return $this; + } + + public function setDuration($duration) + { + $this->duration = $duration; + + return $this; + } + + public function setDescription($description) + { + $this->description = $description; + + return $this; + } + + public function setAttendee($attendee) + { + $this->attendee = $attendee; + + return $this; + } + + public function setTrigger($trigger) + { + $this->trigger = $trigger; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function buildPropertyBag() + { + $propertyBag = new PropertyBag(); + + if (null != $this->trigger) { + $propertyBag->set('TRIGGER', $this->trigger); + } + + if (null != $this->action) { + $propertyBag->set('ACTION', $this->action); + } + + if (null != $this->repeat) { + $propertyBag->set('REPEAT', $this->repeat); + } + + if (null != $this->duration) { + $propertyBag->set('DURATION', $this->duration); + } + + if (null != $this->description) { + $propertyBag->set('DESCRIPTION', $this->description); + } + + if (null != $this->attendee) { + $propertyBag->set('ATTENDEE', $this->attendee); + } + + return $propertyBag; + } +} diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Component/Calendar.php b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Calendar.php new file mode 100644 index 00000000..db3dd98d --- /dev/null +++ b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Calendar.php @@ -0,0 +1,323 @@ +<?php + +/* + * This file is part of the eluceo/iCal package. + * + * (c) Markus Poerschke <markus@eluceo.de> + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Eluceo\iCal\Component; + +use Eluceo\iCal\Component; +use Eluceo\iCal\PropertyBag; + +class Calendar extends Component +{ + /** + * Methods for calendar components. + * + * According to RFP 5545: 3.7.2. Method + * + * @link http://tools.ietf.org/html/rfc5545#section-3.7.2 + * + * And then according to RFC 2446: 3 APPLICATION PROTOCOL ELEMENTS + * @link https://www.ietf.org/rfc/rfc2446.txt + */ + const METHOD_PUBLISH = 'PUBLISH'; + const METHOD_REQUEST = 'REQUEST'; + const METHOD_REPLY = 'REPLY'; + const METHOD_ADD = 'ADD'; + const METHOD_CANCEL = 'CANCEL'; + const METHOD_REFRESH = 'REFRESH'; + const METHOD_COUNTER = 'COUNTER'; + const METHOD_DECLINECOUNTER = 'DECLINECOUNTER'; + + /** + * This property defines the calendar scale used for the calendar information specified in the iCalendar object. + * + * According to RFC 5545: 3.7.1. Calendar Scale + * + * @link http://tools.ietf.org/html/rfc5545#section-3.7 + */ + const CALSCALE_GREGORIAN = 'GREGORIAN'; + + /** + * The Product Identifier. + * + * According to RFC 2445: 4.7.3 Product Identifier + * + * This property specifies the identifier for the product that created the Calendar object. + * + * @link http://www.ietf.org/rfc/rfc2445.txt + * + * @var string + */ + protected $prodId = null; + protected $method = null; + protected $name = null; + protected $description = null; + protected $timezone = null; + + /** + * This property defines the calendar scale used for the + * calendar information specified in the iCalendar object. + * + * Also identifies the calendar type of a non-Gregorian recurring appointment. + * + * @var string + * + * @see http://tools.ietf.org/html/rfc5545#section-3.7 + * @see http://msdn.microsoft.com/en-us/library/ee237520(v=exchg.80).aspx + */ + protected $calendarScale = null; + + /** + * Specifies whether or not the iCalendar file only contains one appointment. + * + * @var bool + * + * @see http://msdn.microsoft.com/en-us/library/ee203486(v=exchg.80).aspx + */ + protected $forceInspectOrOpen = false; + + /** + * Specifies a globally unique identifier for the calendar. + * + * @var string + * + * @see http://msdn.microsoft.com/en-us/library/ee179588(v=exchg.80).aspx + */ + protected $calId = null; + + /** + * Specifies a suggested iCalendar file download frequency for clients and + * servers with sync capabilities. + * + * @var string + * + * @see http://msdn.microsoft.com/en-us/library/ee178699(v=exchg.80).aspx + */ + protected $publishedTTL = 'P1W'; + + /** + * Specifies a color for the calendar in calendar for Apple/Outlook. + * + * @var string + * + * @see http://msdn.microsoft.com/en-us/library/ee179588(v=exchg.80).aspx + */ + protected $calendarColor = null; + + public function __construct($prodId) + { + if (empty($prodId)) { + throw new \UnexpectedValueException('PRODID cannot be empty'); + } + + $this->prodId = $prodId; + } + + /** + * {@inheritdoc} + */ + public function getType() + { + return 'VCALENDAR'; + } + + /** + * @param $method + * + * @return $this + */ + public function setMethod($method) + { + $this->method = $method; + + return $this; + } + + /** + * @param $name + * + * @return $this + */ + public function setName($name) + { + $this->name = $name; + + return $this; + } + + /** + * @param $description + * + * @return $this + */ + public function setDescription($description) + { + $this->description = $description; + + return $this; + } + + /** + * @param $timezone + * + * @return $this + */ + public function setTimezone($timezone) + { + $this->timezone = $timezone; + + return $this; + } + + /** + * @param $calendarColor + * + * @return $this + */ + public function setCalendarColor($calendarColor) + { + $this->calendarColor = $calendarColor; + + return $this; + } + + /** + * @param $calendarScale + * + * @return $this + */ + public function setCalendarScale($calendarScale) + { + $this->calendarScale = $calendarScale; + + return $this; + } + + /** + * @param bool $forceInspectOrOpen + * + * @return $this + */ + public function setForceInspectOrOpen($forceInspectOrOpen) + { + $this->forceInspectOrOpen = $forceInspectOrOpen; + + return $this; + } + + /** + * @param string $calId + * + * @return $this + */ + public function setCalId($calId) + { + $this->calId = $calId; + + return $this; + } + + /** + * @param string $ttl + * + * @return $this + */ + public function setPublishedTTL($ttl) + { + $this->publishedTTL = $ttl; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function buildPropertyBag() + { + $propertyBag = new PropertyBag(); + $propertyBag->set('VERSION', '2.0'); + $propertyBag->set('PRODID', $this->prodId); + + if ($this->method) { + $propertyBag->set('METHOD', $this->method); + } + + if ($this->calendarColor) { + $propertyBag->set('X-APPLE-CALENDAR-COLOR', $this->calendarColor); + $propertyBag->set('X-OUTLOOK-COLOR', $this->calendarColor); + $propertyBag->set('X-FUNAMBOL-COLOR', $this->calendarColor); + } + + if ($this->calendarScale) { + $propertyBag->set('CALSCALE', $this->calendarScale); + $propertyBag->set('X-MICROSOFT-CALSCALE', $this->calendarScale); + } + + if ($this->name) { + $propertyBag->set('X-WR-CALNAME', $this->name); + } + + if ($this->description) { + $propertyBag->set('X-WR-CALDESC', $this->description); + } + + if ($this->timezone) { + if ($this->timezone instanceof Timezone) { + $propertyBag->set('X-WR-TIMEZONE', $this->timezone->getZoneIdentifier()); + $this->addComponent($this->timezone); + } else { + $propertyBag->set('X-WR-TIMEZONE', $this->timezone); + $this->addComponent(new Timezone($this->timezone)); + } + } + + if ($this->forceInspectOrOpen) { + $propertyBag->set('X-MS-OLK-FORCEINSPECTOROPEN', $this->forceInspectOrOpen); + } + + if ($this->calId) { + $propertyBag->set('X-WR-RELCALID', $this->calId); + } + + if ($this->publishedTTL) { + $propertyBag->set('X-PUBLISHED-TTL', $this->publishedTTL); + } + + return $propertyBag; + } + + /** + * Adds an Event to the Calendar. + * + * Wrapper for addComponent() + * + * @see Eluceo\iCal::addComponent + * @deprecated Please, use public method addComponent() from abstract Component class + * + * @param Event $event + */ + public function addEvent(Event $event) + { + $this->addComponent($event); + } + + /** + * @return null|string + */ + public function getProdId() + { + return $this->prodId; + } + + public function getMethod() + { + return $this->method; + } +} diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Component/Event.php b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Event.php new file mode 100644 index 00000000..e93d506c --- /dev/null +++ b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Event.php @@ -0,0 +1,783 @@ +<?php + +/* + * This file is part of the eluceo/iCal package. + * + * (c) Markus Poerschke <markus@eluceo.de> + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Eluceo\iCal\Component; + +use Eluceo\iCal\Component; +use Eluceo\iCal\Property; +use Eluceo\iCal\Property\DateTimeProperty; +use Eluceo\iCal\Property\Event\Attendees; +use Eluceo\iCal\Property\Event\Organizer; +use Eluceo\iCal\Property\Event\RecurrenceRule; +use Eluceo\iCal\Property\Event\Description; +use Eluceo\iCal\PropertyBag; +use Eluceo\iCal\Property\Event\RecurrenceId; +use Eluceo\iCal\Property\DateTimesProperty; + +/** + * Implementation of the EVENT component. + */ +class Event extends Component +{ + const TIME_TRANSPARENCY_OPAQUE = 'OPAQUE'; + const TIME_TRANSPARENCY_TRANSPARENT = 'TRANSPARENT'; + + const STATUS_TENTATIVE = 'TENTATIVE'; + const STATUS_CONFIRMED = 'CONFIRMED'; + const STATUS_CANCELLED = 'CANCELLED'; + + /** + * @var string + */ + protected $uniqueId; + + /** + * The property indicates the date/time that the instance of + * the iCalendar object was created. + * + * The value MUST be specified in the UTC time format. + * + * @var \DateTime + */ + protected $dtStamp; + + /** + * @var \DateTime + */ + protected $dtStart; + + /** + * Preferentially chosen over the duration if both are set. + * + * @var \DateTime + */ + protected $dtEnd; + + /** + * @var \DateInterval + */ + protected $duration; + + /** + * @var bool + */ + protected $noTime = false; + + /** + * @var string + */ + protected $url; + + /** + * @var string + */ + protected $location; + + /** + * @var string + */ + protected $locationTitle; + + /** + * @var string + */ + protected $locationGeo; + + /** + * @var string + */ + protected $summary; + + /** + * @var Organizer + */ + protected $organizer; + + /** + * @see http://www.ietf.org/rfc/rfc2445.txt 4.8.2.7 Time Transparency + * + * @var string + */ + protected $transparency = self::TIME_TRANSPARENCY_OPAQUE; + + /** + * If set to true the timezone will be added to the event. + * + * @var bool + */ + protected $useTimezone = false; + + /** + * @var int + */ + protected $sequence = 0; + + /** + * @var Attendees + */ + protected $attendees; + + /** + * @var string + */ + protected $description; + + /** + * @var string + */ + protected $descriptionHTML; + + /** + * @var string + */ + protected $status; + + /** + * @var RecurrenceRule + */ + protected $recurrenceRule; + + /** + * This property specifies the date and time that the calendar + * information was created. + * + * The value MUST be specified in the UTC time format. + * + * @var \DateTime + */ + protected $created; + + /** + * The property specifies the date and time that the information + * associated with the calendar component was last revised. + * + * The value MUST be specified in the UTC time format. + * + * @var \DateTime + */ + protected $modified; + + /** + * Indicates if the UTC time should be used or not. + * + * @var bool + */ + protected $useUtc = true; + + /** + * @var bool + */ + protected $cancelled; + + /** + * This property is used to specify categories or subtypes + * of the calendar component. The categories are useful in searching + * for a calendar component of a particular type and category. + * + * @see https://tools.ietf.org/html/rfc5545#section-3.8.1.2 + * + * @var array + */ + protected $categories; + + /** + * https://tools.ietf.org/html/rfc5545#section-3.8.1.3. + * + * @var bool + */ + protected $isPrivate = false; + + /** + * Dates to be excluded from a series of events. + * + * @var \DateTime[] + */ + protected $exDates = array(); + + /** + * @var RecurrenceId + */ + protected $recurrenceId; + + public function __construct($uniqueId = null) + { + if (null == $uniqueId) { + $uniqueId = uniqid(); + } + + $this->uniqueId = $uniqueId; + } + + /** + * {@inheritdoc} + */ + public function getType() + { + return 'VEVENT'; + } + + /** + * {@inheritdoc} + */ + public function buildPropertyBag() + { + $propertyBag = new PropertyBag(); + + // mandatory information + $propertyBag->set('UID', $this->uniqueId); + + $propertyBag->add(new DateTimeProperty('DTSTART', $this->dtStart, $this->noTime, $this->useTimezone, $this->useUtc)); + $propertyBag->set('SEQUENCE', $this->sequence); + $propertyBag->set('TRANSP', $this->transparency); + + if ($this->status) { + $propertyBag->set('STATUS', $this->status); + } + + // An event can have a 'dtend' or 'duration', but not both. + if (null != $this->dtEnd) { + $propertyBag->add(new DateTimeProperty('DTEND', $this->dtEnd, $this->noTime, $this->useTimezone, $this->useUtc)); + } elseif (null != $this->duration) { + $propertyBag->set('DURATION', $this->duration->format('P%dDT%hH%iM%sS')); + } + + // optional information + if (null != $this->url) { + $propertyBag->set('URL', $this->url); + } + + if (null != $this->location) { + $propertyBag->set('LOCATION', $this->location); + + if (null != $this->locationGeo) { + $propertyBag->add( + new Property( + 'X-APPLE-STRUCTURED-LOCATION', + 'geo:' . $this->locationGeo, + array( + 'VALUE' => 'URI', + 'X-ADDRESS' => $this->location, + 'X-APPLE-RADIUS' => 49, + 'X-TITLE' => $this->locationTitle, + ) + ) + ); + $propertyBag->set('GEO', str_replace(',', ';', $this->locationGeo)); + } + } + + if (null != $this->summary) { + $propertyBag->set('SUMMARY', $this->summary); + } + + if (null != $this->attendees) { + $propertyBag->add($this->attendees); + } + + $propertyBag->set('CLASS', $this->isPrivate ? 'PRIVATE' : 'PUBLIC'); + + if (null != $this->description) { + $propertyBag->set('DESCRIPTION', new Description($this->description)); + } + + if (null != $this->descriptionHTML) { + $propertyBag->add( + new Property( + 'X-ALT-DESC', + $this->descriptionHTML, + array( + 'FMTTYPE' => 'text/html', + ) + ) + ); + } + + if (null != $this->recurrenceRule) { + $propertyBag->set('RRULE', $this->recurrenceRule); + } + + if (null != $this->recurrenceId) { + $this->recurrenceId->applyTimeSettings($this->noTime, $this->useTimezone, $this->useUtc); + $propertyBag->add($this->recurrenceId); + } + + if (!empty($this->exDates)) { + $propertyBag->add(new DateTimesProperty('EXDATE', $this->exDates, $this->noTime, $this->useTimezone, $this->useUtc)); + } + + if ($this->cancelled) { + $propertyBag->set('STATUS', 'CANCELLED'); + } + + if (null != $this->organizer) { + $propertyBag->add($this->organizer); + } + + if ($this->noTime) { + $propertyBag->set('X-MICROSOFT-CDO-ALLDAYEVENT', 'TRUE'); + } + + if (null != $this->categories) { + $propertyBag->set('CATEGORIES', $this->categories); + } + + $propertyBag->add( + new DateTimeProperty('DTSTAMP', $this->dtStamp ?: new \DateTime(), false, false, true) + ); + + if ($this->created) { + $propertyBag->add(new DateTimeProperty('CREATED', $this->created, false, false, true)); + } + + if ($this->modified) { + $propertyBag->add(new DateTimeProperty('LAST-MODIFIED', $this->modified, false, false, true)); + } + + return $propertyBag; + } + + /** + * @param $dtEnd + * + * @return $this + */ + public function setDtEnd($dtEnd) + { + $this->dtEnd = $dtEnd; + + return $this; + } + + public function getDtEnd() + { + return $this->dtEnd; + } + + public function setDtStart($dtStart) + { + $this->dtStart = $dtStart; + + return $this; + } + + /** + * @param $dtStamp + * + * @return $this + */ + public function setDtStamp($dtStamp) + { + $this->dtStamp = $dtStamp; + + return $this; + } + + /** + * @param $duration + * + * @return $this + */ + public function setDuration($duration) + { + $this->duration = $duration; + + return $this; + } + + /** + * @param $location + * @param string $title + * @param null $geo + * + * @return $this + */ + public function setLocation($location, $title = '', $geo = null) + { + $this->location = $location; + $this->locationTitle = $title; + $this->locationGeo = $geo; + + return $this; + } + + /** + * @param $noTime + * + * @return $this + */ + public function setNoTime($noTime) + { + $this->noTime = $noTime; + + return $this; + } + + /** + * @param int $sequence + * + * @return $this + */ + public function setSequence($sequence) + { + $this->sequence = $sequence; + + return $this; + } + + /** + * @return int + */ + public function getSequence() + { + return $this->sequence; + } + + /** + * @param Organizer $organizer + * + * @return $this + */ + public function setOrganizer(Organizer $organizer) + { + $this->organizer = $organizer; + + return $this; + } + + /** + * @param $summary + * + * @return $this + */ + public function setSummary($summary) + { + $this->summary = $summary; + + return $this; + } + + /** + * @param $uniqueId + * + * @return $this + */ + public function setUniqueId($uniqueId) + { + $this->uniqueId = $uniqueId; + + return $this; + } + + /** + * @return string + */ + public function getUniqueId() + { + return $this->uniqueId; + } + + /** + * @param $url + * + * @return $this + */ + public function setUrl($url) + { + $this->url = $url; + + return $this; + } + + /** + * @param $useTimezone + * + * @return $this + */ + public function setUseTimezone($useTimezone) + { + $this->useTimezone = $useTimezone; + + return $this; + } + + /** + * @return bool + */ + public function getUseTimezone() + { + return $this->useTimezone; + } + + /** + * @param Attendees $attendees + * + * @return $this + */ + public function setAttendees(Attendees $attendees) + { + $this->attendees = $attendees; + + return $this; + } + + /** + * @param string $attendee + * @param array $params + * + * @return $this + */ + public function addAttendee($attendee, $params = array()) + { + if (!isset($this->attendees)) { + $this->attendees = new Attendees(); + } + $this->attendees->add($attendee, $params); + + return $this; + } + + /** + * @return Attendees + */ + public function getAttendees() + { + return $this->attendees; + } + + /** + * @param $description + * + * @return $this + */ + public function setDescription($description) + { + $this->description = $description; + + return $this; + } + + /** + * @param $descriptionHTML + * + * @return $this + */ + public function setDescriptionHTML($descriptionHTML) + { + $this->descriptionHTML = $descriptionHTML; + + return $this; + } + + /** + * @param bool $useUtc + * + * @return $this + */ + public function setUseUtc($useUtc = true) + { + $this->useUtc = $useUtc; + + return $this; + } + + /** + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * @return string + */ + public function getDescriptionHTML() + { + return $this->descriptionHTML; + } + + /** + * @param $status + * + * @return $this + */ + public function setCancelled($status) + { + $this->cancelled = (bool) $status; + + return $this; + } + + /** + * @param $transparency + * + * @return $this + * + * @throws \InvalidArgumentException + */ + public function setTimeTransparency($transparency) + { + $transparency = strtoupper($transparency); + if ($transparency === self::TIME_TRANSPARENCY_OPAQUE + || $transparency === self::TIME_TRANSPARENCY_TRANSPARENT + ) { + $this->transparency = $transparency; + } else { + throw new \InvalidArgumentException('Invalid value for transparancy'); + } + + return $this; + } + + /** + * @param $status + * + * @return $this + * + * @throws \InvalidArgumentException + */ + public function setStatus($status) + { + $status = strtoupper($status); + if ($status == self::STATUS_CANCELLED + || $status == self::STATUS_CONFIRMED + || $status == self::STATUS_TENTATIVE + ) { + $this->status = $status; + } else { + throw new \InvalidArgumentException('Invalid value for status'); + } + + return $this; + } + + /** + * @param RecurrenceRule $recurrenceRule + * + * @return $this + */ + public function setRecurrenceRule(RecurrenceRule $recurrenceRule) + { + $this->recurrenceRule = $recurrenceRule; + + return $this; + } + + /** + * @return RecurrenceRule + */ + public function getRecurrenceRule() + { + return $this->recurrenceRule; + } + + /** + * @param $dtStamp + * + * @return $this + */ + public function setCreated($dtStamp) + { + $this->created = $dtStamp; + + return $this; + } + + /** + * @param $dtStamp + * + * @return $this + */ + public function setModified($dtStamp) + { + $this->modified = $dtStamp; + + return $this; + } + + /** + * @param $categories + * + * @return $this + */ + public function setCategories($categories) + { + $this->categories = $categories; + + return $this; + } + + /** + * Sets the event privacy. + * + * @param bool $flag + * + * @return $this + */ + public function setIsPrivate($flag) + { + $this->isPrivate = (bool) $flag; + + return $this; + } + + /** + * @param \DateTime $dateTime + * + * @return \Eluceo\iCal\Component\Event + */ + public function addExDate(\DateTime $dateTime) + { + $this->exDates[] = $dateTime; + + return $this; + } + + /** + * @return \DateTime[] + */ + public function getExDates() + { + return $this->exDates; + } + + /** + * @param \DateTime[] + * + * @return \Eluceo\iCal\Component\Event + */ + public function setExDates(array $exDates) + { + $this->exDates = $exDates; + + return $this; + } + + /** + * @return \Eluceo\iCal\Property\Event\RecurrenceId + */ + public function getRecurrenceId() + { + return $this->recurrenceId; + } + + /** + * @param RecurrenceId $recurrenceId + * + * @return \Eluceo\iCal\Component\Event + */ + public function setRecurrenceId(RecurrenceId $recurrenceId) + { + $this->recurrenceId = $recurrenceId; + + return $this; + } +} diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Component/Timezone.php b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Timezone.php new file mode 100644 index 00000000..c820d75b --- /dev/null +++ b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Timezone.php @@ -0,0 +1,57 @@ +<?php + +/* + * This file is part of the eluceo/iCal package. + * + * (c) Markus Poerschke <markus@eluceo.de> + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Eluceo\iCal\Component; + +use Eluceo\iCal\Component; +use Eluceo\iCal\PropertyBag; + +/** + * Implementation of the TIMEZONE component. + */ +class Timezone extends Component +{ + /** + * @var string + */ + protected $timezone; + + public function __construct($timezone) + { + $this->timezone = $timezone; + } + + /** + * {@inheritdoc} + */ + public function getType() + { + return 'VTIMEZONE'; + } + + /** + * {@inheritdoc} + */ + public function buildPropertyBag() + { + $propertyBag = new PropertyBag(); + + $propertyBag->set('TZID', $this->timezone); + $propertyBag->set('X-LIC-LOCATION', $this->timezone); + + return $propertyBag; + } + + public function getZoneIdentifier() + { + return $this->timezone; + } +} diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Component/TimezoneRule.php b/vendor/eluceo/ical/src/Eluceo/iCal/Component/TimezoneRule.php new file mode 100644 index 00000000..97da4911 --- /dev/null +++ b/vendor/eluceo/ical/src/Eluceo/iCal/Component/TimezoneRule.php @@ -0,0 +1,215 @@ +<?php + +/* + * This file is part of the eluceo/iCal package. + * + * (c) Markus Poerschke <markus@eluceo.de> + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Eluceo\iCal\Component; + +use Eluceo\iCal\Component; +use Eluceo\iCal\PropertyBag; +use Eluceo\iCal\Property\Event\RecurrenceRule; + +/** + * Implementation of Standard Time and Daylight Saving Time observances (or rules) + * which define the TIMEZONE component. + */ +class TimezoneRule extends Component +{ + const TYPE_DAYLIGHT = 'DAYLIGHT'; + const TYPE_STANDARD = 'STANDARD'; + + /** + * @var string + */ + protected $type; + + /** + * @var string + */ + protected $tzOffsetFrom; + + /** + * @var string + */ + protected $tzOffsetTo; + + /** + * @var string + */ + protected $tzName; + + /** + * @var \DateTime + */ + protected $dtStart; + + /** + * @var RecurrenceRule + */ + protected $recurrenceRule; + + /** + * create new Timezone Rule object by giving a rule type identifier. + * + * @param string $ruleType one of DAYLIGHT or STANDARD + * + * @throws \InvalidArgumentException + */ + public function __construct($ruleType) + { + $ruleType = strtoupper($ruleType); + if ($ruleType === self::TYPE_DAYLIGHT || $ruleType === self::TYPE_STANDARD) { + $this->type = $ruleType; + } else { + throw new \InvalidArgumentException('Invalid value for timezone rule type'); + } + } + + /** + * {@inheritdoc} + */ + public function buildPropertyBag() + { + $propertyBag = new PropertyBag(); + + if ($this->getTzName()) { + $propertyBag->set('TZNAME', $this->getTzName()); + } + + if ($this->getTzOffsetFrom()) { + $propertyBag->set('TZOFFSETFROM', $this->getTzOffsetFrom()); + } + + if ($this->getTzOffsetTo()) { + $propertyBag->set('TZOFFSETTO', $this->getTzOffsetTo()); + } + + if ($this->getDtStart()) { + $propertyBag->set('DTSTART', $this->getDtStart()); + } + + if ($this->recurrenceRule) { + $propertyBag->set('RRULE', $this->recurrenceRule); + } + + return $propertyBag; + } + + /** + * @param $offset + * + * @return $this + */ + public function setTzOffsetFrom($offset) + { + $this->tzOffsetFrom = $offset; + + return $this; + } + + /** + * @param $offset + * + * @return $this + */ + public function setTzOffsetTo($offset) + { + $this->tzOffsetTo = $offset; + + return $this; + } + + /** + * @param $name + * + * @return $this + */ + public function setTzName($name) + { + $this->tzName = $name; + + return $this; + } + + /** + * @param \DateTime $dtStart + * + * @return $this + */ + public function setDtStart(\DateTime $dtStart) + { + $this->dtStart = $dtStart; + + return $this; + } + + /** + * @param RecurrenceRule $recurrenceRule + * + * @return $this + */ + public function setRecurrenceRule(RecurrenceRule $recurrenceRule) + { + $this->recurrenceRule = $recurrenceRule; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getType() + { + return $this->type; + } + + /** + * @return string + */ + public function getTzOffsetFrom() + { + return $this->tzOffsetFrom; + } + + /** + * @return string + */ + public function getTzOffsetTo() + { + return $this->tzOffsetTo; + } + + /** + * @return string + */ + public function getTzName() + { + return $this->tzName; + } + + /** + * @return RecurrenceRule + */ + public function getRecurrenceRule() + { + return $this->recurrenceRule; + } + + /** + * @return mixed return string representation of start date or NULL if no date was given + */ + public function getDtStart() + { + if ($this->dtStart) { + return $this->dtStart->format('Ymd\THis'); + } + + return; + } +} |