예제 #1
0
/**
 * Remove all dir
 */
function scorm_delete_files($directory)
{
    if (is_dir($directory)) {
        $handle = opendir($directory);
        while (($file = readdir($handle)) != '') {
            if ($file != "." && $file != "..") {
                if (!is_dir($directory . "/" . $file)) {
                    unlink($directory . "/" . $file);
                } else {
                    scorm_delete_files($directory . "/" . $file);
                }
            }
        }
        closedir($handle);
        rmdir($directory);
    }
}
예제 #2
0
function scorm_check_package($data)
{
    global $CFG, $COURSE;
    require_once $CFG->libdir . '/filelib.php';
    $courseid = $data->course;
    // Course Module ID
    $reference = $data->reference;
    // Package path
    $scormid = $data->instance;
    // scorm ID
    $validation = new stdClass();
    if (!empty($courseid) && !empty($reference)) {
        $externalpackage = scorm_external_link($reference);
        $validation->launch = 0;
        $referencefield = $reference;
        if (empty($reference)) {
            $validation = null;
        } else {
            if ($reference[0] == '#') {
                if (isset($CFG->repositoryactivate) && $CFG->repositoryactivate) {
                    $referencefield = $reference . '/imsmanifest.xml';
                    $reference = $CFG->repository . substr($reference, 1) . '/imsmanifest.xml';
                } else {
                    $validation = null;
                }
            } else {
                if (!$externalpackage) {
                    $reference = $CFG->dataroot . '/' . $courseid . '/' . $reference;
                }
            }
        }
        if (!empty($scormid)) {
            //
            // SCORM Update
            //
            if (!empty($validation) && (is_file($reference) || $externalpackage)) {
                if (!$externalpackage) {
                    $mdcheck = md5_file($reference);
                } else {
                    if ($externalpackage) {
                        if ($scormdir = make_upload_directory("{$courseid}/{$CFG->moddata}/scorm")) {
                            if ($tempdir = scorm_tempdir($scormdir)) {
                                $content = download_file_content($reference);
                                $file = fopen($tempdir . '/' . basename($reference), 'x');
                                fwrite($file, $content);
                                fclose($file);
                                $mdcheck = md5_file($tempdir . '/' . basename($reference));
                                scorm_delete_files($tempdir);
                            }
                        }
                    }
                }
                if ($scorm = get_record('scorm', 'id', $scormid)) {
                    if ($scorm->reference[0] == '#') {
                        if (isset($CFG->repositoryactivate) && $CFG->repositoryactivate) {
                            $oldreference = $CFG->repository . substr($scorm->reference, 1) . '/imsmanifest.xml';
                        } else {
                            $oldreference = $scorm->reference;
                        }
                    } else {
                        if (!scorm_external_link($scorm->reference)) {
                            $oldreference = $CFG->dataroot . '/' . $courseid . '/' . $scorm->reference;
                        } else {
                            $oldreference = $scorm->reference;
                        }
                    }
                    $validation->launch = $scorm->launch;
                    if ($oldreference == $reference && $mdcheck != $scorm->md5hash || $oldreference != $reference) {
                        // This is a new or a modified package
                        $validation->launch = 0;
                    } else {
                        // Old package already validated
                        if (strpos($scorm->version, 'AICC') !== false) {
                            $validation->pkgtype = 'AICC';
                        } else {
                            $validation->pkgtype = 'SCORM';
                        }
                    }
                } 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
                    $scormdir = '';
                    if ($scormdir = make_upload_directory("{$courseid}/{$CFG->moddata}/scorm")) {
                        if ($tempdir = scorm_tempdir($scormdir)) {
                            if ($externalpackage) {
                                $content = download_file_content($reference);
                                $file = fopen($tempdir . '/' . basename($reference), 'x');
                                fwrite($file, $content);
                                fclose($file);
                            } else {
                                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 = scorm_validate_manifest($tempdir . '/imsmanifest.xml');
                                $validation->pkgtype = 'SCORM';
                            } else {
                                $validation = scorm_validate_aicc($tempdir);
                                $validation->pkgtype = 'AICC';
                            }
                        } else {
                            $validation = null;
                        }
                    } else {
                        $validation = null;
                    }
                    break;
                case '.xml':
                    if (basename($reference) == 'imsmanifest.xml') {
                        if ($externalpackage) {
                            if ($scormdir = make_upload_directory("{$courseid}/{$CFG->moddata}/scorm")) {
                                if ($tempdir = scorm_tempdir($scormdir)) {
                                    $content = download_file_content($reference);
                                    $file = fopen($tempdir . '/' . basename($reference), 'x');
                                    fwrite($file, $content);
                                    fclose($file);
                                    if (is_file($tempdir . '/' . basename($reference))) {
                                        $validation = scorm_validate_manifest($tempdir . '/' . basename($reference));
                                    } else {
                                        $validation = null;
                                    }
                                }
                            }
                        } else {
                            $validation = scorm_validate_manifest($reference);
                        }
                        $validation->pkgtype = 'SCORM';
                    } else {
                        $validation = null;
                    }
                    break;
                default:
                    $validation = null;
                    break;
            }
            if ($validation == null) {
                if (is_dir($tempdir)) {
                    // Delete files and temporary directory
                    scorm_delete_files($tempdir);
                }
            } else {
                if ($ext == '.xml' && !$externalpackage) {
                    $validation->datadir = dirname($referencefield);
                } else {
                    $validation->datadir = substr($tempdir, strlen($scormdir));
                }
                $validation->launch = 0;
            }
        }
    } else {
        $validation = null;
    }
    return $validation;
}
예제 #3
0
/**
* Given an ID of an instance of this module,
* this function will permanently delete the instance
* and any data that depends on it.
*
* @param int $id Scorm instance id
* @return boolean
*/
function scorm_delete_instance($id)
{
    global $CFG;
    if (!($scorm = get_record('scorm', 'id', $id))) {
        return false;
    }
    $result = true;
    $scorm->dir = $CFG->dataroot . '/' . $scorm->course . '/moddata/scorm';
    if (is_dir($scorm->dir . '/' . $scorm->id)) {
        // Delete any dependent files
        require_once 'locallib.php';
        scorm_delete_files($scorm->dir . '/' . $scorm->id);
    }
    // Delete any dependent records
    if (!delete_records('scorm_scoes_track', 'scormid', $scorm->id)) {
        $result = false;
    }
    if ($scoes = get_records('scorm_scoes', 'scorm', $scorm->id)) {
        foreach ($scoes as $sco) {
            if (!delete_records('scorm_scoes_data', 'scoid', $sco->id)) {
                $result = false;
            }
        }
        delete_records('scorm_scoes', 'scorm', $scorm->id);
    } else {
        $result = false;
    }
    if (!delete_records('scorm', 'id', $scorm->id)) {
        $result = false;
    }
    /*if (! delete_records('scorm_sequencing_controlmode', 'scormid', $scorm->id)) {
          $result = false;
      }
      if (! delete_records('scorm_sequencing_rolluprules', 'scormid', $scorm->id)) {
          $result = false;
      }
      if (! delete_records('scorm_sequencing_rolluprule', 'scormid', $scorm->id)) {
          $result = false;
      }
      if (! delete_records('scorm_sequencing_rollupruleconditions', 'scormid', $scorm->id)) {
          $result = false;
      }
      if (! delete_records('scorm_sequencing_rolluprulecondition', 'scormid', $scorm->id)) {
          $result = false;
      }
      if (! delete_records('scorm_sequencing_rulecondition', 'scormid', $scorm->id)) {
          $result = false;
      }
      if (! delete_records('scorm_sequencing_ruleconditions', 'scormid', $scorm->id)) {
          $result = false;
      }*/
    scorm_grade_item_delete(stripslashes_recursive($scorm));
    return $result;
}