/**
  * testXMozAckExdate
  * 
  * @see 0009396: alarm_ack_time and alarm_snooze_time are not updated
  */
 public function testXMozAckExdate()
 {
     $vcalendarStream = Calendar_Frontend_WebDAV_EventTest::getVCalendar(dirname(__FILE__) . '/../../../Import/files/lightning_repeating_exdate_mozlastack.ics');
     $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_THUNDERBIRD);
     $event = $converter->toTine20Model($vcalendarStream);
     $this->assertEquals(1, count($event->alarms));
     $alarmOptions = Zend_Json::decode($event->alarms->getFirstRecord()->options);
     $alarmAckIndex = 'acknowledged-' . Tinebase_Core::getUser()->contact_id;
     $this->assertTrue(array_key_exists($alarmAckIndex, $alarmOptions), 'did not find index ' . $alarmAckIndex . ' in ' . print_r($alarmOptions, true));
     $this->assertEquals('2014-01-08 15:01:54', $alarmOptions[$alarmAckIndex]);
 }
 /**
  * test converting vcard from sogo connector to Calendar_Model_Event 
  */
 public function testConvertToTine20Model()
 {
     $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/lightning.ics', 'r');
     $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC);
     $event = $converter->toTine20Model($vcalendarStream);
     $organizer = Addressbook_Controller_Contact::getInstance()->get($event->organizer);
     $this->assertEquals(Calendar_Model_Event::CLASS_PRIVATE, $event->class);
     $this->assertEquals('Hamburg', $event->location);
     $this->assertEquals('*****@*****.**', $organizer->email);
     $this->assertGreaterThan(0, count($event->attendee->filter('user_id', $event->organizer)), 'Organizer must be attendee too');
 }
 /**
  * test converting vcard from EM Client to Calendar_Model_Event 
  */
 public function testConvertToTine20Model()
 {
     $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/emclient.ics', 'r');
     $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC);
     $event = $converter->toTine20Model($vcalendarStream);
     $this->assertEquals('eM Patch Upload', $event->summary);
     $this->assertEquals('2013-05-27 06:00:00', $event->dtstart->toString());
     $this->assertEquals('UTC', $event->dtstart->getTimeZone()->getName());
     $this->assertEquals('Europe/Berlin', $event->originator_tz);
     $this->assertCount(1, $event->alarms, 'there should be one alarm');
     $this->assertEquals(15, $event->alarms->getFirstRecord()->minutes_before, 'alarm should be 15 minutes before');
 }
 /**
  * exports calendars as ICS
  *
  * @param Zend_Console_Getopt $_opts
  */
 public function exportICS($_opts)
 {
     Tinebase_Core::set('HOSTNAME', 'localhost');
     $opts = $_opts->getRemainingArgs();
     $container_id = $opts[0];
     $filter = new Calendar_Model_EventFilter(array(array('field' => 'container_id', 'operator' => 'equals', 'value' => $container_id)));
     $result = Calendar_Controller_MSEventFacade::getInstance()->search($filter, null, false, false, 'get');
     if ($result->count() == 0) {
         throw new Tinebase_Exception('this calendar does not contain any records.');
     }
     $converter = Calendar_Convert_Event_VCalendar_Factory::factory("generic");
     $result = $converter->fromTine20RecordSet($result);
     print $result->serialize();
 }
