. * */ /** * This class manages our calendars */ class OC_Calendar_Object{ /** * @brief Returns all objects of a calendar * @param integer $id * @return array * * The objects are associative arrays. You'll find the original vObject in * ['calendardata'] */ public static function all($id){ $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ?' ); $result = $stmt->execute(array($id)); $calendarobjects = array(); while( $row = $result->fetchRow()){ $calendarobjects[] = $row; } return $calendarobjects; } /** * @brief Returns an object * @param integer $id * @return associative array */ public static function find($id){ $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE id = ?' ); $result = $stmt->execute(array($id)); return $result->fetchRow(); } /** * @brief finds an object by its DAV Data * @param integer $cid Calendar id * @param string $uri the uri ('filename') * @return associative array */ public static function findWhereDAVDataIs($cid,$uri){ $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ? AND uri = ?' ); $result = $stmt->execute(array($cid,$uri)); return $result->fetchRow(); } /** * @brief Adds an object * @param integer $id Calendar id * @param string $data object * @return insertid */ public static function add($id,$data){ $object = self::parse($data); list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); if(is_null($uid)){ $uid = self::createUID(); $object->add('UID',$uid); $data = $object->serialize(); } $uri = 'owncloud-'.md5($data.rand().time()).'.ics'; $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttype,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' ); $result = $stmt->execute(array($id,$type,$startdate,$enddate,$repeating,$summary,$data,$uri,time())); OC_Calendar_Calendar::touchCalendar($id); return OC_DB::insertid(); } /** * @brief Adds an object with the data provided by sabredav * @param integer $id Calendar id * @param string $uri the uri the card will have * @param string $data object * @return insertid */ public static function addFromDAVData($id,$uri,$data){ $object = self::parse($data); list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttype,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' ); $result = $stmt->execute(array($id,$type,$startdate,$enddate,$repeating,$summary,$data,$uri,time())); OC_Calendar_Calendar::touchCalendar($id); return OC_DB::insertid(); } /** * @brief edits an object * @param integer $id id of object * @param string $data object * @return boolean */ public static function edit($id, $data){ $oldobject = self::find($id); $object = self::parse($data); list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); $stmt = OC_DB::prepare( 'UPDATE *PREFIX*calendar_objects SET objecttype=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' ); $result = $stmt->execute(array($type,$startdate,$enddate,$repeating,$summary,$data,time(),$id)); OC_Calendar_Calendar::touchCalendar($id); return true; } /** * @brief edits an object with the data provided by sabredav * @param integer $id calendar id * @param string $uri the uri of the object * @param string $data object * @return boolean */ public static function editFromDAVData($cid,$uri,$data){ $oldobject = self::findWhereDAVDataIs($cid,$uri); $object = self::parse($data); list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); $stmt = OC_DB::prepare( 'UPDATE *PREFIX*calendar_objects SET objecttype=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' ); $result = $stmt->execute(array($type,$startdate,$enddate,$repeating,$summary,$data,time(),$oldobject['id'])); OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']); return true; } /** * @brief deletes an object * @param integer $id id of object * @return boolean */ public static function delete($id){ $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE id = ?' ); $stmt->execute(array($id)); return true; } /** * @brief deletes an object with the data provided by sabredav * @param integer $cid calendar id * @param string $uri the uri of the object * @return boolean */ public static function deleteFromDAVData($cid,$uri){ $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE calendarid = ? AND uri=?' ); $stmt->execute(array($cid,$uri)); return true; } /** * @brief Creates a UID * @return string */ protected static function createUID(){ return substr(md5(rand().time()),0,10); } /** * @brief Extracts data from a vObject-Object * @param Sabre_VObject $object * @return array * * [type, start, end, summary, repeating, uid] */ protected static function extractData($object){ $return = array('',null,null,'',0,null); // Child to use $children = 0; $use = null; foreach($object->children as &$property){ if($property->name == 'VEVENT'){ $children++; $thisone = true; foreach($property->children as &$element){ if($element->name == 'RECURRENCE-ID'){ $thisone = false; } } unset($element); if($thisone){ $use = $property; } } elseif($property->name == 'VTODO' || $property->name == 'VJOURNAL'){ $return[0] = $property->name; foreach($property->children as &$element){ if($element->name == 'SUMMARY'){ $return[3] = $element->value; } elseif($element->name == 'UID'){ $return[5] = $element->value; } }; // Only one VTODO or VJOURNAL per object // (only one UID per object but a UID is required by a VTODO => // one VTODO per object) break; } } unset($property); // find the data if(!is_null($use)){ $return[0] = $use->name; foreach($use->children as &$property){ if($property->name == 'DTSTART'){ $return[1] = self::getUTCforMDB($property->getDateTime()); } elseif($property->name == 'DTEND'){ $return[2] = self::getUTCforMDB($property->getDateTime()); } elseif($property->name == 'SUMMARY'){ $return[3] = $property->value; } elseif($property->name == 'RRULE'){ $return[4] = 1; } elseif($property->name == 'UID'){ $return[5] = $property->value; } } unset($property); } // More than one child means reoccuring! if($children > 1){ $return[4] = 1; } return $return; } /** * @brief DateTime to UTC string * @param DateTime $datetime The date to convert * @returns date as YYYY-MM-DD hh:mm * * This function creates a date string that can be used by MDB2. * Furthermore it converts the time to UTC. */ protected static function getUTCforMDB($datetime){ return date('Y-m-d H:i', $datetime->format('U') - $datetime->getOffset()); } /** * @brief Parses the VObject * @param string VObject as string * @returns Sabre_VObject or null */ public static function parse($data){ try { $calendar = Sabre_VObject_Reader::read($data); return $calendar; } catch (Exception $e) { return null; } } }