/** * Given an object containing all the necessary data, * (defined by the form in mod.html) this function * will update an existing instance with new data. * * @param mixed $udutu Form data * @return int */ function udutu_update_instance($udutu) { global $CFG; require_once 'locallib.php'; if (($packagedata = udutu_check_package($udutu)) != null) { $udutu->pkgtype = $packagedata->pkgtype; if ($packagedata->launch == 0) { $udutu->launch = $packagedata->launch; $udutu->datadir = $packagedata->datadir; $udutu->parse = 1; if (!udutu_external_link($udutu->reference)) { $udutu->md5hash = md5_file($CFG->dataroot . '/' . $udutu->course . '/' . $udutu->reference); } else { $udutu->dir = $CFG->dataroot . '/' . $udutu->course . '/moddata/udutu'; $udutu->md5hash = md5_file($udutu->dir . $udutu->datadir . '/' . basename($udutu->reference)); } } else { $udutu->parse = 0; } } $udutu->timemodified = time(); $udutu->id = $udutu->instance; $udutu = udutu_option2text($udutu); $udutu->width = str_replace('%', '', $udutu->width); $udutu->height = str_replace('%', '', $udutu->height); if (!isset($udutu->whatgrade)) { $udutu->whatgrade = 0; } $udutu->grademethod = $udutu->whatgrade * 10 + $udutu->grademethod; // Check if udutu manifest needs to be reparsed if ($udutu->parse == 1) { $udutu->dir = $CFG->dataroot . '/' . $udutu->course . '/moddata/udutu'; if (is_dir($udutu->dir . '/' . $udutu->id)) { udutu_delete_files($udutu->dir . '/' . $udutu->id); } if (isset($udutu->datadir) && $udutu->datadir != $udutu->id && (udutu_external_link($udutu->reference) || basename($udutu->reference) != 'imsmanifest.xml' && $udutu->reference[0] != '#')) { rename($udutu->dir . $udutu->datadir, $udutu->dir . '/' . $udutu->id); } $udutu->launch = udutu_parse($udutu); } else { $oldudutu = get_record('udutu', 'id', $udutu->id); $udutu->reference = $oldudutu->reference; // This fix a problem with Firefox when the teacher choose Cancel on overwrite question } return update_record('udutu', $udutu); }
if (isset($sco->parameters) && !empty($sco->parameters)) { $launcher = $sco->launch . $connector . $sco->parameters; } else { $launcher = $sco->launch; } } if (udutu_external_link($sco->launch)) { // Remote learning activity $result = $launcher; } else { if ($udutu->reference[0] == '#') { // Repository require_once $repositoryconfigfile; $result = $CFG->repositorywebroot . substr($udutu->reference, 1) . '/' . $sco->launch; } else { if (basename($udutu->reference) == 'imsmanifest.xml' && udutu_external_link($udutu->reference)) { // Remote manifest $result = dirname($udutu->reference) . '/' . $launcher; } else { // Moodle internal package/manifest or remote (auto-imported) package if (basename($udutu->reference) == 'imsmanifest.xml') { $basedir = dirname($udutu->reference); } else { $basedir = $CFG->moddata . '/udutu/' . $udutu->id; } if ($CFG->slasharguments) { $result = $CFG->wwwroot . '/file.php/' . $udutu->course . '/' . $basedir . '/' . $launcher; } else { $result = $CFG->wwwroot . '/file.php?file=/' . $udutu->course . '/' . $basedir . '/' . $launcher; } }
function udutu_check_package($data) { global $CFG, $COURSE; $courseid = $data->course; // Course Module ID $reference = $data->reference; // Package path $udutuid = $data->instance; // udutu ID $validation = new stdClass(); if (!empty($courseid) && !empty($reference)) { $externalpackage = udutu_external_link($reference); $validation->launch = 0; $referencefield = $reference; if (empty($reference)) { $validation = null; } else { if ($reference[0] == '#') { require_once $repositoryconfigfile; if ($CFG->repositoryactivate) { $referencefield = $reference . '/imsmanfest.xml'; $reference = $CFG->repository . substr($reference, 1) . '/imsmanifest.xml'; } else { $validation = null; } } else { if (!$externalpackage) { $reference = $CFG->dataroot . '/' . $courseid . '/' . $reference; } } } if (!empty($udutuid)) { // // udutu Update // if (!empty($validation) && (is_file($reference) || $externalpackage)) { if (!$externalpackage) { $mdcheck = md5_file($reference); } else { if ($externalpackage) { if ($udutudir = make_upload_directory("{$courseid}/{$CFG->moddata}/udutu")) { if ($tempdir = udutu_tempdir($udutudir)) { copy("{$reference}", $tempdir . '/' . basename($reference)); $mdcheck = md5_file($tempdir . '/' . basename($reference)); udutu_delete_files($tempdir); } } } } if ($udutu = get_record('udutu', 'id', $udutuid)) { if ($udutu->reference[0] == '#') { require_once $repositoryconfigfile; if ($CFG->repositoryactivate) { $oldreference = $CFG->repository . substr($udutu->reference, 1) . '/imsmanifest.xml'; } else { $oldreference = $udutu->reference; } } else { if (!udutu_external_link($udutu->reference)) { $oldreference = $CFG->dataroot . '/' . $courseid . '/' . $udutu->reference; } else { $oldreference = $udutu->reference; } } $validation->launch = $udutu->launch; if ($oldreference == $reference && $mdcheck != $udutu->md5hash || $oldreference != $reference) { // This is a new or a modified package $validation->launch = 0; } else { // Old package already validated if (strpos($udutu->version, 'AICC') !== false) { $validation->pkgtype = 'AICC'; } else { $validation->pkgtype = 'udutu'; } } } else { $validation = null; } } else { $validation = null; } } //$validation->launch = 0; if ($validation != null && $validation->launch == 0) { // // Package must be validated // $ext = strtolower(substr(basename($reference), strrpos(basename($reference), '.'))); $tempdir = ''; switch ($ext) { case '.pif': case '.zip': // Create a temporary directory to unzip package and validate package $udutudir = ''; if ($udutudir = make_upload_directory("{$courseid}/{$CFG->moddata}/udutu")) { if ($tempdir = udutu_tempdir($udutudir)) { copy("{$reference}", $tempdir . '/' . basename($reference)); unzip_file($tempdir . '/' . basename($reference), $tempdir, false); if (!$externalpackage) { unlink($tempdir . '/' . basename($reference)); } if (is_file($tempdir . '/imsmanifest.xml')) { $validation = udutu_validate_manifest($tempdir . '/imsmanifest.xml'); $validation->pkgtype = 'udutu'; } else { $validation = udutu_validate_aicc($tempdir); $validation->pkgtype = 'AICC'; } } else { $validation = null; } } else { $validation = null; } break; case '.xml': if (basename($reference) == 'imsmanifest.xml') { if ($externalpackage) { if ($udutudir = make_upload_directory("{$courseid}/{$CFG->moddata}/udutu")) { if ($tempdir = udutu_tempdir($udutudir)) { copy("{$reference}", $tempdir . '/' . basename($reference)); if (is_file($tempdir . '/' . basename($reference))) { $validation = udutu_validate_manifest($tempdir . '/' . basename($reference)); } else { $validation = null; } } } } else { $validation = udutu_validate_manifest($CFG->dataroot . '/' . $COURSE->id . '/' . $reference); } $validation->pkgtype = 'udutu'; } else { $validation = null; } break; default: $validation = null; break; } if ($validation == null) { if (is_dir($tempdir)) { // Delete files and temporary directory udutu_delete_files($tempdir); } } else { if ($ext == '.xml' && !$externalpackage) { $validation->datadir = dirname($referencefield); } else { $validation->datadir = substr($tempdir, strlen($udutudir)); } $validation->launch = 0; } } } else { $validation = null; } return $validation; }