Beispiel #5
0
 /**
  * this function creates a Calendar_Model_Event and stores it in the database
  * 
  * @todo the header handling does not belong here. It should be moved to the DAV_Server class when supported
  * 
  * @param  Tinebase_Model_Container  $container
  * @param  stream|string             $vobjectData
  */
 public static function create(Tinebase_Model_Container $container, $name, $vobjectData)
 {
     if (is_resource($vobjectData)) {
         $vobjectData = stream_get_contents($vobjectData);
     }
     // Converting to UTF-8, if needed
     $vobjectData = Sabre_DAV_StringUtil::ensureUTF8($vobjectData);
     Sabre_CalDAV_ICalendarUtil::validateICalendarObject($vobjectData, array('VEVENT', 'VFREEBUSY'));
     list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($_SERVER['HTTP_USER_AGENT']);
     $event = Calendar_Convert_Event_VCalendar_Factory::factory($backend, $version)->toTine20Model($vobjectData);
     $event->container_id = $container->getId();
     $id = ($pos = strpos($name, '.')) === false ? $name : substr($name, 0, $pos);
     $event->setId($id);
     self::enforceEventParameters($event);
     if ($event->exdate instanceof Tinebase_Record_RecordSet) {
         foreach ($event->exdate as $exdate) {
             if ($exdate->is_deleted == false && $exdate->organizer != $event->organizer) {
                 throw new Sabre_DAV_Exception_PreconditionFailed('Organizer for exdate must be the same like base event');
             }
         }
     }
     // check if there is already an existing event with this ID
     // this can happen when the invitation email is faster then the caldav update or
     // or when an event gets moved to another container
     $filter = new Calendar_Model_EventFilter(array(array('field' => 'containerType', 'operator' => 'equals', 'value' => 'all'), array('field' => 'dtstart', 'operator' => 'equals', 'value' => $event->dtstart), array('field' => 'dtend', 'operator' => 'equals', 'value' => $event->dtend), array('condition' => 'OR', 'filters' => array(array('field' => 'id', 'operator' => 'equals', 'value' => $id), array('field' => 'uid', 'operator' => 'equals', 'value' => $id)))));
     $existingEvent = Calendar_Controller_MSEventFacade::getInstance()->search($filter, null, false, false, 'sync')->getFirstRecord();
     if ($existingEvent === null) {
         $event = Calendar_Controller_MSEventFacade::getInstance()->create($event);
         $vevent = new self($container, $event);
     } else {
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' update existing event');
         }
         $vevent = new self($container, $existingEvent);
         $vevent->put($vobjectData);
     }
     return $vevent;
 }
