MDL-29956: Implement common cartridge export (r16882)
authorMark Nielsen <mark@moodlerooms.com>
Wed, 26 Oct 2011 17:14:54 +0000 (10:14 -0700)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Mon, 14 Nov 2011 20:25:08 +0000 (21:25 +0100)
87 files changed:
backup/backup.class.php
backup/cc/cc112moodle.php [new file with mode: 0644]
backup/cc/cc2moodle.php
backup/cc/cc_includes.php [new file with mode: 0644]
backup/cc/cc_lib/cc_asssesment.php [new file with mode: 0644]
backup/cc/cc_lib/cc_basiclti.php [new file with mode: 0644]
backup/cc/cc_lib/cc_builder_creator.php [new file with mode: 0644]
backup/cc/cc_lib/cc_convert_moodle2.php [new file with mode: 0644]
backup/cc/cc_lib/cc_converter_basiclti.php [new file with mode: 0644]
backup/cc/cc_lib/cc_converter_forum.php [new file with mode: 0644]
backup/cc/cc_lib/cc_converter_lti.php [new file with mode: 0644]
backup/cc/cc_lib/cc_converter_resource.php [new file with mode: 0644]
backup/cc/cc_lib/cc_converter_url.php [new file with mode: 0644]
backup/cc/cc_lib/cc_converters.php [new file with mode: 0644]
backup/cc/cc_lib/cc_forum.php [new file with mode: 0644]
backup/cc/cc_lib/cc_general.php [new file with mode: 0644]
backup/cc/cc_lib/cc_interfaces.php [new file with mode: 0644]
backup/cc/cc_lib/cc_manifest.php [new file with mode: 0644]
backup/cc/cc_lib/cc_metadata.php [new file with mode: 0644]
backup/cc/cc_lib/cc_metadata_file.php [new file with mode: 0644]
backup/cc/cc_lib/cc_metadata_resource.php [new file with mode: 0644]
backup/cc/cc_lib/cc_organization.php [new file with mode: 0644]
backup/cc/cc_lib/cc_resources.php [new file with mode: 0644]
backup/cc/cc_lib/cc_utils.php [new file with mode: 0644]
backup/cc/cc_lib/cc_version1.php [new file with mode: 0644]
backup/cc/cc_lib/cc_version11.php [new file with mode: 0644]
backup/cc/cc_lib/cc_version_base.php [new file with mode: 0644]
backup/cc/cc_lib/cc_weblink.php [new file with mode: 0644]
backup/cc/cc_lib/gral_lib/ccdependencyparser.php [new file with mode: 0644]
backup/cc/cc_lib/gral_lib/cssparser.php [new file with mode: 0644]
backup/cc/cc_lib/gral_lib/functions.php [new file with mode: 0644]
backup/cc/cc_lib/gral_lib/parser.php [new file with mode: 0644]
backup/cc/cc_lib/gral_lib/pathutils.php [new file with mode: 0644]
backup/cc/cc_lib/xmlbase.php [new file with mode: 0644]
backup/cc/entities.class.php
backup/cc/entities11.class.php [new file with mode: 0644]
backup/cc/entity.forum.class.php
backup/cc/entity.label.class.php
backup/cc/entity.quiz.class.php
backup/cc/entity.resource.class.php
backup/cc/entity11.basiclti.class.php [new file with mode: 0644]
backup/cc/entity11.forum.class.php [new file with mode: 0644]
backup/cc/entity11.lti.class.php [new file with mode: 0644]
backup/cc/entity11.quiz.class.php [new file with mode: 0644]
backup/cc/entity11.resource.class.php [new file with mode: 0644]
backup/cc/includes/constants.php
backup/cc/schemas/domainProfile_4/ims_qtiasiv1p2.xsd
backup/cc/schemas/domainProfile_4/ims_qtiasiv1p2_def_copy.xsd
backup/cc/schemas/domainProfile_4/ims_qtiasiv1p2_localised.xsd
backup/cc/schemas/imscp_v1p2.xsd
backup/cc/schemas/imscp_v1p2_localised.xsd
backup/cc/schemas11/cc11libxml2validator.xsd [new file with mode: 0644]
backup/cc/schemas11/ccv1p1_imsccauth_v1p1.xsd [new file with mode: 0644]
backup/cc/schemas11/ccv1p1_imscp_v1p2_v1p0.xsd [new file with mode: 0644]
backup/cc/schemas11/ccv1p1_imsdt_v1p1.xsd [new file with mode: 0644]
backup/cc/schemas11/ccv1p1_imswl_v1p1.xsd [new file with mode: 0644]
backup/cc/schemas11/ccv1p1_lommanifest_v1p0.xsd [new file with mode: 0644]
backup/cc/schemas11/ccv1p1_lomresource_v1p0.xsd [new file with mode: 0644]
backup/cc/schemas11/ccv1p1_qtiasiv1p2p1_v1p0.xsd [new file with mode: 0644]
backup/cc/schemas11/imsbasiclti_v1p0p1.xsd [new file with mode: 0644]
backup/cc/schemas11/imslticc_v1p0p1.xsd [new file with mode: 0644]
backup/cc/schemas11/imslticm_v1p0.xsd [new file with mode: 0644]
backup/cc/schemas11/imslticp_v1p0.xsd [new file with mode: 0644]
backup/cc/schemas11/xml.xsd [new file with mode: 0644]
backup/cc/sheets/course_header.xml
backup/cc/sheets/course_modules_mod_basiclti.xml [new file with mode: 0644]
backup/cc/sheets/course_modules_mod_forum.xml
backup/cc/sheets/course_modules_mod_label.xml
backup/cc/sheets/course_modules_mod_lti.xml [new file with mode: 0644]
backup/cc/sheets/course_modules_mod_resource.xml
backup/cc/sheets/course_question_categories_question_category.xml
backup/cc/sheets/course_question_categories_question_category_question.xml
backup/cc/sheets/course_question_categories_question_category_question_answer.xml
backup/cc/sheets/info_details_mod_instance.xml
backup/cc/sheets/moodle_blti_export.xml [new file with mode: 0644]
backup/cc/validator.php [new file with mode: 0644]
backup/converter/imscc11/backuplib.php [new file with mode: 0644]
backup/converter/imscc11/lib.php [new file with mode: 0644]
backup/converter/moodle1/backuplib.php [new file with mode: 0644]
backup/moodle2/backup_final_task.class.php
backup/moodle2/backup_root_task.class.php
backup/moodle2/backup_root_task.class.php.orig [new file with mode: 0644]
backup/util/helper/backup_general_helper.class.php
backup/util/helper/convert_helper.class.php
backup/util/settings/base_setting.class.php
backup/util/settings/setting_dependency.class.php
lang/en/backup.php

