function addCourse($sid, $target_id, $crs_xml)
 {
     $this->initAuth($sid);
     $this->initIlias();
     if (!$this->__checkSession($sid)) {
         return $this->__raiseError($this->__getMessage(), $this->__getMessageCode());
     }
     if (!is_numeric($target_id)) {
         return $this->__raiseError('No valid target id given. Please choose an existing reference id of an ILIAS category', 'Client');
     }
     global $rbacsystem;
     if (!($target_obj =& ilObjectFactory::getInstanceByRefId($target_id, false))) {
         return $this->__raiseError('No valid target given.', 'Client');
     }
     if (ilObject::_isInTrash($target_id)) {
         return $this->__raiseError("Parent with ID {$target_id} has been deleted.", 'CLIENT_OBJECT_DELETED');
     }
     if (!$rbacsystem->checkAccess('create', $target_id, 'crs')) {
         return $this->__raiseError('Check access failed. No permission to create courses', 'Server');
     }
     // Start import
     include_once "Modules/Course/classes/class.ilObjCourse.php";
     $newObj = new ilObjCourse();
     $newObj->setType('crs');
     $newObj->setTitle('dummy');
     $newObj->setDescription("");
     $newObj->create(true);
     // true for upload
     $newObj->createReference();
     $newObj->putInTree($target_id);
     $newObj->setPermissions($target_id);
     include_once 'Modules/Course/classes/class.ilCourseXMLParser.php';
     $xml_parser = new ilCourseXMLParser($newObj);
     $xml_parser->setXMLContent($crs_xml);
     $xml_parser->startParsing();
     return $newObj->getRefId() ? $newObj->getRefId() : "0";
 }
 /**
  * Generate courses
  *
  * @param
  * @return
  */
 function generateCourses($a_start = 1, $a_end = 500, $a_course_per_cat = 10, $a_title_base = "Course")
 {
     global $tree;
     include_once "./Modules/Course/classes/class.ilObjCourse.php";
     $this->log("Creating Courses");
     $a_current = $a_start;
     // how many categories do we need?
     $needed_cats = ceil(($a_end - $a_start + 1) / $a_course_per_cat);
     // get all categories and sort them by depth
     $nodes = $tree->getFilteredSubTree($tree->getRootId(), array("adm", "crs", "fold", "grp"));
     $nodes = ilUtil::sortArray($nodes, "depth", "desc");
     foreach ($nodes as $node) {
         if ($node["type"] == "cat" && $a_current <= $a_end) {
             for ($i = 1; $i <= $a_course_per_cat; $i++) {
                 if ($a_current <= $a_end) {
                     $this->log($a_title_base . " " . $a_current);
                     $new_crs = new ilObjCourse();
                     $new_crs->setTitle($a_title_base . " " . $a_current);
                     $new_crs->create();
                     $new_crs->createReference();
                     $new_crs->putInTree($node["child"]);
                     $new_crs->setPermissions($node["child"]);
                     $a_current++;
                 }
             }
         }
     }
 }