Beispiel #6
0
 /**
  * get ics converter
  * 
  * @return Calendar_Convert_Event_VCalendar_Abstract
  */
 protected function _getConverter()
 {
     if (!$this->_converter) {
         list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($this->userAgent);
         $this->_converter = Calendar_Convert_Event_VCalendar_Factory::factory($backend, $version);
     }
     return $this->_converter;
 }
 /**
  * get max period (from) in months (default: 2)
  * 
  * @return integer
  */
 protected function _getMaxPeriodFrom()
 {
     //if the client does support sync tokens and the plugin Tinebase_WebDav_Plugin_SyncToken is active, allow to filter for all calendar events => return 100 years
     if (Calendar_Convert_Event_VCalendar_Factory::supportsSyncToken($_SERVER['HTTP_USER_AGENT'])) {
         return 100;
     }
     return Calendar_Config::getInstance()->get(Calendar_Config::MAX_FILTER_PERIOD_CALDAV, 2);
 }
 /**
  * get iMIP record from internal event
  * 
  * @param string $_method
  * @param boolean $_addEventToiMIP
  * @return Calendar_Model_iMIP
  */
 protected function _getiMIP($_method, $_addEventToiMIP = FALSE, $_testEmptyMethod = FALSE)
 {
     $email = $this->_getEmailAddress();
     $event = $this->_getEvent();
     $event = Calendar_Controller_Event::getInstance()->create($event);
     $this->_eventIdsToDelete[] = $event->getId();
     if ($_method == 'REPLY') {
         $personas = Zend_Registry::get('personas');
         $sclever = $personas['sclever'];
         $scleverAttendee = $event->attendee->filter('status', Calendar_Model_Attender::STATUS_NEEDSACTION)->getFirstRecord();
         $scleverAttendee->status = Calendar_Model_Attender::STATUS_ACCEPTED;
         Calendar_Controller_Event::getInstance()->attenderStatusUpdate($event, $scleverAttendee, $scleverAttendee->status_authkey);
         $event = Calendar_Controller_Event::getInstance()->get($event->getId());
         $email = $sclever->accountEmailAddress;
     }
     // get iMIP invitation for event
     $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC);
     $vevent = $converter->fromTine20Model($event);
     $vevent->METHOD = $_method;
     $ics = $vevent->serialize();
     $iMIP = new Calendar_Model_iMIP(array('id' => Tinebase_Record_Abstract::generateUID(), 'ics' => $ics, 'method' => $_testEmptyMethod ? NULL : $_method, 'originator' => $email));
     if ($_addEventToiMIP) {
         $iMIP->event = $event;
     }
     return $iMIP;
 }
 /**
  * send notification to a single attender
  * 
  * @param Calendar_Model_Attender    $_attender
  * @param Calendar_Model_Event       $_event
  * @param Tinebase_Model_FullAccount $_updater
  * @param Sting                      $_action
  * @param String                     $_notificationLevel
  * @param array                      $_updates
  * @param array                      $attachs
  * @return void
  */
 public function sendNotificationToAttender($_attender, $_event, $_updater, $_action, $_notificationLevel, $_updates = NULL, $attachs = FALSE)
 {
     try {
         // find organizer account
         if ($_event->organizer && $_event->resolveOrganizer()->account_id) {
             $organizer = Tinebase_User::getInstance()->getFullUserById($_event->resolveOrganizer()->account_id);
         } else {
             // use creator as organizer
             $organizer = Tinebase_User::getInstance()->getFullUserById($_event->created_by);
         }
         // get prefered language, timezone and notification level
         $prefUser = $_attender->getUserAccountId();
         $locale = Tinebase_Translation::getLocale(Tinebase_Core::getPreference()->getValueForUser(Tinebase_Preference::LOCALE, $prefUser ? $prefUser : $organizer->getId()));
         $timezone = Tinebase_Core::getPreference()->getValueForUser(Tinebase_Preference::TIMEZONE, $prefUser ? $prefUser : $organizer->getId());
         $translate = Tinebase_Translation::getTranslation('Calendar', $locale);
         // check if user wants this notification
         $sendLevel = $prefUser ? Tinebase_Core::getPreference('Calendar')->getValueForUser(Calendar_Preference::NOTIFICATION_LEVEL, $prefUser) : 100;
         $sendOnOwnActions = $prefUser ? Tinebase_Core::getPreference('Calendar')->getValueForUser(Calendar_Preference::SEND_NOTIFICATION_OF_OWN_ACTIONS, $prefUser) : 0;
         // NOTE: organizer gets mails unless she set notificationlevel to NONE
         if ($prefUser == $_updater->getId() && !$sendOnOwnActions || $sendLevel < $_notificationLevel && ($prefUser != $organizer->getId() || $sendLevel == self::NOTIFICATION_LEVEL_NONE)) {
             return;
         }
         // get date strings
         $startDateString = Tinebase_Translation::dateToStringInTzAndLocaleFormat($_event->dtstart, $timezone, $locale);
         $endDateString = Tinebase_Translation::dateToStringInTzAndLocaleFormat($_event->dtend, $timezone, $locale);
         switch ($_action) {
             case 'alarm':
                 $messageSubject = sprintf($translate->_('Alarm for event "%1$s" at %2$s'), $_event->summary, $startDateString);
                 break;
             case 'created':
                 $messageSubject = sprintf($translate->_('Event invitation "%1$s" at %2$s'), $_event->summary, $startDateString);
                 $method = Calendar_Model_iMIP::METHOD_REQUEST;
                 break;
             case 'deleted':
                 $messageSubject = sprintf($translate->_('Event "%1$s" at %2$s has been canceled'), $_event->summary, $startDateString);
                 $method = Calendar_Model_iMIP::METHOD_CANCEL;
                 break;
             case 'changed':
                 switch ($_notificationLevel) {
                     case self::NOTIFICATION_LEVEL_EVENT_RESCHEDULE:
                         $messageSubject = sprintf($translate->_('Event "%1$s" at %2$s has been rescheduled'), $_event->summary, $startDateString);
                         $method = Calendar_Model_iMIP::METHOD_REQUEST;
                         break;
                     case self::NOTIFICATION_LEVEL_EVENT_UPDATE:
                         $messageSubject = sprintf($translate->_('Event "%1$s" at %2$s has been updated'), $_event->summary, $startDateString);
                         $method = Calendar_Model_iMIP::METHOD_REQUEST;
                         break;
                     case self::NOTIFICATION_LEVEL_ATTENDEE_STATUS_UPDATE:
                         if (!empty($_updates['attendee']) && !empty($_updates['attendee']['toUpdate']) && count($_updates['attendee']['toUpdate']) == 1) {
                             // single attendee status update
                             $attender = $_updates['attendee']['toUpdate'][0];
                             switch ($attender->status) {
                                 case Calendar_Model_Attender::STATUS_ACCEPTED:
                                     $messageSubject = sprintf($translate->_('%1$s accepted event "%2$s" at %3$s'), $attender->getName(), $_event->summary, $startDateString);
                                     break;
                                 case Calendar_Model_Attender::STATUS_DECLINED:
                                     $messageSubject = sprintf($translate->_('%1$s declined event "%2$s" at %3$s'), $attender->getName(), $_event->summary, $startDateString);
                                     break;
                                 case Calendar_Model_Attender::STATUS_TENTATIVE:
                                     $messageSubject = sprintf($translate->_('Tentative response from %1$s for event "%2$s" at %3$s'), $attender->getName(), $_event->summary, $startDateString);
                                     break;
                                 case Calendar_Model_Attender::STATUS_NEEDSACTION:
                                     $messageSubject = sprintf($translate->_('No response from %1$s for event "%2$s" at %3$s'), $attender->getName(), $_event->summary, $startDateString);
                                     break;
                             }
                         } else {
                             $messageSubject = sprintf($translate->_('Attendee changes for event "%1$s" at %2$s'), $_event->summary, $startDateString);
                         }
                         // we don't send iMIP parts to organizers with an account cause event is already up to date
                         if ($_event->organizer && !$_event->resolveOrganizer()->account_id) {
                             $method = Calendar_Model_iMIP::METHOD_REPLY;
                         }
                         break;
                 }
                 break;
             default:
                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
                     Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " unknown action '{$_action}'");
                 }
                 break;
         }
         $view = new Zend_View();
         $view->setScriptPath(dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'views');
         $view->translate = $translate;
         $view->timezone = $timezone;
         $view->event = $_event;
         $view->updater = $_updater;
         $view->updates = $_updates;
         $messageBody = $view->render('eventNotification.php');
         if (isset($method) && version_compare(PHP_VERSION, '5.3.0', '>=')) {
             $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC);
             $converter->setMethod($method);
             $vcalendar = $converter->fromTine20Model($_event);
             // in Tine 2.0 non organizers might be given the grant to update events
             // @see rfc6047 section 2.2.1 & rfc5545 section 3.2.18
             if ($method != Calendar_Model_iMIP::METHOD_REPLY && $_event->organizer !== $_updater->contact_id) {
                 foreach ($vcalendar->children() as $component) {
                     if ($component->name == 'VEVENT') {
                         if (isset($component->{'ORGANIZER'})) {
                             $component->{'ORGANIZER'}->add(new Sabre_VObject_Parameter('SEND-BY', 'mailto:' . $_updater->accountEmailAddress));
                         }
                     }
                 }
             }
             /* not yet supported
                // in Tine 2.0 status updater might not be updater
                if ($method == Calendar_Model_iMIP::METHOD_REPLY) {
                    
                }
                */
             $calendarPart = new Zend_Mime_Part($vcalendar->serialize());
             $calendarPart->charset = 'UTF-8';
             $calendarPart->type = 'text/calendar; method=' . $method;
             $calendarPart->encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE;
             $attachment = new Zend_Mime_Part($vcalendar->serialize());
             $attachment->type = 'application/ics';
             $attachment->encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE;
             $attachment->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
             $attachment->filename = 'event.ics';
             $attachments = array($attachment);
             if ($attachs) {
                 foreach ($attachs as $file) {
                     $stream = fopen($file['tempFile']['path'], 'r');
                     $part = new Zend_Mime_Part($stream);
                     $part->type = $file['tempFile']['type'];
                     $part->encoding = Zend_Mime::ENCODING_BASE64;
                     $part->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
                     $part->filename = $file['tempFile']['name'];
                     $attachments[] = $part;
                 }
             }
         } else {
             $calendarPart = null;
             $attachments = null;
         }
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " receiver: '{$_attender->getEmail()}'");
         }
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " subject: '{$messageSubject}'");
         }
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " body: {$messageBody}");
         }
         // NOTE: this is a contact as we only support users and groupmembers
         $contact = $_attender->getResolvedUser();
         $sender = $_action == 'alarm' ? $organizer : $_updater;
         Tinebase_Notification::getInstance()->send($sender, array($contact), $messageSubject, $messageBody, $calendarPart, $attachments);
     } catch (Exception $e) {
         Tinebase_Core::getLogger()->WARN(__METHOD__ . '::' . __LINE__ . " could not send notification :" . $e);
         return;
     }
 }
 /**
  * create iMIP VCALENDAR
  * 
  * @param Calendar_Model_Event $event
  * @param string $method
  * @param Tinebase_Model_FullAccount $updater
  * @return Sabre\VObject\Component
  */
 protected function _createVCalendar($event, $method, $updater)
 {
     $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC);
     $converter->setMethod($method);
     $vcalendar = $converter->fromTine20Model($event);
     foreach ($vcalendar->children() as $component) {
         if ($component->name == 'VEVENT') {
             if ($method != Calendar_Model_iMIP::METHOD_REPLY && $event->organizer !== $updater->contact_id) {
                 if (isset($component->{'ORGANIZER'})) {
                     // in Tine 2.0 non organizers might be given the grant to update events
                     // @see rfc6047 section 2.2.1 & rfc5545 section 3.2.18
                     $component->{'ORGANIZER'}->add('SENT-BY', 'mailto:' . $updater->accountEmailAddress);
                 }
             } else {
                 if ($method == Calendar_Model_iMIP::METHOD_REPLY) {
                     // TODO in Tine 2.0 status updater might not be updater
                     $component->{'REQUEST-STATUS'} = '2.0;Success';
                 }
             }
         }
     }
     return $vcalendar;
 }
 /**
  * test converting vcard from sogo connector to Calendar_Model_Event 
  */
 public function testConvertToTine20Model()
 {
     $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/lightning.ics', 'r');
     $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC);
     $event = $converter->toTine20Model($vcalendarStream);
 }
 /**
  * create instance of Calendar_Convert_Event_VCalendar_*
  * 
  * @return Calendar_Convert_Event_VCalendar_Abstract
  */
 public function _getConverter()
 {
     list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($_SERVER['HTTP_USER_AGENT']);
     if (!$this->_converter) {
         $this->_converter = Calendar_Convert_Event_VCalendar_Factory::factory($backend, $version);
     }
     return $this->_converter;
 }
 public function testConvertToTine20ModelYosemiteRecurringAllDayWithUntil()
 {
     $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX, '10.10.5');
     $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_calendar_10.10_birthday02-PUT-quit-old.ics', 'r');
     $event = $converter->toTine20Model($vcalendarStream);
     $this->assertEquals('FREQ=YEARLY;INTERVAL=1;UNTIL=2016-09-17 22:00:00', $event->rrule);
 }
