diff options
Diffstat (limited to 'modules-available/locationinfo/inc/coursebackend/coursebackend_davinci.inc.php')
-rw-r--r-- | modules-available/locationinfo/inc/coursebackend/coursebackend_davinci.inc.php | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/modules-available/locationinfo/inc/coursebackend/coursebackend_davinci.inc.php b/modules-available/locationinfo/inc/coursebackend/coursebackend_davinci.inc.php new file mode 100644 index 00000000..fac3f296 --- /dev/null +++ b/modules-available/locationinfo/inc/coursebackend/coursebackend_davinci.inc.php @@ -0,0 +1,142 @@ +<?php + +class CourseBackend_Davinci extends CourseBackend +{ + + private $location; + private $verifyHostname = true; + private $verifyCert = true; + + public function setCredentialsInternal($data) + { + if (empty($data['baseUrl'])) { + $this->error = "No url is given"; + return false; + } + $location = preg_replace('#/+(davinciis\.dll)?\W*$#i', '', $data['baseUrl']); + $this->location = $location . "/DAVINCIIS.dll?"; + $this->verifyHostname = $data['verifyHostname']; + $this->verifyCert = $data['verifyCert']; + return true; + } + + public function checkConnection() + { + if (empty($this->location)) { + $this->error = "Credentials are not set"; + } else { + $startDate = new DateTime('today 0:00'); + $endDate = new DateTime('+7 days 0:00'); + $data = $this->fetchRoomRaw('someroomid123', $startDate, $endDate); + if ($data !== false && strpos($data, 'DAVINCI SERVER') === false) { + $this->error = "Unknown reply; this doesn't seem to be a DAVINCI server."; + } + } + return $this->error === false; + } + + public function getCredentialDefinitions() + { + return [ + new BackendProperty('baseUrl', 'string'), + new BackendProperty('verifyCert', 'bool', true), + new BackendProperty('verifyHostname', 'bool', true) + ]; + } + + public function getDisplayName() + { + return 'Davinci'; + } + + public function getCacheTime() + { + return 30 * 60; + } + + public function getRefreshTime() + { + return 0; + } + + /** + * @param string $roomId unique name of the room, as used by davinci + * @param \DateTime $startDate start date to fetch + * @param \DateTime $endDate end date of range to fetch + * @return array|bool if successful the arrayrepresentation of the timetable + */ + private function fetchRoomRaw($roomId, $startDate, $endDate) + { + $url = $this->location . "content=xml&type=room&name=" . urlencode($roomId) + . "&startdate=" . $startDate->format('d.m.Y') . "&enddate=" . $endDate->format('d.m.Y'); + $ch = curl_init(); + $options = array( + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_SSL_VERIFYHOST => $this->verifyHostname ? 2 : 0, + CURLOPT_SSL_VERIFYPEER => $this->verifyCert ? 1 : 0, + CURLOPT_URL => $url, + ); + + curl_setopt_array($ch, $options); + $output = curl_exec($ch); + if ($output === false) { + $this->error = 'Curl error: ' . curl_error($ch); + return false; + } else { + $this->error = false; + ///Operation completed successfully + } + curl_close($ch); + return $output; + + } + + public function fetchSchedulesInternal($requestedRoomIds) + { + $startDate = new DateTime('today 0:00'); + $endDate = new DateTime('+7 days 0:00'); + $lower = (int)$startDate->format('Ymd'); + $upper = (int)$endDate->format('Ymd'); + $schedules = []; + foreach ($requestedRoomIds as $roomId) { + $return = $this->fetchRoomRaw($roomId, $startDate, $endDate); + if ($return === false) { + continue; + } + $return = $this->xmlStringToArray($return); + if ($return === false) { + continue; + } + $lessons = $this->getArrayPath($return, '/Lessons/Lesson'); + if ($lessons === false) { + $this->error = "Cannot find /Lessons/Lesson in XML"; + continue; + } + $timetable = []; + foreach ($lessons as $lesson) { + if (!isset($lesson['Date']) || !isset($lesson['Start']) || !isset($lesson['Finish'])) { + $this->error = 'Lesson is missing Date, Start or Finish'; + continue; + } + $c = (int)$lesson['Date']; + if ($c < $lower || $c > $upper) + continue; + $date = $lesson['Date']; + $date = substr($date, 0, 4) . '-' . substr($date, 4, 2) . '-' . substr($date, 6, 2); + $start = $lesson['Start']; + $start = substr($start, 0, 2) . ':' . substr($start, 2, 2); + $end = $lesson['Finish']; + $end = substr($end, 0, 2) . ':' . substr($end, 2, 2); + $subject = isset($lesson['Subject']) ? $lesson['Subject'] : '???'; + $timetable[] = array( + 'title' => $subject, + 'start' => $date . "T" . $start . ':00', + 'end' => $date . "T" . $end . ':00' + ); + } + $schedules[$roomId] = $timetable; + } + return $schedules; + } +} |