/**
  * @param \OCA\Calendar\IObject|\OCA\Calendar\IObjectCollection $data
  * @param TimezoneMapper $timezones
  * @param int $statusCode
  */
 public function __construct($data, TimezoneMapper $timezones = null, $statusCode = Http::STATUS_OK)
 {
     $vobject = $data->getVObject();
     if ($vobject) {
         if ($timezones) {
             SabreUtility::addMissingVTimezones($vobject, $timezones);
         }
         $serialized = $vobject->serialize();
         parent::__construct($serialized, $statusCode, ['Content-type' => 'text/calendar; charset=utf-8']);
         if ($data instanceof IObject) {
             $this->setETag($data->getEtag(true));
         }
     } else {
         parent::__construct(null, HTTP::STATUS_NO_CONTENT);
     }
 }
 /**
  * @param ICalendar $calendar
  * @param \OCA\Calendar\IObject|\OCA\Calendar\IObjectCollection $data
  * @param TimezoneMapper $timezones
  */
 public function __construct(ICalendar $calendar, $data, TimezoneMapper $timezones)
 {
     $vobject = $data->getVObject();
     if ($vobject) {
         if ($timezones) {
             SabreUtility::addMissingVTimezones($vobject, $timezones);
         }
         $serialized = $vobject->serialize();
         $contentType = 'application/octet-stream';
         $filename = $calendar->getPublicUri();
         if ($data instanceof IObject) {
             $filename .= '-' . $data->getSummary();
         }
         $filename .= '.ics';
         parent::__construct($serialized, $filename, $contentType);
     }
 }
 /**
  * get endDate
  * @return DateTime
  */
 public function getEndDate()
 {
     /** @var \Sabre\VObject\Component $object */
     $object = $this->vObject->{$this->getObjectName()};
     $realEnd = SabreUtility::getDTEnd($object);
     if ($realEnd instanceof SDateTime || $realEnd instanceof SDate) {
         return $realEnd->getDateTime();
     } else {
         return null;
     }
 }
 /**
  * create calendar object from VCalendar
  * @param VCalendar $vcalendar
  * @return $this
  */
 public function fromVObject(VCalendar $vcalendar)
 {
     foreach ($this->icsMapper as $classvar => $icsproperty) {
         $setter = 'set' . ucfirst($classvar);
         $value = $vcalendar->select($icsproperty);
         if (!empty($value)) {
             $this->{$setter}(reset($value));
         }
     }
     $tzIds = $vcalendar->select('X-WR-TIMEZONE');
     $tzId = reset($tzIds);
     $tz = SabreUtility::getTimezoneFromVObject($vcalendar, $tzId);
     if ($tz) {
         $this->setTimezone($tz);
     }
     return $this;
 }