Updated the 19 build version to 20101023
[moodle.git] / mod / scorm / aicc.php
blobd2d5e9760dae57941ec9229cfa07d8d136f5199e
1 <?php
2 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
3 header("Cache-Control: no-cache");
4 header("Pragma: no-cache");
6 require_once('../../config.php');
7 include_once($CFG->dirroot.'/mod/scorm/lib.php');
8 require_once($CFG->dirroot.'/mod/scorm/locallib.php');
9 require_once($CFG->dirroot.'/mod/scorm/datamodels/aicclib.php');
11 foreach ($_POST as $key => $value) {
12 $tempkey = strtolower($key);
13 $_POST[$tempkey] = $value;
16 $command = required_param('command', PARAM_ALPHA);
17 $sessionid = required_param('session_id', PARAM_ALPHANUM);
18 $aiccdata = optional_param('aicc_data', '', PARAM_RAW);
20 require_login();
22 if (!empty($command) && confirm_sesskey($sessionid)) {
23 $command = strtolower($command);
25 if (isset($SESSION->scorm_scoid)) {
26 $scoid = $SESSION->scorm_scoid;
27 } else {
28 error('Invalid script call');
30 $mode = 'normal';
31 if (isset($SESSION->scorm_mode)) {
32 $mode = $SESSION->scorm_mode;
34 $status = 'Not Initialized';
35 if (isset($SESSION->scorm_status)) {
36 $status = $SESSION->scorm_status;
38 if (isset($SESSION->scorm_attempt)) {
39 $attempt = $SESSION->scorm_attempt;
40 } else {
41 $attempt = 1;
44 if ($sco = scorm_get_sco($scoid, SCO_ONLY)) {
45 if (!$scorm = get_record('scorm','id',$sco->scorm)) {
46 error('Invalid script call');
48 } else {
49 error('Invalid script call');
52 if ($scorm = get_record('scorm','id',$sco->scorm)) {
53 switch ($command) {
54 case 'getparam':
55 if ($status == 'Not Initialized') {
56 $SESSION->scorm_status = 'Running';
57 $status = 'Running';
59 if ($status != 'Running') {
60 echo "error=101\r\nerror_text=Terminated\r\n";
61 } else {
62 if ($usertrack=scorm_get_tracks($scoid,$USER->id,$attempt)) {
63 $userdata = $usertrack;
64 } else {
65 $userdata->status = '';
66 $userdata->score_raw = '';
68 $userdata->student_id = $USER->username;
69 $userdata->student_name = $USER->lastname .', '. $USER->firstname;
70 $userdata->mode = $mode;
71 if ($userdata->mode == 'normal') {
72 $userdata->credit = 'credit';
73 } else {
74 $userdata->credit = 'no-credit';
77 if ($sco = scorm_get_sco($scoid)) {
78 $userdata->course_id = $sco->identifier;
79 $userdata->datafromlms = isset($sco->datafromlms)?$sco->datafromlms:'';
80 $userdata->mastery_score = isset($sco->mastery_score)?$sco->mastery_score:'';
81 $userdata->max_time_allowed = isset($sco->max_time_allowed)?$sco->max_time_allowed:'';
82 $userdata->time_limit_action = isset($sco->time_limit_action)?$sco->time_limit_action:'';
83 echo "error=0\r\nerror_text=Successful\r\naicc_data=";
84 echo "[Core]\r\n";
85 echo 'Student_ID='.$userdata->student_id."\r\n";
86 echo 'Student_Name='.$userdata->student_name."\r\n";
87 if (isset($userdata->{'cmi.core.lesson_location'})) {
88 echo 'Lesson_Location='.$userdata->{'cmi.core.lesson_location'}."\r\n";
89 } else {
90 echo 'Lesson_Location='."\r\n";
92 echo 'Credit='.$userdata->credit."\r\n";
93 if (isset($userdata->status)) {
94 if ($userdata->status == '') {
95 $userdata->entry = ', ab-initio';
96 } else {
97 if (isset($userdata->{'cmi.core.exit'}) && ($userdata->{'cmi.core.exit'} == 'suspend')) {
98 $userdata->entry = ', resume';
99 } else {
100 $userdata->entry = '';
104 if (isset($userdata->{'cmi.core.lesson_status'})) {
105 echo 'Lesson_Status='.$userdata->{'cmi.core.lesson_status'}.$userdata->entry."\r\n";
106 $SESSION->scorm_lessonstatus = $userdata->{'cmi.core.lesson_status'};
107 } else {
108 echo 'Lesson_Status=not attempted'.$userdata->entry."\r\n";
109 $SESSION->scorm_lessonstatus = 'not attempted';
111 if (isset($userdata->{'cmi.core.score.raw'})) {
112 $max = '';
113 $min = '';
114 if (isset($userdata->{'cmi.core.score.max'}) && !empty($userdata->{'cmi.core.score.max'})) {
115 $max = ', '.$userdata->{'cmi.core.score.max'};
116 if (isset($userdata->{'cmi.core.score.min'}) && !empty($userdata->{'cmi.core.score.min'})) {
117 $min = ', '.$userdata->{'cmi.core.score.min'};
120 echo 'Score='.$userdata->{'cmi.core.score.raw'}.$max.$min."\r\n";
121 } else {
122 echo 'Score='."\r\n";
124 if (isset($userdata->{'cmi.core.total_time'})) {
125 echo 'Time='.$userdata->{'cmi.core.total_time'}."\r\n";
126 } else {
127 echo 'Time='.'00:00:00'."\r\n";
129 echo 'Lesson_Mode='.$userdata->mode."\r\n";
130 if (isset($userdata->{'cmi.suspend_data'})) {
131 echo "[Core_Lesson]\r\n".rawurldecode($userdata->{'cmi.suspend_data'})."\r\n";
132 } else {
133 echo "[Core_Lesson]\r\n";
135 echo "[Core_Vendor]\r\n".$userdata->datafromlms."\r\n";
136 echo "[Evaluation]\r\nCourse_ID = {".$userdata->course_id."}\r\n";
137 echo "[Student_Data]\r\n";
138 echo 'Mastery_Score='.$userdata->mastery_score."\r\n";
139 echo 'Max_Time_Allowed='.$userdata->max_time_allowed."\r\n";
140 echo 'Time_Limit_Action='.$userdata->time_limit_action."\r\n";
141 } else {
142 error('Sco not found');
145 break;
146 case 'putparam':
147 if ($status == 'Running') {
148 if (! $cm = get_coursemodule_from_instance("scorm", $scorm->id, $scorm->course)) {
149 echo "error=1\r\nerror_text=Unknown\r\n"; // No one must see this error message if not hacked
151 if (!empty($aiccdata) && has_capability('mod/scorm:savetrack', get_context_instance(CONTEXT_MODULE, $cm->id))) {
152 $initlessonstatus = 'not attempted';
153 $lessonstatus = 'not attempted';
154 if (isset($SESSION->scorm_lessonstatus)) {
155 $initlessonstatus = $SESSION->scorm_lessonstatus;
157 $score = '';
158 $datamodel['lesson_location'] = 'cmi.core.lesson_location';
159 $datamodel['lesson_status'] = 'cmi.core.lesson_status';
160 $datamodel['score'] = 'cmi.core.score.raw';
161 $datamodel['time'] = 'cmi.core.session_time';
162 $datamodel['[core_lesson]'] = 'cmi.suspend_data';
163 $datamodel['[comments]'] = 'cmi.comments';
164 $datarows = explode("\r\n",$aiccdata);
165 reset($datarows);
166 while ((list(,$datarow) = each($datarows)) !== false) {
167 if (($equal = strpos($datarow, '=')) !== false) {
168 $element = strtolower(trim(substr($datarow,0,$equal)));
169 $value = trim(substr($datarow,$equal+1));
170 if (isset($datamodel[$element])) {
171 $element = $datamodel[$element];
172 switch ($element) {
173 case 'cmi.core.lesson_location':
174 $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $element, $value);
175 break;
176 case 'cmi.core.lesson_status':
177 $statuses = array(
178 'passed' => 'passed',
179 'completed' => 'completed',
180 'failed' => 'failed',
181 'incomplete' => 'incomplete',
182 'browsed' => 'browsed',
183 'not attempted' => 'not attempted',
184 'p' => 'passed',
185 'c' => 'completed',
186 'f' => 'failed',
187 'i' => 'incomplete',
188 'b' => 'browsed',
189 'n' => 'not attempted'
191 $exites = array(
192 'logout' => 'logout',
193 'time-out' => 'time-out',
194 'suspend' => 'suspend',
195 'l' => 'logout',
196 't' => 'time-out',
197 's' => 'suspend',
199 $values = explode(',',$value);
200 $value = '';
201 if (count($values) > 1) {
202 $value = trim(strtolower($values[1]));
203 $value = $value[0];
204 if (isset($exites[$value])) {
205 $value = $exites[$value];
208 if (empty($value) || isset($exites[$value])) {
209 $subelement = 'cmi.core.exit';
210 $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $subelement, $value);
212 $value = trim(strtolower($values[0]));
213 $value = $value[0];
214 if (isset($statuses[$value]) && ($mode == 'normal')) {
215 $value = $statuses[$value];
216 $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $element, $value);
218 $lessonstatus = $value;
219 break;
220 case 'cmi.core.score.raw':
221 $values = explode(',',$value);
222 if ((count($values) > 1) && ($values[1] >= $values[0]) && is_numeric($values[1])) {
223 $subelement = 'cmi.core.score.max';
224 $value = trim($values[1]);
225 $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $subelement, $value);
226 if ((count($values) == 3) && ($values[2] <= $values[0]) && is_numeric($values[2])) {
227 $subelement = 'cmi.core.score.min';
228 $value = trim($values[2]);
229 $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $subelement, $value);
233 $value = '';
234 if (is_numeric($values[0])) {
235 $value = trim($values[0]);
236 $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $element, $value);
238 $score = $value;
239 break;
240 case 'cmi.core.session_time':
241 $SESSION->scorm_session_time = $value;
242 break;
245 } else {
246 if (isset($datamodel[strtolower(trim($datarow))])) {
247 $element = $datamodel[strtolower(trim($datarow))];
248 $value = '';
249 while ((($datarow = current($datarows)) !== false) && (substr($datarow,0,1) != '[')) {
250 $value .= $datarow."\r\n";
251 next($datarows);
253 $value = rawurlencode(stripslashes($value));
254 $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $element, $value);
258 if (($mode == 'browse') && ($initlessonstatus == 'not attempted')){
259 $lessonstatus = 'browsed';
260 $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, 'cmi.core.lesson_status', 'browsed');
262 if ($mode == 'normal') {
264 if ($sco = scorm_get_sco($scoid)) {
265 if (!empty($sco->mastery_score)) {
266 if (!empty($score)) {
267 if ($score >= $sco->mastery_score) {
268 $lessonstatus = 'passed';
269 } else {
270 $lessonstatus = 'failed';
274 $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, 'cmi.core.lesson_status', $lessonstatus);
278 echo "error=0\r\nerror_text=Successful\r\n";
279 } else if ($status == 'Terminated') {
280 echo "error=1\r\nerror_text=Terminated\r\n";
281 } else {
282 echo "error=1\r\nerror_text=Not Initialized\r\n";
284 break;
285 case 'putcomments':
286 if ($status == 'Running') {
287 echo "error=0\r\nerror_text=Successful\r\n";
288 } else if ($status == 'Terminated') {
289 echo "error=1\r\nerror_text=Terminated\r\n";
290 } else {
291 echo "error=1\r\nerror_text=Not Initialized\r\n";
293 break;
294 case 'putinteractions':
295 if ($status == 'Running') {
296 echo "error=0\r\nerror_text=Successful\r\n";
297 } else if ($status == 'Terminated') {
298 echo "error=1\r\nerror_text=Terminated\r\n";
299 } else {
300 echo "error=1\r\nerror_text=Not Initialized\r\n";
302 break;
303 case 'putobjectives':
304 if ($status == 'Running') {
305 echo "error=0\r\nerror_text=Successful\r\n";
306 } else if ($status == 'Terminated') {
307 echo "error=1\r\nerror_text=Terminated\r\n";
308 } else {
309 echo "error=1\r\nerror_text=Not Initialized\r\n";
311 break;
312 case 'putpath':
313 if ($status == 'Running') {
314 echo "error=0\r\nerror_text=Successful\r\n";
315 } else if ($status == 'Terminated') {
316 echo "error=1\r\nerror_text=Terminated\r\n";
317 } else {
318 echo "error=1\r\nerror_text=Not Initialized\r\n";
320 break;
321 case 'putperformance':
322 if ($status == 'Running') {
323 echo "error=0\r\nerror_text=Successful\r\n";
324 } else if ($status == 'Terminated') {
325 echo "error=1\r\nerror_text=Terminated\r\n";
326 } else {
327 echo "error=1\r\nerror_text=Not Initialized\r\n";
329 break;
330 case 'exitau':
331 if ($status == 'Running') {
332 if (isset($SESSION->scorm_session_time) && ($SESSION->scorm_session_time != '')) {
333 if ($track = get_record_select('scorm_scoes_track',"userid='$USER->id' AND scormid='$scorm->id' AND scoid='$sco->id' AND attempt='$attempt' AND element='cmi.core.total_time'")) {
334 // Add session_time to total_time
335 $value = scorm_add_time($track->value, $SESSION->scorm_session_time);
336 $track->value = $value;
337 $track->timemodified = time();
338 update_record('scorm_scoes_track',$track);
339 $id = $track->id;
340 } else {
341 $track = new object();
342 $track->userid = $USER->id;
343 $track->scormid = $scorm->id;
344 $track->scoid = $sco->id;
345 $track->element = 'cmi.core.total_time';
346 $track->value = $SESSION->scorm_session_time;
347 $track->attempt = $attempt;
348 $track->timemodified = time();
349 $id = insert_record('scorm_scoes_track',$track);
351 scorm_update_grades($scorm, $USER->id);
353 $SESSION->scorm_status = 'Terminated';
354 $SESSION->scorm_session_time = '';
355 echo "error=0\r\nerror_text=Successful\r\n";
356 } else if ($status == 'Terminated') {
357 echo "error=1\r\nerror_text=Terminated\r\n";
358 } else {
359 echo "error=1\r\nerror_text=Not Initialized\r\n";
361 break;
362 default:
363 echo "error=1\r\nerror_text=Invalid Command\r\n";
364 break;
367 } else {
368 if (empty($command)) {
369 echo "error=1\r\nerror_text=Invalid Command\r\n";
370 } else {
371 echo "error=3\r\nerror_text=Invalid Session ID\r\n";