/** * scan events for categories. * @param $events VEVENTs to scan. null to check all events for the current user. */ public static function scanCategories($events = null) { if (is_null($events)) { $calendars = CalendarCalendar::allCalendars(\OCP\USER::getUser()); if (count($calendars) > 0) { $events = array(); foreach ($calendars as $calendar) { if ($calendar['userid'] === \OCP\User::getUser()) { $calendar_events = Object::all($calendar['id']); $events = $events + $calendar_events; } } } } if (is_array($events) && count($events) > 0) { $vcategories = \OC::$server->getTagManager()->load('event'); $getName = function ($tag) { return $tag['name']; }; $tags = array_map($getName, $vcategories->getTags()); $vcategories->delete($tags); foreach ($events as $event) { $vobject = VObject::parse($event['calendardata']); if (!is_null($vobject)) { $object = null; if (isset($calendar->VEVENT)) { $object = $calendar->VEVENT; } else { if (isset($calendar->VTODO)) { $object = $calendar->VTODO; } else { if (isset($calendar->VJOURNAL)) { $object = $calendar->VJOURNAL; } } } if ($object && isset($object->CATEGORIES)) { $vcategories->addMultiple($object->CATEGORIES->getParts(), true, $event['id']); } } } } }
/** * @NoAdminRequired * * @brief checks if a whole calendar is already cached * @param integer $id * @return bool */ public function isCalendarCached($id) { $aCachedevents = $this->getCalendar($id); $cachedevents = 0; if ($aCachedevents !== null) { $cachedevents = count($aCachedevents); } $repeatingevents = 0; $allevents = Object::all($id); foreach ($allevents as $event) { if ((int) $event['repeating'] === 1) { $repeatingevents++; } } if ($cachedevents < $repeatingevents) { return false; } else { return true; } }
/** * * @param string $query * @return \OCP\Search\Result */ function search($query) { $today = date('Y-m-d', time()); $allowedCommands = array('#ra' => 1, '#dt' => 1); $calendars = CalendarCalendar::allCalendars(\OCP\USER::getUser(), true); $activeCalendars = ''; $config = \OC::$server->getConfig(); foreach ($calendars as $calendar) { $isAktiv = $calendar['active']; if ($config->getUserValue(\OCP\USER::getUser(), CalendarApp::$appname, 'calendar_' . $calendar['id']) != '') { $isAktiv = $config->getUserValue(\OCP\USER::getUser(), CalendarApp::$appname, 'calendar_' . $calendar['id']); } if (!array_key_exists('active', $calendar)) { $isAktiv = 1; } if ($isAktiv == 1 && (int) $calendar['issubscribe'] === 0) { $activeCalendars[] = $calendar; } } if (count($activeCalendars) === 0 || !\OCP\App::isEnabled(CalendarApp::$appname)) { //return false; } $results = array(); $searchquery = array(); if (substr_count($query, ' ') > 0) { $searchquery = explode(' ', $query); } else { $searchquery[] = $query; } $user_timezone = CalendarApp::getTimezone(); $l = \OC::$server->getL10N(CalendarApp::$appname); $isDate = false; if (strlen($query) >= 5 && self::validateDate($query)) { $isDate = true; //\OCP\Util::writeLog('calendar','VALID DATE FOUND', \OCP\Util::DEBUG); } foreach ($activeCalendars as $calendar) { $objects = Object::all($calendar['id']); foreach ($objects as $object) { if ($object['objecttype'] !== 'VEVENT') { continue; } $searchAdvanced = false; if ($isDate === true && strlen($query) >= 5) { // \OCP\Util::writeLog('calendar','search: ->'.$query, \OCP\Util::DEBUG); $tempQuery = strtotime($query); $checkDate = date('Y-m-d', $tempQuery); if (substr_count($object['startdate'], $checkDate) > 0) { $searchAdvanced = true; } } if (array_key_exists($query, $allowedCommands) && $allowedCommands[$query]) { if ($query === '#dt') { $search = $object['startdate']; if (substr_count($search, $today) > 0) { $searchAdvanced = true; } } if ($query == '#ra') { if ($object['isalarm'] === 1) { $searchAdvanced = true; } } } if (substr_count(strtolower($object['summary']), strtolower($query)) > 0 || $searchAdvanced === true) { $calendardata = VObject::parse($object['calendardata']); $vevent = $calendardata->VEVENT; if (Object::getowner($object['id']) !== \OCP\USER::getUser()) { if (isset($vevent->CLASS) && $vevent->CLASS->getValue() === 'CONFIDENTIAL') { continue; } if (isset($vevent->CLASS) && ($vevent->CLASS->getValue() === 'PRIVATE' || $vevent->CLASS->getValue() === '')) { continue; } } $dtstart = $vevent->DTSTART; $dtend = Object::getDTEndFromVEvent($vevent); $start_dt = $dtstart->getDateTime(); $start_dt->setTimezone(new \DateTimeZone($user_timezone)); $end_dt = $dtend->getDateTime(); $end_dt->setTimezone(new \DateTimeZone($user_timezone)); if ($dtstart->getValueType() == 'DATE') { $end_dt->modify('-1 sec'); if ($start_dt->format('d.m.Y') != $end_dt->format('d.m.Y')) { $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y') . ' - ' . $end_dt->format('d.m.Y'); } else { $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y'); } } else { $info = $l->t('Date') . ': ' . $start_dt->format('d.m.y H:i') . ' - ' . $end_dt->format('d.m.y H:i'); } $link = \OC::$server->getURLGenerator()->linkToRoute(CalendarApp::$appname . '.page.index') . '#' . urlencode($object['id']); $returnData['id'] = $object['id']; $returnData['description'] = $object['summary'] . ' ' . $info; $returnData['link'] = $link; $returnData['type'] = 'calendar'; //$results[]=$returnData; $results[] = new Result($returnData); //$name,$text,$link,$type } } } return $results; }
/** * Returns all calendar objects within a calendar object. * * Every item contains an array with the following keys: * * id - unique identifier which will be used for subsequent updates * * calendardata - The iCalendar-compatible calnedar data * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. * * lastmodified - a timestamp of the last modification time * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: * ' "abcdef"') * * calendarid - The calendarid as it was passed to this function. * * Note that the etag is optional, but it's highly encouraged to return for * speed reasons. * * The calendardata is also optional. If it's not returned * 'getCalendarObject' will be called later, which *is* expected to return * calendardata. * * @param string $calendarId * @return array */ public function getCalendarObjects($calendarId) { $data = array(); $calendar = CalendarCalendar::find($calendarId); $isShared = $calendar['userid'] !== \OCP\USER::getUser(); foreach (Object::all($calendarId) as $row) { if (!$isShared) { $data[] = $this->OCAddETag($row); } else { if (substr_count($row['calendardata'], 'CLASS') === 0) { $data[] = $this->OCAddETag($row); } else { $object = VObject::parse($row['calendardata']); if (!$object) { return false; } $isPrivate = false; $toCheck = array('VEVENT', 'VJOURNAL', 'VTODO'); foreach ($toCheck as $type) { foreach ($object->select($type) as $vobject) { if (isset($vobject->{'CLASS'}) && $vobject->{'CLASS'}->getValue() === 'PRIVATE') { $isPrivate = true; } } } if ($isPrivate === false) { $data[] = $this->OCAddETag($row); } } } } return $data; }