2012-06-29 16:32:07 +04:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Copyright (c) 2012 Georg Ehrke <ownclouddev@georgswebsite.de>
|
|
|
|
* This file is licensed under the Affero General Public License version 3 or
|
|
|
|
* later.
|
|
|
|
* See the COPYING-README file.
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
* This class does import and converts all times to the users current timezone
|
|
|
|
*/
|
|
|
|
class OC_Calendar_Import{
|
2012-07-04 00:33:24 +04:00
|
|
|
/*
|
|
|
|
* @brief counts the absolute number of parsed elements
|
|
|
|
*/
|
|
|
|
private $abscount;
|
|
|
|
|
2012-06-29 16:32:07 +04:00
|
|
|
/*
|
2012-06-30 14:42:36 +04:00
|
|
|
* @brief var saves if the percentage should be saved with OC_Cache
|
2012-06-29 16:32:07 +04:00
|
|
|
*/
|
2012-06-30 14:42:36 +04:00
|
|
|
private $cacheprogress;
|
2012-06-29 16:32:07 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief Sabre_VObject_Component_VCalendar object - for documentation see http://code.google.com/p/sabredav/wiki/Sabre_VObject_Component_VCalendar
|
|
|
|
*/
|
|
|
|
private $calobject;
|
|
|
|
|
2012-07-01 00:26:29 +04:00
|
|
|
/*
|
|
|
|
* @brief var counts the number of imported elements
|
|
|
|
*/
|
|
|
|
private $count;
|
|
|
|
|
2012-06-29 16:32:07 +04:00
|
|
|
/*
|
2012-06-30 14:42:36 +04:00
|
|
|
* @brief var to check if errors happend while initialization
|
2012-06-29 16:32:07 +04:00
|
|
|
*/
|
2012-06-30 14:42:36 +04:00
|
|
|
private $error;
|
2012-06-29 16:32:07 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief var saves the ical string that was submitted with the __construct function
|
|
|
|
*/
|
2012-06-30 14:42:36 +04:00
|
|
|
private $ical;
|
2012-06-29 16:32:07 +04:00
|
|
|
|
2012-06-30 17:17:29 +04:00
|
|
|
/*
|
|
|
|
* @brief calendar id for import
|
|
|
|
*/
|
|
|
|
private $id;
|
|
|
|
|
2012-06-29 16:32:07 +04:00
|
|
|
/*
|
|
|
|
* @brief var saves the percentage of the import's progress
|
|
|
|
*/
|
|
|
|
private $progress;
|
2012-06-30 14:42:36 +04:00
|
|
|
|
2012-07-04 00:33:24 +04:00
|
|
|
/*
|
|
|
|
* @brief var saves the key for the percentage of the import's progress
|
|
|
|
*/
|
|
|
|
private $progresskey;
|
|
|
|
|
2012-06-30 14:42:36 +04:00
|
|
|
/*
|
|
|
|
* @brief var saves the timezone the events shell converted to
|
|
|
|
*/
|
|
|
|
private $tz;
|
2012-07-01 00:08:30 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief var saves the userid
|
|
|
|
*/
|
|
|
|
private $userid;
|
2012-06-29 16:32:07 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* public methods
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief does general initialization for import object
|
2012-06-30 14:42:36 +04:00
|
|
|
* @param string $calendar content of ical file
|
|
|
|
* @param string $tz timezone of the user
|
2012-06-29 16:32:07 +04:00
|
|
|
* @return boolean
|
|
|
|
*/
|
2012-06-30 14:42:36 +04:00
|
|
|
public function __construct($ical){
|
2012-06-29 16:32:07 +04:00
|
|
|
$this->error = null;
|
|
|
|
$this->ical = $ical;
|
2012-07-04 00:33:24 +04:00
|
|
|
$this->abscount = 0;
|
2012-07-01 00:26:29 +04:00
|
|
|
$this->count = 0;
|
2012-06-29 16:32:07 +04:00
|
|
|
try{
|
|
|
|
$this->calobject = OC_VObject::parse($this->ical);
|
|
|
|
}catch(Exception $e){
|
|
|
|
//MISSING: write some log
|
|
|
|
$this->error = true;
|
|
|
|
return false;
|
|
|
|
}
|
2012-06-30 14:42:36 +04:00
|
|
|
return true;
|
2012-06-29 16:32:07 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief imports a calendar
|
|
|
|
* @return boolean
|
|
|
|
*/
|
2012-07-01 00:08:30 +04:00
|
|
|
public function import(){
|
|
|
|
if(!$this->isValid()){
|
2012-06-29 16:32:07 +04:00
|
|
|
return false;
|
|
|
|
}
|
2012-07-04 00:33:24 +04:00
|
|
|
$numofcomponents = count($this->calobject->getComponents());
|
2012-06-30 14:42:36 +04:00
|
|
|
foreach($this->calobject->getComponents() as $object){
|
|
|
|
if(!($object instanceof Sabre_VObject_Component_VEvent) && !($object instanceof Sabre_VObject_Component_VJournal) && !($object instanceof Sabre_VObject_Component_VTodo)){
|
|
|
|
continue;
|
|
|
|
}
|
2012-07-01 00:45:12 +04:00
|
|
|
$dtend = OC_Calendar_Object::getDTEndFromVEvent($object);
|
2012-07-01 00:08:30 +04:00
|
|
|
$object->DTSTART->getDateTime()->setTimezone(new DateTimeZone($this->tz));
|
2012-07-01 00:45:12 +04:00
|
|
|
$object->DTEND->setDateTime($dtend->getDateTime(), $object->DTSTART->getDateType());
|
2012-07-01 00:08:30 +04:00
|
|
|
$object->DTEND->getDateTime()->setTimezone(new DateTimeZone($this->tz));
|
|
|
|
$vcalendar = $this->createVCalendar($object->serialize());
|
2012-07-01 01:18:41 +04:00
|
|
|
$insertid = OC_Calendar_Object::add($this->id, $vcalendar);
|
2012-07-04 00:33:24 +04:00
|
|
|
$this->abscount++;
|
2012-07-01 01:18:41 +04:00
|
|
|
if($this->isDuplicate($insertid)){
|
|
|
|
OC_Calendar_Object::delete($insertid);
|
|
|
|
}else{
|
2012-07-04 00:33:24 +04:00
|
|
|
$this->count++;
|
2012-07-01 01:18:41 +04:00
|
|
|
}
|
2012-07-04 00:33:24 +04:00
|
|
|
$this->updateProgress(intval(($this->abscount / $numofcomponents)*100));
|
2012-06-30 14:42:36 +04:00
|
|
|
}
|
2012-07-04 00:33:24 +04:00
|
|
|
OC_Cache::remove($this->progresskey);
|
2012-06-30 17:17:29 +04:00
|
|
|
return true;
|
2012-06-30 14:42:36 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief sets the timezone
|
|
|
|
* @return boolean
|
|
|
|
*/
|
|
|
|
public function setTimeZone($tz){
|
|
|
|
$this->tz = $tz;
|
|
|
|
return true;
|
2012-06-29 16:32:07 +04:00
|
|
|
}
|
|
|
|
|
2012-07-04 00:33:24 +04:00
|
|
|
/*
|
|
|
|
* @brief sets the progresskey
|
|
|
|
* @return boolean
|
|
|
|
*/
|
|
|
|
public function setProgresskey($progresskey){
|
|
|
|
$this->progresskey = $progresskey;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2012-06-29 16:32:07 +04:00
|
|
|
/*
|
|
|
|
* @brief checks if something went wrong while initialization
|
|
|
|
* @return boolean
|
|
|
|
*/
|
|
|
|
public function isValid(){
|
|
|
|
if(is_null($this->error)){
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief returns the percentage of progress
|
|
|
|
* @return integer
|
|
|
|
*/
|
|
|
|
public function getProgress(){
|
|
|
|
return $this->progress;
|
|
|
|
}
|
2012-06-30 14:42:36 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief enables the cache for the percentage of progress
|
|
|
|
* @return boolean
|
|
|
|
*/
|
|
|
|
public function enableProgressCache(){
|
|
|
|
$this->cacheprogress = true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief disables the cache for the percentage of progress
|
|
|
|
* @return boolean
|
|
|
|
*/
|
|
|
|
public function disableProgressCache(){
|
|
|
|
$this->cacheprogress = false;
|
|
|
|
return false;
|
|
|
|
}
|
2012-06-30 17:17:29 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief generates a new calendar name
|
|
|
|
* @return string
|
|
|
|
*/
|
2012-07-01 00:08:30 +04:00
|
|
|
public function createCalendarName(){
|
|
|
|
$calendars = OC_Calendar_Calendar::allCalendars($this->userid);
|
2012-06-30 17:17:29 +04:00
|
|
|
$calendarname = $guessedcalendarname = !is_null($this->guessCalendarName())?($this->guessCalendarName()):(OC_Calendar_App::$l10n->t('New Calendar'));
|
|
|
|
$i = 1;
|
2012-07-01 00:08:30 +04:00
|
|
|
while(!OC_Calendar_Calendar::isCalendarNameavailable($calendarname, $this->userid)){
|
2012-06-30 17:17:29 +04:00
|
|
|
$calendarname = $guessedcalendarname . ' (' . $i . ')';
|
|
|
|
$i++;
|
|
|
|
}
|
|
|
|
return $calendarname;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief generates a new calendar color
|
|
|
|
* @return string
|
|
|
|
*/
|
2012-07-01 00:08:30 +04:00
|
|
|
public function createCalendarColor(){
|
|
|
|
if(is_null($this->guessCalendarColor())){
|
2012-06-30 17:17:29 +04:00
|
|
|
return '#9fc6e7';
|
|
|
|
}
|
|
|
|
return $this->guessCalendarColor();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief sets the id for the calendar
|
|
|
|
* @param integer $id of the calendar
|
|
|
|
* @return boolean
|
|
|
|
*/
|
2012-07-01 00:08:30 +04:00
|
|
|
public function setCalendarID($id){
|
2012-06-30 17:17:29 +04:00
|
|
|
$this->id = $id;
|
2012-07-01 00:08:30 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief sets the userid to import the calendar
|
|
|
|
* @param string $id of the user
|
|
|
|
* @return boolean
|
|
|
|
*/
|
|
|
|
public function setUserID($userid){
|
|
|
|
$this->userid = $userid;
|
|
|
|
return true;
|
2012-06-30 17:17:29 +04:00
|
|
|
}
|
2012-07-01 00:26:29 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief returns the private
|
|
|
|
* @param string $id of the user
|
|
|
|
* @return boolean
|
|
|
|
*/
|
|
|
|
public function getCount(){
|
|
|
|
return $this->count;
|
|
|
|
}
|
2012-06-29 16:32:07 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* private methods
|
|
|
|
*/
|
|
|
|
|
2012-06-30 14:42:36 +04:00
|
|
|
/*
|
|
|
|
* @brief generates an unique ID
|
|
|
|
* @return string
|
|
|
|
*/
|
2012-07-06 13:23:20 +04:00
|
|
|
//private function createUID(){
|
|
|
|
// return substr(md5(rand().time()),0,10);
|
|
|
|
//}
|
2012-06-30 14:42:36 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief checks is the UID is already in use for another event
|
|
|
|
* @param string $uid uid to check
|
|
|
|
* @return boolean
|
|
|
|
*/
|
2012-07-06 13:23:20 +04:00
|
|
|
//private function isUIDAvailable($uid){
|
|
|
|
//
|
|
|
|
//}
|
2012-06-30 14:42:36 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief generates a proper VCalendar string
|
|
|
|
* @param string $vobject
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
private function createVCalendar($vobject){
|
|
|
|
if(is_object($vobject)){
|
|
|
|
$vobject = @$vobject->serialize();
|
|
|
|
}
|
|
|
|
$vcalendar = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud Calendar " . OCP\App::getAppVersion('calendar') . "\n";
|
|
|
|
$vcalendar .= $vobject;
|
|
|
|
$vcalendar .= "END:VCALENDAR";
|
|
|
|
return $vcalendar;
|
|
|
|
}
|
|
|
|
|
2012-06-29 16:32:07 +04:00
|
|
|
/*
|
2012-07-01 00:08:30 +04:00
|
|
|
* @brief checks if an event already exists in the user's calendars
|
2012-07-01 01:18:41 +04:00
|
|
|
* @param integer $insertid id of the new object
|
2012-07-01 00:08:30 +04:00
|
|
|
* @return boolean
|
2012-06-29 16:32:07 +04:00
|
|
|
*/
|
2012-07-01 01:18:41 +04:00
|
|
|
private function isDuplicate($insertid){
|
|
|
|
$newobject = OC_Calendar_Object::find($insertid);
|
2012-08-17 23:29:26 +04:00
|
|
|
$stmt = OCP\DB::prepare('SELECT COUNT(*) as count FROM *PREFIX*calendar_objects
|
|
|
|
INNER JOIN *PREFIX*calendar_calendars ON calendarid=*PREFIX*calendar_calendars.id
|
|
|
|
WHERE objecttype=? AND startdate=? AND enddate=? AND repeating=? AND summary=? AND calendardata=? AND userid = ?');
|
|
|
|
$result = $stmt->execute(array($newobject['objecttype'],$newobject['startdate'],$newobject['enddate'],$newobject['repeating'],$newobject['summary'],$newobject['calendardata'], $this->userid));
|
2012-07-01 01:18:41 +04:00
|
|
|
$result = $result->fetchRow();
|
|
|
|
if($result['count'] >= 2){
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2012-07-01 00:08:30 +04:00
|
|
|
}
|
2012-06-29 16:32:07 +04:00
|
|
|
|
2012-06-30 14:42:36 +04:00
|
|
|
/*
|
2012-07-04 00:33:24 +04:00
|
|
|
* @brief updates the progress var
|
|
|
|
* @param integer $percentage
|
|
|
|
* @return boolean
|
2012-06-30 14:42:36 +04:00
|
|
|
*/
|
2012-07-04 00:33:24 +04:00
|
|
|
private function updateProgress($percentage){
|
|
|
|
$this->progress = $percentage;
|
|
|
|
if($this->cacheprogress){
|
|
|
|
OC_Cache::set($this->progresskey, $this->progress, 300);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2012-06-29 16:32:07 +04:00
|
|
|
|
|
|
|
/*
|
2012-07-01 23:36:09 +04:00
|
|
|
* public methods for (pre)rendering of X-... Attributes
|
2012-06-29 16:32:07 +04:00
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief guesses the calendar color
|
|
|
|
* @return mixed - string or boolean
|
|
|
|
*/
|
2012-07-01 23:36:09 +04:00
|
|
|
public function guessCalendarColor(){
|
2012-06-29 16:32:07 +04:00
|
|
|
if(!is_null($this->calobject->__get('X-APPLE-CALENDAR-COLOR'))){
|
|
|
|
return $this->calobject->__get('X-APPLE-CALENDAR-COLOR');
|
|
|
|
}
|
2012-06-30 17:17:29 +04:00
|
|
|
return null;
|
2012-06-29 16:32:07 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief guesses the calendar description
|
|
|
|
* @return mixed - string or boolean
|
|
|
|
*/
|
2012-07-01 23:36:09 +04:00
|
|
|
public function guessCalendarDescription(){
|
2012-06-29 16:32:07 +04:00
|
|
|
if(!is_null($this->calobject->__get('X-WR-CALDESC'))){
|
|
|
|
return $this->calobject->__get('X-WR-CALDESC');
|
|
|
|
}
|
2012-06-30 17:17:29 +04:00
|
|
|
return null;
|
2012-06-29 16:32:07 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief guesses the calendar name
|
|
|
|
* @return mixed - string or boolean
|
|
|
|
*/
|
2012-07-01 23:36:09 +04:00
|
|
|
public function guessCalendarName(){
|
2012-06-29 16:32:07 +04:00
|
|
|
if(!is_null($this->calobject->__get('X-WR-CALNAME'))){
|
|
|
|
return $this->calobject->__get('X-WR-CALNAME');
|
|
|
|
}
|
2012-06-30 17:17:29 +04:00
|
|
|
return null;
|
2012-06-29 16:32:07 +04:00
|
|
|
}
|
|
|
|
}
|