index 51c0ec6..441ed10 100644 (file)
@@ -41,7 +41,8 @@ abstract class backup implements checksumable {
     // Backup format
     const FORMAT_MOODLE  = 'moodle2';
     const FORMAT_MOODLE1 = 'moodle1';
-    const FORMAT_IMSCC   = 'imscc';
+    const FORMAT_IMSCC1  = 'imscc1';
+    const FORMAT_IMSCC11 = 'imscc11';
     const FORMAT_UNKNOWN = 'unknown';
 
     // Interactive
diff --git a/backup/cc/cc112moodle.php b/backup/cc/cc112moodle.php
new file mode 100644 (file)
index 0000000..d9c03e2
--- /dev/null
@@ -0,0 +1,205 @@
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package   moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+require_once($CFG->dirroot . '/backup/cc/cc2moodle.php');
+require_once($CFG->dirroot . '/backup/cc/entities11.class.php');
+require_once($CFG->dirroot . '/backup/cc/entity11.resource.class.php');
+require_once($CFG->dirroot . '/backup/cc/entity11.forum.class.php');
+require_once($CFG->dirroot . '/backup/cc/entity11.quiz.class.php');
+require_once($CFG->dirroot . '/backup/cc/entity11.lti.class.php');
+
+class cc112moodle extends cc2moodle {
+    const CC_TYPE_FORUM              = 'imsdt_xmlv1p1';
+    const CC_TYPE_QUIZ               = 'imsqti_xmlv1p2/imscc_xmlv1p1/assessment';
+    const CC_TYPE_QUESTION_BANK      = 'imsqti_xmlv1p2/imscc_xmlv1p1/question-bank';
+    const CC_TYPE_WEBLINK            = 'imswl_xmlv1p1';
+    const CC_TYPE_ASSOCIATED_CONTENT = 'associatedcontent/imscc_xmlv1p1/learning-application-resource';
+    const CC_TYPE_BASICLTI           = 'imsbasiclti_xmlv1p0';
+
+    public static $namespaces = array('imscc'    => 'http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1',
+                                      'lomimscc' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/manifest',
+                                      'lom'      => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/resource',
+                                      'xsi'      => 'http://www.w3.org/2001/XMLSchema-instance',
+                                      'cc'       => 'http://www.imsglobal.org/xsd/imsccv1p1/imsccauth_v1p1');
+
+    public static $restypes = array('associatedcontent/imscc_xmlv1p1/learning-application-resource', 'webcontent');
+    public static $forumns  = array('dt' => 'http://www.imsglobal.org/xsd/imsccv1p1/imsdt_v1p1');
+    public static $quizns   = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2');
+    public static $resourcens = array('wl' => 'http://www.imsglobal.org/xsd/imsccv1p1/imswl_v1p1');
+    public static $basicltins = array(
+                                       'xmlns' => 'http://www.imsglobal.org/xsd/imslticc_v1p0',
+                                       'blti'  => 'http://www.imsglobal.org/xsd/imsbasiclti_v1p0',
+                                                                  'lticm' => 'http://www.imsglobal.org/xsd/imslticm_v1p0',
+                                       'lticp' => 'http://www.imsglobal.org/xsd/imslticp_v1p0'
+                                      );
+
+
+    public function __construct($path_to_manifest) {
+        parent::__construct($path_to_manifest);
+    }
+
+    public function generate_moodle_xml () {
+
+        global $CFG;
+
+        mkdir(static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files');
+
+        $sheet_base = static::loadsheet(SHEET_BASE);
+
+        // MOODLE_BACKUP / INFO / DETAILS / MOD
+        $node_info_details_mod = $this->create_code_info_details_mod();
+
+        // MOODLE_BACKUP / BLOCKS / BLOCK
+        $node_course_blocks_block = $this->create_node_course_blocks_block();
+
+        // MOODLE_BACKUP / COURSES / SECTIONS / SECTION
+        $node_course_sections_section = $this->create_node_course_sections_section();
+
+        // MOODLE_BACKUP / COURSES / QUESTION_CATEGORIES
+        $node_course_question_categories = $this->create_node_question_categories();
+
+        // MOODLE_BACKUP / COURSES / MODULES / MOD
+        $node_course_modules_mod = $this->create_node_course_modules_mod();
+
+        // MOODLE_BACKUP / COURSE / HEADER
+        $node_course_header = $this->create_node_course_header();
+
+        // GENERAL INFO
+        $filename = optional_param('file', 'not_available.zip', PARAM_RAW);
+        $filename = basename($filename);
+
+        $www_root = $CFG->wwwroot;
+
+        $find_tags = array('[#zip_filename#]',
+                               '[#www_root#]',
+                               '[#node_course_header#]',
+                               '[#node_info_details_mod#]',
+                               '[#node_course_blocks_block#]',
+                               '[#node_course_sections_section#]',
+                               '[#node_course_question_categories#]',
+                               '[#node_course_modules#]');
+
+        $replace_values = array($filename,
+        $www_root,
+        $node_course_header,
+        $node_info_details_mod,
+        $node_course_blocks_block,
+        $node_course_sections_section,
+        $node_course_question_categories,
+        $node_course_modules_mod);
+
+        $result_xml = str_replace($find_tags, $replace_values, $sheet_base);
+
+        // COPY RESOURSE FILES
+        $entities = new entities11();
+
+        $entities->move_all_files();
+
+        if (array_key_exists("index", self::$instances)) {
+
+            if (!file_put_contents(static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'moodle.xml', $result_xml)) {
+                static::log_action('Cannot save the moodle manifest file: ' . static::$path_to_tmp_folder . DIRECTORY_SEPARATOR . 'moodle.xml', true);
+            } else {
+                $status = true;
+            }
+
+        } else {
+            $status = false;
+            static::log_action('The course is empty', false);
+        }
+
+        return $status;
+
+    }
+
+    public function convert_to_moodle_type ($cc_type) {
+        $type = parent::convert_to_moodle_type($cc_type);
+
+        if ($type == TYPE_UNKNOWN) {
+            if ($cc_type == static::CC_TYPE_BASICLTI) {
+                $type = MOODLE_TYPE_LTI;
+            }
+        }
+
+        return $type;
+    }
+
+    protected function create_node_question_categories () {
+
+        $quiz = new cc11_quiz();
+
+        static::log_action('Creating node: QUESTION_CATEGORIES');
+
+        $node_course_question_categories = $quiz->generate_node_question_categories();
+
+        return $node_course_question_categories;
+    }
+
+    protected function create_code_info_details_mod () {
+        $result = parent::create_code_info_details_mod();
+
+        $count_blti = $this->count_instances(MOODLE_TYPE_LTI);
+
+        $sheet_info_details_mod_instances_instance = static::loadsheet(SHEET_INFO_DETAILS_MOD_INSTANCE);
+
+        $blti_mod = '';
+
+        if ($count_blti > 0) {
+            $blti_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_blti, static::$instances['instances'][MOODLE_TYPE_LTI]);
+            $blti_mod = $blti_instance ? $this->create_mod_info_details_mod(MOODLE_TYPE_LTI, $blti_instance) : '';
+        }
+
+        return $result . $blti_mod;
+    }
+
+    protected function create_node_course_modules_mod () {
+        $resources = new cc11_resource();
+        $forums = new cc11_forum();
+        $quiz = new cc11_quiz();
+        $basiclti = new cc11_lti();
+
+        static::log_action('Creating node: COURSE/MODULES/MOD');
+
+        // RESOURCES (WEB CONTENT AND WEB LINK)
+        $node_course_modules_mod_resource = $resources->generate_node();
+
+        // FORUMS
+        $node_course_modules_mod_forum = $forums->generate_node();
+
+        // QUIZ
+        $node_course_modules_mod_quiz = $quiz->generate_node_course_modules_mod();
+
+        //BasicLTI
+        $node_course_modules_mod_basiclti = $basiclti->generate_node();
+
+        $node_course_modules = $node_course_modules_mod_resource .
+                               $node_course_modules_mod_forum .
+                               $node_course_modules_mod_quiz .
+                               $node_course_modules_mod_basiclti;
+
+        return $node_course_modules;
+    }
+
+}
\ No newline at end of file
index 1d562b8..43d3134 100644 (file)
@@ -30,34 +30,91 @@ require_once($CFG->dirroot . '/backup/cc/entity.quiz.class.php');
 
 class cc2moodle {
 
+    const CC_TYPE_FORUM              = 'imsdt_xmlv1p0';
+    const CC_TYPE_QUIZ               = 'imsqti_xmlv1p2/imscc_xmlv1p0/assessment';
+    const CC_TYPE_QUESTION_BANK      = 'imsqti_xmlv1p2/imscc_xmlv1p0/question-bank';
+    const CC_TYPE_WEBLINK            = 'imswl_xmlv1p0';
+    const CC_TYPE_WEBCONTENT         = 'webcontent';
+    const CC_TYPE_ASSOCIATED_CONTENT = 'associatedcontent/imscc_xmlv1p0/learning-application-resource';
+    const CC_TYPE_EMPTY              = '';
+
+    public static $restypes = array('associatedcontent/imscc_xmlv1p0/learning-application-resource', 'webcontent');
+    public static $forumns  = array('dt' => 'http://www.imsglobal.org/xsd/imsdt_v1p0');
+    public static $quizns   = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2');
+    public static $resourcens = array('wl' => 'http://www.imsglobal.org/xsd/imswl_v1p0');
+    /**
+     *
+     * @return array
+     */
+    public static function getquizns() {
+        return static::$quizns;
+    }
+
+    /**
+     *
+     * @return array
+     */
+    public static function getforumns() {
+        return static::$forumns;
+    }
+
+    /**
+     *
+     * @return array
+     */
+    public static function getresourcens() {
+        return static::$resourcens;
+    }
+
+    public static function get_manifest($folder) {
+        if (!is_dir($folder)) {
+            return false;
+        }
+
+        $result = false;
+        try {
+            $dirIter = new RecursiveDirectoryIterator($folder, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
+            $recIter = new RecursiveIteratorIterator($dirIter, RecursiveIteratorIterator::CHILD_FIRST);
+            foreach ($recIter as $info) {
+                if ($info->isFile() && ($info->getFilename() == 'imsmanifest.xml')) {
+                    $result = $info->getPathname();
+                    break;
+                }
+            }
+        } catch (Exception $e) {}
+
+        return $result;
+    }
+
     public static $instances = array();
     public static $manifest;
     public static $path_to_manifest_folder;
 
-    public static $namespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1',
+    public static $namespaces = array('imscc'    => 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1',
                                       'lomimscc' => 'http://ltsc.ieee.org/xsd/imscc/LOM',
-                                      'lom' => 'http://ltsc.ieee.org/xsd/LOM',
-                                      'voc' => 'http://ltsc.ieee.org/xsd/LOM/vocab',
-                                      'xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
-                                      'cc' => 'http://www.imsglobal.org/xsd/imsccauth_v1p0');
+                                      'lom'      => 'http://ltsc.ieee.org/xsd/LOM',
+                                      'voc'      => 'http://ltsc.ieee.org/xsd/LOM/vocab',
+                                      'xsi'      => 'http://www.w3.org/2001/XMLSchema-instance',
+                                      'cc'       => 'http://www.imsglobal.org/xsd/imsccauth_v1p0');
 
     function __construct ($path_to_manifest) {
 
-        self::$manifest = new DOMDocument();
+        static::$manifest = new DOMDocument();
+        static::$manifest->validateOnParse = false;
 
-        self::$path_to_manifest_folder = dirname($path_to_manifest);
+        static::$path_to_manifest_folder = dirname($path_to_manifest);
 
-        self::log_action('Proccess start');
-        self::log_action('Load the manifest file: ' . $path_to_manifest);
+        static::log_action('Proccess start');
+        static::log_action('Load the manifest file: ' . $path_to_manifest);
 
-        if (!self::$manifest->load($path_to_manifest)) {
-            self::log_action('Cannot load the manifest file: ' . $path_to_manifest, true);
+        if (!static::$manifest->load($path_to_manifest, LIBXML_NONET)) {
+            static::log_action('Cannot load the manifest file: ' . $path_to_manifest, true);
         }
     }
 
     public function is_auth () {
 
-        $xpath = self::newx_path(self::$manifest, self::$namespaces);
+        $xpath = static::newx_path(static::$manifest, static::$namespaces);
 
         $count_auth = $xpath->evaluate('count(/imscc:manifest/cc:authorizations)');
 
@@ -70,9 +127,9 @@ class cc2moodle {
         return $response;
     }
 
-    private function get_metadata ($section, $key) {
+    protected function get_metadata ($section, $key) {
 
-        $xpath = self::newx_path(self::$manifest, self::$namespaces);
+        $xpath = static::newx_path(static::$manifest, static::$namespaces);
 
         $metadata = $xpath->query('/imscc:manifest/imscc:metadata/lomimscc:lom/lomimscc:' . $section . '/lomimscc:' . $key . '/lomimscc:string');
         $value = !empty($metadata->item(0)->nodeValue) ? $metadata->item(0)->nodeValue : '';
@@ -84,9 +141,9 @@ class cc2moodle {
 
         global $CFG;
 
-        mkdir(self::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files');
+        mkdir(static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files');
 
-        $sheet_base = self::loadsheet(SHEET_BASE);
+        $sheet_base = static::loadsheet(SHEET_BASE);
 
         // MOODLE_BACKUP / INFO / DETAILS / MOD
         $node_info_details_mod = $this->create_code_info_details_mod();
@@ -107,7 +164,7 @@ class cc2moodle {
         $node_course_header = $this->create_node_course_header();
 
         // GENERAL INFO
-        $filename = optional_param('file', 'not_available.zip');
+        $filename = optional_param('file', 'not_available.zip', PARAM_RAW);
         $filename = basename($filename);
 
         $www_root = $CFG->wwwroot;
@@ -139,8 +196,8 @@ class cc2moodle {
 
         if (array_key_exists("index", self::$instances)) {
 
-            if (!file_put_contents(self::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'moodle.xml', $result_xml)) {
-                self::log_action('Cannot save the moodle manifest file: ' . self::$path_to_tmp_folder . DIRECTORY_SEPARATOR . 'moodle.xml', true);
+            if (!file_put_contents(static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'moodle.xml', $result_xml)) {
+                static::log_action('Cannot save the moodle manifest file: ' . static::$path_to_tmp_folder . DIRECTORY_SEPARATOR . 'moodle.xml', true);
             } else {
                 $status = true;
             }
@@ -148,14 +205,14 @@ class cc2moodle {
         } else {
             $status = false;
             notify('The course is empty');
-            self::log_action('The course is empty', false);
+            static::log_action('The course is empty', false);
         }
 
         return $status;
 
     }
 
-    private function get_sections_numbers ($instances) {
+    protected function get_sections_numbers ($instances) {
 
         $count = 0;
 
@@ -170,13 +227,15 @@ class cc2moodle {
         return $count;
     }
 
-    private function create_node_course_header () {
+    protected function create_node_course_header () {
 
         $node_course_header = '';
-        $sheet_course_header = self::loadsheet(SHEET_COURSE_HEADER);
+        $sheet_course_header = static::loadsheet(SHEET_COURSE_HEADER);
 
-        $course_title = $this->get_metadata('general', 'title');
-        $section_count = $this->get_sections_numbers(self::$instances) - 1;
+        $course_title = trim($this->get_metadata('general', 'title'));
+        $course_title = empty($course_title) ? 'Untitled Course' : $course_title;
+        $course_description = $this->get_metadata('general', 'description');
+        $section_count = $this->get_sections_numbers(static::$instances) - 1;
 
         if ($section_count == -1) {
             $section_count = 0;
@@ -190,11 +249,13 @@ class cc2moodle {
 
         $find_tags = array('[#course_name#]',
                            '[#course_short_name#]',
+                           '[#course_description#]',
                            '[#date_now#]',
                            '[#section_count#]');
 
-        $replace_values = array($course_title,
-                                $course_short_name,
+        $replace_values = array(htmlentities($course_title),
+                                htmlentities($course_short_name),
+                                htmlentities($course_description),
                                 time(),
                                 $section_count);
 
@@ -203,25 +264,25 @@ class cc2moodle {
         return $node_course_header;
     }
 
-    private function create_node_question_categories () {
+    protected function create_node_question_categories () {
 
-        $quiz = new quiz();
+        $quiz = new cc_quiz();
 
-        self::log_action('Creating node: QUESTION_CATEGORIES');
+        static::log_action('Creating node: QUESTION_CATEGORIES');
 
         $node_course_question_categories = $quiz->generate_node_question_categories();
 
         return $node_course_question_categories;
     }
 
-    private function create_node_course_modules_mod () {
+    protected function create_node_course_modules_mod () {
 
-        $labels = new label();
-        $resources = new resource();
-        $forums = new forum();
-        $quiz = new quiz();
+        $labels = new cc_label();
+        $resources = new cc_resource();
+        $forums = new cc_forum();
+        $quiz = new cc_quiz();
 
-        self::log_action('Creating node: COURSE/MODULES/MOD');
+        static::log_action('Creating node: COURSE/MODULES/MOD');
 
         // LABELS
         $node_course_modules_mod_label = $labels->generate_node();
@@ -234,18 +295,18 @@ class cc2moodle {
 
         // QUIZ
         $node_course_modules_mod_quiz = $quiz->generate_node_course_modules_mod();
-        $node_course_modules = $node_course_modules_mod_label . $node_course_modules_mod_resource . $node_course_modules_mod_forum . $node_course_modules_mod_quiz;
+        $node_course_modules = /*$node_course_modules_mod_label .*/ $node_course_modules_mod_resource . $node_course_modules_mod_forum . $node_course_modules_mod_quiz;
 
         return $node_course_modules;
     }
 
 
-    private function create_node_course_sections_section () {
+    protected function create_node_course_sections_section () {
 
-        self::log_action('Creating node: COURSE/SECTIONS/SECTION');
+        static::log_action('Creating node: COURSE/SECTIONS/SECTION');
 
         $node_course_sections_section = '';
-        $sheet_course_sections_section = self::loadsheet(SHEET_COURSE_SECTIONS_SECTION);
+        $sheet_course_sections_section = static::loadsheet(SHEET_COURSE_SECTIONS_SECTION);
 
         $topics = $this->get_nodes_by_criteria('deep', ROOT_DEEP);
 
@@ -292,13 +353,13 @@ class cc2moodle {
         return $node_course_sections_section;
     }
 
-    private function create_node_course_blocks_block () {
+    protected function create_node_course_blocks_block () {
 
         global $CFG;
 
-        self::log_action('Creating node: COURSE/BLOCKS/BLOCK');
+        static::log_action('Creating node: COURSE/BLOCKS/BLOCK');
 
-        $sheet_course_blocks_block = self::loadsheet(SHEET_COURSE_BLOCKS_BLOCK);
+        $sheet_course_blocks_block = static::loadsheet(SHEET_COURSE_BLOCKS_BLOCK);
         $node_course_blocks_block = '';
 
         $format_config = $CFG->dirroot . '/course/format/weeks/config.php';
@@ -360,9 +421,9 @@ class cc2moodle {
 
     }
 
-    private function create_node_course_sections_section_mods_mod ($root_parent) {
+    protected function create_node_course_sections_section_mods_mod ($root_parent) {
 
-        $sheet_course_sections_section_mods_mod = self::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD);
+        $sheet_course_sections_section_mods_mod = static::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD);
         $childs = $this->get_nodes_by_criteria('root_parent', $root_parent);
 
         if ($childs) {
@@ -419,8 +480,8 @@ class cc2moodle {
 
         $response = array();
 
-        if (array_key_exists('index', self::$instances)) {
-            foreach (self::$instances['index'] as $item) {
+        if (array_key_exists('index', static::$instances)) {
+            foreach (static::$instances['index'] as $item) {
                 if ($item[$key] == $value) {
                     $response[] = $item;
                 }
@@ -430,13 +491,14 @@ class cc2moodle {
         return $response;
     }
 
-    private function create_code_info_details_mod () {
+    //Modified here
+    protected function create_code_info_details_mod () {
 
-        self::log_action('Creating node: INFO/DETAILS/MOD');
+        static::log_action('Creating node: INFO/DETAILS/MOD');
 
-        $xpath = self::newx_path(self::$manifest, self::$namespaces);
+        $xpath = static::newx_path(static::$manifest, static::$namespaces);
 
-        $items = $xpath->query('/imscc:manifest/imscc:organizations/imscc:organization/imscc:item | /imscc:manifest/imscc:resources/imscc:resource[@type="' . CC_TYPE_QUESTION_BANK . '"]');
+        $items = $xpath->query('/imscc:manifest/imscc:organizations/imscc:organization/imscc:item | /imscc:manifest/imscc:resources/imscc:resource[@type="' . static::CC_TYPE_QUESTION_BANK . '"]');
 
         $this->create_instances($items);
 
@@ -445,19 +507,19 @@ class cc2moodle {
         $count_resource = $this->count_instances(MOODLE_TYPE_RESOURCE);
         $count_label = $this->count_instances(MOODLE_TYPE_LABEL);
 
-        $sheet_info_details_mod_instances_instance = self::loadsheet(SHEET_INFO_DETAILS_MOD_INSTANCE);
+        $sheet_info_details_mod_instances_instance = static::loadsheet(SHEET_INFO_DETAILS_MOD_INSTANCE);
 
         if ($count_resource > 0) {
-            $resource_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_resource, self::$instances['instances'][MOODLE_TYPE_RESOURCE]);
+            $resource_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_resource, static::$instances['instances'][MOODLE_TYPE_RESOURCE]);
         }
         if ($count_quiz > 0) {
-            $quiz_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_quiz, self::$instances['instances'][MOODLE_TYPE_QUIZ]);
+            $quiz_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_quiz, static::$instances['instances'][MOODLE_TYPE_QUIZ]);
         }
         if ($count_forum > 0) {
-            $forum_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_forum, self::$instances['instances'][MOODLE_TYPE_FORUM]);
+            $forum_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_forum, static::$instances['instances'][MOODLE_TYPE_FORUM]);
         }
         if ($count_label > 0) {
-            $label_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_label, self::$instances['instances'][MOODLE_TYPE_LABEL]);
+            $label_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_label, static::$instances['instances'][MOODLE_TYPE_LABEL]);
         }
 
         $resource_mod = $count_resource ? $this->create_mod_info_details_mod(MOODLE_TYPE_RESOURCE, $resource_instance) : '';
@@ -465,13 +527,13 @@ class cc2moodle {
         $forum_mod = $count_forum ? $this->create_mod_info_details_mod(MOODLE_TYPE_FORUM, $forum_instance) : '';
         $label_mod = $count_label ? $this->create_mod_info_details_mod(MOODLE_TYPE_LABEL, $label_instance) : '';
 
-        return $label_mod . $resource_mod . $quiz_mod . $forum_mod;
+        return /*$label_mod .*/ $resource_mod . $quiz_mod . $forum_mod;
 
     }
 
-    private function create_mod_info_details_mod ($mod_type, $node_info_details_mod_instances_instance) {
+    protected function create_mod_info_details_mod ($mod_type, $node_info_details_mod_instances_instance) {
 
-        $sheet_info_details_mod = self::loadsheet(SHEET_INFO_DETAILS_MOD);
+        $sheet_info_details_mod = static::loadsheet(SHEET_INFO_DETAILS_MOD);
 
         $find_tags = array('[#mod_type#]' ,'[#node_info_details_mod_instances_instance#]');
         $replace_values = array($mod_type , $node_info_details_mod_instances_instance);
@@ -479,7 +541,7 @@ class cc2moodle {
         return str_replace($find_tags, $replace_values, $sheet_info_details_mod);
     }
 
-    private function create_mod_info_details_mod_instances_instance ($sheet, $instances_quantity, $instances) {
+    protected function create_mod_info_details_mod_instances_instance ($sheet, $instances_quantity, $instances) {
 
         $instance = '';
 
@@ -489,10 +551,10 @@ class cc2moodle {
 
         for ($i = 1; $i <= $instances_quantity; $i++) {
 
-            $user_info = ($instances[$i - 1]['common_cartriedge_type'] == CC_TYPE_FORUM) ? 'true' : 'false';
+            $user_info = ($instances[$i - 1]['common_cartriedge_type'] == static::CC_TYPE_FORUM) ? 'true' : 'false';
 
             $replace_values = array($instances[$i - 1]['instance'],
-                                    $instances[$i - 1]['title'],
+                                    htmlentities($instances[$i - 1]['title']),
                                     $user_info);
 
             $instance .= str_replace($find_tags, $replace_values, $sheet);
@@ -502,14 +564,14 @@ class cc2moodle {
 
     }
 
-    private function create_instances ($items, $level = 0, &$array_index = 0, $index_root = 0) {
+    protected function create_instances ($items, $level = 0, &$array_index = 0, $index_root = 0) {
 
         $level++;
         $i = 1;
 
         if ($items) {
 
-            $xpath = self::newx_path(self::$manifest, self::$namespaces);
+            $xpath = self::newx_path(static::$manifest, static::$namespaces);
 
             foreach ($items as $item) {
 
@@ -543,17 +605,17 @@ class cc2moodle {
                     $index_root = $array_index;
                 }
 
-                self::$instances['index'][$array_index]['common_cartriedge_type'] = $cc_type;
-                self::$instances['index'][$array_index]['moodle_type'] = $moodle_type;
-                self::$instances['index'][$array_index]['title'] = $title ? $title : '';
-                self::$instances['index'][$array_index]['root_parent'] = $index_root;
-                self::$instances['index'][$array_index]['index'] = $array_index;
-                self::$instances['index'][$array_index]['deep'] = $level;
-                self::$instances['index'][$array_index]['instance'] = $this->count_instances($moodle_type);
-                self::$instances['index'][$array_index]['resource_indentifier'] = $identifierref;
-
-                self::$instances['instances'][$moodle_type][] = array('title' => $title,
-                        'instance' => self::$instances['index'][$array_index]['instance'],
+                static::$instances['index'][$array_index]['common_cartriedge_type'] = $cc_type;
+                static::$instances['index'][$array_index]['moodle_type'] = $moodle_type;
+                static::$instances['index'][$array_index]['title'] = $title ? $title : '';
+                static::$instances['index'][$array_index]['root_parent'] = $index_root;
+                static::$instances['index'][$array_index]['index'] = $array_index;
+                static::$instances['index'][$array_index]['deep'] = $level;
+                static::$instances['index'][$array_index]['instance'] = $this->count_instances($moodle_type);
+                static::$instances['index'][$array_index]['resource_indentifier'] = $identifierref;
+
+                static::$instances['instances'][$moodle_type][] = array('title' => $title,
+                        'instance' => static::$instances['index'][$array_index]['instance'],
                         'common_cartriedge_type' => $cc_type , 'resource_indentifier' => $identifierref);
 
                 $more_items = $xpath->query('imscc:item', $item);
@@ -572,10 +634,10 @@ class cc2moodle {
 
         $quantity = 0;
 
-        if (array_key_exists('index', self::$instances)) {
-            if (self::$instances['index'] && $type) {
+        if (array_key_exists('index', static::$instances)) {
+            if (static::$instances['index'] && $type) {
 
-                foreach (self::$instances['index'] as $instance) {
+                foreach (static::$instances['index'] as $instance) {
                     if (!empty($instance['moodle_type'])) {
                         $types[] = $instance['moodle_type'];
                     }
@@ -590,37 +652,41 @@ class cc2moodle {
     }
 
     public function convert_to_moodle_type ($cc_type) {
+        $type = TYPE_UNKNOWN;
 
-        if ($cc_type == CC_TYPE_FORUM) {
+        if ($cc_type == static::CC_TYPE_FORUM) {
             $type = MOODLE_TYPE_FORUM;
         }
-        if ($cc_type == CC_TYPE_QUIZ) {
+
+        if ($cc_type == static::CC_TYPE_QUIZ) {
             $type = MOODLE_TYPE_QUIZ;
         }
-        if ($cc_type == CC_TYPE_WEBLINK) {
+
+        if ($cc_type == static::CC_TYPE_WEBLINK) {
             $type = MOODLE_TYPE_RESOURCE;
         }
-        if ($cc_type == CC_TYPE_WEBCONTENT) {
+
+        if ($cc_type == static::CC_TYPE_WEBCONTENT) {
             $type = MOODLE_TYPE_RESOURCE;
         }
-        if ($cc_type == CC_TYPE_ASSOCIATED_CONTENT) {
+
+        if ($cc_type == static::CC_TYPE_ASSOCIATED_CONTENT) {
             $type = MOODLE_TYPE_RESOURCE;
         }
-        if ($cc_type == CC_TYPE_QUESTION_BANK) {
+
+        if ($cc_type == static::CC_TYPE_QUESTION_BANK) {
             $type = MOODLE_TYPE_QUESTION_BANK;
         }
-        if ($cc_type == CC_TYPE_EMPTY) {
+        /*if ($cc_type == static::CC_TYPE_EMPTY) {
             $type = MOODLE_TYPE_LABEL;
-        }
-
-        $type = empty($type) ? TYPE_UNKNOWN : $type;
+        }*/
 
         return $type;
     }
 
     public function get_item_cc_type ($identifier) {
 
-        $xpath = self::newx_path(self::$manifest, self::$namespaces);
+        $xpath = static::newx_path(static::$manifest, static::$namespaces);
 
         $nodes = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $identifier . '"]/@type');
 
@@ -638,7 +704,7 @@ class cc2moodle {
         if (!empty($namespaces)) {
             foreach ($namespaces as $prefix => $ns) {
                 if (!$xpath->registerNamespace($prefix, $ns)) {
-                    self::log_action('Cannot register the namespace: ' . $prefix . ':' . $ns, true);
+                    static::log_action('Cannot register the namespace: ' . $prefix . ':' . $ns, true);
                 }
             }
         }
@@ -650,32 +716,35 @@ class cc2moodle {
 
         $content = (is_readable($file) && ($content = file_get_contents($file))) ? $content : false;
 
-        self::log_action('Loading sheet: ' . $file);
+        static::log_action('Loading sheet: ' . $file);
 
         if (!$content) {
-            self::log_action('Cannot load the xml sheet: ' . $file, true);
+            static::log_action('Cannot load the xml sheet: ' . $file, true);
         }
 
-        self::log_action('Load OK!');
+        static::log_action('Load OK!');
 
         return $content;
     }
 
+    public static function log_file() {
+        return static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'cc2moodle.log';
+    }
+
     public static function log_action ($text, $critical_error = false) {
 
-        $filename = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'cc2moodle.log';
         $full_message = strtoupper(date("j/n/Y g:i:s a")) . " - " . $text . "\r";
 
-        file_put_contents($filename, $full_message, FILE_APPEND);
+        file_put_contents(static::log_file(), $full_message, FILE_APPEND);
 
         if ($critical_error) {
-            self::critical_error($text);
+            static::critical_error($text);
         }
     }
 
-    private function critical_error ($text) {
+    protected function critical_error ($text) {
 
-        $path_to_log = cc2moodle::$path_to_manifest_folder . '/cc2moodle.log';
+        $path_to_log = static::log_file();
 
         echo '
 
@@ -698,16 +767,10 @@ class cc2moodle {
         die();
     }
 
-    private function create_course_code ($title) {
-
-        $code = '';
-        $words = explode(' ', $title);
-
-        foreach ($words as $word) {
-            $code .= $word[0];
-        }
-
-        $code = strtoupper($code . '-1');
+    protected function create_course_code ($title) {
+        //Making sure that text of the short name does not go over the DB limit.
+        //and leaving the space to add additional characters by the platform
+        $code = substr(strtoupper(str_replace(' ', '', trim($title))),0,94);
         return $code;
     }
 }
diff --git a/backup/cc/cc_includes.php b/backup/cc/cc_includes.php
new file mode 100644 (file)
index 0000000..263172c
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* Main include for IMS Common Cartridge export classes
+*
+* @package    backup-convert
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once($CFG->dirroot .'/backup/cc/cc_lib/xmlbase.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_resources.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_builder_creator.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_manifest.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_metadata.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_metadata_resource.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_metadata_file.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_version11.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/gral_lib/pathutils.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/gral_lib/functions.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_organization.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_basiclti.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_lti.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_forum.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_url.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_resource.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_convert_moodle2.php');
diff --git a/backup/cc/cc_lib/cc_asssesment.php b/backup/cc/cc_lib/cc_asssesment.php
new file mode 100644 (file)
index 0000000..b15f540
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+
+require_once 'cc_general.php';
+
+class assesment1_resurce_file extends general_cc_file {
+    const deafultname = 'assesment.xml';
+
+    protected $rootns   = 'xmlns';
+    protected $rootname = 'questestinterop';
+    protected $ccnamespaces = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2',
+                                    'xsi'   => 'http://www.w3.org/2001/XMLSchema-instance');
+    protected $ccnsnames = array('xmlns' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_4/ims_qtiasiv1p2_localised.xsd');
+
+    protected $assesment_title = null;
+    protected $assesment_ident = null;
+    protected $qtimetadata = array();
+
+    protected function on_save() {
+        $rns = $this->ccnamespaces[$this->rootns];
+        //add some root stuff
+        $assesment = $this->append_new_element_ns($this->root, $rns, 'assesment');
+        $this->append_new_attribute_ns($assesment, $rns, 'ident', $this->assesment_ident);
+        $this->append_new_attribute_ns($assesment, $rns, 'title', $this->assesment_title);
+
+        if (!empty($this->qtimetadata)) {
+            $qtimetadata = $this->append_new_element_ns($assesment, $rns, 'qtimetadata');
+            foreach ($this->qtimetadata as $label => $entry) {
+                $this->append_new_element_ns($qtimetadata, $rns, 'fieldlabel', $label);
+                $this->append_new_element_ns($qtimetadata, $rns, 'fieldentry', $entry);
+            }
+        }
+
+        //TODO: implement section processing (looks quite complicated for implementing)
+
+        //TODO: finish this!
+        return false;
+    }
+}
+
+
+class assesment11_resurce_file extends assesment1_resurce_file {
+    protected $ccnsnames = array('xmlns' => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_qtiasiv1p2p1_v1p0.xsd');
+}
diff --git a/backup/cc/cc_lib/cc_basiclti.php b/backup/cc/cc_lib/cc_basiclti.php
new file mode 100644 (file)
index 0000000..f0c7263
--- /dev/null
@@ -0,0 +1,181 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_general.php';
+
+class basicltil1_resurce_file extends general_cc_file {
+    const deafultname = 'basiclti.xml';
+
+    protected $rootns   = 'xmlns';
+    protected $rootname = 'cartridge_basiclti_link';
+    protected $ccnamespaces = array('xmlns' => 'http://www.imsglobal.org/xsd/imslticc_v1p0',
+                                    'blti'  => 'http://www.imsglobal.org/xsd/imsbasiclti_v1p0',
+                                                               'lticm' => 'http://www.imsglobal.org/xsd/imslticm_v1p0',
+                                    'lticp' => 'http://www.imsglobal.org/xsd/imslticp_v1p0',
+                                    'xsi'   => 'http://www.w3.org/2001/XMLSchema-instance');
+    protected $ccnsnames = array('xmlns' => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticc_v1p0.xsd',
+                                 'blti'  => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imsbasiclti_v1p0p1.xsd',
+                                                        'lticm' => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticm_v1p0.xsd',
+                                 'lticp' => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticp_v1p0.xsd');
+
+    protected $title = 'Untitled';
+    protected $description = 'description';
+    protected $custom_properties = array();
+    protected $extension_properties = array();
+    protected $extension_platform = null;
+    protected $launch_url = null;
+    protected $secure_launch_url = null;
+    protected $icon = null;
+    protected $secure_icon = null;
+    protected $vendor = false;
+    protected $vendor_code = 'I';
+    protected $vendor_name = null;
+    protected $vendor_description = null;
+    protected $vendor_url = null;
+    protected $vendor_contact = null;
+    protected $cartridge_bundle = null;
+    protected $cartridge_icon = null;
+
+    public function set_title($title) {
+        $this->title = $title;
+    }
+    public function set_description($description) {
+        $this->description = $description;
+    }
+    public function set_launch_url ($url) {
+        $this->launch_url = $url;
+    }
+    public function set_secure_launch_url ($url) {
+        $this->secure_launch_url = $url;
+    }
+    public function set_launch_icon ($icon) {
+        $this->icon = $icon;
+    }
+    public function set_secure_launch_icon ($icon) {
+        $this->secure_icon = $icon;
+    }
+    public function set_vendor_code ($code) {
+        $this->vendor_code = $code;
+        $this->vendor = true;
+    }
+    public function set_vendor_name ($name) {
+        $this->vendor_name = $name;
+        $this->vendor = true;
+    }
+    public function set_vendor_description ($desc) {
+        $this->vendor_description = $desc;
+        $this->vendor = true;
+    }
+    public function set_vendor_url ($url) {
+        $this->vendor_url = $url;
+        $this->vendor = true;
+    }
+    public function set_vendor_contact ($email) {
+        $this->vendor_contact = array('email' => $email);
+        $this->vendor = true;
+    }
+    public function add_custom_property ($property, $value) {
+        $this->custom_properties[$property] = $value;
+    }
+    public function add_extension ($extension, $value) {
+        $this->extension_properties[$extension] = $value;
+    }
+    public function set_extension_platform ($value) {
+        $this->extension_platform = $value;
+    }
+
+    public function set_cartridge_bundle($value) {
+        $this->cartridge_bundle = $value;
+    }
+
+    public function set_cartridge_icon($value) {
+        $this->cartridge_icon = $value;
+    }
+
+    protected function on_save() {
+        //this has to be done like this since order of apearance of the tags is also mandatory
+        //and specified in basiclti schema files
+
+        //main items
+        $rns = $this->ccnamespaces['blti'];
+        $this->append_new_element_ns($this->root, $rns, 'title'      , $this->title      );
+        $this->append_new_element_ns($this->root, $rns, 'description', $this->description);
+
+        //custom properties
+        if (!empty($this->custom_properties)) {
+            $custom = $this->append_new_element_ns($this->root, $rns, 'custom');
+            foreach ($this->custom_properties as $property => $value) {
+                $node = $this->append_new_element_ns($custom, $this->ccnamespaces['lticm'], 'property' , $value);
+                $this->append_new_attribute_ns($node, $this->ccnamespaces['xmlns'],'name', $property);
+            }
+        }
+
+        //extension properties
+        if (!empty($this->extension_properties)) {
+            $extension = $this->append_new_element_ns($this->root, $rns, 'extensions');
+            if (!empty($this->extension_platform)) {
+                $this->append_new_attribute_ns($extension, $this->ccnamespaces['xmlns'], 'platform', $this->extension_platform);
+            }
+            foreach ($this->extension_properties as $property => $value) {
+                $node = $this->append_new_element_ns($extension, $this->ccnamespaces['lticm'], 'property' , $value);
+                $this->append_new_attribute_ns($node, $this->ccnamespaces['xmlns'], 'name', $property);
+            }
+        }
+
+        $this->append_new_element_ns($this->root, $rns, 'launch_url' , $this->launch_url );
+        if (!empty($this->secure_launch_url)) {
+            $this->append_new_element_ns($this->root, $rns, 'secure_launch_url' , $this->secure_launch_url);
+        }
+        $this->append_new_element_ns($this->root, $rns, 'icon'       , $this->icon       );
+        if (!empty($this->secure_icon)) {
+            $this->append_new_element_ns($this->root, $rns, 'secure_icon' , $this->secure_icon);
+        }
+
+        //vendor info
+        $vendor = $this->append_new_element_ns($this->root, $rns, 'vendor');
+        $vcode = empty($this->vendor_code) ? 'I' : $this->vendor_code;
+        $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'code', $vcode);
+        $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'name', $this->vendor_name);
+        if (!empty($this->vendor_description)) {
+            $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'description', $this->vendor_description);
+        }
+        if (!empty($this->vendor_url)) {
+            $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'url', $this->vendor_url);
+        }
+        if (!empty($this->vendor_contact)) {
+            $vcontact = $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'contact');
+            $this->append_new_element_ns($vcontact, $this->ccnamespaces['lticp'], 'email', $this->vendor_contact['email']);
+        }
+
+        //cartridge bundle and icon
+        if (!empty($this->cartridge_bundle)) {
+            $cbundle = $this->append_new_element_ns($this->root, $this->ccnamespaces['xmlns'], 'cartridge_bundle');
+            $this->append_new_attribute_ns($cbundle, $this->ccnamespaces['xmlns'], 'identifierref', $this->cartridge_bundle);
+        }
+        if (!empty($this->cartridge_icon)) {
+            $cicon = $this->append_new_element_ns($this->root, $this->ccnamespaces['xmlns'], 'cartridge_icon');
+            $this->append_new_attribute_ns($cicon, $this->ccnamespaces['xmlns'], 'identifierref', $this->cartridge_icon);
+        }
+
+        return true;
+    }
+
+}
diff --git a/backup/cc/cc_lib/cc_builder_creator.php b/backup/cc/cc_lib/cc_builder_creator.php
new file mode 100644 (file)
index 0000000..e993206
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+/**
+ * Factory pattern class
+ * Create the version class to use
+ *
+ */
+class cc_builder_creator {
+
+   public static function factory($version){
+       if (is_null($version)) {
+           throw new Exception("Version is null!");
+       }
+       if (include_once 'cc_version' . $version . '.php') {
+           $classname = 'cc_version' . $version;
+           return new $classname;
+       } else {
+           throw new Exception ("Dont find cc version class!");
+       }
+   }
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/cc_convert_moodle2.php b/backup/cc/cc_lib/cc_convert_moodle2.php
new file mode 100644 (file)
index 0000000..e672f1e
--- /dev/null
@@ -0,0 +1,194 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+if (!extension_loaded('fileinfo')) {
+    die('You must install fileinfo extension!');
+}
+
+abstract class cc_convert_moodle2 {
+
+    /**
+     *
+     * Enter description here ...
+     * @param unknown_type $packagedir
+     * @param unknown_type $outdir
+     * @throws DOMException
+     * @throws InvalidArgumentException
+     */
+    public static function convert($packagedir, $outdir) {
+        $dir = realpath($packagedir);
+        if (empty($dir)) {
+            throw new InvalidArgumentException('Directory does not exist!');
+        }
+        $odir = realpath($outdir);
+        if (empty($odir)) {
+            throw new InvalidArgumentException('Directory does not exist!');
+        }
+        $coursefile = $dir.DIRECTORY_SEPARATOR.'course'.DIRECTORY_SEPARATOR.'course.xml';
+        $doc = new XMLGenericDocument();
+        if ($doc->load($coursefile)) {
+            $course_name = $doc->nodeValue('/course/fullname');
+            $course_desc = $doc->nodeValue('/course/summary');
+            $course_language = $doc->nodeValue('/course/lang');
+            $course_language = empty($course_language) ? 'en' : $course_language;
+            $course_category = $doc->nodeValue('/course/category/name');
+
+            //Initialize the manifest metadata class
+            $meta = new cc_metadata_manifest();
+
+            //Package metadata
+            $metageneral = new cc_metadata_general();
+            $metageneral->set_language($course_language);
+            $metageneral->set_title($course_name, $course_language);
+            $metageneral->set_description($course_desc, $course_language);
+            $metageneral->set_catalog('category');
+            $metageneral->set_entry($course_category);
+            $meta->add_metadata_general($metageneral);
+
+            // Create the manifest
+            $manifest = new cc_manifest(cc_version::v11);
+
+            $manifest->add_metadata_manifest($meta);
+
+            $organization = null;
+
+            //Package structure - default organization and resources
+            //Get the course structure - this will be transformed into organization
+            //Step 1 - Get the list and order of sections/topics
+            $moodle_backup = $dir . DIRECTORY_SEPARATOR . 'moodle_backup.xml';
+            $secp = new XMLGenericDocument();
+            $docp = new XMLGenericDocument();
+            if ($docp->load($moodle_backup)) {
+                //sections
+                $sections = array();
+                $section_list = $docp->nodeList('/moodle_backup/information/contents/sections/section');
+                if (!empty($section_list)) {
+                    foreach ($section_list as $node) {
+                        $sectionid    = $docp->nodeValue('sectionid', $node);
+                        $sectiontitle = $docp->nodeValue('title'    , $node);
+                        $sectionpath  = $docp->nodeValue('directory', $node);
+                        $sequence = array();
+                        //Get section stuff
+                        $section_file = $dir .
+                        DIRECTORY_SEPARATOR .
+                        $sectionpath .
+                        DIRECTORY_SEPARATOR .
+                                            'section.xml';
+                        if ($secp->load($section_file)) {
+                            $rawvalue = $secp->nodeValue('/section/sequence');
+                            if ($rawvalue != '$@NULL@$') {
+                                $sequence = explode(',', $rawvalue);
+                            }
+                        }
+                        $sections[$sectionid] = array($sectiontitle, $sequence);
+                    }
+                }
+                //organization title
+                $organization = new cc_organization();
+                //Add section/topic items
+                foreach ($sections as $sectionid => $values) {
+                    $item = new cc_item();
+                    $item->title = $values[0];
+                    self::process_sequence($item, $manifest, $values[1], $dir, $odir);
+                    $organization->add_item($item);
+                }
+                $manifest->put_nodes();
+            }
+
+            if (!empty($organization)) {
+                $manifest->add_new_organization($organization);
+            }
+
+            $manifestpath = $outdir.DIRECTORY_SEPARATOR.'imsmanifest.xml';
+            $manifest->saveTo($manifestpath);
+        }
+
+    }
+
+    /**
+    *
+    * Process the activites and create item structure
+    * @param cc_i_item $item
+    * @param array $sequence
+    * @param string $packageroot - directory path
+    * @throws DOMException
+    */
+    protected static function process_sequence(cc_i_item &$item, cc_i_manifest &$manifest, array $sequence, $packageroot, $outdir) {
+        $moodle_backup = $packageroot . DIRECTORY_SEPARATOR . 'moodle_backup.xml';
+        $doc = new XMLGenericDocument();
+        if(!$doc->load($moodle_backup)) {
+            return;
+        }
+        $activities = $doc->nodeList('/moodle_backup/information/contents/activities/activity');
+        if (!empty($activities)) {
+            $dpp = new XMLGenericDocument();
+            foreach ($activities as $activity) {
+                $moduleid = $doc->nodeValue('moduleid', $activity);
+                if (in_array($moduleid, $sequence)) {
+                    //detect activity type
+                    $directory = $doc->nodeValue('directory', $activity);
+                    $path = $packageroot . DIRECTORY_SEPARATOR . $directory;
+                    $module_file = $path . DIRECTORY_SEPARATOR . 'module.xml';
+                    if ($dpp->load($module_file)) {
+                        $activity_type = $dpp->nodeValue('/module/modulename');
+                        $activity_indentation = $dpp->nodeValue('/module/indent');
+                        $aitem = self::item_indenter($item, $activity_indentation);
+                        $caller = "cc_converter_{$activity_type}";
+                        if (class_exists($caller)) {
+                            $obj = new $caller($aitem, $manifest, $packageroot, $path);
+                            if ( !$obj->convert($outdir) ) {
+                                echo "failed to convert {$activity_type}".PHP_EOL;
+                            }
+                        } else {
+                            echo "skipped {$activity_type}".PHP_EOL;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    protected static function item_indenter(cc_i_item &$item, $level = 0) {
+        $indent = (int)$level;
+        $indent = ($indent) <= 0 ? 0 : $indent;
+        $nprev = null;
+        $nfirst = null;
+        for ($pos = 0, $size = $indent; $pos < $size; $pos++) {
+            $nitem = new cc_item();
+            $nitem->title = '';
+            if (empty($nfirst)) {
+                $nfirst = $nitem;
+            }
+            if (!empty($nprev)) {
+                $nprev->add_child_item($nitem);
+            }
+            $nprev = $nitem;
+        }
+        $result = $item;
+        if (!empty($nfirst)) {
+            $item->add_child_item($nfirst);
+            $result = $nprev;
+        }
+        return $result;
+    }
+
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/cc_converter_basiclti.php b/backup/cc/cc_lib/cc_converter_basiclti.php
new file mode 100644 (file)
index 0000000..49299c0
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_converters.php';
+require_once 'cc_general.php';
+require_once 'cc_basiclti.php';
+
+class cc_converter_basiclti extends cc_converter {
+
+    public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+        $this->cc_type     = cc_version11::basiclti;
+        $this->defaultfile = 'basiclti.xml';
+        $this->defaultname = basicltil1_resurce_file::deafultname;
+        parent::__construct($item, $manifest, $rootpath, $path);
+    }
+
+    public function convert($outdir) {
+        $rt = new basicltil1_resurce_file();
+        $title = $this->doc->nodeValue('/activity/basiclti/name');
+        $rt->set_title($title);
+        $rt->set_launch_url($this->doc->nodeValue('/activity/basiclti/toolurl'));
+        $rt->set_launch_icon('');
+        $rt->set_vendor_code($this->doc->nodeValue('/activity/basiclti/organizationid'));
+        $rt->set_vendor_description($this->doc->nodeValue('/activity/basiclti/organizationdescr'));
+        $rt->set_vendor_url($this->doc->nodeValue('/activity/basiclti/organizationurl'));
+        $this->store($rt, $outdir, $title);
+        return true;
+    }
+
+}
diff --git a/backup/cc/cc_lib/cc_converter_forum.php b/backup/cc/cc_lib/cc_converter_forum.php
new file mode 100644 (file)
index 0000000..9833756
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_converters.php';
+require_once 'cc_general.php';
+require_once 'cc_forum.php';
+
+class cc_converter_forum extends cc_converter {
+
+    public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+        $this->cc_type     = cc_version11::discussiontopic;
+        $this->defaultfile = 'forum.xml';
+        $this->defaultname = 'discussion.xml';
+        parent::__construct($item, $manifest, $rootpath, $path);
+    }
+
+    public function convert($outdir) {
+        $rt = new forum11_resurce_file();
+        $title = $this->doc->nodeValue('/activity/forum/name');
+        $rt->set_title($title);
+        $text = $this->doc->nodeValue('/activity/forum/intro');
+        $deps = null;
+        if (!empty($text)) {
+            $textformat = intval($this->doc->nodeValue('/activity/forum/introformat'));
+            $contextid = $this->doc->nodeValue('/activity/@contextid');
+            $result = cc_helpers::process_linked_files($text,
+                                                       $this->manifest,
+                                                       $this->rootpath,
+                                                       $contextid,
+                                                       $outdir);
+
+            $textformat = ($textformat == 1) ? 'text/html' : 'text/plain';
+            $rt->set_text($result[0], $textformat);
+            $deps = $result[1];
+        }
+
+        $this->store($rt, $outdir, $title, $deps);
+        return true;
+    }
+
+}
+
diff --git a/backup/cc/cc_lib/cc_converter_lti.php b/backup/cc/cc_lib/cc_converter_lti.php
new file mode 100644 (file)
index 0000000..1a2b681
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_converters.php';
+require_once 'cc_general.php';
+require_once 'cc_basiclti.php';
+
+class cc_converter_lti extends cc_converter {
+
+    public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+        $this->cc_type     = cc_version11::basiclti;
+        $this->defaultfile = 'lti.xml';
+        $this->defaultname = basicltil1_resurce_file::deafultname;
+        parent::__construct($item, $manifest, $rootpath, $path);
+    }
+
+    public function convert($outdir) {
+        $rt = new basicltil1_resurce_file();
+        $title = $this->doc->nodeValue('/activity/lti/name');
+        $rt->set_title($title);
+        $rt->set_description($this->doc->nodeValue('/activity/lti/intro'));
+        $rt->set_launch_url($this->doc->nodeValue('/activity/lti/toolurl'));
+        $rt->set_launch_icon('');
+        $this->store($rt, $outdir, $title);
+        return true;
+    }
+}
diff --git a/backup/cc/cc_lib/cc_converter_resource.php b/backup/cc/cc_lib/cc_converter_resource.php
new file mode 100644 (file)
index 0000000..6293c95
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_converters.php';
+require_once 'cc_general.php';
+
+class cc_converter_resource extends cc_converter {
+
+    public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+        $this->cc_type     = cc_version11::webcontent;
+        $this->defaultfile = 'resource.xml';
+        parent::__construct($item, $manifest, $rootpath, $path);
+    }
+
+    public function convert($outdir) {
+        $title = $this->doc->nodeValue('/activity/resource/name');
+        $contextid = $this->doc->nodeValue('/activity/@contextid');
+        $files = cc_helpers::handle_resource_content($this->manifest,
+                                                   $this->rootpath,
+                                                   $contextid,
+                                                   $outdir);
+        $deps = null;
+        $resvalue = null;
+        foreach ($files as $vfile => $values) {
+            if ($values[2]) {
+                $resvalue = $values[0];
+                break;
+            }
+        }
+
+        $resitem = new cc_item();
+        $resitem->identifierref = $resvalue;
+        $resitem->title = $title;
+        $this->item->add_child_item($resitem);
+
+        return true;
+    }
+
+}
+
diff --git a/backup/cc/cc_lib/cc_converter_url.php b/backup/cc/cc_lib/cc_converter_url.php
new file mode 100644 (file)
index 0000000..53b1eab
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_converters.php';
+require_once 'cc_general.php';
+require_once 'cc_weblink.php';
+
+class cc_converter_url extends cc_converter {
+
+    public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+        $this->cc_type     = cc_version11::weblink;
+        $this->defaultfile = 'url.xml';
+        $this->defaultname = 'weblink.xml';
+        parent::__construct($item, $manifest, $rootpath, $path);
+    }
+
+    public function convert($outdir) {
+        $rt = new url11_resurce_file();
+        $title = $this->doc->nodeValue('/activity/url/name');
+        $rt->set_title($title);
+        $url = $this->doc->nodeValue('/activity/url/externalurl');
+        if (!empty($url)) {
+            /**
+             *
+             * Display value choices
+             * 0 - automatic (system chooses what to do) (usualy defaults to the open)
+             * 1 - embed - display within a frame
+             * 5 - open - just open it full in the same frame
+             * 6 - in popup - popup - new frame
+             */
+            $display = intval($this->doc->nodeValue('/activity/forum/display'));
+            $target = ($display == 6) ? '_blank' : '_self';
+            //TODO: Moodle also supports custom parameters
+            //this should be transformed somehow into url where possible
+            $rt->set_url($url, $target);
+        }
+
+        $this->store($rt, $outdir, $title);
+        return true;
+    }
+
+}
+
diff --git a/backup/cc/cc_lib/cc_converters.php b/backup/cc/cc_lib/cc_converters.php
new file mode 100644 (file)
index 0000000..d531964
--- /dev/null
@@ -0,0 +1,129 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_interfaces.php';
+
+abstract class cc_converter {
+    /**
+     *
+     * Enter description here ...
+     * @var cc_item
+     */
+    protected $item     = null;
+    /**
+     *
+     * Enter description here ...
+     * @var cc_manifest
+     */
+    protected $manifest = null;
+    /**
+     *
+     * Enter description here ...
+     * @var string
+     */
+    protected $rootpath = null;
+    /**
+     *
+     * Enter description here ...
+     * @var string
+     */
+    protected $path     = null;
+    /**
+     *
+     * Enter description here ...
+     * @var string
+     */
+    protected $defaultfile = null;
+    /**
+     *
+     * Enter description here ...
+     * @var string
+     */
+    protected $defaultname = null;
+    /**
+     *
+     * Enter description here ...
+     * @var string
+     */
+    protected $cc_type = null;
+    /**
+     *
+     * Document
+     * @var XMLGenericDocument
+     */
+    protected $doc = null;
+
+    /**
+     *
+     * ctor
+     * @param  cc_i_item $item
+     * @param  cc_i_manifest $manifest
+     * @param  string $rootpath
+     * @param  string $path
+     * @throws InvalidArgumentException
+     */
+    public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+        $rpath = realpath($rootpath);
+        if (empty($rpath)) {
+            throw new InvalidArgumentException('Invalid path!');
+        }
+        $rpath2 = realpath($path);
+        if (empty($rpath)) {
+            throw new InvalidArgumentException('Invalid path!');
+        }
+        $doc = new XMLGenericDocument();
+        if (!$doc->load($path . DIRECTORY_SEPARATOR . $this->defaultfile)) {
+            throw new RuntimeException('File does not exist!');
+        }
+
+        $this->doc      = $doc;
+        $this->item     = $item;
+        $this->manifest = $manifest;
+        $this->rootpath = $rpath;
+        $this->path     = $rpath2;
+    }
+
+    /**
+     *
+     * performs conversion
+     * @param string $outdir - root directory of common cartridge
+     * @return boolean
+     */
+    abstract public function convert($outdir);
+
+    /**
+     *
+     * Stores any files that need to be stored
+     */
+    protected function store(general_cc_file $doc, $outdir, $title, $deps = null) {
+        $rdir = new cc_resource_location($outdir);
+        $rtp = $rdir->fullpath(true).$this->defaultname;
+        $doc->saveTo($rtp);
+        $resource = new cc_resource($rdir->rootdir(), $this->defaultname, $rdir->dirname(true));
+        $resource->dependency = empty($deps) ? array() : $deps;
+        $res = $this->manifest->add_resource($resource, null, $this->cc_type);
+        $resitem = new cc_item();
+        $resitem->attach_resource($res[0]);
+        $resitem->title = $title;
+        $this->item->add_child_item($resitem);
+    }
+}
diff --git a/backup/cc/cc_lib/cc_forum.php b/backup/cc/cc_lib/cc_forum.php
new file mode 100644 (file)
index 0000000..27ec08e
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_general.php';
+
+class forum1_resurce_file extends general_cc_file {
+    const deafultname = 'discussion.xml';
+
+    protected $rootns = 'dt';
+    protected $rootname = 'dt:topic';
+    protected $ccnamespaces = array('dt'  => 'http://www.imsglobal.org/xsd/imsdt_v1p0',
+                                    'xsi' => 'http://www.w3.org/2001/XMLSchema-instance');
+    protected $ccnsnames = array('dt' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_6/imsdt_v1p0_localised.xsd');
+
+    protected $title = null;
+    protected $text_type = 'text/plain';
+    protected $text = null;
+    protected $attachments = array();
+
+    public function set_title($title) {
+        $this->title = $title;
+    }
+
+    public function set_text($text, $type='text/plain') {
+        $this->text = $text;
+        $this->text_type = $type;
+    }
+
+    public function set_attachments(array $attachments) {
+        $this->attachments = $attachments;
+    }
+
+    protected function on_save() {
+        $this->append_new_element($this->root, 'title', $this->title);
+        $text = $this->append_new_element($this->root, 'text', $this->text);
+        $this->append_new_attribute($text, 'texttype', $this->text_type);
+        if (!empty($this->attachments)) {
+            $attachments = $this->append_new_element($this->root, 'attachments');
+            foreach ($this->attachments as $value) {
+                $att = $this->append_new_element($attachments, 'attachment');
+                $this->append_new_attribute($att, 'href', $value);
+            }
+        }
+        return true;
+    }
+
+}
+
+class forum11_resurce_file extends forum1_resurce_file {
+    protected $rootns = 'dt';
+    protected $rootname = 'topic';
+    protected $ccnamespaces = array('dt'  => 'http://www.imsglobal.org/xsd/imsccv1p1/imsdt_v1p1',
+                                    'xsi' => 'http://www.w3.org/2001/XMLSchema-instance');
+    protected $ccnsnames = array('dt' => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_imsdt_v1p1.xsd');
+
+    protected function on_save() {
+        $rns = $this->ccnamespaces[$this->rootns];
+        $this->append_new_element_ns($this->root, $rns, 'title', $this->title);
+        $text = $this->append_new_element_ns($this->root, $rns, 'text', $this->text);
+        $this->append_new_attribute_ns($text, $rns, 'texttype', $this->text_type);
+        if (!empty($this->attachments)) {
+            $attachments = $this->append_new_element_ns($this->root, $rns, 'attachments');
+            foreach ($this->attachments as $value) {
+                $att = $this->append_new_element_ns($attachments, $rns, 'attachment');
+                $this->append_new_attribute_ns($att, $rns, 'href', $value);
+            }
+        }
+        return true;
+    }
+
+}
+
+
+
diff --git a/backup/cc/cc_lib/cc_general.php b/backup/cc/cc_lib/cc_general.php
new file mode 100644 (file)
index 0000000..23ffd43
--- /dev/null
@@ -0,0 +1,71 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'gral_lib/cssparser.php';
+require_once 'xmlbase.php';
+
+class general_cc_file extends XMLGenericDocument {
+    /**
+     *
+     * Root element
+     * @var DOMElement
+     */
+    protected $root = null;
+    protected $rootns = null;
+    protected $rootname = null;
+    protected $ccnamespaces = array();
+    protected $ccnsnames = array();
+
+    public function __construct() {
+        parent::__construct();
+
+        foreach ($this->ccnamespaces as $key => $value){
+            $this->registerNS($key,$value);
+        }
+    }
+
+
+    protected function on_create() {
+        $rootel = $this->append_new_element_ns($this->doc,
+                                               $this->ccnamespaces[$this->rootns],
+                                               $this->rootname);
+        //add all namespaces
+        foreach ($this->ccnamespaces as $key => $value) {
+            $dummy_attr = "{$key}:dummy";
+            $this->doc->createAttributeNS($value,$dummy_attr);
+        }
+
+        // add location of schemas
+        $schemaLocation='';
+        foreach ($this->ccnsnames as $key => $value) {
+            $vt = empty($schemaLocation) ? '' : ' ';
+            $schemaLocation .= $vt.$this->ccnamespaces[$key].' '.$value;
+        }
+        $this->append_new_attribute_ns($rootel,
+                                       $this->ccnamespaces['xsi'],
+                                       'xsi:schemaLocation',
+                                        $schemaLocation);
+
+        $this->root = $rootel;
+    }
+
+}
diff --git a/backup/cc/cc_lib/cc_interfaces.php b/backup/cc/cc_lib/cc_interfaces.php
new file mode 100644 (file)
index 0000000..81feabd
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+/**
+ * CC Manifest Interface
+ */
+interface cc_i_manifest {
+
+    public function on_create ();
+    public function on_load ();
+    public function on_save ();
+    public function add_new_organization (cc_i_organization &$org);
+    public function get_resources ();
+    public function get_resource_list ();
+    public function add_resource (cc_i_resource $res, $identifier=null, $type='webcontent');
+    public function add_metadata_manifest(cc_i_metadata_manifest $met);
+    public function add_metadata_resource (cc_i_metadata_resource $met,$identifier);
+    public function add_metadata_file (cc_i_metadata_file $met,$identifier,$filename);
+    public function put_nodes ();
+
+}
+
+
+
+/**
+ * CC Organization Interface
+ */
+interface cc_i_organization {
+
+    public function add_item (cc_i_item &$item);
+    public function has_items ();
+    public function attr_value (&$nod, $name, $ns=null);
+    public function process_organization (&$node,&$doc);
+
+}
+
+
+
+/**
+ * CC Item Interface
+ */
+interface cc_i_item {
+
+    public function add_child_item (cc_i_item &$item);
+    public function attach_resource ($res);     // can be object or value
+    public function has_child_items ();
+    public function attr_value (&$nod, $name, $ns=null);
+    public function process_item (&$node,&$doc);
+
+}
+
+
+/**
+ * CC Resource Interface
+ */
+interface cc_i_resource {
+
+    public function get_attr_value (&$nod, $name, $ns=null);
+    public function add_resource ($fname, $location='');
+    public function import_resource (DOMElement &$node, cc_i_manifest &$doc);
+    public function process_resource ($manifestroot, &$fname,$folder);
+
+}
+
+
+
+/**
+ * CC Metadata Manifest Interface
+ */
+interface cc_i_metadata_manifest {
+
+    public function add_metadata_general($obj);
+    public function add_metadata_technical($obj);
+    public function add_metadata_rights($obj);
+    public function add_metadata_lifecycle($obj);
+
+}
+
+
+/**
+ * CC Metadata Resource Interface
+ */
+interface cc_i_metadata_resource {
+
+    public function add_metadata_resource_educational($obj);
+
+}
+
+/**
+ * CC Metadata File Interface
+ */
+interface cc_i_metadata_file {
+
+    public function add_metadata_file_educational($obj);
+
+}
+
diff --git a/backup/cc/cc_lib/cc_manifest.php b/backup/cc/cc_lib/cc_manifest.php
new file mode 100644 (file)
index 0000000..01dbb1f
--- /dev/null
@@ -0,0 +1,377 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+* Manifest management
+*
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+
+require_once 'cc_utils.php';
+require_once 'xmlbase.php';
+require_once 'cc_resources.php';
+require_once 'cc_version_base.php';
+require_once 'gral_lib/pathutils.php';
+
+
+/**
+ * Manifest Class
+ *
+ */
+class cc_manifest extends XMLGenericDocument implements cc_i_manifest {
+    private $ccversion              = null;
+    private $ccobj                  = null;
+    private $rootmanifest           = null;
+    private $activemanifest         = null;
+    private $parentmanifest         = null;
+    private $parentparentmanifest   = null;
+    private $ares                   = array();
+    private $mainidentifier         = null;
+
+    public function __construct($ccver = cc_version::v1,$activemanifest=null,
+                        $parentmanifest=null,$parentparentmanifest=null) {
+
+        if (is_int($ccver)){
+            $this->ccversion=$ccver;
+            $classname = "cc_version{$ccver}";
+            $this->ccobj = new $classname;
+            parent::__construct('UTF-8',true);
+        } else
+        if (is_object($ccver) && (get_class($ccver)=='cc_manifest')){
+            $this->doc = $ccver->doc;
+            $this->rootmanifest = $ccver->rootmanifest;
+            $this->activemanifest = $activemanifest;
+            $this->parentmanifest = $parentmanifest;
+            $this->parentparentmanifest = $parentparentmanifest;
+            $this->ccversion = $ccver->ccversion;
+            $this->ccobj = $ccver;
+            $this->register_namespaces_for_xpath();
+        }
+    }
+
+    public function __destruct() {
+        parent::__destruct();
+    }
+
+
+    /**
+     * Register Namespace for use XPATH
+     *
+     */
+    public function register_namespaces_for_xpath(){
+        $scnam = $this->activemanifest->get_cc_namespaces();
+        foreach ($scnam as $key => $value){
+            $this->registerNS($key,$value);
+        }
+    }
+
+    /**
+     * TODO - implement this method - critical
+     * Enter description here ...
+     */
+    private function fill_manifest() {
+
+    }
+
+    /**
+     * Add Metadata For Manifest
+     *
+     * @param cc_i_metadata_manifest $met
+     */
+    public function add_metadata_manifest (cc_i_metadata_manifest $met){
+        $metanode = $this->node("//imscc:manifest[@identifier='".
+                                $this->activemanifest->manifestID().
+                                "']/imscc:metadata");
+        $nmeta = $this->activemanifest->create_metadata_node($met,$this->doc,$metanode);
+        $metanode->appendChild($nmeta);
+    }
+
+
+    /**
+     * Add Metadata For Resource
+     *
+     * @param cc_i_metadata_resource $met
+     * @param string $identifier
+     */
+    public function add_metadata_resource (cc_i_metadata_resource $met,$identifier){
+       $metanode = $this->node("//imscc:resource".
+                     "[@identifier='".
+                     $identifier.
+                     "']");
+       $metanode2 = $this->node("//imscc:resource".
+                     "[@identifier='".
+                     $identifier.
+                     "']/imscc:file");
+       $dnode  = $this->doc->createElementNS($this->ccnamespaces['imscc'], "metadata");
+
+       $metanode->insertBefore($dnode,$metanode2);
+
+       $this->activemanifest->create_metadata_resource_node($met,$this->doc,$dnode);
+    }
+
+
+    /**
+     * Add Metadata For File
+     *
+     * @param cc_i_metadata_file $met
+     * @param string $identifier
+     * @param string $filename
+     */
+    public function add_metadata_file (cc_i_metadata_file $met,$identifier,$filename){
+
+        if (empty($met) || empty($identifier) || empty($filename)){
+            throw new Exception('Try to add a metadata file with nulls values given!');
+        }
+
+        $metanode = $this->node("//imscc:resource".
+                     "[@identifier='".
+                     $identifier.
+                     "']/imscc:file".
+                     "[@href='".
+                     $filename.
+                     "']");
+
+       $dnode  = $this->doc->createElementNS($this->ccnamespaces['imscc'], "metadata");
+
+       $metanode->appendChild($dnode);
+
+       $this->activemanifest->create_metadata_file_node($met,$this->doc,$dnode);
+    }
+
+
+    public function on_create (){
+        $this->activemanifest = cc_builder_creator::factory($this->ccversion);
+        $this->rootmanifest = $this->activemanifest;
+        $result = $this->activemanifest->create_manifest($this->doc);
+        $this->register_namespaces_for_xpath();
+        return $result;
+
+    }
+
+
+    public function get_relative_base_path() {return $this->activemanifest->base();}
+    public function parent_manifest () {return new cc_manifest($this,$this->parentmanifest,$this->parentparentmanifest);}
+    public function root_manifest   () {return new cc_manifest($this,$this->rootmanifest);}
+    public function manifestID     () {return $this->activemanifest->manifestID();}
+    public function get_manifest_namespaces() {return $this->rootmanifest->get_cc_namespaces(); }
+
+
+
+    /**
+     * Add a new organization
+     *
+     * @param cc_i_organization $org
+     */
+    public function add_new_organization(cc_i_organization &$org) {
+        $norg = $this->activemanifest->create_organization_node($org,$this->doc);
+        $orgnode = $this->node("//imscc:manifest[@identifier='".
+                                $this->activemanifest->manifestID().
+                                "']/imscc:organizations");
+        $orgnode->appendChild($norg);
+    }
+
+
+
+    public function get_resources($searchspecific='') {
+        $reslist = $this->get_resource_list($searchspecific);
+        $resourcelist = array();
+        foreach ($reslist as $resourceitem) {
+            $resourcelist[]=new cc_resource($this, $resourceitem);
+        }
+        return $resourcelist;
+    }
+
+
+
+    public function get_cc_namespace_path($nsname) {
+        if (is_string($nsname) && (!empty($nsname))){
+            $scnam = $this->activemanifest->get_cc_namespaces();
+            return $scnam[$nsname];
+        }
+        return null;
+    }
+
+
+    public function get_resource_list($searchspecific=''){
+        return $this->nodeList("//imscc:manifest[@identifier='".
+                            $this->activemanifest->manifestID().
+                            "']/imscc:resources/imscc:resource".$searchspecific);
+    }
+
+
+    public function on_load (){
+        $this->register_namespaces_for_xpath();
+        $this->fill_manifest();
+        return true;
+    }
+
+    public function on_save (){
+        return true;
+    }
+
+
+    /**
+     * Add a resource to the manifest
+     *
+     * @param cc_i_resource $res
+     * @param string $identifier
+     * @param string $type
+     * @return array
+     */
+    public function add_resource (cc_i_resource $res, $identifier=null, $type='webcontent'){
+
+        if (!$this->ccobj->valid($type)){
+             throw new Exception("Type invalid...");
+        }
+
+        if (is_null($res)){
+            throw new Exception('Invalid Resource or dont give it');
+        }
+        $rst = null;
+
+        if (is_string($res)){
+            $rst = new cc_resource($this->filePath(), $res);
+            if (is_string($identifier)){
+                $rst->identifier = $identifier;
+            }
+        } else {
+            $rst = $res;
+        }
+
+        //TODO: This has to be reviewed since it does not handle properly mutiple file
+        //      dependencies
+        if (is_object($identifier)) {
+            $this->activemanifest->create_resource_node($rst,$this->doc,$identifier);
+        } else {
+            $nresnode   = null;
+
+            $rst->type = $type;
+            if (!cc_helpers::is_html($rst->filename)) {
+                $rst->href = null;
+            }
+            $this->activemanifest->create_resource_node($rst,$this->doc,$nresnode);
+
+
+            for ($i = 1 ; $i < count ($rst->files); $i++){
+                $ident = $this->get_identifier_by_filename($rst->files[$i]);
+                if(empty($ident)){
+                    $newres = new cc_resource($rst->manifestroot,$rst->files[$i],false);
+                    if (!empty($newres)) {
+                        if (!cc_helpers::is_html($rst->files[$i])) {
+                             $newres->href = null;
+                        }
+                        $newres->type = 'webcontent';
+                        $this->activemanifest->create_resource_node($newres,$this->doc,$nresnode);
+                    }
+                }
+
+            }
+            foreach ($this->activemanifest->resources as $k => $v){
+                ($k);
+                $depen = $this->check_if_exist_in_other($v->files[0]);
+                if (!empty($depen)){
+                    $this->replace_file_x_dependency($depen,$v->files[0]);
+                    // coloca aca como type = webcontent porque son archivos dependientes
+                    // quizas aqui habria q ver de que type es el que vino y segun eso, ponerlo
+                    // en associatedcontent o en webcontent
+                    $v->type = 'webcontent';
+                }
+            }
+        }
+
+        $tmparray = array($rst->identifier,$rst->files[0]);
+        return $tmparray;
+    }
+
+
+
+    private function check_if_exist_in_other($name){
+        $status = array();
+        foreach ($this->activemanifest->resources as $key => $value){
+            ($key);
+            for ($i=1; $i< count($value->files); $i++){
+                if ($name == $value->files[$i]){
+                    array_push($status,$value->identifier);
+                }
+            }
+        }
+        return $status;
+    }
+
+
+    private function replace_file_x_dependency($depen,$name){
+        foreach ($depen as $key => $value){
+            ($key);
+            $ident = $this->get_identifier_by_filename($name);
+            $this->activemanifest->resources[$value]->files =
+                $this->array_remove_by_value($this->activemanifest->resources[$value]->files,$name);
+            if (!in_array($ident,$this->activemanifest->resources[$value]->dependency)){
+                array_push($this->activemanifest->resources[$value]->dependency,$ident);
+            }
+
+        }
+        return true;
+    }
+
+
+    private function get_identifier_by_filename($name){
+        $result = null;
+        foreach ($this->activemanifest->resources as $key => $value) {
+                if ($name == $value->files[0]){
+                    $result = $key;
+                    break;
+                }
+        }
+        return $result;
+    }
+
+
+
+    private function array_remove_by_value($arr,$value) {
+        return array_values(array_diff($arr,array($value)));
+
+    }
+
+    private function array_remove_by_key($arr,$key) {
+        return array_values(array_diff_key($arr,array($key)));
+
+    }
+
+
+    /**
+     * Append the resources nodes in the Manifest
+     *
+     * @return DOMNode
+     */
+    public function put_nodes (){
+
+        $resnodestr = "//imscc:manifest[@identifier='".$this->activemanifest->manifestID().
+                          "']/imscc:resources";
+        $resnode    = $this->node($resnodestr);
+
+        foreach ($this->activemanifest->resources as $key => $node) {
+            ($key);
+            $resnode->appendChild($this->activemanifest->create_resource_node($node,$this->doc,null));
+        }
+        return $resnode;
+
+    }
+}
+
+
diff --git a/backup/cc/cc_lib/cc_metadata.php b/backup/cc/cc_lib/cc_metadata.php
new file mode 100644 (file)
index 0000000..6020b90
--- /dev/null
@@ -0,0 +1,236 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+
+
+ /**
+   Defined as specified in CC 1.1
+ */
+class intended_user_role {
+    const LEARNER               = 'Learner';
+    const INSTRUCTOR            = 'Instructor';
+    const MENTOR                = 'Mentor';
+}
+
+class technical_role {
+    const AUTHOR                = 'author';
+    const PUBLISHER             = 'publisher';
+    const UNKNOWN               = 'unknown';
+    const INITIATOR             = 'initiator';
+    const TERMINATOR            = 'terminator';
+    const VALIDATOR             = 'validator';
+    const EDITOR                = 'editor';
+    const GRAPHICAL_DESIGNER    = 'graphical designer';
+    const TECHNICAL_IMPLEMENTER = 'technical implementer';
+    const CONTENT_PROVIDER      = 'content provider';
+    const TECHNICAL_VALIDATOR   = 'technical validator';
+    const EDUCATION_VALIDATOR   = 'educational validator';
+    const SCRIPT_WRITER         = 'script writer';
+    const INSTRUCTIONAL_DESIGNER= 'instructional designer';
+    const SUBJET_MATTER_EXPERT  = 'subject matter expert';
+}
+
+
+class rights_copyright {
+    const   YES                  = 'yes';
+    const   NO                   = 'no';
+}
+
+
+class rights_cost {
+    const   YES                  = 'yes';
+    const   NO                   = 'no';
+}
+
+
+// Language identifier (as defined in ISO 639-1, ISO 639-2, and ISO 3166-1)
+class language_lom {
+    const   US_ENGLISH           = 'en-US';
+    const   GB_ENGLISH           = 'en-GB';
+    const   AR_SPANISH           = 'es-AR';
+    const   GR_GREEK             = 'el-GR';
+
+}
+
+
+
+/**
+ * Metadata Manifest
+ *
+ */
+class cc_metadata_manifest implements cc_i_metadata_manifest {
+
+
+    public  $arraygeneral   = array();
+    public  $arraytech      = array();
+    public  $arrayrights    = array();
+    public  $arraylifecycle = array();
+
+
+    public function add_metadata_general($obj){
+        if (empty($obj)){
+            throw new Exception('Medatada Object given is invalid or null!');
+        }
+        !is_null($obj->title)? $this->arraygeneral['title']=$obj->title:null;
+        !is_null($obj->language)? $this->arraygeneral['language']=$obj->language:null;
+        !is_null($obj->description)? $this->arraygeneral['description']=$obj->description:null;
+        !is_null($obj->keyword)? $this->arraygeneral['keyword']=$obj->keyword:null;
+        !is_null($obj->coverage)? $this->arraygeneral['coverage']=$obj->coverage:null;
+        !is_null($obj->catalog)? $this->arraygeneral['catalog']=$obj->catalog:null;
+        !is_null($obj->entry)? $this->arraygeneral['entry']=$obj->entry:null;
+    }
+
+    public function add_metadata_technical($obj){
+        if (empty($obj)){
+            throw new Exception('Medatada Object given is invalid or null!');
+        }
+        !is_null($obj->format)? $this->arraytech['format']=$obj->format:null;
+    }
+
+
+    public function add_metadata_rights($obj){
+        if (empty($obj)){
+            throw new Exception('Medatada Object given is invalid or null!');
+        }
+        !is_null($obj->copyright)? $this->arrayrights['copyrightAndOtherRestrictions']=$obj->copyright:null;
+        !is_null($obj->description)? $this->arrayrights['description']=$obj->description:null;
+        !is_null($obj->cost)? $this->arrayrights['cost']=$obj->cost:null;
+
+    }
+
+
+    public function add_metadata_lifecycle($obj){
+        if (empty($obj)){
+            throw new Exception('Medatada Object given is invalid or null!');
+        }
+        !is_null($obj->role)? $this->arraylifecycle['role']=$obj->role:null;
+        !is_null($obj->entity)? $this->arraylifecycle['entity']=$obj->entity:null;
+        !is_null($obj->date)? $this->arraylifecycle['date']=$obj->date:null;
+
+    }
+
+}
+
+
+/**
+ * Metadata Lifecycle Type
+ *
+ */
+class cc_metadata_lifecycle{
+
+    public $role             = array();
+    public $entity           = array();
+    public $date             = array();
+
+    public function set_role($role){
+        $this->role[] = array($role);
+    }
+    public function set_entity($entity){
+        $this->entity[] = array($entity);
+    }
+    public function set_date($date){
+        $this->date[] = array($date);
+    }
+
+
+}
+
+/**
+ * Metadata Rights Type
+ *
+ */
+class cc_metadata_rights {
+
+    public $copyright        = array();
+    public $description      = array();
+    public $cost             = array();
+
+    public function set_copyright($copy){
+        $this->copyright[] = array($copy);
+    }
+    public function set_description ($des,$language){
+        $this->description[] = array($language,$des);
+    }
+    public function set_cost($cost){
+        $this->cost[] = array($cost);
+    }
+
+}
+
+
+/**
+ * Metadata Technical Type
+ *
+ */
+class cc_metadata_technical {
+
+    public  $format         = array();
+
+
+    public function set_format($format){
+        $this->format[] = array($format);
+    }
+
+}
+
+
+/**
+ * Metadata General Type
+ *
+ */
+class cc_metadata_general {
+
+    public  $title          = array();
+    public  $language       = array();
+    public  $description    = array();
+    public  $keyword        = array();
+    public  $coverage       = array();
+    public  $catalog        = array();
+    public  $entry          = array();
+
+
+
+    public function set_coverage ($coverage,$language){
+        $this->coverage[] = array($language,$coverage);
+    }
+    public function set_description ($description,$language){
+        $this->description[] = array($language,$description);
+    }
+    public function set_keyword ($keyword,$language){
+        $this->keyword[] = array($language,$keyword);
+    }
+    public function set_language ($language){
+        $this->language[] = array($language);
+    }
+    public function set_title ($title,$language){
+        $this->title[] = array($language,$title);
+    }
+    public function set_catalog ($cat){
+        $this->catalog[] = array($cat);
+    }
+    public function set_entry ($entry){
+        $this->entry[] = array($entry);
+    }
+
+
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/cc_metadata_file.php b/backup/cc/cc_lib/cc_metadata_file.php
new file mode 100644 (file)
index 0000000..525a32b
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* Metadata management
+*
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+
+/**
+ * Metadata File Education Type
+ *
+ */
+class cc_metadata_file_educational{
+
+    public $value   = array();
+
+    public function set_value ($value){
+        $arr = array($value);
+        $this->value[] = $arr;
+    }
+
+}
+
+/**
+ * Metadata File
+ *
+ */
+class cc_metadata_file implements cc_i_metadata_file {
+
+    public $arrayeducational  = array();
+
+    public function add_metadata_file_educational($obj){
+        if (empty($obj)){
+            throw new Exception('Medatada Object given is invalid or null!');
+        }
+         !is_null($obj->value)? $this->arrayeducational['value']=$obj->value:null;
+    }
+
+
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/cc_metadata_resource.php b/backup/cc/cc_lib/cc_metadata_resource.php
new file mode 100644 (file)
index 0000000..b575bef
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* Metadata managing
+*
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+
+
+/**
+ * Metadata Resource Educational Type
+ *
+ */
+class cc_metadata_resouce_educational{
+
+    public $value   = array();
+
+
+    public function set_value ($value){
+        $arr = array($value);
+        $this->value[] = $arr;
+    }
+
+}
+
+/**
+ * Metadata Resource
+ *
+ */
+class cc_metadata_resouce implements cc_i_metadata_resource {
+
+    public $arrayeducational  = array();
+
+    public function add_metadata_resource_educational($obj){
+        if (empty($obj)){
+            throw new Exception('Medatada Object given is invalid or null!');
+        }
+         !is_null($obj->value)? $this->arrayeducational['value']=$obj->value:null;
+    }
+
+
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/cc_organization.php b/backup/cc/cc_lib/cc_organization.php
new file mode 100644 (file)
index 0000000..3720f01
--- /dev/null
@@ -0,0 +1,278 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_utils.php';
+require_once 'cc_version_base.php';
+require_once 'cc_resources.php';
+require_once 'cc_manifest.php';
+
+
+/**
+ * Organization Class
+ *
+ */
+
+class cc_organization implements cc_i_organization {
+
+
+    public   $title         = null;
+    public   $identifier    = null;
+    public   $structure     = null;
+    public   $itemlist      = null;
+    private  $metadata      = null;
+    private  $sequencing    = null;
+
+
+
+    public function __construct($node=null, $doc=null) {
+        if (is_object($node) && is_object($doc)) {
+            $this->process_organization($node,$doc);
+        } else {
+            $this->init_new();
+        }
+    }
+
+    /**
+     * Add one Item into the Organization
+     *
+     * @param cc_i_item $item
+     */
+    public function add_item(cc_i_item &$item) {
+        if (is_null($this->itemlist)) {
+            $this->itemlist = array();
+        }
+        $this->itemlist[$item->identifier] = $item;
+    }
+
+    /**
+     * Add new Item into the Organization
+     *
+     * @param string $title
+     * @return cc_i_item
+     */
+    public function add_new_item($title='') {
+        $nitem = new cc_item();
+        $nitem->title = $title;
+        $this->add_item($nitem);
+        return $nitem;
+    }
+
+
+    public function has_items() {
+        return is_array($this->itemlist) && (count($this->itemlist) > 0);
+    }
+
+    public function attr_value(&$nod, $name, $ns=null) {
+      return is_null($ns) ?
+             ($nod->hasAttribute($name) ? $nod->getAttribute($name) : null) :
+             ($nod->hasAttributeNS($ns, $name) ? $nod->getAttributeNS($ns, $name) : null);
+    }
+
+
+    public function process_organization(&$node,&$doc) {
+        $this->identifier   = $this->attr_value($node,"identifier");
+        $this->structure    = $this->attr_value($node,"structure");
+        $this->title        = '';
+        $nlist              = $node->getElementsByTagName('title');
+        if (is_object($nlist) && ($nlist->length > 0) ) {
+            $this->title = $nlist->item(0)->nodeValue;
+        }
+        $nlist = $doc->nodeList("//imscc:organization[@identifier='".$this->identifier."']/imscc:item");
+        $this->itemlist=array();
+        foreach ($nlist as $item) {
+            $this->itemlist[$item->getAttribute("identifier")] = new cc_item($item,$doc);
+        }
+        $this->isempty=false;
+    }
+
+    public function init_new() {
+        $this->title        = null;
+        $this->identifier   = cc_helpers::uuidgen('O_');
+        $this->structure    = 'rooted-hierarchy';
+        $this->itemlist     = null;
+        $this->metadata     = null;
+        $this->sequencing   = null;
+
+    }
+
+    public function uuidgen() {
+        $uuid = sprintf('%04x%04x', mt_rand(0, 65535), mt_rand(0, 65535));
+        return strtoupper(trim($uuid));
+    }
+
+
+}
+
+
+/**
+ * Item Class
+ *
+ */
+class cc_item implements cc_i_item  {
+
+
+    public  $identifier     = null;
+    public  $identifierref  = null;
+    public  $isvisible      = null;
+    public  $title          = null;
+    public  $parameters     = null;
+    public  $childitems     = null;
+    private $parentItem     = null;
+    private $isempty        = true;
+
+
+
+    public function __construct($node=null,$doc=null) {
+        if (is_object($node)) {
+            $clname = get_class($node);
+            if ($clname =='cc_resource') {
+                $this->init_new_item();
+                $this->identifierref = $node->identifier;
+                $this->title = is_string($doc) && (!empty($doc)) ? $doc : 'item';
+            } else if ($clname =='cc_manifest') {
+                $this->init_new_item();
+                $this->identifierref = $node->manifestID();
+                $this->title = is_string($doc) && (!empty($doc)) ? $doc : 'item';
+            } else if ( is_object($doc)){
+                $this->process_item($node,$doc);
+            } else {
+                $this->init_new_item();
+            }
+        } else {
+            $this->init_new_item();
+        }
+    }
+
+
+
+    public function attr_value(&$nod, $name, $ns=null) {
+      return is_null($ns) ?
+             ($nod->hasAttribute($name) ? $nod->getAttribute($name) : null) :
+             ($nod->hasAttributeNS($ns, $name) ? $nod->getAttributeNS($ns, $name) : null);
+    }
+
+
+    public function process_item(&$node,&$doc) {
+        $this->identifier       = $this->attr_value($node,"identifier");
+        $this->structure        = $this->attr_value($node,"structure");
+        $this->identifierref    = $this->attr_value($node,"identifierref");
+        $atr = $this->attr_value($node,"isvisible");
+        $this->isvisible = is_null($atr) ? true : $atr;
+        $nlist = $node->getElementsByTagName('title');
+        if (is_object($nlist) && ($nlist->length > 0) ) {
+            $this->title = $nlist->item(0)->nodeValue;
+        }
+        $nlist = $doc->nodeList("//imscc:item[@identifier='".$this->identifier."']/imscc:item");
+        if ($nlist->length > 0) {
+            $this->childitems=array();
+            foreach ($nlist as $item) {
+                $key=$this->attr_value($item,"identifier");
+                $this->childitems[$key] = new cc_item($item,$doc);
+            }
+        }
+        $this->isempty = false;
+    }
+
+    /**
+     * Add one Child Item
+     *
+     * @param cc_i_item $item
+     */
+    public function add_child_item(cc_i_item &$item) {
+        if (is_null($this->childitems)) {
+            $this->childitems = array();
+        }
+        $this->childitems[$item->identifier] = $item;
+    }
+
+
+    /**
+     * Add new child Item
+     *
+     * @param string $title
+     * @return cc_i_item
+     */
+    public function add_new_child_item($title='') {
+        $sc         = new cc_item();
+        $sc->title  = $title;
+        $this->add_child_item($sc);
+        return $sc;
+    }
+
+
+
+    public function attach_resource($resource) {
+
+        if ($this->has_child_items()) {
+            throw new Exception("Can not attach resource to item that contains other items!");
+        }
+        $resident = null;
+        if (is_string($resource)) {
+            $resident = $resource;
+        } else if (is_object($resource)) {
+            $clname = get_class($resource);
+            if ($clname == 'cc_resource') {
+                $resident = $resource->identifier;
+            } else
+            if ($clname == 'cc_manifest') {
+                $resident = $resource->manifestID();
+            } else {
+                throw new Exception("Unable to attach resource. Invalid object.");
+            }
+        }
+        if (is_null($resident) || (empty($resident))) {
+            throw new Exception("Resource must have valid identifier!");
+        }
+        $this->identifierref = $resident;
+    }
+
+    public function has_child_items() {
+        return is_array($this->childitems) && (count($this->childitems) > 0);
+    }
+
+    public function child_item($identifier) {
+        return $this->has_child_items() ? $this->childitems[$identifier] : null;
+    }
+
+
+    public function init_clean() {
+            $this->identifier   = null;
+            $this->isvisible    = null;
+            $this->title        = null;
+            $this->parameters   = null;
+            $this->childitems   = null;
+            $this->parentItem   = null;
+            $this->isempty      = true;
+    }
+
+    public function init_new_item() {
+            $this->identifier   = cc_helpers::uuidgen('I_');
+            $this->isvisible    = true; //default is true
+            $this->title        = null;
+            $this->parameters   = null;
+            $this->childitems   = null;
+            $this->parentItem   = null;
+            $this->isempty      = false;
+    }
+
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/cc_resources.php b/backup/cc/cc_lib/cc_resources.php
new file mode 100644 (file)
index 0000000..43b9ac6
--- /dev/null
@@ -0,0 +1,244 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_interfaces.php';
+require_once 'xmlbase.php';
+require_once 'gral_lib/pathutils.php';
+require_once 'gral_lib/ccdependencyparser.php';
+require_once 'cc_version_base.php';
+require_once 'cc_version1.php';
+require_once 'cc_manifest.php';
+
+/**
+ * Common Cartridge Version
+ *
+ */
+class cc_version{
+  const v1  = 1;
+  const v11 = 11;
+}
+
+
+class cc1_resource_type {
+    const   webcontent          = 'webcontent';
+    const   questionbank        = 'imsqti_xmlv1p2/imscc_xmlv1p0/question-bank';
+    const   assessment          = 'imsqti_xmlv1p2/imscc_xmlv1p0/assessment';
+    const   associatedcontent   = 'associatedcontent/imscc_xmlv1p0/learning-application-resource';
+    const   discussiontopic     = 'imsdt_xmlv1p0';
+    const   weblink             = 'imswl_xmlv1p0';
+
+    public static $checker = array(self::webcontent,
+                                    self::assessment,
+                                    self::associatedcontent,
+                                    self::discussiontopic,
+                                    self::questionbank,
+                                    self::weblink);
+
+}
+
+class cc11_resource_type {
+    const webcontent         = 'webcontent';
+    const questionbank       = 'imsqti_xmlv1p2/imscc_xmlv1p1/question-bank';
+    const assessment         = 'imsqti_xmlv1p2/imscc_xmlv1p1/assessment';
+    const associatedcontent  = 'associatedcontent/imscc_xmlv1p1/learning-application-resource';
+    const discussiontopic    = 'imsdt_xmlv1p1';
+    const weblink            = 'imswl_xmlv1p1';
+    const basiclti           = 'imsbasiclti_xmlv1p0';
+
+    public static $checker = array(self::webcontent,
+                                    self::assessment,
+                                    self::associatedcontent,
+                                    self::discussiontopic,
+                                    self::questionbank,
+                                    self::weblink,
+                                    self::basiclti);
+
+}
+
+
+/**
+ * Resource Class
+ *
+ */
+class cc_resource implements cc_i_resource {
+
+    public  $identifier     = null;
+    public  $type           = null;
+    public  $dependency     = array();
+    public  $identifierref  = null;
+    public  $href           = null;
+    public  $base           = null;
+    public  $persiststate   = null;
+    public  $filename       = null;
+    public  $files          = array();
+    public  $isempty        = null;
+    public  $manifestroot   = null;
+    public  $folder         = null;
+
+    private $throwonerror   = true;
+
+    public function __construct($manifest, $file, $folder='', $throwonerror = true) {
+        $this->throwonerror = $throwonerror;
+        if (is_string($manifest)) {
+            $this->folder = $folder;
+            $this->process_resource($manifest, $file,$folder);
+            $this->manifestroot = $manifest;
+        } else if (is_object($manifest)) {
+            $this->import_resource($file,$manifest.$folder);
+        }
+    }
+
+    /**
+     * Add resource
+     *
+     * @param string $fname
+     * @param string $location
+     */
+    public function add_resource ($fname, $location =''){
+        $this->process_resource($fname,$location);
+
+    }
+
+
+    /**
+     * Import a resource
+     *
+     * @param DOMElement $node
+     * @param cc_i_manifest $doc
+     */
+    public function import_resource(DOMElement &$node, cc_i_manifest &$doc) {
+
+        $searchstr = "//imscc:manifest[@identifier='".$doc->manifestID().
+                     "']/imscc:resources/imscc:resource";
+        $this->identifier   = $this->get_attr_value($node,"identifier");
+        $this->type         = $this->get_attr_value($node,"type");
+        $this->href         = $this->get_attr_value($node,"href");
+        $this->base         = $this->get_attr_value($node,"base");
+        $this->persiststate = null;
+        $nodo               = $doc->nodeList($searchstr."[@identifier='".
+                              $this->identifier."']/metadata/@href");
+        $this->metadata     = $nodo->nodeValue;
+        $this->filename     = $this->href;
+        $nlist              = $doc->nodeList($searchstr."[@identifier='".
+                              $this->identifier."']/imscc:file/@href");
+        $this->files        = array();
+        foreach ($nlist as $file) {
+            $this->files[]  = $file->nodeValue;
+        }
+        $nlist              = $doc->nodeList($searchstr."[@identifier='".
+                              $this->identifier."']/imscc:dependency/@identifierref");
+        $this->dependency   = array();
+        foreach ($nlist as $dependency) {
+            $this->dependency[]  = $dependency->nodeValue;
+        }
+        $this->isempty      = false;
+    }
+
+
+    /**
+     * Get a attribute value
+     *
+     * @param DOMElement $nod
+     * @param string $name
+     * @param string $ns
+     * @return string
+     */
+    public function get_attr_value(&$nod, $name, $ns=null) {
+      return is_null($ns) ?
+             ($nod->hasAttribute($name) ? $nod->getAttribute($name) : null) :
+             ($nod->hasAttributeNS($ns, $name) ? $nod->getAttributeNS($ns, $name) : null);
+    }
+
+
+    /**
+     * Process a resource
+     *
+     * @param string $manifestroot
+     * @param string $fname
+     * @param string $folder
+     */
+    public function process_resource($manifestroot, &$fname, $folder) {
+        $file = empty($folder) ? $manifestroot.'/'.$fname : $manifestroot.'/'.$folder.'/'.$fname;
+        if (!file_exists($file) && $this->throwonerror){
+            throw new Exception('The file doesnt exist!');
+        }
+
+        //TODO: ver el tema de fpatch con el tema de unix y windows
+        //$fpathtocheck = $this->adjust_path($manifestroot,$fname);
+        //!empty($fpathtocheck) &&
+        if (GetDepFiles($manifestroot, $fname, $this->folder, $this->files)) {
+            array_unshift($this->files,$folder.$fname);
+            $this->init_empty_new();
+            $this->href             = $folder.$fname;
+            $this->identifierref    = $folder.$fname;
+            $this->filename         = $fname;
+            $this->isempty          = false;
+            $this->folder           = $folder;
+        } else {
+            $this->init_clean();
+        }
+    }
+
+    public function adjust_path($mroot, $fname) {
+        $result = null;
+        if (file_exists($fname->filename)) {
+            $result = pathDiff($fname->filename,$mroot);
+
+        } else if (file_exists($mroot.$fname->filename) || file_exists($mroot.DIRECTORY_SEPARATOR.$fname->filename)) {
+            $result = trim(toUrlPath($fname->filename),"/");
+        }
+        return $result;
+    }
+
+
+
+    public function init_clean() {
+        $this->identifier       =   null;
+        $this->type             =   null;
+        $this->href             =   null;
+        $this->base             =   null;
+        $this->metadata         =   array();
+        $this->dependency       =   array();
+        $this->identifierref    =   null;
+        $this->persiststate     =   null;
+        $this->filename         =   '';
+        $this->files            =   array();
+        $this->isempty          =   true;
+    }
+
+
+    public function init_empty_new() {
+        $this->identifier       =   cc_helpers::uuidgen('I_', '_R');
+        $this->type             =   null;
+        $this->href             =   null;
+        $this->persiststate     =   null;
+        $this->filename         =   null;
+        $this->isempty          =   false;
+        $this->identifierref    =   null;
+    }
+
+    public function get_manifestroot(){
+        return $this->manifestroot;
+    }
+
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/cc_utils.php b/backup/cc/cc_lib/cc_utils.php
new file mode 100644 (file)
index 0000000..40fda06
--- /dev/null
@@ -0,0 +1,383 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'xmlbase.php';
+
+/**
+ *
+ * Various helper utils
+ * @author Darko Miletic dmiletic@moodlerooms.com
+ *
+ */
+abstract class cc_helpers {
+
+    /**
+     *
+     * Checks extension of the supplied filename
+     * @param string $filename
+     */
+    public static function is_html($filename) {
+        $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
+        return in_array($extension, array('htm', 'html'));
+    }
+
+    /**
+     *
+     * Generates unique identifier
+     * @param string $prefix
+     * @param string $suffix
+     * @return string
+     */
+    public static function uuidgen($prefix = '', $suffix = '', $uppercase = true) {
+        $uuid = trim(sprintf('%s%04x%04x%s', $prefix, mt_rand(0, 65535), mt_rand(0, 65535), $suffix));
+        $result = $uppercase ? strtoupper($uuid) : strtolower($uuid) ;
+        return $result;
+    }
+
+    /**
+     *
+     * Creates new folder with random name
+     * @param string $where
+     * @param string $prefix
+     * @param string $suffix
+     * @return mixed - directory short name or false in case of faliure
+     */
+    public static function randomdir($where, $prefix = '', $suffix = '') {
+        $dirname    = false;
+        $randomname = self::uuidgen($prefix, $suffix, false);
+        $newdirname = $where.DIRECTORY_SEPARATOR.$randomname;
+        if (mkdir($newdirname)) {
+            chmod($newdirname, 0755);
+            $dirname = $randomname;
+        }
+        return $dirname;
+    }
+
+    /**
+     *
+     * Get list of embedded files
+     * @param string $html
+     * @return multitype:mixed
+     */
+    public static function embedded_files($html) {
+        $result = array();
+        $doc = new XMLGenericDocument();
+        if ($doc->loadHTML($html)) {
+            $list = $doc->nodeList("//img[starts-with(@src,'@@PLUGINFILE@@')]/@src");
+            foreach ($list as $filelink) {
+                $result[] = str_replace('@@PLUGINFILE@@', '', $filelink->nodeValue);
+            }
+        }
+        return $result;
+    }
+
+    public static function embedded_mapping($packageroot, $contextid = null) {
+        $main_file = $packageroot . DIRECTORY_SEPARATOR . 'files.xml';
+        $mfile = new XMLGenericDocument();
+        if (!$mfile->load($main_file)) {
+            return false;
+        }
+        $query = "/files/file[filename!='.']";
+        if (!empty($contextid)) {
+            $query .= "[contextid='{$contextid}']";
+        }
+        $files = $mfile->nodeList($query);
+        $depfiles = array();
+        foreach ($files as $node) {
+            $mainfile   = intval($mfile->nodeValue('sortorder', $node));
+            $filename   = $mfile->nodeValue('filename', $node);
+            $filepath   = $mfile->nodeValue('filepath', $node);
+            $source     = $mfile->nodeValue('source', $node);
+            $author     = $mfile->nodeValue('author', $node);
+            $license    = $mfile->nodeValue('license', $node);
+            $hashedname = $mfile->nodeValue('contenthash', $node);
+            $hashpart   = substr($hashedname, 0, 2);
+            $location   = 'files'.DIRECTORY_SEPARATOR.$hashpart.DIRECTORY_SEPARATOR.$hashedname;
+            $type       = $mfile->nodeValue('mimetype', $node);
+            $depfiles[$filepath.$filename] = array( $location,
+                                                    ($mainfile == 1),
+                                                    strtolower(str_replace(' ', '_',$filename)),
+                                                    $type,
+                                                    $source,
+                                                    $author,
+                                                    $license,
+                                                    strtolower(str_replace(' ', '_',$filepath)));
+        }
+
+        return $depfiles;
+    }
+
+    public static function add_files(cc_i_manifest &$manifest, $packageroot, $outdir, $allinone = true) {
+        if (pkg_static_resources::instance()->finished) {
+            return;
+        }
+        $files = cc_helpers::embedded_mapping($packageroot);
+        $rdir = $allinone ? new cc_resource_location($outdir) : null;
+        foreach ($files as $virtual => $values) {
+            $clean_filename = $values[2];
+            if (!$allinone) {
+                $rdir = new cc_resource_location($outdir);
+            }
+            $rtp = $rdir->fullpath(true).$clean_filename;
+            //Are there any relative virtual directories?
+            //let us try to recreate them
+            $justdir = $rdir->fullpath(true).$values[7];
+            if (!file_exists($justdir)) {
+                if (!mkdir($justdir, 0777, true)) {
+                    throw new RuntimeException('Unable to create directories!');
+                }
+            }
+
+            $source = $packageroot.DIRECTORY_SEPARATOR.$values[0];
+            if (!copy($source, $rtp)) {
+                throw new RuntimeException('Unable to copy files!');
+            }
+            $resource = new cc_resource($rdir->rootdir(), $clean_filename, $rdir->dirname(true));
+            $res = $manifest->add_resource($resource, null, cc_version11::webcontent);
+            pkg_static_resources::instance()->add($virtual, $res[0], $rdir->dirname(true).$clean_filename, $values[1], $resource);
+        }
+
+        pkg_static_resources::instance()->finished = true;
+    }
+
+    /**
+     *
+     * Excerpt from IMS CC 1.1 overview :
+     * No spaces in filenames, directory and file references should
+     * employ all lowercase or all uppercase - no mixed case
+     *
+     * @param cc_i_manifest $manifest
+     * @param string $packageroot
+     * @param integer $contextid
+     * @param string $outdir
+     * @param boolean $allinone
+     * @throws RuntimeException
+     */
+    public static function handle_static_content(cc_i_manifest &$manifest, $packageroot, $contextid, $outdir, $allinone = true){
+        cc_helpers::add_files($manifest, $packageroot, $outdir, $allinone);
+        return pkg_static_resources::instance()->get_values();
+    }
+
+    public static function handle_resource_content(cc_i_manifest &$manifest, $packageroot, $contextid, $outdir, $allinone = true){
+        $result = array();
+        cc_helpers::add_files($manifest, $packageroot, $outdir, $allinone);
+        $files = cc_helpers::embedded_mapping($packageroot, $contextid);
+        //$rdir = $allinone ? new cc_resource_location($outdir) : null;
+        $rootnode = null;
+        $rootvals = null;
+        $depfiles = array();
+        $depres = array();
+        $flocation = null;
+        foreach ($files as $virtual => $values) {
+            $clean_filename = $values[2];
+            $vals = pkg_static_resources::instance()->get_identifier($virtual);
+            $resource = $vals[3];
+            $identifier = $resource->identifier;
+            $flocation = $vals[1];
+            if ($values[1]) {
+                $rootnode = $resource;
+                $rootvals = $flocation;
+                continue;
+            }
+
+            $depres[] = $identifier;
+            $depfiles[] = $vals[1];
+            $result[$virtual] = array($identifier, $flocation, false);
+        }
+
+        if (!empty($rootnode)) {
+            $rootnode->files = array_merge($rootnode->files, $depfiles);
+            $result[$virtual] = array($rootnode->identifier, $rootvals, true);
+        }
+
+        return $result;
+    }
+
+    public static function process_linked_files($content, cc_i_manifest &$manifest, $packageroot, $contextid, $outdir) {
+        /**
+        - detect all embedded files
+        - locate their physical counterparts in moodle 2 backup
+        - copy all files in the cc package stripping any spaces and using inly lowercase letters
+        - add those files as resources of the type webcontent to the manifest
+        - replace the links to the resourcse using $IMS-CC-FILEBASE$ and their new locations
+        - cc_resource has array of files and array of dependencies
+        - most likely we would need to add all files as independent resources and than
+        attach them all as dependencies to the forum tag
+        */
+        $lfiles = self::embedded_files($content);
+        $text = $content;
+        $deps = null;
+        if (!empty($lfiles)) {
+            $files = self::handle_static_content($manifest,
+                                                 $packageroot,
+                                                 $contextid,
+                                                 $outdir);
+            foreach ($lfiles as $lfile) {
+                if (array_key_exists($lfile, $files)) {
+                    $text = str_replace('@@PLUGINFILE@@'.$lfile,
+                                        '$IMS-CC-FILEBASE$../'.$files[$lfile][1],
+                    $text);
+                    $deps[] = $files[$lfile][0];
+                }
+            }
+        }
+        return array($text, $deps);
+    }
+
+    public static function relative_location($originpath, $linkingpath) {
+        return false;
+    }
+
+}
+
+
+final class cc_resource_location {
+    /**
+     *
+     * Root directory
+     * @var string
+     */
+    private $rootdir = null;
+    /**
+     *
+     * new directory
+     * @var string
+     */
+    private $dir = null;
+    /**
+     *
+     * Full precalculated path
+     * @var string
+     */
+    private $fullpath = null;
+
+    /**
+     *
+     * ctor
+     * @param string $rootdir - path to the containing directory
+     * @throws InvalidArgumentException
+     * @throws RuntimeException
+     */
+    public function __construct($rootdir) {
+        $rdir = realpath($rootdir);
+        if (empty($rdir)) {
+            throw new InvalidArgumentException('Invalid path!');
+        }
+        $dir = cc_helpers::randomdir($rdir, 'i_');
+        if ($dir === false) {
+            throw new RuntimeException('Unable to create directory!');
+        }
+        $this->rootdir  = $rdir;
+        $this->dir      = $dir;
+        $this->fullpath = $rdir.DIRECTORY_SEPARATOR.$dir;
+    }
+
+    /**
+     *
+     * Newly created directory
+     * @return string
+     */
+    public function dirname($endseparator=false) {
+        return $this->dir.($endseparator ? '/' : '');
+    }
+
+    /**
+     *
+     * Full path to the new directory
+     * @return string
+     */
+    public function fullpath($endseparator=false) {
+        return $this->fullpath.($endseparator ? DIRECTORY_SEPARATOR : '');
+    }
+
+    /**
+     * Returns containing dir
+     * @return string
+     */
+    public function rootdir($endseparator=false) {
+        return $this->rootdir.($endseparator ? DIRECTORY_SEPARATOR : '');
+    }
+}
+
+class pkg_static_resources {
+
+    /**
+     * @var array
+     */
+    private $values = array();
+
+    /**
+     * @var boolean
+     */
+    public $finished = false;
+
+    /**
+     * @var pkg_static_resources
+     */
+    private static $instance = null;
+
+    private function __clone() {}
+    private function __construct() {}
+
+    /**
+     * @return pkg_static_resources
+     */
+    public static function instance() {
+        if (empty(self::$instance)) {
+            $c = __CLASS__;
+            self::$instance = new $c();
+        }
+        return self::$instance;
+    }
+
+    /**
+     *
+     * add new element
+     * @param string $identifier
+     * @param string $file
+     * @param boolean $main
+     */
+    public function add($key, $identifier, $file, $main, $node = null) {
+        $this->values[$key] = array($identifier, $file, $main, $node);
+    }
+
+    /**
+     * @return array
+     */
+    public function get_values() {
+        return $this->values;
+    }
+
+    public function get_identifier($location) {
+        $result = false;
+        if (array_key_exists($location, $this->values)) {
+            $result = $this->values[$location];
+        }
+        return $result;
+    }
+
+    public function reset() {
+        $this->values   = array();
+        $this->finished = false  ;
+    }
+}
diff --git a/backup/cc/cc_lib/cc_version1.php b/backup/cc/cc_lib/cc_version1.php
new file mode 100644 (file)
index 0000000..30f382a
--- /dev/null
@@ -0,0 +1,566 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_utils.php';
+require_once 'cc_version_base.php';
+require_once 'cc_organization.php';
+
+
+/**
+ * Version 1 class of Common Cartridge
+ *
+ */
+class cc_version1 extends cc_version_base {
+    const   webcontent          = 'webcontent';
+    const   questionbank        = 'imsqti_xmlv1p2/imscc_xmlv1p0/question-bank';
+    const   assessment          = 'imsqti_xmlv1p2/imscc_xmlv1p0/assessment';
+    const   associatedcontent   = 'associatedcontent/imscc_xmlv1p0/learning-application-resource';
+    const   discussiontopic     = 'imsdt_xmlv1p0';
+    const   weblink             = 'imswl_xmlv1p0';
+
+    public static $checker = array(self::webcontent,
+                                   self::assessment,
+                                   self::associatedcontent,
+                                   self::discussiontopic,
+                                   self::questionbank,
+                                   self::weblink);
+
+    /**
+    * Validate if the type are valid or not
+    *
+    * @param string $type
+    * @return bool
+    */
+    public function valid($type) {
+        return in_array($type, self::$checker);
+    }
+
+    public function __construct() {
+        $this->ccnamespaces     = array('imscc'    => 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1',
+                                        'lomimscc' => 'http://ltsc.ieee.org/xsd/imscc/LOM',
+                                        'lom'      => 'http://ltsc.ieee.org/xsd/LOM',
+                                        'voc'      => 'http://ltsc.ieee.org/xsd/LOM/vocab',
+                                        'xsi'      => 'http://www.w3.org/2001/XMLSchema-instance'
+                                        );
+
+        $this->ccnsnames        = array('imscc'    => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/imscp_v1p2_localised.xsd' ,
+                                        'lom'      => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_2/lomLoose_localised.xsd' ,
+                                        'lomimscc' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_1/lomLoose_localised.xsd',
+                                        'voc'      => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_2/vocab/loose.xsd'
+                                        );
+
+        $this->ccversion        = '1.0.0';
+        $this->camversion       = '1.0.0';
+        $this->_generator       = 'Moodle 2 Common Cartridge generator';
+    }
+
+    protected function on_create(DOMDocument &$doc, $rootmanifestnode=null,$nmanifestID=null) {
+      $doc->formatOutput        = true;
+      $doc->preserveWhiteSpace  = true;
+
+
+      $this->manifestID = is_null($nmanifestID) ? cc_helpers::uuidgen('M_') : $nmanifestID;
+      $mUUID = $doc->createAttribute('identifier');
+      $mUUID->nodeValue = $this->manifestID;
+
+
+      if (is_null($rootmanifestnode)) {
+          if (!empty($this->_generator)) {
+              $comment = $doc->createComment($this->_generator);
+              $doc->appendChild($comment);
+          }
+
+          $rootel = $doc->createElementNS($this->ccnamespaces['imscc'],'manifest');
+          $rootel->appendChild($mUUID);
+          $doc->appendChild($rootel);
+
+          //add all namespaces
+          foreach ($this->ccnamespaces as $key => $value) {
+                if ($key != 'lom' ){
+                    $dummy_attr = $key.":dummy";
+                    $doc->createAttributeNS($value,$dummy_attr);
+                }
+          }
+
+          // add location of schemas
+          $schemaLocation='';
+          foreach ($this->ccnsnames as $key => $value) {
+              $vt = empty($schemaLocation) ? '' : ' ';
+              $schemaLocation .= $vt.$this->ccnamespaces[$key].' '.$value;
+          }
+          $aSchemaLoc = $doc->createAttributeNS($this->ccnamespaces['xsi'],'xsi:schemaLocation');
+          $aSchemaLoc->nodeValue=$schemaLocation;
+          $rootel->appendChild($aSchemaLoc);
+
+      } else {
+          $rootel = $doc->createElementNS($this->ccnamespaces['imscc'],'imscc:manifest');
+          $rootel->appendChild($mUUID);
+      }
+
+      $metadata = $doc->createElementNS($this->ccnamespaces['imscc'],'metadata');
+      $schema = $doc->createElementNS($this->ccnamespaces['imscc'],'schema','IMS Common Cartridge');
+      $schemaversion = $doc->createElementNS($this->ccnamespaces['imscc'],'schemaversion',$this->ccversion);
+
+      $metadata->appendChild($schema);
+      $metadata->appendChild($schemaversion);
+      $rootel->appendChild($metadata);
+
+      if (!is_null($rootmanifestnode)) {
+          $rootmanifestnode->appendChild($rootel);
+      }
+
+      $organizations = $doc->createElementNS($this->ccnamespaces['imscc'],'organizations');
+      $rootel->appendChild($organizations);
+      $resources = $doc->createElementNS($this->ccnamespaces['imscc'],'resources');
+      $rootel->appendChild($resources);
+
+      return true;
+    }
+
+
+    protected function update_attribute(DOMDocument &$doc, $attrname, $attrvalue, DOMElement &$node) {
+        $busenew = (is_object($node) && $node->hasAttribute($attrname));
+        $nResult = null;
+        if (!$busenew && is_null($attrvalue)) {
+            $node->removeAttribute($attrname);
+        } else {
+            $nResult = $busenew ? $node->getAttributeNode($attrname) : $doc->createAttribute($attrname);
+            $nResult->nodeValue = $attrvalue;
+            if (!$busenew) {
+                $node->appendChild($nResult);
+            }
+        }
+        return $nResult;
+    }
+
+
+    protected function update_attribute_ns(DOMDocument &$doc, $attrname, $attrnamespace,$attrvalue, DOMElement &$node) {
+        $busenew = (is_object($node) && $node->hasAttributeNS($attrnamespace, $attrname));
+        $nResult = null;
+        if (!$busenew && is_null($attrvalue)) {
+            $node->removeAttributeNS($attrnamespace, $attrname);
+        } else {
+            $nResult = $busenew ? $node->getAttributeNodeNS($attrnamespace, $attrname) : $doc->createAttributeNS($attrnamespace, $attrname);
+            $nResult->nodeValue = $attrvalue;
+            if (!$busenew) {
+                $node->appendChild($nResult);
+            }
+        }
+        return $nResult;
+    }
+
+
+    protected function get_child_node(DOMDocument &$doc, $itemname, DOMElement &$node) {
+        $nlist = $node->getElementsByTagName($itemname);
+        $item = is_object($nlist) && ($nlist->length > 0) ? $nlist->item(0) : null;
+        return $item;
+    }
+
+
+    protected function update_child_item(DOMDocument &$doc, $itemname, $itemvalue, DOMElement &$node, $attrtostore=null) {
+        $tnode = $this->get_child_node($doc,'title',$node);
+        $usenew = is_null($tnode);
+        $tnode = $usenew ? $doc->createElementNS($this->ccnamespaces['imscc'], $itemname) : $tnode;
+        if (!is_null($attrtostore)) {
+            foreach ($attrtostore as $key => $value) {
+                $this->update_attribute($doc,$key,$value,$tnode);
+            }
+        }
+        $tnode->nodeValue = $itemvalue;
+        if ($usenew) {
+            $node->appendChild($tnode);
+        }
+    }
+
+
+    protected function update_items($items, DOMDocument &$doc, DOMElement &$xmlnode) {
+        foreach ($items as $key => $item) {
+            $itemnode = $doc->createElementNS($this->ccnamespaces['imscc'], 'item');
+            $this->update_attribute($doc, 'identifier'   , $key                , $itemnode);
+            $this->update_attribute($doc, 'identifierref', $item->identifierref, $itemnode);
+            $this->update_attribute($doc, 'parameters'   , $item->parameters   , $itemnode);
+            if (!empty($item->title)) {
+                $titlenode = $doc->createElementNS($this->ccnamespaces['imscc'],
+                                                   'title',
+                                                   $item->title);
+                $itemnode->appendChild($titlenode);
+            }
+            if ($item->has_child_items()) {
+                $this->update_items($item->childitems, $doc, $itemnode);
+            }
+            $xmlnode->appendChild($itemnode);
+        }
+    }
+
+
+    /**
+     * Create a Resource (How to)
+     *
+     * @param cc_i_resource $res
+     * @param DOMDocument $doc
+     * @param object $xmlnode
+     * @return DOMNode
+     */
+    protected function create_resource(cc_i_resource &$res, DOMDocument &$doc, $xmlnode=null) {
+        $usenew = is_object($xmlnode);
+        $dnode  = $usenew ? $xmlnode : $doc->createElementNS($this->ccnamespaces['imscc'], "resource");
+        $this->update_attribute($doc,'identifier',$res->identifier,$dnode);
+        $this->update_attribute($doc,'type'      ,$res->type      ,$dnode);
+        !is_null($res->href) ? $this->update_attribute($doc,'href',$res->href,$dnode): null;
+        $this->update_attribute($doc,'base'      ,$res->base      ,$dnode);
+
+        foreach ($res->files as $file) {
+            $nd = $doc->createElementNS($this->ccnamespaces['imscc'],'file');
+            $ndatt = $doc->createAttribute('href');
+            $ndatt->nodeValue = $file;
+            $nd->appendChild($ndatt);
+            $dnode->appendChild($nd);
+        }
+        $this->resources[$res->identifier]  = $res;
+
+        foreach ($res->dependency as $dependency){
+            $nd = $doc->createElementNS($this->ccnamespaces['imscc'],'dependency');
+            $ndatt = $doc->createAttribute('identifierref');
+            $ndatt->nodeValue = $dependency;
+            $nd->appendChild($ndatt);
+            $dnode->appendChild($nd);
+        }
+
+        return $dnode;
+    }
+
+
+
+    /**
+     * Create an Item Folder (How To)
+     *
+     * @param cc_i_organization $org
+     * @param DOMDocument $doc
+     * @param DOMElement $xmlnode
+     */
+    protected function create_item_folder (cc_i_organization &$org, DOMDocument &$doc, DOMElement &$xmlnode=null){
+
+            $itemfoldernode = $doc->createElementNS($this->ccnamespaces['imscc'],'item');
+            $this->update_attribute($doc,'identifier', "root", $itemfoldernode);
+
+            if ($org->has_items()) {
+                $this->update_items($org->itemlist, $doc, $itemfoldernode);
+            }
+            if (is_null($this->organizations)) {
+                $this->organizations = array();
+            }
+            $this->organizations[$org->identifier]  = $org;
+
+            $xmlnode->appendChild($itemfoldernode);
+    }
+
+
+
+
+    /**
+     * Create an Organization (How To)
+     *
+     * @param cc_i_organization $org
+     * @param DOMDocument $doc
+     * @param object $xmlnode
+     * @return DOMNode
+     */
+    protected function create_organization (cc_i_organization &$org, DOMDocument &$doc, $xmlnode=null){
+
+        $usenew = is_object($xmlnode);
+        $dnode  = $usenew ? $xmlnode : $doc->createElementNS($this->ccnamespaces['imscc'], "organization");
+        $this->update_attribute($doc,'identifier' ,$org->identifier,$dnode);
+        $this->update_attribute($doc,'structure'  ,$org->structure ,$dnode);
+
+        $this->create_item_folder($org,$doc,$dnode);
+
+        return $dnode;
+    }
+
+
+
+
+    /**
+     * Create Metadata For Manifest (How To)
+     *
+     * @param cc_i_metadata_manifest $met
+     * @param DOMDocument $doc
+     * @param object $xmlnode
+     * @return DOMNode
+     */
+    protected function create_metadata_manifest (cc_i_metadata_manifest $met,DOMDocument &$doc,$xmlnode=null) {
+
+        $dnode  =  $doc->createElementNS($this->ccnamespaces['lomimscc'], "lom");
+        if (!empty($xmlnode)) {
+            $xmlnode->appendChild($dnode);
+        }
+        $dnodegeneral   = empty($met->arraygeneral  ) ? null : $this->create_metadata_general  ($met, $doc, $xmlnode);
+        $dnodetechnical = empty($met->arraytech     ) ? null : $this->create_metadata_technical($met, $doc, $xmlnode);
+        $dnoderights    = empty($met->arrayrights   ) ? null : $this->create_metadata_rights   ($met, $doc, $xmlnode);
+        $dnodelifecycle = empty($met->arraylifecycle) ? null : $this->create_metadata_lifecycle($met, $doc, $xmlnode);
+
+        !is_null($dnodegeneral)?$dnode->appendChild($dnodegeneral):null;
+        !is_null($dnodetechnical)?$dnode->appendChild($dnodetechnical):null;
+        !is_null($dnoderights)?$dnode->appendChild($dnoderights):null;
+        !is_null($dnodelifecycle)?$dnode->appendChild($dnodelifecycle):null;
+
+        return $dnode;
+
+    }
+
+
+
+    /**
+     * Create Metadata For Resource (How To)
+     *
+     * @param cc_i_metadata_resource $met
+     * @param DOMDocument $doc
+     * @param object $xmlnode
+     * @return DOMNode
+     */
+    protected function create_metadata_resource (cc_i_metadata_resource $met,DOMDocument &$doc,$xmlnode=null) {
+
+        $dnode = $doc->createElementNS($this->ccnamespaces['lom'], "lom");
+
+        !empty($xmlnode)? $xmlnode->appendChild($dnode):null;
+        !empty($met->arrayeducational) ? $this->create_metadata_educational($met,$doc,$dnode):null;
+
+        return $dnode;
+    }
+
+
+
+
+    /**
+     * Create Metadata For File (How To)
+     *
+     * @param cc_i_metadata_file $met
+     * @param DOMDocument $doc
+     * @param Object $xmlnode
+     * @return DOMNode
+     */
+    protected function create_metadata_file (cc_i_metadata_file $met,DOMDocument &$doc,$xmlnode=null) {
+
+        $dnode = $doc->createElementNS($this->ccnamespaces['lom'], "lom");
+
+        !empty($xmlnode)? $xmlnode->appendChild($dnode):null;
+        !empty($met->arrayeducational) ? $this->create_metadata_educational($met,$doc,$dnode):null;
+
+        return $dnode;
+    }
+
+
+
+
+    /**
+     * Create General Metadata (How To)
+     *
+     * @param object $met
+     * @param DOMDocument $doc
+     * @param object $xmlnode
+     * @return DOMNode
+     */
+    protected function create_metadata_general($met,DOMDocument &$doc,$xmlnode){
+        ($xmlnode);
+        $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'],'general');
+
+        foreach ($met->arraygeneral as $name => $value) {
+            !is_array($value)?$value =array($value):null;
+            foreach ($value as $k => $v){
+                ($k);
+                if ($name != 'language' && $name != 'catalog' && $name != 'entry'){
+                    $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name);
+                    $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'string',$v[1]);
+                    $ndatt = $doc->createAttribute('language');
+                    $ndatt->nodeValue = $v[0];
+                    $nd3->appendChild($ndatt);
+                    $nd2->appendChild($nd3);
+                    $nd->appendChild($nd2);
+                }else{
+                    if ($name == 'language'){
+                        $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name,$v[0]);
+                        $nd->appendChild($nd2);
+                    }
+                }
+            }
+        }
+        if (!empty($met->arraygeneral['catalog']) || !empty($met->arraygeneral['entry'])){
+            $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'identifier');
+            $nd->appendChild($nd2);
+            if (!empty($met->arraygeneral['catalog'])){
+                $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'catalog',$met->arraygeneral['catalog'][0][0]);
+                $nd2->appendChild($nd3);
+            }
+            if (!empty($met->arraygeneral['entry'])){
+                $nd4 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'entry',$met->arraygeneral['entry'][0][0]);
+                $nd2->appendChild($nd4);
+            }
+        }
+        return $nd;
+    }
+
+
+
+
+    /**
+     * Create Technical Metadata (How To)
+     *
+     * @param object $met
+     * @param DOMDocument $doc
+     * @param object $xmlnode
+     * @return DOMNode
+     */
+    protected function create_metadata_technical($met,DOMDocument &$doc,$xmlnode){
+        ($xmlnode);
+        $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'],'technical');
+        $xmlnode->appendChild($nd);
+
+        foreach ($met->arraytech as $name => $value) {
+            ($name);
+            !is_array($value)?$value =array($value):null;
+            foreach ($value as $k => $v){
+                ($k);
+                    $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name,$v[0]);
+                    $nd->appendChild($nd2);
+            }
+        }
+        return $nd;
+    }
+
+
+
+
+    /**
+     * Create Rights Metadata (How To)
+     *
+     * @param object $met
+     * @param DOMDocument $doc
+     * @param object $xmlnode
+     * @return DOMNode
+     */
+    protected function create_metadata_rights($met,DOMDocument &$doc,$xmlnode){
+        ($xmlnode);
+
+        $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'],'rights');
+
+        foreach ($met->arrayrights as $name => $value) {
+            !is_array($value)?$value =array($value):null;
+            foreach ($value as $k => $v){
+                ($k);
+                if ($name == 'description'){
+                    $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name);
+                    $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'string',$v[1]);
+                    $ndatt = $doc->createAttribute('language');
+                    $ndatt->nodeValue = $v[0];
+                    $nd3->appendChild($ndatt);
+                    $nd2->appendChild($nd3);
+                    $nd->appendChild($nd2);
+                }elseif ($name == 'copyrightAndOtherRestrictions' || $name == 'cost'){
+                    $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name);
+                    $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'value',$v[0]);
+                    $nd2->appendChild($nd3);
+                    $nd->appendChild($nd2);
+                }
+            }
+        }
+        return $nd;
+    }
+
+
+
+
+    /**
+     * Create LifeCyle Metadata (How To)
+     *
+     * @param object $met
+     * @param DOMDocument $doc
+     * @param object $xmlnode
+     * @return DOMNode
+     */
+    protected function create_metadata_lifecycle($met,DOMDocument &$doc,$xmlnode){
+        ($xmlnode);
+
+        $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'],'lifeCycle');
+        $nd2= $doc->createElementNS($this->ccnamespaces['lomimscc'],'contribute');
+
+
+        $nd->appendChild ($nd2);
+        $xmlnode->appendChild ($nd);
+
+        foreach ($met->arraylifecycle as $name => $value) {
+            !is_array($value)?$value =array($value):null;
+            foreach ($value as $k => $v){
+                ($k);
+                if ($name == 'role'){
+                    $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name);
+                    $nd2->appendChild($nd3);
+                    $nd4 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'value',$v[0]);
+                    $nd3->appendChild($nd4);
+                }else{
+                    if ($name == 'date'){
+                        $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name);
+                        $nd2->appendChild($nd3);
+                        $nd4 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'dateTime',$v[0]);
+                        $nd3->appendChild($nd4);
+                    }else{
+                        $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name,$v[0]);
+                        $nd2->appendChild($nd3);
+                    }
+                }
+            }
+        }
+        return $nd;
+    }
+
+
+
+
+    /**
+     * Create Education Metadata (How To)
+     *
+     * @param object $met
+     * @param DOMDocument $doc
+     * @param object $xmlnode
+     * @return DOMNode
+     */
+    protected function create_metadata_educational ($met,DOMDocument  &$doc, $xmlnode){
+        $nd = $doc->createElementNS($this->ccnamespaces['lom'],'educational');
+        $nd2 = $doc->createElementNS($this->ccnamespaces['lom'],'intendedEndUserRole');
+        $nd3 = $doc->createElementNS($this->ccnamespaces['voc'],'vocabulary');
+
+        $xmlnode->appendChild($nd);
+        $nd->appendChild($nd2);
+        $nd2->appendChild($nd3);
+
+        foreach ($met->arrayeducational as $name => $value) {
+            !is_array($value)?$value =array($value):null;
+            foreach ($value as $k => $v){
+                ($k);
+                $nd4 = $doc->createElementNS($this->ccnamespaces['voc'],$name,$v[0]);
+                $nd3->appendChild($nd4);
+            }
+        }
+        return $nd;
+    }
+
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/cc_version11.php b/backup/cc/cc_lib/cc_version11.php
new file mode 100644 (file)
index 0000000..6df8ab7
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_version1.php';
+
+
+/**
+ * Version 1.1 class of Common Cartridge
+ *
+ */
+class cc_version11 extends cc_version1 {
+    const webcontent         = 'webcontent';
+    const questionbank       = 'imsqti_xmlv1p2/imscc_xmlv1p1/question-bank';
+    const assessment         = 'imsqti_xmlv1p2/imscc_xmlv1p1/assessment';
+    const associatedcontent  = 'associatedcontent/imscc_xmlv1p1/learning-application-resource';
+    const discussiontopic    = 'imsdt_xmlv1p1';
+    const weblink            = 'imswl_xmlv1p1';
+    const basiclti           = 'imsbasiclti_xmlv1p0';
+
+    public static $checker = array(self::webcontent,
+                                   self::assessment,
+                                   self::associatedcontent,
+                                   self::discussiontopic,
+                                   self::questionbank,
+                                   self::weblink,
+                                   self::basiclti);
+
+    /**
+    * Validate if the type are valid or not
+    *
+    * @param string $type
+    * @return bool
+    */
+    public function valid($type) {
+        return in_array($type, self::$checker);
+    }
+
+    public function __construct() {
+        $this->ccnamespaces = array('imscc'    => 'http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1',
+                                    'lomimscc' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/manifest'  ,
+                                    'lom'      => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/resource'  ,
+                                    'xsi'      => 'http://www.w3.org/2001/XMLSchema-instance'
+                                   );
+
+        $this->ccnsnames    = array('imscc'    => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_imscp_v1p2_v1p0.xsd'     ,
+                                    'lomimscc' => 'http://www.imsglobal.org/profile/cc/ccv1p1/LOM/ccv1p1_lommanifest_v1p0.xsd',
+                                    'lom'      => 'http://www.imsglobal.org/profile/cc/ccv1p1/LOM/ccv1p1_lomresource_v1p0.xsd'
+                                   );
+
+        $this->ccversion    = '1.1.0';
+        $this->camversion   = '1.1.0';
+        $this->_generator   = 'Moodle 2 Common Cartridge generator';
+    }
+
+    protected function update_items($items, DOMDocument &$doc, DOMElement &$xmlnode) {
+        foreach ($items as $key => $item) {
+            $itemnode = $doc->createElementNS($this->ccnamespaces['imscc'], 'item');
+            $this->update_attribute($doc, 'identifier'   , $key                , $itemnode);
+            $this->update_attribute($doc, 'identifierref', $item->identifierref, $itemnode);
+            if (!is_null($item->title)) {
+                $titlenode = $doc->createElementNS($this->ccnamespaces['imscc'],
+                                                       'title',
+                $item->title);
+                $itemnode->appendChild($titlenode);
+            }
+            if ($item->has_child_items()) {
+                $this->update_items($item->childitems, $doc, $itemnode);
+            }
+            $xmlnode->appendChild($itemnode);
+        }
+    }
+
+}
diff --git a/backup/cc/cc_lib/cc_version_base.php b/backup/cc/cc_lib/cc_version_base.php
new file mode 100644 (file)
index 0000000..9fc230e
--- /dev/null
@@ -0,0 +1,131 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_organization.php';
+
+
+/**
+ * Abstract Version Base class
+ *
+ */
+abstract class cc_version_base {
+    protected $_generator           = null;
+    protected $ccnamespaces         = array();
+    protected $isrootmanifest       = false;
+    protected $manifestID           = null;
+    protected $organizationid       = null;
+    public    $resources            = null;
+    protected $metadata             = null;
+    public    $organizations        = null;
+    protected $base                 = null;
+    public    $ccversion            = null;
+    public    $camversion           = null;
+
+
+    abstract protected function on_create(DOMDocument &$doc,$rootmanifestnode=null,$nmanifestID=null);
+
+    abstract protected function create_metadata_manifest (cc_i_metadata_manifest $met,DOMDocument &$doc,$xmlnode=null);
+
+    abstract protected function create_metadata_resource (cc_i_metadata_resource $met,DOMDocument &$doc,$xmlnode=null);
+
+    abstract protected function create_metadata_file (cc_i_metadata_file $met,DOMDocument &$doc,$xmlnode=null);
+
+    abstract protected function create_resource(cc_i_resource &$res, DOMDocument &$doc, $xmlnode=null);
+
+    abstract protected function create_organization(cc_i_organization &$org, DOMDocument &$doc, $xmlnode=null);
+
+    public function get_cc_namespaces(){
+        return $this->ccnamespaces;
+    }
+
+    public function create_manifest(DOMDocument &$doc,$rootmanifestnode=null){
+        return $this->on_create($doc,$rootmanifestnode);
+    }
+
+    public function create_resource_node(cc_i_resource &$res, DOMDocument &$doc, $xmlnode = null) {
+        return $this->create_resource($res,$doc,$xmlnode);
+    }
+
+
+    public function create_metadata_node (&$met, DOMDocument &$doc, $xmlnode = null){
+        return $this->create_metadata_manifest($met,$doc,$xmlnode);
+    }
+
+    public function create_metadata_resource_node (&$met, DOMDocument &$doc, $xmlnode = null){
+        return $this->create_metadata_resource($met,$doc,$xmlnode);
+    }
+
+    public function create_metadata_file_node (&$met, DOMDocument &$doc, $xmlnode = null){
+        return $this->create_metadata_file($met,$doc,$xmlnode);
+    }
+
+    public function create_organization_node(cc_i_organization &$org, DOMDocument &$doc, $xmlnode = null) {
+        return $this->create_organization($org,$doc,$xmlnode);
+    }
+
+    public function manifestID(){
+        return $this->manifestID;
+    }
+
+    public function set_manifestID($id){
+        $this->manifestID = $id;
+    }
+
+    public function get_base(){
+        return $this->base;
+    }
+
+    public function set_base($baseval){
+        $this->base = $baseval;
+    }
+
+    public function import_resources(DOMElement &$node, cc_i_manifest &$doc) {
+        if (is_null($this->resources)){
+            $this->resources = array();
+        }
+        $nlist = $node->getElementsByTagNameNS($this->ccnamespaces['imscc'],'resource');
+        if (is_object($nlist)) {
+            foreach ($nlist as $nd) {
+                $sc = new cc_resource($doc,$nd);
+                $this->resources[$sc->identifier]=$sc;
+            }
+        }
+    }
+
+    public function import_organization_items(DOMElement &$node, cc_i_manifest &$doc) {
+        if (is_null($this->organizations)) {
+            $this->organizations = array();
+        }
+        $nlist = $node->getElementsByTagNameNS($this->ccnamespaces['imscc'],'organization');
+        if (is_object($nlist)) {
+            foreach ($nlist as $nd) {
+                $sc = new cc_organization($nd,$doc);
+                $this->organizations[$sc->identifier]=$sc;
+            }
+        }
+    }
+
+    public function set_generator($value) {
+        $this->_generator = $value;
+    }
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/cc_weblink.php b/backup/cc/cc_lib/cc_weblink.php
new file mode 100644 (file)
index 0000000..db68fa2
--- /dev/null
@@ -0,0 +1,99 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_general.php';
+
+class url1_resurce_file extends general_cc_file {
+    const deafultname = 'weblink.xml';
+
+    protected $rootns = 'wl';
+    protected $rootname = 'wl:webLink';
+    protected $ccnamespaces = array('wl'  => 'http://www.imsglobal.org/xsd/imswl_v1p0',
+                                    'xsi' => 'http://www.w3.org/2001/XMLSchema-instance');
+    protected $ccnsnames = array('wl'   => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_5/imswl_v1p0_localised.xsd');
+
+    protected $url = null;
+    protected $title = null;
+    protected $href = null;
+    protected $target = '_self';
+    protected $window_features = null;
+
+    /**
+     *
+     * Set the url title
+     * @param string $title
+     */
+    public function set_title($title) {
+        $this->title = htmlentities($title);
+    }
+
+    /**
+     *
+     * Set the url specifics
+     * @param string $url
+     * @param string $target
+     * @param string $window_features
+     */
+    public function set_url($url, $target='_self', $window_features=null) {
+        $this->url = $url;
+        $this->target = $target;
+        $this->window_features = $window_features;
+    }
+
+    protected function on_save() {
+        $this->append_new_element($this->root, 'title', $this->title);
+        $url = $this->append_new_element($this->root, 'url');
+        $this->append_new_attribute($url, 'href', $this->url);
+        if (!empty($this->target)) {
+            $this->append_new_attribute($url, 'target', $this->target);
+        }
+        if (!empty($this->window_features)) {
+            $this->append_new_attribute($url, 'windowFeatures', $this->window_features);
+        }
+        return true;
+    }
+
+}
+
+class url11_resurce_file extends url1_resurce_file {
+    protected $rootname = 'webLink';
+
+    protected $ccnamespaces = array('wl'  => 'http://www.imsglobal.org/xsd/imsccv1p1/imswl_v1p1',
+                                    'xsi' => 'http://www.w3.org/2001/XMLSchema-instance');
+    protected $ccnsnames = array('wl' => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_imswl_v1p1.xsd');
+
+    protected function on_save() {
+        $rns = $this->ccnamespaces[$this->rootns];
+        $this->append_new_element_ns($this->root, $rns, 'title', $this->title);
+        $url = $this->append_new_element_ns($this->root, $rns, 'url');
+        $this->append_new_attribute_ns($url, $rns, 'href', $this->url);
+        if (!empty($this->target)) {
+            $this->append_new_attribute_ns($url, $rns, 'target', $this->target);
+        }
+        if (!empty($this->window_features)) {
+            $this->append_new_attribute_ns($url, $rns, 'windowFeatures', $this->window_features);
+        }
+        return true;
+    }
+}
+
diff --git a/backup/cc/cc_lib/gral_lib/ccdependencyparser.php b/backup/cc/cc_lib/gral_lib/ccdependencyparser.php
new file mode 100644 (file)
index 0000000..5992b8e
--- /dev/null
@@ -0,0 +1,168 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+require_once $CFG->dirroot .'/backup/cc/cc_lib/xmlbase.php';
+require_once 'cssparser.php';
+require_once 'pathutils.php';
+
+
+
+/**
+ *
+ * Older version better suited for PHP < 5.2
+ * @deprecated
+ * @param unknown_type $url
+ * @return boolean
+ */
+function is_url_deprecated($url) {
+    if (
+         !preg_match('#^http\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) &&
+         !preg_match('#^https\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) &&
+         !preg_match('#^ftp\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url)
+        ) {
+        $status = false;
+    } else {
+        $status = true;
+    }
+    return $status;
+}
+
+/**
+ *
+ * validates URL
+ * @param string $url
+ * @return boolean
+ */
+function is_url($url) {
+    $result = filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED) !== false;
+    return $result;
+}
+
+function GetDepFiles($manifestroot, $fname,$folder,&$filenames) {
+    $extension      = pathinfo($fname, PATHINFO_EXTENSION);
+    $filenames      = array();
+    $dcx            = new XMLGenericDocument();
+    $result         = true;
+
+    switch ($extension){
+        case 'xml':
+                 $result = @$dcx->loadXMLFile($manifestroot.$folder.$fname);
+                 if (!$result) {
+                    $result = @$dcx->loadXMLFile($manifestroot.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.$fname);
+                 }
+                 GetDepFilesXML($manifestroot, $fname,$filenames,$dcx, $folder);
+            break;
+        case 'html':
+        case 'htm':
+                 $result = @$dcx->loadHTMLFile($manifestroot.$folder.$fname);
+                 if (!$result) {
+                    $result = @$dcx->loadHTMLFile($manifestroot.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.$fname);
+                 }
+                 GetDepFilesHTML($manifestroot, $fname,$filenames,$dcx, $folder);
+            break;
+    }
+    return $result;
+}
+
+
+
+function GetDepFilesXML ($manifestroot, $fname,&$filenames,&$dcx, $folder){
+        $nlist = $dcx->nodeList("//img/@src | //attachments/attachment/@href  | //link/@href | //script/@src");
+        $css_obj_array = array();
+        foreach ($nlist as $nl) {
+            $item = $folder.$nl->nodeValue;
+            $path_parts = pathinfo($item);
+            $fname = $path_parts['basename'];
+            $ext   = array_key_exists('extension',$path_parts) ? $path_parts['extension'] : '';
+            if (!is_url($nl->nodeValue)) {
+              //$file =   $folder.$nl->nodeValue; // DEPENDERA SI SE QUIERE Q SEA RELATIVO O ABSOLUTO
+              $file =   $nl->nodeValue;
+              toNativePath($file);
+              $filenames[]=$file;
+            }
+        }
+        $dcx->registerNS('qti','http://www.imsglobal.org/xsd/imscc/ims_qtiasiv1p2.xsd');
+        $dcx->resetXpath();
+        $nlist = $dcx->nodeList("//qti:mattext | //text");
+        $dcx2 = new XMLGenericDocument();
+        foreach ($nlist as $nl) {
+            if ($dcx2->loadString($nl->nodeValue)){
+                GetDepFilesHTML($manifestroot,$fname,$filenames,$dcx2,$folder);
+            }
+        }
+}
+
+
+
+function GetDepFilesHTML ($manifestroot, $fname, &$filenames, &$dcx, $folder){
+        $dcx->resetXpath();
+        $nlist = $dcx->nodeList("//img/@src | //link/@href | //script/@src | //a[not(starts-with(@href,'#'))]/@href");
+        $css_obj_array=array();
+        foreach ($nlist as $nl) {
+            $item = $folder.$nl->nodeValue;
+            $path_parts = pathinfo($item);
+            $fname = $path_parts['basename'];
+            $ext   = array_key_exists('extension',$path_parts) ? $path_parts['extension'] : '';
+            if (!is_url($folder.$nl->nodeValue) && !is_url($nl->nodeValue)) {
+              $path = $folder.$nl->nodeValue;
+              $file = fullPath($path,"/");
+              toNativePath($file);
+              if (file_exists($manifestroot.DIRECTORY_SEPARATOR.$file)) {
+                  $filenames[]= $file;
+              }
+            }
+            if ($ext == 'css') {
+                $css = new cssparser();
+                $css->Parse($dcx->filePath().$nl->nodeValue);
+                $css_obj_array[$item]=$css;
+            }
+        }
+        $nlist = $dcx->nodeList("//*/@class");
+        foreach ($nlist as $nl) {
+            $item = $folder.$nl->nodeValue;
+            foreach ($css_obj_array as $csskey => $cssobj) {
+                $bimg = $cssobj->Get($item,"background-image");
+                $limg = $cssobj->Get($item,"list-style-image");
+                $npath = pathinfo($csskey);
+                if ((!empty($bimg))&& ($bimg != 'none')) {
+                    $filenames[] = stripUrl($bimg,$npath['dirname'].'/');
+                } else
+                if ((!empty($limg))&& ($limg != 'none')) {
+                    $filenames[] = stripUrl($limg,$npath['dirname'].'/');
+                }
+            }
+        }
+        $elems_to_check = array("body","p","ul","h4","a","th");
+        $do_we_have_it = array();
+        foreach ($elems_to_check as $elem) {
+            $do_we_have_it[$elem]=($dcx->nodeList("//".$elem)->length > 0);
+        }
+        foreach ($elems_to_check as $elem) {
+            if ($do_we_have_it[$elem]) {
+                foreach ($css_obj_array as $csskey => $cssobj) {
+                    $sb = $cssobj->Get($elem, "background-image");
+                    $sbl = $cssobj->Get($elem,"list-style-image");
+                    $npath = pathinfo($csskey);
+                    if ((!empty($sb)) && ($sb != 'none')) {
+                        $filenames[] = stripUrl($sb,$npath['dirname'].'/');
+                    } else
+                    if ((!empty($sbl)) && ($sbl != 'none')) {
+                        $filenames[] = stripUrl($sbl,$npath['dirname'].'/');
+                    }
+                }
+            }
+        }
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/gral_lib/cssparser.php b/backup/cc/cc_lib/gral_lib/cssparser.php
new file mode 100644 (file)
index 0000000..1dcbee8
--- /dev/null
@@ -0,0 +1,261 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+class cssparser {
+  private $css;
+  private $html;
+
+  function cssparser($html = true) {
+    // Register "destructor"
+    register_shutdown_function(array(&$this, "finalize"));
+    $this->html = ($html != false);
+    $this->Clear();
+  }
+
+  function finalize() {
+    unset($this->css);
+  }
+
+  function Clear() {
+    unset($this->css);
+    $this->css = array();
+    if($this->html) {
+      $this->Add("ADDRESS", "");
+      $this->Add("APPLET", "");
+      $this->Add("AREA", "");
+      $this->Add("A", "text-decoration : underline; color : Blue;");
+      $this->Add("A:visited", "color : Purple;");
+      $this->Add("BASE", "");
+      $this->Add("BASEFONT", "");
+      $this->Add("BIG", "");
+      $this->Add("BLOCKQUOTE", "");
+      $this->Add("BODY", "");
+      $this->Add("BR", "");
+      $this->Add("B", "font-weight: bold;");
+      $this->Add("CAPTION", "");
+      $this->Add("CENTER", "");
+      $this->Add("CITE", "");
+      $this->Add("CODE", "");
+      $this->Add("DD", "");
+      $this->Add("DFN", "");
+      $this->Add("DIR", "");
+      $this->Add("DIV", "");
+      $this->Add("DL", "");
+      $this->Add("DT", "");
+      $this->Add("EM", "");
+      $this->Add("FONT", "");
+      $this->Add("FORM", "");
+      $this->Add("H1", "");
+      $this->Add("H2", "");
+      $this->Add("H3", "");
+      $this->Add("H4", "");
+      $this->Add("H5", "");
+      $this->Add("H6", "");
+      $this->Add("HEAD", "");
+      $this->Add("HR", "");
+      $this->Add("HTML", "");
+      $this->Add("IMG", "");
+      $this->Add("INPUT", "");
+      $this->Add("ISINDEX", "");
+      $this->Add("I", "font-style: italic;");
+      $this->Add("KBD", "");
+      $this->Add("LINK", "");
+      $this->Add("LI", "");
+      $this->Add("MAP", "");
+      $this->Add("MENU", "");
+      $this->Add("META", "");
+      $this->Add("OL", "");
+      $this->Add("OPTION", "");
+      $this->Add("PARAM", "");
+      $this->Add("PRE", "");
+      $this->Add("P", "");
+      $this->Add("SAMP", "");
+      $this->Add("SCRIPT", "");
+      $this->Add("SELECT", "");
+      $this->Add("SMALL", "");
+      $this->Add("STRIKE", "");
+      $this->Add("STRONG", "");
+      $this->Add("STYLE", "");
+      $this->Add("SUB", "");
+      $this->Add("SUP", "");
+      $this->Add("TABLE", "");
+      $this->Add("TD", "");
+      $this->Add("TEXTAREA", "");
+      $this->Add("TH", "");
+      $this->Add("TITLE", "");
+      $this->Add("TR", "");
+      $this->Add("TT", "");
+      $this->Add("UL", "");
+      $this->Add("U", "text-decoration : underline;");
+      $this->Add("VAR", "");
+    }
+  }
+
+  function SetHTML($html) {
+    $this->html = ($html != false);
+  }
+
+  function Add($key, $codestr) {
+    $key = strtolower($key);
+    $codestr = strtolower($codestr);
+    if(!isset($this->css[$key])) {
+      $this->css[$key] = array();
+    }
+    $codes = explode(";",$codestr);
+    if(count($codes) > 0) {
+      $codekey=''; $codevalue='';
+      foreach($codes as $code) {
+        $code = trim($code);
+        $this->assignValues(explode(":",$code),$codekey,$codevalue);
+        if(strlen($codekey) > 0) {
+          $this->css[$key][trim($codekey)] = trim($codevalue);
+        }
+      }
+    }
+  }
+
+  private function assignValues($arr,&$val1,&$val2) {
+      $n = count($arr);
+      if ($n > 0) {
+          $val1=$arr[0];
+          $val2=($n > 1) ? $arr[1] : '';
+      }
+  }
+  function Get($key, $property) {
+    $key = strtolower($key);
+    $property = strtolower($property);
+    $tag='';$subtag='';$class='';$id='';
+    $this->assignValues(explode(":",$key),$tag,$subtag);
+    $this->assignValues(explode(".",$tag),$tag,$class);
+    $this->assignValues(explode("#",$tag),$tag,$id);
+    $result = "";
+    $_subtag=''; $_class=''; $_id='';
+    foreach($this->css as $_tag => $value) {
+      $this->assignValues(explode(":",$_tag),$_tag,$_subtag);
+      $this->assignValues(explode(".",$_tag),$_tag,$_class);
+      $this->assignValues(explode("#",$_tag),$_tag,$_id);
+
+      $tagmatch = (strcmp($tag, $_tag) == 0) | (strlen($_tag) == 0);
+      $subtagmatch = (strcmp($subtag, $_subtag) == 0) | (strlen($_subtag) == 0);
+      $classmatch = (strcmp($class, $_class) == 0) | (strlen($_class) == 0);
+      $idmatch = (strcmp($id, $_id) == 0);
+
+      if($tagmatch & $subtagmatch & $classmatch & $idmatch) {
+        $temp = $_tag;
+        if((strlen($temp) > 0) & (strlen($_class) > 0)) {
+          $temp .= ".".$_class;
+        } elseif(strlen($temp) == 0) {
+          $temp = ".".$_class;
+        }
+        if((strlen($temp) > 0) & (strlen($_subtag) > 0)) {
+          $temp .= ":".$_subtag;
+        } elseif(strlen($temp) == 0) {
+          $temp = ":".$_subtag;
+        }
+        if(isset($this->css[$temp][$property])) {
+          $result = $this->css[$temp][$property];
+        }
+      }
+    }
+    return $result;
+  }
+
+  function GetSection($key) {
+    $key = strtolower($key);
+    $tag='';$subtag='';$class='';$id='';
+    $_subtag=''; $_class=''; $_id='';
+
+    $this->assignValues(explode(":",$key),$tag,$subtag);
+    $this->assignValues(explode(".",$tag),$tag,$class);
+    $this->assignValues(explode("#",$tag),$tag,$id);
+    $result = array();
+    foreach($this->css as $_tag => $value) {
+      $this->assignValues(explode(":",$_tag),$_tag,$_subtag);
+      $this->assignValues(explode(".",$_tag),$_tag,$_class);
+      $this->assignValues(explode("#",$_tag),$_tag,$_id);
+
+      $tagmatch = (strcmp($tag, $_tag) == 0) | (strlen($_tag) == 0);
+      $subtagmatch = (strcmp($subtag, $_subtag) == 0) | (strlen($_subtag) == 0);
+      $classmatch = (strcmp($class, $_class) == 0) | (strlen($_class) == 0);
+      $idmatch = (strcmp($id, $_id) == 0);
+
+      if($tagmatch & $subtagmatch & $classmatch & $idmatch) {
+        $temp = $_tag;
+        if((strlen($temp) > 0) & (strlen($_class) > 0)) {
+          $temp .= ".".$_class;
+        } elseif(strlen($temp) == 0) {
+          $temp = ".".$_class;
+        }
+        if((strlen($temp) > 0) & (strlen($_subtag) > 0)) {
+          $temp .= ":".$_subtag;
+        } elseif(strlen($temp) == 0) {
+          $temp = ":".$_subtag;
+        }
+        foreach($this->css[$temp] as $property => $value) {
+          $result[$property] = $value;
+        }
+      }
+    }
+    return $result;
+  }
+
+  function ParseStr($str) {
+    $this->Clear();
+    // Remove comments
+    $str = preg_replace("/\/\*(.*)?\*\//Usi", "", $str);
+    // Parse this damn csscode
+    $parts = explode("}",$str);
+    if(count($parts) > 0) {
+      foreach($parts as $part) {
+        $keystr='';$codestr='';
+        $this->assignValues(explode("{",$part),$keystr,$codestr);
+        $keys = explode(",",trim($keystr));
+        if(count($keys) > 0) {
+          foreach($keys as $key) {
+            if(strlen($key) > 0) {
+              $key = str_replace("\n", "", $key);
+              $key = str_replace("\\", "", $key);
+              $this->Add($key, trim($codestr));
+            }
+          }
+        }
+      }
+    }
+    //
+    return (count($this->css) > 0);
+  }
+
+  function Parse($filename) {
+    $this->Clear();
+    if(file_exists($filename)) {
+      return $this->ParseStr(file_get_contents($filename));
+    } else {
+      return false;
+    }
+  }
+
+  function GetCSS() {
+    $result = "";
+    foreach($this->css as $key => $values) {
+      $result .= $key." {\n";
+      foreach($values as $key => $value) {
+        $result .= "  $key: $value;\n";
+      }
+      $result .= "}\n\n";
+    }
+    return $result;
+  }
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/gral_lib/functions.php b/backup/cc/cc_lib/gral_lib/functions.php
new file mode 100644 (file)
index 0000000..fcacf81
--- /dev/null
@@ -0,0 +1,131 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Librería de funciones básicas V1.0 (June, 16th 2009)
+ *
+ *
+ * @author Daniel Mühlrad
+ * @link daniel.muhlrad@uvcms.com
+ * @version 1.0
+ * @copyright 2009
+ *
+ */
+
+
+
+
+/**
+ * Make a Handler error with an exception msg error
+ *
+ * @param integer $errno
+ * @param string $errstr
+ * @param string $errfile
+ * @param string $errline
+ */
+function errorHandler($errno, $errstr, $errfile, $errline) {
+       // si deseas podes guardarlos en un archivo
+       ($errfile);($errline);
+       throw new Exception($errstr, $errno);
+}
+
+
+
+/**
+ * Return de mime-type of a file
+ *
+ * @param string $file
+ * @param string $default_type
+ *
+ */
+function file_mime_type ($file, $default_type = 'application/octet-stream'){
+    $ftype = $default_type;
+    $magic_path =   dirname(__FILE__)
+                  . DIRECTORY_SEPARATOR
+                  . '..'
+                  . DIRECTORY_SEPARATOR
+                  . 'magic'
+                  . DIRECTORY_SEPARATOR
+                  . 'magic';
+    $finfo = @finfo_open(FILEINFO_MIME , $magic_path);
+    if ($finfo !== false) {
+
+        $fres = @finfo_file($finfo, $file);
+
+        if ( is_string($fres) && !empty($fres) ) {
+            $ftype = $fres;
+        }
+        @finfo_close($finfo);
+    }
+    return $ftype;
+}
+
+
+
+
+function array_remove_by_value($arr,$value) {
+    return array_values(array_diff($arr,array($value)));
+
+}
+
+
+function array_remove_by_key($arr,$key) {
+    return array_values(array_diff_key($arr,array($key)));
+
+}
+
+
+function cc_print_object($object) {
+    echo '<pre>' . htmlspecialchars(print_r($object,true)) . '</pre>';
+}
+
+
+
+/**
+ * IndexOf - first version of find an element in the Array given
+ * returns the index of the *first* occurance
+ * @param mixed $needle
+ * @param array $haystack
+ * @return mixed The element or false if the function didnt find it
+ */
+
+function indexOf($needle, $haystack) {
+    for ($i = 0; $i < count($haystack) ; $i++) {
+            if ($haystack[$i] == $needle) {
+                return $i;
+            }
+    }
+    return false;
+}
+
+
+/**
+ * IndexOf2 - second version of find an element in the Array given
+ *
+ * @param mixed $needle
+ * @param array $haystack
+ * @return mixed The index of the element or false if the function didnt find it
+ */
+
+function indexOf2($needle, $haystack) {
+    for($i = 0,$z = count($haystack); $i < $z; $i++){
+        if ($haystack[$i] == $needle) {  //finds the needle
+            return $i;
+        }
+    }
+    return false;
+}
+
diff --git a/backup/cc/cc_lib/gral_lib/parser.php b/backup/cc/cc_lib/gral_lib/parser.php
new file mode 100644 (file)
index 0000000..00e0dc3
--- /dev/null
@@ -0,0 +1,149 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+require_once $CFG->dirroot .'/backup/cc/cc_lib/xmlbase.php';
+require_once 'cssparser.php';
+require_once 'pathutils.php';
+
+
+
+function is_url($url) {
+    if (
+         !preg_match('#^http\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) &&
+         !preg_match('#^https\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) &&
+         !preg_match('#^ftp\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url)
+        ) {
+        $status = false;
+    } else {
+        $status = true;
+    }
+    return $status;
+}
+
+function GetDepFiles($manifestroot, $fname,$folder,&$filenames) {
+
+    $extension      = end(explode('.',$fname));
+    $filenames      = array();
+    $dcx            = new XMLGenericDocument();
+    $result         = true;
+
+    switch ($extension){
+        case 'xml':
+                 $result = @$dcx->loadXMLFile($manifestroot.$folder.$fname);
+                 if (!$result) {
+                    $result = @$dcx->loadXMLFile($manifestroot.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.$fname);
+                 }
+                 GetDepFilesXML($manifestroot, $fname,$filenames,$dcx, $folder);
+            break;
+        case 'html':
+        case 'htm':
+                 $result = @$dcx->loadHTMLFile($manifestroot.$folder.$fname);
+                 if (!$result) {
+                    $result = @$dcx->loadHTMLFile($manifestroot.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.$fname);
+                 }
+                 GetDepFilesHTML($manifestroot, $fname,$filenames,$dcx, $folder);
+            break;
+    }
+    return $result;
+}
+
+
+
+function GetDepFilesXML ($manifestroot, $fname,&$filenames,&$dcx, $folder){
+        $nlist = $dcx->nodeList("//img/@src | //attachments/attachment/@href  | //link/@href | //script/@src");
+        $css_obj_array = array();
+        foreach ($nlist as $nl) {
+            $item = $nl->nodeValue;
+            $path_parts = pathinfo($item);
+            $fname = $path_parts['basename'];
+            $ext   = array_key_exists('extension',$path_parts) ? $path_parts['extension'] : '';
+            if (!is_url($nl->nodeValue)) {
+              //$file =   $folder.$nl->nodeValue; // DEPENDERA SI SE QUIERE Q SEA RELATIVO O ABSOLUTO
+              $file =   $nl->nodeValue;
+              toNativePath($file);
+              $filenames[]=$file;
+            }
+        }
+        $dcx->registerNS('qti','http://www.imsglobal.org/xsd/imscc/ims_qtiasiv1p2.xsd');
+        $dcx->resetXpath();
+        $nlist = $dcx->nodeList("//qti:mattext | //text");
+        $dcx2 = new XMLGenericDocument();
+        foreach ($nlist as $nl) {
+            if ($dcx2->loadString($nl->nodeValue)){
+                GetDepFilesHTML($manifestroot,$fname,$filenames,$dcx2,$folder);
+            }
+        }
+}
+
+
+
+function GetDepFilesHTML ($manifestroot, $fname,&$filenames,&$dcx, $folder){
+        $dcx->resetXpath();
+        $nlist = $dcx->nodeList("//img/@src | //link/@href | //script/@src | //a[not(starts-with(@href,'#'))]/@href");
+        $css_obj_array=array();
+        foreach ($nlist as $nl) {
+            $item = $nl->nodeValue;
+            $path_parts = pathinfo($item);
+            $fname = $path_parts['basename'];
+            $ext   = array_key_exists('extension',$path_parts) ? $path_parts['extension'] : '';
+            if (!is_url($folder.$nl->nodeValue) && !is_url($nl->nodeValue)) {
+              $path = $nl->nodeValue;
+              //$file = fullPath($path,"/");
+              toNativePath($path);
+              $filenames[]= $path;
+            }
+            if ($ext == 'css') {
+                $css = new cssparser();
+                $css->Parse($dcx->filePath().$nl->nodeValue);
+                $css_obj_array[$item]=$css;
+            }
+        }
+        $nlist = $dcx->nodeList("//*/@class");
+        foreach ($nlist as $nl) {
+            $item = $nl->nodeValue;
+            foreach ($css_obj_array as $csskey => $cssobj) {
+                $bimg = $cssobj->Get($item,"background-image");
+                $limg = $cssobj->Get($item,"list-style-image");
+                $npath = pathinfo($csskey);
+                if ((!empty($bimg))&& ($bimg != 'none')) {
+                    $filenames[] = stripUrl($bimg,$npath['dirname'].'/');
+                } else
+                if ((!empty($limg))&& ($limg != 'none')) {
+                    $filenames[] = stripUrl($limg,$npath['dirname'].'/');
+                }
+            }
+        }
+        $elems_to_check = array("body","p","ul","h4","a","th");
+        $do_we_have_it = array();
+        foreach ($elems_to_check as $elem) {
+            $do_we_have_it[$elem]=($dcx->nodeList("//".$elem)->length > 0);
+        }
+        foreach ($elems_to_check as $elem) {
+            if ($do_we_have_it[$elem]) {
+                foreach ($css_obj_array as $csskey => $cssobj) {
+                    $sb = $cssobj->Get($elem, "background-image");
+                    $sbl = $cssobj->Get($elem,"list-style-image");
+                    $npath = pathinfo($csskey);
+                    if ((!empty($sb)) && ($sb != 'none')) {
+                        $filenames[] = stripUrl($sb,$npath['dirname'].'/');
+                    } else
+                    if ((!empty($sbl)) && ($sbl != 'none')) {
+                        $filenames[] = stripUrl($sbl,$npath['dirname'].'/');
+                    }
+                }
+            }
+        }
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/gral_lib/pathutils.php b/backup/cc/cc_lib/gral_lib/pathutils.php
new file mode 100644 (file)
index 0000000..4e2bbb3
--- /dev/null
@@ -0,0 +1,419 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Function expands all relative parts of supplied path string thus
+ * removing things like ../../ or ./../.
+ *
+ * @param string $path
+ * @param string $dirsep Character that represents directory separator should be
+ *                       specified here. Default is DIRECTORY_SEPARATOR.
+ * @return string
+ */
+function fullPath($path,$dirsep=DIRECTORY_SEPARATOR) {
+    $token = '$IMS-CC-FILEBASE$';
+    $path = str_replace($token,'',$path);
+    if ( is_string($path) && ($path != '') ) {
+        $sep   = $dirsep;
+        $dotDir= '.';
+        $upDir = '..';
+        $length= strlen($path);
+        $rtemp= trim($path);
+        $start = strrpos($path, $sep);
+        $canContinue = ($start !== false);
+        $result= $canContinue ? '': $path;
+        $rcount=0;
+        while ($canContinue) {
+            $dirPart = ($start !== false) ? substr($rtemp,$start+1,$length-$start) : $rtemp;
+            $canContinue = ($dirPart !== false);
+            if ($canContinue) {
+                if ($dirPart != $dotDir) {
+                    if ($dirPart == $upDir) {
+                        $rcount++;
+                    } else {
+                        if ($rcount > 0) {
+                            $rcount--;
+                        } else {
+                            $result = ($result == '') ? $dirPart : $dirPart.$sep.$result;
+                        }
+                    }
+                }
+                $rtemp = substr($path,0,$start);
+                $start = strrpos($rtemp, $sep);
+                $canContinue = (($start !== false) || (strlen($rtemp) > 0));
+            }
+        } //end while
+    }
+    return $result;
+}
+
+
+
+/**
+ * Function strips url part from css link
+ *
+ * @param string $path
+ * @param string $rootDir
+ * @return string
+ */
+function stripUrl($path, $rootDir='') {
+    $result = $path;
+    if ( is_string($path) && ($path != '') ) {
+        $start=strpos($path,'(')+1;
+        $length=strpos($path,')')-$start;
+        $rut = $rootDir.substr($path,$start,$length);
+        $result=fullPath($rut,'/');
+    }
+    return $result;
+}
+
+/**
+ * Converts direcotry separator in given path to / to validate in CC
+ * Value is passed byref hence variable itself is changed
+ *
+ * @param string $path
+ */
+function toNativePath(&$path) {
+    for ($count = 0 ; $count < strlen($path); ++$count) {
+        $chr = $path{$count};
+        if (($chr == '\\') || ($chr == '/')) {
+            $path{$count} = '/';
+        }
+    }
+}
+
+
+/**
+ * Converts direcotry separator in given path to the one on the server platform
+ * Value is passed byref hence variable itself is changed
+ *
+ * @param string $path
+ */
+function toNativePath2(&$path) {
+    for ($count = 0 ; $count < strlen($path); ++$count) {
+        $chr = $path{$count};
+        if (($chr == '\\') || ($chr == '/')) {
+            $path{$count} = DIRECTORY_SEPARATOR;
+        }
+    }
+}
+
+/**
+ * Converts \ Directory separator to the / more suitable for URL
+ *
+ * @param string $path
+ */
+function toUrlPath(&$path) {
+    for ($count = 0 ; $count < strlen($path); ++$count) {
+        $chr = $path{$count};
+        if (($chr == '\\')) {
+            $path{$count} = '/';
+        }
+    }
+}
+
+/**
+ * Returns relative path from two directories with full path
+ *
+ * @param string $path1
+ * @param string $path2
+ * @return string
+ */
+function pathDiff($path1, $path2) {
+    toUrlPath($path1);
+    toUrlPath($path2);
+    $result = "";
+    $bl2 = strlen($path2);
+    $a = strpos($path1,$path2);
+    if ($a !== false) {
+        $result = trim(substr($path1,$bl2+$a),'/');
+    }
+    return $result;
+}
+
+ /**
+  * Copy a file, or recursively copy a folder and its contents
+  *
+  * @author      Aidan Lister <aidan@php.net>
+  * @version     1.0.1
+  * @link        http://aidanlister.com/repos/v/function.copyr.php
+  * @param       string   $source    Source path
+  * @param       string   $dest      Destination path
+  * @return      bool     Returns TRUE on success, FALSE on failure
+  */
+ function copyr($source, $dest)
+ {
+     // Simple copy for a file
+     if (is_file($source)) {
+         return copy($source, $dest);
+     }
+
+     // Make destination directory
+     if (!is_dir($dest)) {
+         mkdir($dest);
+     }
+
+     // Loop through the folder
+     $dir = dir($source);
+     while (false !== $entry = $dir->read()) {
+         // Skip pointers
+         if ($entry == '.' || $entry == '..') {
+             continue;
+         }
+
+         // Deep copy directories
+         if ($dest !== "$source/$entry") {
+             copyr("$source/$entry", "$dest/$entry");
+         }
+     }
+
+     // Clean up
+     $dir->close();
+     return true;
+ }
+
+/**
+ * Function returns array with directories contained in folder (only first level)
+ *
+ * @param  string $rootDir  directory to look into
+ * @param  string $contains which string to look for
+ * @param  array  $excludeitems array of names to be excluded
+ * @param  bool   $startswith should the $contains value be searched only from
+ *                             beginning
+ * @return array  Returns array of sub-directories. In case $rootDir path is
+ *                invalid it returns FALSE.
+ */
+function getDirectories($rootDir, $contains, $excludeitems = null, $startswith = true) {
+    $result = is_dir($rootDir);
+    if ($result) {
+        $dirlist = dir($rootDir);
+        $entry = null;
+        $result = array();
+        while(false !== ($entry = $dirlist->read())) {
+            $currdir = $rootDir.$entry;
+            if (is_dir($currdir)) {
+                $bret = strpos($entry,$contains);
+                if (($bret !== false)) {
+                    if (($startswith && ($bret == 0)) || !$startswith) {
+                        if (!( is_array($excludeitems) && in_array($entry,$excludeitems) )) {
+                            $result[] = $entry;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return $result;
+}
+
+function getFilesOnly($rootDir, $contains, $excludeitems = null, $startswith = true,$extension=null) {
+    $result = is_dir($rootDir);
+    if ($result) {
+        $filelist = dir($rootDir);
+        $entry = null;
+        $result = array();
+        while(false !== ($entry = $filelist->read())) {
+            $curritem = $rootDir.$entry;
+            $pinfo = pathinfo($entry);
+            $ext = array_key_exists('extension',$pinfo) ? $pinfo['extension'] : null;
+            if (is_file($curritem) && (is_null($extension) || ($ext == $extension) )) {
+                $bret = strpos($entry,$contains);
+                if (($bret !== false)) {
+                    if (($startswith && ($bret == 0)) || !$startswith) {
+                        if (!( is_array($excludeitems) && in_array($entry,$excludeitems) )) {
+                            $result[] = $entry;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    natcasesort($result);
+    return $result;
+}
+
+
+
+/**
+ * Search an identifier in array
+ *
+ * @param array $array
+ * @param string $name
+ *
+ */
+
+function search_ident_by_name($array,$name){
+    if (empty($array)){
+        throw new Exception('The array given is null');
+    }
+    $ident = null;
+    foreach ($array as $k => $v){
+        ($k);
+        if ($v[1] == $name){
+            $ident = $v[0];
+            break;
+        }
+    }
+    return $ident;
+}
+
+
+
+
+
+/**
+ * Function returns files recursivly with appeneded relative path
+ *
+ * @param string $startDir
+ * @param string $rootDir
+ * @param array $excludedirs
+ * @param array $excludefileext
+ * @return array
+ */
+function getRawFiles($startDir, &$fhandle, $rootDir='', $excludedirs = null, $excludefileext = null) {
+    $result = is_dir($startDir);
+    if ($result) {
+        $dirlist = dir($startDir);
+        $entry = null;
+        while(false !== ($entry = $dirlist->read())) {
+            $curritem = $startDir.$entry;
+            if (($entry=='.') || ($entry =='..')) {
+                continue;
+            }
+            if (is_dir($curritem)) {
+                if (!( is_array($excludedirs) && in_array($entry,$excludedirs) )) {
+                    getRawFiles($startDir.$entry."/",$fhandle,$rootDir.$entry."/",$excludedirs,$excludefileext);
+                }
+                continue;
+            }
+            if (is_file($curritem)){
+                $pinfo = pathinfo($entry);
+                $ext = array_key_exists('extension',$pinfo) ? $pinfo['extension'] : '';
+                if (!is_array($excludefileext) ||
+                               (is_array($excludefileext) && !in_array($ext,$excludefileext))) {
+                    fwrite($fhandle,$rootDir.$entry."\n");
+                }
+            }
+        }
+    }
+    return $result;
+}
+
+
+function getRawFiles2($startDir,&$arr, $rootDir='', $excludedirs = null, $excludefileext = null) {
+
+    $result = is_dir($startDir);
+    if ($result) {
+        $dirlist = dir($startDir);
+        $entry = null;
+        while(false !== ($entry = $dirlist->read())) {
+            $curritem = $startDir.$entry;
+            if (($entry=='.') || ($entry =='..')) {
+                continue;
+            }
+            if (is_dir($curritem)) {
+                if (!( is_array($excludedirs) && in_array($entry,$excludedirs) )) {
+                    getRawFiles2($startDir.$entry."/",$arr,$rootDir.$entry."/",$excludedirs,$excludefileext);
+                }
+                continue;
+            }
+            if (is_file($curritem)){
+                $pinfo = pathinfo($entry);
+                $ext = array_key_exists('extension',$pinfo) ? $pinfo['extension'] : '';
+                if (!is_array($excludefileext) ||
+                (is_array($excludefileext) && !in_array($ext,$excludefileext))) {
+                    array_push($arr,$rootDir.$entry);
+                   // fwrite($fhandle,$rootDir.$entry."\n");
+                }
+            }
+        }
+    }
+    return $result;
+}
+
+
+function GetFiles($startDir, $outfile, $rootDir='', $excludedirs = null, $excludefileext = null) {
+    $fh = @fopen($outfile,"w+");
+    if ($fh !== FALSE) {
+        getRawFiles($startDir,$fh,$rootDir,$excludedirs,$excludefileext);
+        @fclose($fh);
+        @chmod($outfile,0777);
+    }
+}
+
+
+/**
+ * Function to get an array with all files in a directory and subdirectories
+ *
+ * @param string $startDir
+ * @param string $rootDir
+ * @param string $excludedirs
+ * @param string $excludefileext
+ * @return array
+ */
+
+function GetFilesArray($startDir, $rootDir='', $excludedirs = null, $excludefileext = null) {
+    $arr = array();
+    getRawFiles2($startDir,$arr,$rootDir,$excludedirs,$excludefileext);
+    return $arr;
+}
+
+
+
+/**
+ * Function returns array with directories contained in folder (only first level)
+ * simmilar to getDirectories but returned items are naturally sorted.
+ *
+ * @param string $rootDir
+ * @param string $contains
+ * @param array $excludeitems
+ * @param bool $startswith
+ * @return array
+ */
+function getCourseDirs ($rootDir, $contains, $excludeitems=null, $startswith=true) {
+    $result = getDirectories($rootDir,$contains,$excludeitems,$startswith);
+    if ($result !== false) {
+        natcasesort($result);
+        $result = array_values($result);
+    }
+    return $result;
+}
+
+
+/**
+ * Delete a directory recursive with files inside
+ *
+ * @param string $dirname
+ * @return bool
+ */
+function rmdirr($dirname)
+{
+    if (!file_exists($dirname)) {
+        return false;
+    }
+    if (is_file($dirname) || is_link($dirname)) {
+        return unlink($dirname);
+    }
+    $dir = dir($dirname);
+    while (false !== $entry = $dir->read()) {
+        if ($entry == '.' || $entry == '..') {
+            continue;
+        }
+        rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);
+    }
+    $dir->close();
+    return rmdir($dirname);
+}
\ No newline at end of file
diff --git a/backup/cc/cc_lib/xmlbase.php b/backup/cc/cc_lib/xmlbase.php
new file mode 100644 (file)
index 0000000..0edb9e7
--- /dev/null
@@ -0,0 +1,406 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package    backup-convert
+* @subpackage cc-library
+* @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'gral_lib/cssparser.php';
+
+/**
+ * Base XML class
+ *
+ */
+class XMLGenericDocument {
+
+
+    private   $charset;
+    /**
+     *
+     * Document
+     * @var DOMDocument
+     */
+    public    $doc = null;
+    /**
+     *
+     * Xpath
+     * @var DOMXPath
+     */
+    protected $dxpath = null;
+    private   $filename;
+    private   $filepath;
+    private   $isloaded         = false;
+    private   $arrayPrefixNS    = array();
+    private   $is_html          = false;
+
+
+       function __construct($ch = 'UTF-8',$validatenow=true){
+               $this->charset = $ch;
+               $this->documentInit();
+               $this->doc->validateOnParse = $validatenow;
+       }
+
+       function __destruct(){
+               $this->dxpath = null;
+               $this->doc = null;
+       }
+
+       private function documentInit($withonCreate=true) {
+               $hg = false;
+               if ($this->isloaded){
+                       $guardstate = $this->doc->validateOnParse;
+                       $hg = true;
+                       unset($this->dxpath);
+                       unset($this->doc);
+                       $this->isloaded = false;
+               }
+               $this->doc = new DOMDocument("1.0",$this->charset);
+               $this->doc->strictErrorChecking = true;
+               if ($hg) {
+                       $this->doc->validateOnParse = $guardstate;
+               }
+               $this->doc->formatOutput = true;
+               $this->doc->preserveWhiteSpace = true;
+               if($withonCreate) {
+                       $this->on_create();
+               }
+       }
+
+       public function viewXML (){
+           return $this->doc->saveXML;
+       }
+
+       public function registerNS($prefix, $nsuri) {
+               $this->arrayPrefixNS[$prefix]=$nsuri;
+       }
+
+       public function load($fname) {
+       // Sine xml will remain loaded should the repeated load fail we should recreate document to be empty.
+               $this->documentInit(false);
+               $this->isloaded = $this->doc->load($fname);
+               if ($this->isloaded){
+                       $this->filename = $fname;
+                       $this->processPath();
+                       $this->is_html = false;
+               }
+               return $this->on_load();
+       }
+
+       public function loadUrl($url){
+               $this->documentInit();
+               $this->isloaded = true;
+               $this->doc->loadXML( file_get_contents($url) );
+               $this->is_html = false;
+               return $this->on_load();
+       }
+
+       public function loadHTML ($content){
+               $this->documentInit();
+               $this->doc->validateOnParse = false;
+               $this->isloaded = true;
+               $this->doc->loadHTML($content);
+               $this->is_html = true;
+               return $this->on_load();
+       }
+
+       public function loadXML ($content){
+               $this->documentInit();
+               $this->doc->validateOnParse = false;
+               $this->isloaded = true;
+               $this->doc->load($content);
+               $this->is_html = true;
+               return $this->on_load();
+       }
+
+       public function loadHTMLFile($fname){
+       //Sine xml will remain loaded should the repeated load fail
+       //we shoudl recreate document to be empty
+               $this->documentInit();
+               $this->doc->validateOnParse = false;
+               $this->isloaded = $this->doc->loadHTMLFile($fname);
+               if ($this->isloaded) {
+                       $this->filename = $fname;
+                       $this->processPath();
+                       $this->is_html=true;
+               }
+               return $this->on_load();
+       }
+
+    public function loadXMLFile($fname){
+    //Sine xml will remain loaded should the repeated load fail
+    //we shoudl recreate document to be empty
+        $this->documentInit();
+        $this->doc->validateOnParse = false;
+        $this->isloaded = $this->doc->load($fname);
+        if ($this->isloaded) {
+            $this->filename = $fname;
+            $this->processPath();
+            $this->is_html=true;
+        }
+        return $this->on_load();
+    }
+
+
+    public function loadString($content){
+
+        $this->doc = new DOMDocument("1.0",$this->charset);
+        $content = '<virtualtag>'.$content.'</virtualtag>';
+        $this->doc->loadXML($content);
+
+        return true;
+
+    }
+
+       public function save() {
+               $this->saveTo($this->filename);
+       }
+
+       public function saveTo($fname) {
+           $status = false;
+               if ($this->on_save()) {
+                       if ($this->is_html) {
+                               $this->doc->saveHTMLFile($fname);
+                       } else {
+                               $this->doc->save($fname);
+                       }
+                       $this->filename = $fname;
+                       $this->processPath();
+                       $status = true;
+               }
+               return $status;
+       }
+
+       public function validate() {
+               return $this->doc->validate();
+       }
+
+       public function attributeValue($path,$attrname,$node=null) {
+               $this->chkxpath();
+               $result = null;
+               $resultlist = null;
+               if (is_null($node)) {
+                       $resultlist = $this->dxpath->query($path);
+               } else {
+                       $resultlist = $this->dxpath->query($path,$node);
+               }
+               if ( is_object($resultlist) &&
+               ($resultlist->length > 0) &&
+               $resultlist->item(0)->hasAttribute($attrname)){
+                       $result = $resultlist->item(0)->getAttribute($attrname);
+               }
+               return $result;
+       }
+
+//     public function nodeValue($path,$count = 1,$node=null){
+//             $nd = $this->node($path,$count,$node);
+//             return $this->nodeTextValue($nd);
+//     }
+
+       /**
+        *
+        * Get's text value of the node based on xpath query
+        * @param string $path
+        * @param DOMNode $node
+        * @param int $count
+        * @return string
+        */
+       public function nodeValue($path, $node = null, $count = 1){
+           $nd = $this->node($path,$count,$node);
+           return $this->nodeTextValue($nd);
+       }
+
+       /**
+        *
+        * Get's text value of the node
+        * @param DOMNode $node
+        * @return string
+        */
+       public function nodeTextValue($node){
+               $result = '';
+               if (is_object($node)) {
+                       if ($node->hasChildNodes()) {
+                               $chnodesList = $node->childNodes;
+                           $types = array(XML_TEXT_NODE, XML_CDATA_SECTION_NODE);
+                               foreach ($chnodesList as $chnode) {
+                                       if (in_array($chnode->nodeType, $types)){
+                                       $result .= $chnode->wholeText;
+                                       }
+                               }
+                       }
+               }
+               return $result;
+       }
+
+       /**
+        *
+        * Enter description here ...
+        * @param string $path
+        * @param int $count
+        * @param DOMNode $nd
+        * @return DOMNode
+        */
+       public function node($path, $count = 1, $nd=null) {
+               $result = null;
+               $resultlist = $this->nodeList($path,$nd);
+               if ( is_object($resultlist) &&
+               ($resultlist->length > 0) ){
+                       $result = $resultlist->item($count -1);
+               }
+               return $result;
+       }
+
+       /**
+        *
+        * Enter description here ...
+        * @param string $path
+        * @param DOMNode $node
+        * @return DOMNodeList
+        */
+       public function nodeList($path,$node=null){
+
+               $this->chkxpath();
+
+               $resultlist = null;
+               if (is_null($node)) {
+                       $resultlist = $this->dxpath->query($path);
+               } else {
+                       $resultlist = $this->dxpath->query($path,$node);
+               }
+               return $resultlist;
+       }
+
+       /**
+        *
+        * Create new attribute
+        * @param string $namespace
+        * @param string $name
+        * @param string $value
+        * @return DOMAttr
+        */
+       public function create_attribute_ns($namespace, $name, $value = null) {
+           $result = $this->doc->createAttributeNS($namespace, $name);
+           if (!empty($value)) {
+               $result->nodeValue = $value;
+           }
+           return $result;
+       }
+
+       /**
+        *
+        * Create new attribute
+        * @param string $name
+        * @param string $value
+        * @return DOMAttr
+        */
+       public function create_attribute($name, $value = null) {
+           $result = $this->doc->createAttribute($name);
+           if (!empty($value)) {
+               $result->nodeValue = $value;
+           }
+           return $result;
+       }
+
+       /**
+        *
+        * Adds new node
+        * @param DOMNode $parentnode
+        * @param string $namespace
+        * @param string $name
+        * @param string $value
+        * @return DOMNode
+        */
+       public function append_new_element_ns(DOMNode &$parentnode, $namespace, $name, $value = null) {
+           $newnode = null;
+           if (empty($value)) {
+               $newnode = $this->doc->createElementNS($namespace, $name);
+           } else {
+               $newnode = $this->doc->createElementNS($namespace, $name, $value);
+           }
+           return $parentnode->appendChild($newnode);
+       }
+
+       /**
+        *
+        * Adds new node
+        * @param DOMNode $parentnode
+        * @param string $name
+        * @param string $value
+        * @return DOMNode
+        */
+       public function append_new_element(DOMNode &$parentnode, $name, $value = null) {
+           $newnode = null;
+           if (empty($value)) {
+               $newnode = $this->doc->createElement($name);
+           } else {
+               $newnode = $this->doc->createElement($name, $value);
+           }
+           return $parentnode->appendChild($newnode);
+       }
+
+       /**
+        *
+        * Adds new attribute
+        * @param DOMNode $node
+        * @param string $name
+        * @param string $value
+        * @return DOMNode
+        */
+       public function append_new_attribute(DOMNode &$node, $name, $value = null) {
+           return $node->appendChild($this->create_attribute($name, $value));
+       }
+
+       /**
+        *
+        * Adds new attribute
+        * @param DOMNode $node
+        * @param string $namespace
+        * @param string $name
+        * @param string $value
+        * @return DOMNode
+        */
+       public function append_new_attribute_ns(DOMNode &$node, $namespace, $name, $value = null) {
+           return $node->appendChild($this->create_attribute_ns($namespace, $name, $value));
+       }
+
+       public function fileName() {return $this->filename;}
+       public function filePath() {return $this->filepath;}
+
+       protected function on_load() {return $this->isloaded;}
+       protected function on_save() {return true;}
+       protected function on_create() {return true;}
+
+       public function resetXpath() {
+               $this->dxpath = null;
+               $this->chkxpath();
+       }
+
+       private function chkxpath() {
+               if (!isset($this->dxpath) || is_null($this->dxpath)){
+                       $this->dxpath = new DOMXPath($this->doc);
+                       foreach ($this->arrayPrefixNS as $nskey => $nsuri) {
+                               $this->dxpath->registerNamespace($nskey,$nsuri);
+                       }
+               }
+       }
+
+       private function processPath(){
+               $path_parts = pathinfo($this->filename);
+               $this->filepath = array_key_exists('dirname',$path_parts) ? $path_parts['dirname']."/" : '';
+       }
+}
index 165fcf5..9dfb396 100644 (file)
@@ -17,6 +17,7 @@
  * @package   moodlecore
  * @subpackage backup-imscc
  * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
@@ -188,21 +189,17 @@ class entities {
         }
     }
 
-    private function get_all_files () {
+    protected function get_all_files () {
 
         $all_files = array();
 
         $xpath = cc2moodle::newx_path(cc2moodle::$manifest, cc2moodle::$namespaces);
 
-        $types = array('associatedcontent/imscc_xmlv1p0/learning-application-resource',
-                       'webcontent',
-                      );
-
-        foreach ($types as $type) {
+        foreach (cc2moodle::$restypes as $type) {
 
             $files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@type="' . $type . '"]/imscc:file/@href');
 
-            if (!empty($files)) {
+            if (!empty($files) && ($files->length > 0)) {
                 foreach ($files as $file) {
                     $all_files[] = $file;
                 }
diff --git a/backup/cc/entities11.class.php b/backup/cc/entities11.class.php
new file mode 100644 (file)
index 0000000..0c1cd34
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package   moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+require_once($CFG->dirroot . '/backup/cc/entities.class.php');
+
+class entities11 extends entities {
+
+    public function get_external_xml($identifier) {
+        $xpath = cc2moodle::newx_path(cc112moodle::$manifest, cc112moodle::$namespaces);
+        $files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' .
+                 $identifier . '"]/imscc:file/@href');
+        $response = empty($files) || ($files->length == 0) ? '' : $files->item(0)->nodeValue;
+        return $response;
+    }
+
+    protected function get_all_files () {
+        $all_files = array();
+        $xpath = cc2moodle::newx_path(cc112moodle::$manifest, cc112moodle::$namespaces);
+        foreach (cc112moodle::$restypes as $type) {
+            $files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@type="' .
+                                    $type . '"]/imscc:file/@href');
+            if (empty($files) || ($files->length == 0)) {
+                continue;
+            }
+            foreach ($files as $file) {
+                $all_files[] = $file;
+            }
+            unset($files);
+        }
+
+        $all_files = empty($all_files) ? '' : $all_files;
+
+        return $all_files;
+    }
+
+}
+
index ab8ab51..143de30 100644 (file)
  * @package   moodlecore
  * @subpackage backup-imscc
  * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
 
-class forum extends entities {
+class cc_forum extends entities {
+
+    public function full_path ($path, $dir_sep = DIRECTORY_SEPARATOR) {
+
+        $token = '$IMS-CC-FILEBASE$';
+        $path = str_replace($token, '', $path);
+
+        if (is_string($path) && ($path != '')) {
+            $dir_sep;
+            $dot_dir = '.';
+            $up_dir = '..';
+            $length = strlen($path);
+            $rtemp = trim($path);
+            $start = strrpos($path, $dir_sep);
+            $can_continue = ($start !== false);
+            $result = $can_continue ? '' : $path;
+            $rcount = 0;
+
+            while ($can_continue) {
+
+                $dir_part = ($start !== false) ? substr($rtemp, $start + 1, $length - $start) : $rtemp;
+                $can_continue = ($dir_part !== false);
+
+                if ($can_continue) {
+                    if ($dir_part != $dot_dir) {
+                        if ($dir_part == $up_dir) {
+                            $rcount++;
+                        } else {
+                            if ($rcount > 0) {
+                                $rcount --;
+                            } else {
+                                $result = ($result == '') ? $dir_part : $dir_part . $dir_sep . $result;
+                            }
+                        }
+                    }
+                    $rtemp = substr($path, 0, $start);
+                    $start = strrpos($rtemp, $dir_sep);
+                    $can_continue = (($start !== false) || (strlen($rtemp) > 0));
+                }
+            }
+        }
+
+        return $result;
+    }
 
     public function generate_node () {
 
@@ -45,6 +89,7 @@ class forum extends entities {
 
         $topic_data = $this->get_topic_data($instance);
 
+        $result = '';
         if (!empty($topic_data)) {
 
             $find_tags = array('[#mod_instance#]',
@@ -53,35 +98,36 @@ class forum extends entities {
                                '[#date_now#]');
 
             $replace_values = array($instance['instance'],
-                                    $instance['title'] . ' - ' . $topic_data['title'],
-                                    $topic_data['description'],
+                                    //To be more true to the actual forum name we use only forum title
+                                    htmlentities($topic_data['title']),
+                                    htmlentities($topic_data['description']),
                                     time());
 
-            return str_replace($find_tags, $replace_values, $sheet_mod_forum);
+            $result = str_replace($find_tags, $replace_values, $sheet_mod_forum);
 
-        } else {
-            return '';
         }
+
+        return $result;
     }
 
     public function get_topic_data ($instance) {
 
         $topic_data = '';
 
-        $namespaces = array('dt' => 'http://www.imsglobal.org/xsd/imsdt_v1p0');
-
         $topic_file = $this->get_external_xml($instance['resource_indentifier']);
 
         if (!empty($topic_file)) {
 
-            $topic = $this->load_xml_resource(cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $topic_file);
+            $topic_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $topic_file;
+            $topic_file_dir = dirname($topic_file_path);
+            $topic = $this->load_xml_resource($topic_file_path);
 
             if (!empty($topic)) {
 
-                $xpath = cc2moodle::newx_path($topic, $namespaces);
+                $xpath = cc2moodle::newx_path($topic, cc2moodle::getforumns());
 
                 $topic_title = $xpath->query('/dt:topic/title');
-                $topic_title = !empty($topic_title->item(0)->nodeValue) ? $topic_title->item(0)->nodeValue : '';
+                $topic_title = !empty($topic_title->item(0)->nodeValue) ? $topic_title->item(0)->nodeValue : 'Untitled Topic';
 
                 $topic_text = $xpath->query('/dt:topic/text');
                 $topic_text = !empty($topic_text->item(0)->nodeValue) ? $this->update_sources($topic_text->item(0)->nodeValue, dirname($topic_file)) : '';
@@ -100,7 +146,7 @@ class forum extends entities {
                 $attachment_html = '';
 
                 foreach ($topic_attachments as $file) {
-                    $attachment_html .= $this->generate_attachment_html($file->nodeValue);
+                    $attachment_html .= $this->generate_attachment_html($this->full_path($file->nodeValue,'/'));
                 }
 
                 $topic_data['description'] = !empty($attachment_html) ? $topic_text . '<p>Attachments:</p>' . $attachment_html : $topic_text;
index a9b611e..ebb0416 100644 (file)
@@ -22,7 +22,7 @@
 
 defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
 
-class label extends entities {
+class cc_label extends entities {
 
     public function generate_node () {
 
@@ -47,10 +47,10 @@ class label extends entities {
                            '[#mod_name#]',
                            '[#mod_content#]',
                            '[#date_now#]');
-
+        //$instance['title']
         $replace_values = array($instance['instance'],
-                                $instance['title'],
-                                $instance['title'],
+                                'Untitled',
+                                'Untitled',
                                 time());
 
         return str_replace($find_tags, $replace_values, $sheet_mod_label);
index ec97d23..79ff905 100644 (file)
  * @package   moodlecore
  * @subpackage backup-imscc
  * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
 
-class quiz extends entities {
-
-    private $namespaces = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2');
+class cc_quiz extends entities {
 
     public function generate_node_question_categories () {
 
@@ -141,15 +140,15 @@ class quiz extends entities {
                            '[#node_questions_feedback#]');
 
         $replace_values = array($instance['id'],
-                                $instance['title'],
-                                $instance['title'],
-                                $quiz_stamp,
-                                $questions_strings,
+                                htmlentities($instance['title']),
+                                htmlentities($instance['title']),
+                                htmlentities($quiz_stamp),
+                                htmlentities($questions_strings),
                                 time(),
                                 $instance['options']['max_attempts'],
                                 $instance['options']['timelimit'],
                                 $node_course_modules_quiz_question_instances,
-                                $node_course_modules_quiz_feedback);
+                                $node_course_modules_quiz_feedback); //this one has tags
 
         $node_question_mod = str_replace($find_tags, $replace_values, $sheet_question_mod);
 
@@ -158,7 +157,7 @@ class quiz extends entities {
 
     private function get_global_config ($assessment, $option, $default_value, $replace_values = '') {
 
-        $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+        $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
         $metadata = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:qtimetadata/xmlns:qtimetadatafield');
 
         foreach ($metadata as $field) {
@@ -257,7 +256,7 @@ class quiz extends entities {
         $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6);
 
         $replace_values = array($instance['id'],
-                                $instance['title'],
+                                htmlentities($instance['title']),
                                 $quiz_stamp,
                                 $node_course_question_categories_questions);
 
@@ -305,10 +304,10 @@ class quiz extends entities {
                 $question_type_node = ($question_moodle_type == MOODLE_QUIZ_SHORTANSWER) ? $this->create_node_course_question_categories_question_category_question_shortanswer($question) : $question_type_node;
 
                 $replace_values = array($question['id'],
-                                        $this->truncate_text($question['title'], 255, true),
-                                        $question['title'],
+                                        htmlentities($this->truncate_text($question['title'], 255, true)),
+                                        htmlentities($question['title']),
                                         $question_moodle_type,
-                                        $question['feedback'],
+                                        htmlentities($question['feedback']),
                                         time(),
                                         $question_type_node,
                                         $quiz_stamp,
@@ -328,7 +327,7 @@ class quiz extends entities {
 
         $questions = array();
 
-        $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+        $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
 
         if (!$is_question_bank) {
             $questions_items = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:section/xmlns:item');
@@ -398,7 +397,7 @@ class quiz extends entities {
 
     private function get_general_feedback ($assessment, $question_identifier) {
 
-        $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+        $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
 
         $respconditions = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
 
@@ -443,7 +442,7 @@ class quiz extends entities {
 
     private function get_feedback ($assessment, $identifier, $item_identifier, $question_type) {
 
-        $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+        $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
 
         $resource_processing = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
 
@@ -488,7 +487,7 @@ class quiz extends entities {
 
     private function get_answers_fib ($question_identifier, $identifier, $assessment, &$last_answer_id) {
 
-        $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+        $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
 
         $answers_fib = array();
 
@@ -554,7 +553,7 @@ class quiz extends entities {
 
     private function get_answers_pattern_match ($question_identifier, $identifier, $assessment, &$last_answer_id) {
 
-        $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+        $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
 
         $answers_fib = array();
 
@@ -630,7 +629,7 @@ class quiz extends entities {
 
     private function get_answers ($identifier, $assessment, &$last_answer_id) {
 
-        $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+        $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
 
         $answers = array();
 
@@ -719,7 +718,7 @@ class quiz extends entities {
 
     private function get_score ($assessment, $identifier, $question_identifier) {
 
-        $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+        $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
 
         $resource_processing = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
 
@@ -765,7 +764,7 @@ class quiz extends entities {
                            '[#is_single#]');
 
         $replace_values = array($node_course_question_categories_question_answer,
-                                $answer_string,
+                                htmlentities($answer_string),
                                 $is_single);
 
         $node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question);
@@ -820,8 +819,8 @@ class quiz extends entities {
                            '[#use_case#]',
                            '[#node_course_question_categories_question_category_question_answer#]');
 
-        $replace_values = array($answers_string,
-                                $use_case,
+        $replace_values = array(htmlentities($answers_string),
+                                htmlentities($use_case),
                                 $node_course_question_categories_question_answer);
 
 
@@ -867,7 +866,7 @@ class quiz extends entities {
                            '[#false_answer_id#]');
 
         $replace_values = array($node_course_question_categories_question_answer,
-                                $true_answer_id,
+                                htmlentities($true_answer_id),
                                 $false_answer_id);
 
         $node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question);
@@ -901,7 +900,7 @@ class quiz extends entities {
                            '[#answer_feedback#]');
 
         $replace_values = array($answer['id'],
-                                $answer['title'],
+                                htmlentities($answer['title']),
                                 $answer['score'],
                                 $answer['feedback']);
 
@@ -912,7 +911,7 @@ class quiz extends entities {
 
     private function get_question_type ($identifier, $assessment) {
 
-        $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+        $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
 
         $metadata = $xpath->query('//xmlns:item[@ident="' . $identifier . '"]/xmlns:itemmetadata/xmlns:qtimetadata/xmlns:qtimetadatafield');
 
index 92408fb..788503e 100644 (file)
  * @package   moodlecore
  * @subpackage backup-imscc
  * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
 
-class resource extends entities {
-
-    private $namespaces = array('wl' => 'http://www.imsglobal.org/xsd/imswl_v1p0');
+class cc_resource extends entities {
 
     public function generate_node () {
 
@@ -46,9 +45,9 @@ class resource extends entities {
     private function create_node_course_modules_mod_resource ($sheet_mod_resource, $instance) {
 
         $link = '';
-        $xpath = cc2moodle::newx_path(CC2Moodle::$manifest, CC2Moodle::$namespaces);
+        $xpath = cc2moodle::newx_path(cc2moodle::$manifest, cc2moodle::$namespaces);
 
-        if ($instance['common_cartriedge_type'] == CC_TYPE_WEBCONTENT || $instance['common_cartriedge_type'] == CC_TYPE_ASSOCIATED_CONTENT) {
+        if ($instance['common_cartriedge_type'] == cc2moodle::CC_TYPE_WEBCONTENT || $instance['common_cartriedge_type'] == cc2moodle::CC_TYPE_ASSOCIATED_CONTENT) {
             $resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/@href');
             $resource = !empty($resource->item(0)->nodeValue) ? $resource->item(0)->nodeValue : '';
 
@@ -66,7 +65,7 @@ class resource extends entities {
             }
         }
 
-        if ($instance['common_cartriedge_type'] == CC_TYPE_WEBLINK) {
+        if ($instance['common_cartriedge_type'] == cc2moodle::CC_TYPE_WEBLINK) {
 
             $external_resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/imscc:file/@href')->item(0)->nodeValue;
 
@@ -75,9 +74,11 @@ class resource extends entities {
                 $resource = $this->load_xml_resource(cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $external_resource);
 
                 if (!empty($resource)) {
-                    $xpath = cc2moodle::newx_path($resource, $this->namespaces);
-                    $resource = $xpath->query('/wl:webLink/url/@href');
-                    $link = $resource->item(0)->nodeValue;
+                    $xpath = cc2moodle::newx_path($resource, cc2moodle::getresourcens());
+                    $resource = $xpath->query('/wl:webLink/wl:url/@href');
+                    if ($resource->length > 0) {
+                        $link = $resource->item(0)->nodeValue;
+                    }
                 }
             }
         }
@@ -91,9 +92,9 @@ class resource extends entities {
                            '[#date_now#]');
 
         $replace_values = array($instance['instance'],
-                                $instance['title'],
+                                htmlentities($instance['title']),
                                 'file',
-                                $link,
+                                htmlentities($link),
                                 '',
                                 '',
                                 time());
diff --git a/backup/cc/entity11.basiclti.class.php b/backup/cc/entity11.basiclti.class.php
new file mode 100644 (file)
index 0000000..d15366b
--- /dev/null
@@ -0,0 +1,119 @@
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package   moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+class cc11_basiclti extends entities11 {
+
+    public function generate_node () {
+
+        cc2moodle::log_action('Creating BasicLTI mods');
+
+        $response = '';
+
+        if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_BASICLTI])) {
+            foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_BASICLTI] as $instance) {
+                $response .= $this->create_node_course_modules_mod_basiclti($instance);
+            }
+        }
+
+        return $response;
+    }
+
+    private function create_node_course_modules_mod_basiclti ($instance) {
+
+        $sheet_mod_basiclti = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_BASICLTI);
+
+        $topic_data = $this->get_basiclti_data($instance);
+
+        $result = '';
+        if (!empty($topic_data)) {
+
+            $find_tags = array('[#mod_instance#]'        ,
+                               '[#mod_basiclti_name#]'   ,
+                               '[#mod_basiclti_intro#]'  ,
+                               '[#mod_basiclti_timec#]'  ,
+                               '[#mod_basiclti_timem#]'  ,
+                               '[#mod_basiclti_toolurl#]',
+                               '[#mod_basiclti_orgid#]'  ,
+                               '[#mod_basiclti_orgurl#]' ,
+                               '[#mod_basiclti_orgdesc#]'
+                               );
+
+            $replace_values = array($instance['instance'],
+                                    $topic_data['title'],
+                                    $topic_data['description'],
+                                    time(),time(),
+                                    $topic_data['launchurl'],
+                                    $topic_data['orgid'],
+                                    $topic_data['orgurl'],
+                                    $topic_data['orgdesc']
+                                    );
+
+            $result = str_replace($find_tags, $replace_values, $sheet_mod_basiclti);
+
+        }
+
+        return $result;
+    }
+
+    protected function getValue($node, $default = '') {
+        $result = $default;
+        if (is_object($node) && ($node->length > 0) && !empty($node->item(0)->nodeValue)) {
+            $result = htmlentities(trim($node->item(0)->nodeValue));
+        }
+        return $result;
+    }
+
+    public function get_basiclti_data($instance) {
+
+        $topic_data = '';
+
+        $basiclti_file = $this->get_external_xml($instance['resource_indentifier']);
+
+        if (!empty($basiclti_file)) {
+            $basiclti_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $basiclti_file;
+            $basiclti_file_dir = dirname($basiclti_file_path);
+            $basiclti = $this->load_xml_resource($basiclti_file_path);
+            if (!empty($basiclti)) {
+                $xpath = cc2moodle::newx_path($basiclti, cc112moodle::$basicltins);
+                $topic_title = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:title'),'Untitled');
+                $blti_description = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:description'));
+                $launch_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:launch_url'));
+                $tool_raw = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:code'),null);
+                $tool_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:url'),null);
+                $tool_desc = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:description'),null);
+                $topic_data['title'      ] = $topic_title;
+                $topic_data['description'] = $blti_description;
+                $topic_data['launchurl'  ] = $launch_url;
+                $topic_data['orgid'      ] = $tool_raw;
+                $topic_data['orgurl'     ] = $tool_url;
+                $topic_data['orgdesc'    ] = $tool_desc;
+            }
+        }
+
+        return $topic_data;
+    }
+
+}
+
diff --git a/backup/cc/entity11.forum.class.php b/backup/cc/entity11.forum.class.php
new file mode 100644 (file)
index 0000000..970fae1
--- /dev/null
@@ -0,0 +1,177 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package   moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+class cc11_forum extends entities11 {
+
+    public function full_path ($path, $dir_sep = DIRECTORY_SEPARATOR) {
+
+        $token = '$IMS-CC-FILEBASE$';
+        $path = str_replace($token, '', $path);
+
+        if (is_string($path) && ($path != '')) {
+            $dir_sep;
+            $dot_dir = '.';
+            $up_dir = '..';
+            $length = strlen($path);
+            $rtemp = trim($path);
+            $start = strrpos($path, $dir_sep);
+            $can_continue = ($start !== false);
+            $result = $can_continue ? '' : $path;
+            $rcount = 0;
+
+            while ($can_continue) {
+
+                $dir_part = ($start !== false) ? substr($rtemp, $start + 1, $length - $start) : $rtemp;
+                $can_continue = ($dir_part !== false);
+
+                if ($can_continue) {
+                    if ($dir_part != $dot_dir) {
+                        if ($dir_part == $up_dir) {
+                            $rcount++;
+                        } else {
+                            if ($rcount > 0) {
+                                $rcount --;
+                            } else {
+                                $result = ($result == '') ? $dir_part : $dir_part . $dir_sep . $result;
+                            }
+                        }
+                    }
+                    $rtemp = substr($path, 0, $start);
+                    $start = strrpos($rtemp, $dir_sep);
+                    $can_continue = (($start !== false) || (strlen($rtemp) > 0));
+                }
+            }
+        }
+
+        return $result;
+    }
+
+    public function generate_node () {
+
+        cc2moodle::log_action('Creating Forum mods');
+
+        $response = '';
+
+        if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_FORUM])) {
+            foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_FORUM] as $instance) {
+                $response .= $this->create_node_course_modules_mod_forum($instance);
+            }
+        }
+
+        return $response;
+    }
+
+    private function create_node_course_modules_mod_forum ($instance) {
+
+        $sheet_mod_forum = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_FORUM);
+
+        $topic_data = $this->get_topic_data($instance);
+
+        $result = '';
+        if (!empty($topic_data)) {
+
+            $find_tags = array('[#mod_instance#]',
+                                   '[#mod_forum_title#]',
+                                   '[#mod_forum_intro#]',
+                                   '[#date_now#]');
+
+            $replace_values = array($instance['instance'],
+            //To be more true to the actual forum name we use only forum title
+            htmlentities($topic_data['title']),
+            htmlentities($topic_data['description']),
+            time());
+
+            $result = str_replace($find_tags, $replace_values, $sheet_mod_forum);
+
+        }
+
+        return $result;
+    }
+
+    public function get_topic_data ($instance) {
+
+        $topic_data = '';
+
+        $topic_file = $this->get_external_xml($instance['resource_indentifier']);
+
+        if (!empty($topic_file)) {
+
+            $topic_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $topic_file;
+            $topic_file_dir = dirname($topic_file_path);
+            $topic = $this->load_xml_resource($topic_file_path);
+
+            if (!empty($topic)) {
+
+                $xpath = cc2moodle::newx_path($topic, cc112moodle::$forumns);
+
+                $topic_title = $xpath->query('/dt:topic/dt:title');
+                if ($topic_title->length > 0 && !empty($topic_title->item(0)->nodeValue)) {
+                    $topic_title = $topic_title->item(0)->nodeValue;
+                } else {
+                    $topic_title = 'Untitled Topic';
+                }
+
+                $topic_text = $xpath->query('/dt:topic/dt:text');
+                $topic_text = !empty($topic_text->item(0)->nodeValue) ? $this->update_sources($topic_text->item(0)->nodeValue, dirname($topic_file)) : '';
+                $topic_text = !empty($topic_text) ? str_replace("%24", "\$", $this->include_titles($topic_text)) : '';
+
+                if (!empty($topic_title)) {
+                    $topic_data['title'] = $topic_title;
+                    $topic_data['description'] = $topic_text;
+                }
+            }
+
+            $topic_attachments = $xpath->query('/dt:topic/dt:attachments/dt:attachment/@href');
+
+            if ($topic_attachments->length > 0) {
+
+                $attachment_html = '';
+
+                foreach ($topic_attachments as $file) {
+                    $attachment_html .= $this->generate_attachment_html($this->full_path($file->nodeValue,'/'));
+                }
+
+                $topic_data['description'] = !empty($attachment_html) ? $topic_text . '<p>Attachments:</p>' . $attachment_html : $topic_text;
+            }
+        }
+
+        return $topic_data;
+    }
+
+    private function generate_attachment_html ($filename) {
+
+        $images_extensions = array('gif' , 'jpeg' , 'jpg' , 'jif' , 'jfif' , 'png' , 'bmp');
+
+        $fileinfo = pathinfo($filename);
+
+        if (in_array($fileinfo['extension'], $images_extensions)) {
+            return '<img src="$@FILEPHP@$/' . $filename . '" title="' . $fileinfo['basename'] . '" alt="' . $fileinfo['basename'] . '" /><br />';
+        } else {
+            return '<a href="$@FILEPHP@$/' . $filename . '" title="' . $fileinfo['basename'] . '" alt="' . $fileinfo['basename'] . '">' . $fileinfo['basename'] . '</a><br />';
+        }
+
+        return '';
+    }
+}
+
diff --git a/backup/cc/entity11.lti.class.php b/backup/cc/entity11.lti.class.php
new file mode 100644 (file)
index 0000000..9e1654e
--- /dev/null
@@ -0,0 +1,112 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package   moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+class cc11_lti extends entities11 {
+
+    public function generate_node () {
+
+        cc2moodle::log_action('Creating BasicLTI mods');
+
+        $response = '';
+
+        if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_LTI])) {
+            foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_LTI] as $instance) {
+                $response .= $this->create_node_course_modules_mod_basiclti($instance);
+            }
+        }
+
+        return $response;
+    }
+
+    private function create_node_course_modules_mod_basiclti ($instance) {
+
+        $sheet_mod_basiclti = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_LTI);
+
+        $topic_data = $this->get_basiclti_data($instance);
+
+        $result = '';
+        if (!empty($topic_data)) {
+
+            $find_tags = array('[#mod_instance#]'        ,
+                               '[#mod_basiclti_name#]'   ,
+                               '[#mod_basiclti_intro#]'  ,
+                               '[#mod_basiclti_timec#]'  ,
+                               '[#mod_basiclti_timem#]'  ,
+                               '[#mod_basiclti_toolurl#]'
+                               );
+
+            $replace_values = array($instance['instance'],
+                                    $topic_data['title'],
+                                    $topic_data['description'],
+                                    time(),time(),
+                                    $topic_data['launchurl']
+                                    );
+
+            $result = str_replace($find_tags, $replace_values, $sheet_mod_basiclti);
+
+        }
+
+        return $result;
+    }
+
+    protected function getValue($node, $default = '') {
+        $result = $default;
+        if (is_object($node) && ($node->length > 0) && !empty($node->item(0)->nodeValue)) {
+            $result = htmlentities(trim($node->item(0)->nodeValue));
+        }
+        return $result;
+    }
+
+    public function get_basiclti_data($instance) {
+
+        $topic_data = '';
+
+        $basiclti_file = $this->get_external_xml($instance['resource_indentifier']);
+
+        if (!empty($basiclti_file)) {
+            $basiclti_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $basiclti_file;
+            $basiclti_file_dir = dirname($basiclti_file_path);
+            $basiclti = $this->load_xml_resource($basiclti_file_path);
+            if (!empty($basiclti)) {
+                $xpath = cc2moodle::newx_path($basiclti, cc112moodle::$basicltins);
+                $topic_title = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:title'),'Untitled');
+                $blti_description = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:description'));
+                $launch_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:launch_url'));
+                $tool_raw = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:code'),null);
+                $tool_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:url'),null);
+                $tool_desc = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:description'),null);
+                $topic_data['title'      ] = $topic_title;
+                $topic_data['description'] = $blti_description;
+                $topic_data['launchurl'  ] = $launch_url;
+                $topic_data['orgid'      ] = $tool_raw;
+                $topic_data['orgurl'     ] = $tool_url;
+                $topic_data['orgdesc'    ] = $tool_desc;
+            }
+        }
+
+        return $topic_data;
+    }
+
+}
+
diff --git a/backup/cc/entity11.quiz.class.php b/backup/cc/entity11.quiz.class.php
new file mode 100644 (file)
index 0000000..a56fe2d
--- /dev/null
@@ -0,0 +1,956 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package   moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
+ * @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+class cc11_quiz extends entities11 {
+
+    public function generate_node_question_categories () {
+
+        $instances = $this->generate_instances();
+
+        $node_course_question_categories = $this->create_node_course_question_categories($instances);
+        $node_course_question_categories = empty($node_course_question_categories) ? '' : $node_course_question_categories;
+
+        return $node_course_question_categories;
+
+    }
+
+    public function generate_node_course_modules_mod () {
+
+        cc112moodle::log_action('Creating Quiz mods');
+
+        $node_course_modules_mod = '';
+        $instances = $this->generate_instances();
+
+        if (!empty($instances)) {
+            foreach ($instances as $instance) {
+                if ($instance['is_question_bank'] == 0) {
+                    $node_course_modules_mod .= $this->create_node_course_modules_mod($instance);
+                }
+            }
+        }
+
+        return $node_course_modules_mod;
+
+    }
+
+    private function create_node_course_modules_mod_quiz_feedback () {
+
+        $sheet_question_mod_feedback = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_FEEDBACK);
+
+        return $sheet_question_mod_feedback;
+    }
+
+    private function generate_instances () {
+
+        $last_instance_id = 0;
+        $last_question_id = 0;
+        $last_answer_id = 0;
+
+        $instances = '';
+
+        $types = array(MOODLE_TYPE_QUIZ, MOODLE_TYPE_QUESTION_BANK);
+
+        foreach ($types as $type) {
+
+            if (!empty(cc112moodle::$instances['instances'][$type])) {
+
+                foreach (cc112moodle::$instances['instances'][$type] as $instance) {
+
+                    if ($type == MOODLE_TYPE_QUIZ) {
+                        $is_question_bank = 0;
+                    } else {
+                        $is_question_bank = 1;
+                    }
+
+                    $assessment_file = $this->get_external_xml($instance['resource_indentifier']);
+
+                    if (!empty($assessment_file)) {
+
+                        $assessment = $this->load_xml_resource(cc112moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $assessment_file);
+
+                        if (!empty($assessment)) {
+
+                            $replace_values = array('unlimited' => 0);
+
+                            $questions = $this->get_questions($assessment, $last_question_id, $last_answer_id, dirname($assessment_file), $is_question_bank);
+                            $question_count = count($questions);
+
+                            if (!empty($question_count)) {
+
+                                $last_instance_id++;
+
+                                $instances[$instance['resource_indentifier']]['questions'] = $questions;
+                                $instances[$instance['resource_indentifier']]['id'] = $last_instance_id;
+                                $instances[$instance['resource_indentifier']]['title'] = $instance['title'];
+                                $instances[$instance['resource_indentifier']]['is_question_bank'] = $is_question_bank;
+                                $instances[$instance['resource_indentifier']]['options']['timelimit'] = $this->get_global_config($assessment, 'qmd_timelimit', 0);
+                                $instances[$instance['resource_indentifier']]['options']['max_attempts'] = $this->get_global_config($assessment, 'cc_maxattempts', 0, $replace_values);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return $instances;
+    }
+
+
+    private function create_node_course_modules_mod ($instance) {
+
+        $sheet_question_mod = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ);
+
+        $node_course_modules_quiz_question_instances = $this->create_node_course_modules_mod_quiz_question_instances($instance);
+        $node_course_modules_quiz_feedback = $this->create_node_course_modules_mod_quiz_feedback($instance);
+
+        $questions_strings = $this->get_questions_string($instance);
+        $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6);
+
+        $find_tags = array('[#mod_id#]',
+                           '[#mod_name#]',
+                           '[#mod_intro#]',
+                           '[#mod_stamp#]',
+                           '[#question_string#]',
+                           '[#date_now#]',
+                           '[#mod_max_attempts#]',
+                           '[#mod_timelimit#]',
+                           '[#node_question_instance#]',
+                           '[#node_questions_feedback#]');
+
+        $replace_values = array($instance['id'],
+                                htmlentities($instance['title']),
+                                htmlentities($instance['title']),
+                                htmlentities($quiz_stamp),
+                                htmlentities($questions_strings),
+                                time(),
+                                $instance['options']['max_attempts'],
+                                $instance['options']['timelimit'],
+                                $node_course_modules_quiz_question_instances,
+                                $node_course_modules_quiz_feedback); //this one has tags
+
+        $node_question_mod = str_replace($find_tags, $replace_values, $sheet_question_mod);
+
+        return $node_question_mod;
+    }
+
+    private function get_global_config ($assessment, $option, $default_value, $replace_values = '') {
+
+        $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+        $metadata = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:qtimetadata/xmlns:qtimetadatafield');
+
+        foreach ($metadata as $field) {
+            $field_label = $xpath->query('xmlns:fieldlabel', $field);
+            $field_label = !empty($field_label->item(0)->nodeValue) ? $field_label->item(0)->nodeValue : '';
+
+            if (strtolower($field_label) == strtolower($option)) {
+                $field_entry = $xpath->query('xmlns:fieldentry', $field);
+                $response = !empty($field_entry->item(0)->nodeValue) ? $field_entry->item(0)->nodeValue : '';
+            }
+        }
+
+        $response = !empty($response) ? trim($response) : '';
+
+        if (!empty($replace_values)) {
+            foreach ($replace_values as $key => $value) {
+                $response = ($key == $response) ? $value : $response;
+            }
+        }
+
+        $response = empty($response) ? $default_value : $response;
+
+        return $response;
+    }
+
+    private function create_node_course_modules_mod_quiz_question_instances ($instance) {
+
+        $node_course_module_mod_quiz_questions_instances = '';
+        $sheet_question_mod_instance = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_QUESTION_INSTANCE);
+
+        $find_tags = array('[#question_id#]' , '[#instance_id#]');
+
+        if (!empty($instance['questions'])) {
+
+            foreach ($instance['questions'] as $question) {
+                $replace_values = array($question['id'] , $question['id']);
+                $node_course_module_mod_quiz_questions_instances .= str_replace($find_tags, $replace_values, $sheet_question_mod_instance);
+            }
+
+            $node_course_module_mod_quiz_questions_instances = str_replace($find_tags, $replace_values, $node_course_module_mod_quiz_questions_instances);
+        }
+
+        return $node_course_module_mod_quiz_questions_instances;
+    }
+
+    private function get_questions_string ($instance) {
+
+        $questions_string = '';
+
+        if (!empty($instance['questions'])) {
+            foreach ($instance['questions'] as $question) {
+                $questions_string .= $question['id'] . ',';
+            }
+        }
+
+        $questions_string = !empty($questions_string) ? substr($questions_string, 0, strlen($questions_string) - 1) : '';
+
+        return $questions_string;
+    }
+
+    private function create_node_course_question_categories ($instances) {
+
+        $sheet_question_categories = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES);
+
+        if (!empty($instances)) {
+
+            $node_course_question_categories_question_category = '';
+
+            foreach ($instances as $instance) {
+                $node_course_question_categories_question_category .= $this->create_node_course_question_categories_question_category($instance);
+            }
+
+            $find_tags = array('[#node_course_question_categories_question_category#]');
+            $replace_values = array($node_course_question_categories_question_category);
+
+            $node_course_question_categories = str_replace($find_tags, $replace_values, $sheet_question_categories);
+        }
+
+        $node_course_question_categories = empty($node_course_question_categories) ? '' : $node_course_question_categories;
+
+        return $node_course_question_categories;
+    }
+
+    private function create_node_course_question_categories_question_category ($instance) {
+
+        $sheet_question_categories_quetion_category = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY);
+
+        $find_tags = array('[#quiz_id#]',
+                           '[#quiz_name#]',
+                           '[#quiz_stamp#]',
+                           '[#node_course_question_categories_question_category_questions#]');
+
+        $node_course_question_categories_questions = $this->create_node_course_question_categories_question_category_question($instance);
+        $node_course_question_categories_questions = empty($node_course_question_categories_questions) ? '' : $node_course_question_categories_questions;
+
+        $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6);
+
+        $replace_values = array($instance['id'],
+                                htmlentities($instance['title']),
+                                $quiz_stamp,
+                                $node_course_question_categories_questions);
+
+        $node_question_categories = str_replace($find_tags, $replace_values, $sheet_question_categories_quetion_category);
+
+        return $node_question_categories;
+    }
+
+    private function create_node_course_question_categories_question_category_question ($instance) {
+
+        global $USER;
+
+        $node_course_question_categories_question = '';
+
+        $find_tags = array('[#question_id#]',
+                           '[#question_title#]',
+                           '[#question_text#]',
+                           '[#question_type#]',
+                           '[#question_general_feedback#]',
+                           '[#date_now#]',
+                           '[#question_type_nodes#]',
+                           '[#question_stamp#]',
+                           '[#question_version#]',
+                           '[#logged_user#]');
+
+        $sheet_question_categories_question = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION);
+
+        $questions = $instance['questions'];
+
+        if (!empty($questions)) {
+
+            foreach ($questions as $question) {
+
+                $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6);
+                $quiz_version = 'localhost+' . time() . '+' . $this->generate_random_string(6);
+
+                $question_moodle_type = $question['moodle_type'];
+                $question_cc_type = $question['cc_type'];
+
+                $question_type_node = '';
+
+                $question_type_node = ($question_moodle_type == MOODLE_QUIZ_MULTIPLE_CHOICE) ? $this->create_node_course_question_categories_question_category_question_multiple_choice($question) : $question_type_node;
+                $question_type_node = ($question_moodle_type == MOODLE_QUIZ_TRUE_FALSE) ? $this->create_node_course_question_categories_question_category_question_true_false($question) : $question_type_node;
+                $question_type_node = ($question_moodle_type == MOODLE_QUIZ_ESSAY) ? $this->create_node_course_question_categories_question_category_question_eesay($question) : $question_type_node;
+                $question_type_node = ($question_moodle_type == MOODLE_QUIZ_SHORTANSWER) ? $this->create_node_course_question_categories_question_category_question_shortanswer($question) : $question_type_node;
+
+                $replace_values = array($question['id'],
+                                        htmlentities($this->truncate_text($question['title'], 255, true)),
+                                        htmlentities($question['title']),
+                                        $question_moodle_type,
+                                        htmlentities($question['feedback']),
+                                        time(),
+                                        $question_type_node,
+                                        $quiz_stamp,
+                                        $quiz_version,
+                                        $USER->id);
+
+                $node_course_question_categories_question .= str_replace($find_tags, $replace_values, $sheet_question_categories_question);
+            }
+        }
+
+        $node_course_question_categories_question = empty($node_course_question_categories_question) ? '' : $node_course_question_categories_question;
+
+        return $node_course_question_categories_question;
+    }
+
+    private function get_questions ($assessment, &$last_question_id, &$last_answer_id, $root_path, $is_question_bank) {
+
+        $questions = array();
+
+        $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+        if (!$is_question_bank) {
+            $questions_items = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:section/xmlns:item');
+        } else {
+            $questions_items = $xpath->query('/xmlns:questestinterop/xmlns:objectbank/xmlns:item');
+        }
+
+        foreach ($questions_items as $question_item) {
+
+            $count_questions = $xpath->evaluate('count(xmlns:presentation/xmlns:flow/xmlns:material/xmlns:mattext)', $question_item);
+
+            if ($count_questions == 0) {
+                $question_title = $xpath->query('xmlns:presentation/xmlns:material/xmlns:mattext', $question_item);
+            } else {
+                $question_title = $xpath->query('xmlns:presentation/xmlns:flow/xmlns:material/xmlns:mattext', $question_item);
+            }
+
+            $question_title = !empty($question_title->item(0)->nodeValue) ? $question_title->item(0)->nodeValue : '';
+
+            $question_identifier = $xpath->query('@ident', $question_item);
+            $question_identifier = !empty($question_identifier->item(0)->nodeValue) ? $question_identifier->item(0)->nodeValue : '';
+
+            if (!empty($question_identifier)) {
+
+                $question_type = $this->get_question_type($question_identifier, $assessment);
+
+                if (!empty($question_type['moodle'])) {
+
+                    $last_question_id++;
+
+                    $questions[$question_identifier]['id'] = $last_question_id;
+
+                    $question_title = $this->update_sources($question_title, $root_path);
+                    $question_title = !empty($question_title) ? str_replace("%24", "\$", $this->include_titles($question_title)) : '';
+
+                    $questions[$question_identifier]['title'] = $question_title;
+                    $questions[$question_identifier]['identifier'] = $question_identifier;
+                    $questions[$question_identifier]['moodle_type'] = $question_type['moodle'];
+                    $questions[$question_identifier]['cc_type'] = $question_type['cc'];
+                    $questions[$question_identifier]['feedback'] = $this->get_general_feedback($assessment, $question_identifier);
+                    $questions[$question_identifier]['answers'] = $this->get_answers($question_identifier, $assessment, $last_answer_id);
+
+                }
+            }
+        }
+
+        $questions = !empty($questions) ? $questions : '';
+
+        return $questions;
+    }
+
+    private function str_replace_once ($search, $replace, $subject) {
+
+        $first_char = strpos($subject, $search);
+
+        if ($first_char !== false) {
+
+            $before_str = substr($subject, 0, $first_char);
+            $after_str = substr($subject, $first_char + strlen($search));
+
+            return $before_str . $replace . $after_str;
+
+        } else {
+            return $subject;
+        }
+    }
+
+    private function get_general_feedback ($assessment, $question_identifier) {
+
+        $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+        $respconditions = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
+
+        if (!empty($respconditions)) {
+
+            foreach ($respconditions as $respcondition) {
+
+                $continue = $respcondition->getAttributeNode('continue');
+                $continue = !empty($continue->nodeValue) ? strtolower($continue->nodeValue) : '';
+
+                if ($continue == 'yes') {
+
+                    $display_feedback = $xpath->query('xmlns:displayfeedback', $respcondition);
+
+                    if (!empty($display_feedback)) {
+                        foreach ($display_feedback as $feedback) {
+
+                            $feedback_identifier = $feedback->getAttributeNode('linkrefid');
+                            $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
+
+                            if (!empty($feedback_identifier)) {
+                                $feedbacks_identifiers[] = $feedback_identifier;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        $feedback = '';
+        $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
+
+        if (!empty($feedbacks_identifiers)) {
+            foreach ($feedbacks_identifiers as $feedback_identifier) {
+                $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
+                $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
+            }
+        }
+
+        return $feedback;
+    }
+
+    private function get_feedback ($assessment, $identifier, $item_identifier, $question_type) {
+
+        $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+        $resource_processing = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
+
+        if (!empty($resource_processing)) {
+
+            foreach ($resource_processing as $response) {
+
+                $varequal = $xpath->query('xmlns:conditionvar/xmlns:varequal', $response);
+                $varequal = !empty($varequal->item(0)->nodeValue) ? $varequal->item(0)->nodeValue : '';
+
+                if (strtolower($varequal) == strtolower($identifier) || ($question_type == CC_QUIZ_ESSAY)) {
+
+                    $display_feedback = $xpath->query('xmlns:displayfeedback', $response);
+
+                    if (!empty($display_feedback)) {
+                        foreach ($display_feedback as $feedback) {
+
+                            $feedback_identifier = $feedback->getAttributeNode('linkrefid');
+                            $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
+
+                            if (!empty($feedback_identifier)) {
+                                $feedbacks_identifiers[] = $feedback_identifier;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        $feedback = '';
+        $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
+
+        if (!empty($feedbacks_identifiers)) {
+            foreach ($feedbacks_identifiers as $feedback_identifier) {
+                $feedbacks = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
+                $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
+            }
+        }
+
+        return $feedback;
+    }
+
+    private function get_answers_fib ($question_identifier, $identifier, $assessment, &$last_answer_id) {
+
+        $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+        $answers_fib = array();
+
+        $response_items = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
+
+        foreach ($response_items as $response_item) {
+
+            $setvar = $xpath->query('xmlns:setvar', $response_item);
+            $setvar = is_object($setvar->item(0)) ? $setvar->item(0)->nodeValue : '';
+
+            if ($setvar != '') {
+
+                $last_answer_id++;
+
+                $answer_title = $xpath->query('xmlns:conditionvar/xmlns:varequal[@respident="' . $identifier . '"]', $response_item);
+                $answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : '';
+
+            $case = $xpath->query('xmlns:conditionvar/xmlns:varequal/@case', $response_item);
+            $case = is_object($case->item(0)) ? $case->item(0)->nodeValue : 'no'
+                                    ;
+            $case = strtolower($case) == 'yes' ? 1 :
+                            0;
+
+                $display_feedback = $xpath->query('xmlns:displayfeedback', $response_item);
+
+                unset($feedbacks_identifiers);
+
+                if (!empty($display_feedback)) {
+
+                    foreach ($display_feedback as $feedback) {
+
+                        $feedback_identifier = $feedback->getAttributeNode('linkrefid');
+                        $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
+
+                        if (!empty($feedback_identifier)) {
+                            $feedbacks_identifiers[] = $feedback_identifier;
+                        }
+                    }
+                }
+
+                $feedback = '';
+                $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
+
+                if (!empty($feedbacks_identifiers)) {
+                    foreach ($feedbacks_identifiers as $feedback_identifier) {
+                        $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
+                        $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
+                    }
+                }
+
+                $answers_fib[] = array('id' => $last_answer_id,
+                                       'title' => $answer_title,
+                                       'score' => $setvar,
+                                       'feedback' => $feedback,
+                                       'case' => $case);
+            }
+        }
+
+        $answers_fib = empty($answers_fib) ? '' : $answers_fib;
+
+        return $answers_fib;
+    }
+
+    private function get_answers_pattern_match ($question_identifier, $identifier, $assessment, &$last_answer_id) {
+
+        $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+        $answers_fib = array();
+
+        $response_items = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
+
+        foreach ($response_items as $response_item) {
+
+            $setvar = $xpath->query('xmlns:setvar', $response_item);
+            $setvar = is_object($setvar->item(0)) ? $setvar->item(0)->nodeValue : '';
+
+            if ($setvar != '') {
+
+                $last_answer_id++;
+
+                $answer_title = $xpath->query('xmlns:conditionvar/xmlns:varequal[@respident="' . $identifier . '"]', $response_item);
+                $answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : '';
+
+                if (empty($answer_title)) {
+                    $answer_title = $xpath->query('xmlns:conditionvar/xmlns:varsubstring[@respident="' . $identifier . '"]', $response_item);
+                    $answer_title = !empty($answer_title->item(0)->nodeValue) ? '*' . $answer_title->item(0)->nodeValue . '*' : '';
+                }
+
+                if (empty($answer_title)) {
+                    $answer_title = '*';
+                }
+
+            $case = $xpath->query('xmlns:conditionvar/xmlns:varequal/@case', $response_item);
+            $case = is_object($case->item(0)) ? $case->item(0)->nodeValue : 'no'
+                                    ;
+            $case = strtolower($case) == 'yes' ? 1 :
+                            0;
+
+                $display_feedback = $xpath->query('xmlns:displayfeedback', $response_item);
+
+                unset($feedbacks_identifiers);
+
+                if (!empty($display_feedback)) {
+
+                    foreach ($display_feedback as $feedback) {
+
+                        $feedback_identifier = $feedback->getAttributeNode('linkrefid');
+                        $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
+
+                        if (!empty($feedback_identifier)) {
+                            $feedbacks_identifiers[] = $feedback_identifier;
+                        }
+                    }
+                }
+
+                $feedback = '';
+                $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
+
+                if (!empty($feedbacks_identifiers)) {
+                    foreach ($feedbacks_identifiers as $feedback_identifier) {
+                        $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
+                        $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
+                    }
+                }
+
+                $answers_fib[] = array('id' => $last_answer_id,
+                                       'title' => $answer_title,
+                                       'score' => $setvar,
+                                       'feedback' => $feedback,
+                                       'case' => $case);
+            }
+        }
+
+        $answers_fib = empty($answers_fib) ? '' : $answers_fib;
+
+        return $answers_fib;
+    }
+
+
+    private function get_answers ($identifier, $assessment, &$last_answer_id) {
+
+        $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+        $answers = array();
+
+        $question_cc_type = $this->get_question_type($identifier, $assessment);
+        $question_cc_type = $question_cc_type['cc'];
+
+        if ($question_cc_type == CC_QUIZ_MULTIPLE_CHOICE || $question_cc_type == CC_QUIZ_MULTIPLE_RESPONSE || $question_cc_type == CC_QUIZ_TRUE_FALSE) {
+
+            $query_answers = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_lid/xmlns:render_choice/xmlns:response_label';
+            $query_answers_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_lid/xmlns:render_choice/xmlns:response_label';
+
+            $query_indentifer = '@ident';
+            $query_title = 'xmlns:material/xmlns:mattext';
+        }
+
+        if ($question_cc_type == CC_QUIZ_ESSAY) {
+
+            $query_answers = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_str';
+            $query_answers_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_str';
+
+            $query_indentifer = '@ident';
+            $query_title = 'xmlns:render_fib';
+        }
+
+        if ($question_cc_type == CC_QUIZ_FIB || $question_cc_type == CC_QUIZ_PATTERN_MACHT) {
+
+            $xpath_query = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_str/@ident';
+            $xpath_query_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_str/@ident';
+
+            $count_response = $xpath->evaluate('count(' . $xpath_query_with_flow . ')');
+
+            if ($count_response == 0) {
+                $answer_identifier = $xpath->query($xpath_query);
+            } else {
+                $answer_identifier = $xpath->query($xpath_query_with_flow);
+            }
+
+            $answer_identifier = !empty($answer_identifier->item(0)->nodeValue) ? $answer_identifier->item(0)->nodeValue : '';
+
+            if ($question_cc_type == CC_QUIZ_FIB) {
+                $answers = $this->get_answers_fib ($identifier, $answer_identifier, $assessment, $last_answer_id);
+            } else {
+                $answers = $this->get_answers_pattern_match ($identifier, $answer_identifier, $assessment, $last_answer_id);
+            }
+
+        } else {
+
+            $count_response = $xpath->evaluate('count(' . $query_answers_with_flow . ')');
+
+            if ($count_response == 0) {
+                $response_items = $xpath->query($query_answers);
+            } else {
+                $response_items = $xpath->query($query_answers_with_flow);
+            }
+
+            if (!empty($response_items)) {
+
+                foreach ($response_items as $response_item) {
+
+                    $last_answer_id++;
+
+                    $answer_identifier = $xpath->query($query_indentifer, $response_item);
+                    $answer_identifier = !empty($answer_identifier->item(0)->nodeValue) ? $answer_identifier->item(0)->nodeValue : '';
+
+                    $answer_title = $xpath->query($query_title, $response_item);
+                    $answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : '';
+
+                    $answer_feedback = $this->get_feedback($assessment, $answer_identifier, $identifier, $question_cc_type);
+
+                    $answer_score = $this->get_score($assessment, $answer_identifier, $identifier);
+
+                    $answers[] = array('id' => $last_answer_id,
+                                       'title' => $answer_title,
+                                       'score' => $answer_score,
+                                       'identifier' => $answer_identifier,
+                                       'feedback' => $answer_feedback);
+                }
+            }
+        }
+
+        $answers = empty($answers) ? '' : $answers;
+
+        return $answers;
+
+    }
+
+    private function get_score ($assessment, $identifier, $question_identifier) {
+
+        $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+        $resource_processing = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
+
+        if (!empty($resource_processing)) {
+
+            foreach ($resource_processing as $response) {
+
+                $question_cc_type = $this->get_question_type($question_identifier, $assessment);
+                $question_cc_type = $question_cc_type['cc'];
+
+                $varequal = $xpath->query('xmlns:conditionvar/xmlns:varequal', $response);
+                $varequal = !empty($varequal->item(0)->nodeValue) ? $varequal->item(0)->nodeValue : '';
+
+                if (strtolower($varequal) == strtolower($identifier)) {
+                    $score = $xpath->query('xmlns:setvar', $response);
+                    $score = !empty($score->item(0)->nodeValue) ? $score->item(0)->nodeValue : '';
+                }
+            }
+        }
+
+        $score = empty($score) ? 0 : $score;
+
+        return $score;
+    }
+
+    private function create_node_course_question_categories_question_category_question_multiple_choice ($question) {
+
+        $node_course_question_categories_question_answer = '';
+        $sheet_question_categories_question = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_MULTIPLE_CHOICE);
+
+        if (!empty($question['answers'])) {
+            foreach ($question['answers'] as $answer) {
+                $node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer);
+