Beispiel #14
0
 /**
  * get iMIP record from internal event
  * 
  * @param string $_method
  * @param boolean $_addEventToiMIP
  * @return Calendar_Model_iMIP
  */
 protected function _getiMIP($_method, $_addEventToiMIP = FALSE, $_testEmptyMethod = FALSE)
 {
     $event = $this->_getEvent();
     $event = Calendar_Controller_Event::getInstance()->create($event);
     $this->_eventIdsToDelete[] = $event->getId();
     // get iMIP invitation for event
     $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC);
     $vevent = $converter->fromTine20Model($event);
     $vevent->METHOD = $_method;
     $ics = $vevent->serialize();
     $testConfig = Zend_Registry::get('testConfig');
     $email = $testConfig->email ? $testConfig->email : '*****@*****.**';
     $iMIP = new Calendar_Model_iMIP(array('id' => Tinebase_Record_Abstract::generateUID(), 'ics' => $ics, 'method' => $_testEmptyMethod ? NULL : $_method, 'originator' => $email));
     if ($_addEventToiMIP) {
         $iMIP->event = $event;
     }
     return $iMIP;
 }
 /**
  * @see 0011130: handle bad originator timzone in VCALENDAR converter
  */
 public function testBrokenTimezoneInTineEvent()
 {
     $event = $this->testConvertRepeatingAllDayDailyEventToTine20Model();
     $event->originator_tz = 'AWST';
     // Australian Western Standard Time
     $this->_converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC);
     try {
         $vevent = $this->_converter->fromTine20Model($event)->serialize();
         $this->fail('should throw Tinebase_Exception_Record_Validation because of bad TZ');
     } catch (Tinebase_Exception_Record_Validation $terv) {
         $this->assertEquals('Bad Timezone: AWST', $terv->getMessage());
     }
 }
 /**
  * test factory with useragent string from thunderbird 
  */
 public function testUserAgentIceowl()
 {
     list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent('Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20111110 Iceowl/1.0b1 Icedove/3.0.11');
     $this->assertEquals(Calendar_Convert_Event_VCalendar_Factory::CLIENT_THUNDERBIRD, $backend);
     $this->assertEquals('1.0b1', $version);
 }
 /**
  * get max period (from) in months (default: 2)
  * 
  * @return integer
  */
 protected function _getMaxPeriodFrom()
 {
     // if the client does support sync tokens and the plugin Tinebase_WebDav_Plugin_SyncToken is active
     if (Calendar_Convert_Event_VCalendar_Factory::supportsSyncToken($_SERVER['HTTP_USER_AGENT'])) {
         $result = Calendar_Config::getInstance()->get(Calendar_Config::MAX_FILTER_PERIOD_CALDAV_SYNCTOKEN, 100);
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' SyncToken active: allow to filter for all calendar events => return ' . $result . ' months');
         }
         return $result;
     }
     return Calendar_Config::getInstance()->get(Calendar_Config::MAX_FILTER_PERIOD_CALDAV, 2);
 }
 /**
  * import the data
  *
  * @param  stream $_resource 
  * @param array $_clientRecordData
  * @return array : 
  *  'results'           => Tinebase_Record_RecordSet, // for dryrun only
  *  'totalcount'        => int,
  *  'failcount'         => int,
  *  'duplicatecount'    => int,
  *  
  *  @throws Calendar_Exception_IcalParser
  *  
  *  @see 0008334: use vcalendar converter for ics import
  */
 public function import($_resource = NULL, $_clientRecordData = array())
 {
     $this->_initImportResult();
     if (!$this->_options['container_id']) {
         throw new Tinebase_Exception_InvalidArgument('you need to define a container_id');
     }
     $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC);
     if (isset($this->_options['onlyBasicData'])) {
         $converter->setOptions(array('onlyBasicData' => $this->_options['onlyBasicData']));
     }
     try {
         $events = $converter->toTine20RecordSet($_resource);
     } catch (Exception $e) {
         Tinebase_Exception::log($e);
         $isce = new Calendar_Exception_IcalParser('Can not parse ics file: ' . $e->getMessage());
         $isce->setParseError($e);
         throw $isce;
     }
     try {
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . ' Trying to find container with ID ' . print_r($this->_options['container_id'], true));
         }
         $container = Tinebase_Container::getInstance()->getContainerById($this->_options['container_id']);
     } catch (Tinebase_Exception_InvalidArgument $e) {
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . ' Could not found container with Id ' . print_r($this->_options['container_id'], true) . ' assuming this is a container name.');
         }
         $container = new Tinebase_Model_Container(array('name' => $this->_options['container_id'], 'type' => Tinebase_Model_Container::TYPE_PERSONAL, 'backend' => Tinebase_User::SQL, 'color' => '#ffffff', 'application_id' => Tinebase_Application::getInstance()->getApplicationByName('Calendar')->getId(), 'owner_id' => Tinebase_Core::getUser()->getId(), 'model' => 'Calendar_Model_Event'));
         $container = Tinebase_Container::getInstance()->addContainer($container);
     }
     try {
         $this->_options['container_id'] = $container->getId();
     } catch (Exception $ex) {
         throw new Tinebase_Exception_NotFound('Could not find container by ID: ' . $this->_options['container_id']);
     }
     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . ' Import into calendar: ' . print_r($this->_options['container_id'], true));
     }
     $cc = Calendar_Controller_MSEventFacade::getInstance();
     $sendNotifications = Calendar_Controller_Event::getInstance()->sendNotifications(FALSE);
     // search uid's and remove already existing -> only in import cal?
     $existingEventsFilter = new Calendar_Model_EventFilter(array(array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_options['container_id']), array('field' => 'uid', 'operator' => 'in', 'value' => array_unique($events->uid))));
     $existingEvents = $cc->search($existingEventsFilter);
     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . ' Found ' . count($existingEvents) . ' existing events');
     }
     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
         Tinebase_Core::getLogger()->trace(__METHOD__ . ' ' . __LINE__ . ' ' . ' Filter: ' . print_r($existingEventsFilter->toArray(), true));
     }
     // insert one by one in a single transaction
     $existingEvents->addIndices(array('uid'));
     foreach ($events as $event) {
         $existingEvent = $existingEvents->find('uid', $event->uid);
         try {
             if (!$existingEvent) {
                 $event->container_id = $this->_options['container_id'];
                 $event = $cc->create($event, FALSE);
                 $this->_importResult['totalcount'] += 1;
                 $this->_importResult['results']->addRecord($event);
             } else {
                 if ($this->_options['forceUpdateExisting'] || $this->_options['updateExisting'] && $event->seq > $existingEvent->seq) {
                     $event->id = $existingEvent->getId();
                     $event->last_modified_time = $existingEvent->last_modified_time instanceof Tinebase_DateTime ? clone $existingEvent->last_modified_time : NULL;
                     $cc->update($event, FALSE);
                     $this->_importResult['results']->addRecord($event);
                     $this->_importResult['totalcount'] += 1;
                 } else {
                     $this->_importResult['duplicatecount'] += 1;
                 }
             }
         } catch (Exception $e) {
             if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) {
                 Tinebase_Core::getLogger()->notice(__METHOD__ . ' ' . __LINE__ . ' Import failed for Event ' . $event->summary);
             }
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
                 Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . print_r($event->toArray(), TRUE));
             }
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
                 Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . $e);
             }
             $this->_importResult['failcount'] += 1;
         }
     }
     Calendar_Controller_Event::getInstance()->sendNotifications($sendNotifications);
     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . ' totalcount: ' . $this->_importResult['totalcount'] . ' / duplicates: ' . $this->_importResult['duplicatecount'] . ' / fails: ' . $this->_importResult['failcount']);
     }
     return $this->_importResult;
 }
 /**
  * checks if client supports delegations
  * 
  * @return boolean
  * 
  * @todo don't use $_SERVER to fetch user agent
  * @todo move user agent parsing to Tinebase
  */
 protected function _clientSupportsDelegations()
 {
     if (isset($_SERVER['HTTP_USER_AGENT'])) {
         list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($_SERVER['HTTP_USER_AGENT']);
         $clientSupportsDelegations = $backend === Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX;
     } else {
         $clientSupportsDelegations = false;
     }
     return $clientSupportsDelegations;
 }
 public function testConvertToTine20ModelWithCustomAlarm()
 {
     $vcalendar = $this->_getVCalendar(dirname(__FILE__) . '/../../../Import/files/event_with_custom_alarm.ics');
     $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC);
     $event = $converter->toTine20Model($vcalendar);
     $this->assertTrue($event->alarms instanceof Tinebase_Record_RecordSet);
     $this->assertEquals(1, count($event->alarms));
     $alarm = $event->alarms->getFirstRecord();
     $this->assertEquals(Tinebase_Model_Alarm::OPTION_CUSTOM, $alarm->minutes_before);
     $this->assertEquals('2012-02-14 17:00:00', $alarm->alarm_time->toString());
 }