ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
class.ilObjMediaObject.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 define("IL_MODE_ALIAS", 1);
5 define("IL_MODE_OUTPUT", 2);
6 define("IL_MODE_FULL", 3);
7 
8 require_once("./Services/MediaObjects/classes/class.ilMediaItem.php");
9 include_once "./Services/Object/classes/class.ilObject.php";
10 
27 {
31  protected $user;
32 
36  protected $app_event_handler;
37 
38  public $is_alias;
39  public $origin_id;
40  public $media_items;
42 
47  public function __construct($a_id = 0)
48  {
49  global $DIC;
50 
51  $this->user = $DIC->user();
52  $this->app_event_handler = $DIC["ilAppEventHandler"];
53  $this->lng = $DIC->language();
54  $this->is_alias = false;
55  $this->media_items = array();
56  $this->contains_int_link = false;
57  $this->type = "mob";
58  parent::__construct($a_id, false);
59  }
60 
61  public function setRefId($a_id)
62  {
63  $this->ilias->raiseError("Operation ilObjMedia::setRefId() not allowed.", $this->ilias->error_obj->FATAL);
64  }
65 
66  public function getRefId()
67  {
68  return false;
69  }
70 
71  public function putInTree($a_parent_ref)
72  {
73  $this->ilias->raiseError("Operation ilObjMedia::putInTree() not allowed.", $this->ilias->error_obj->FATAL);
74  }
75 
76  public function createReference()
77  {
78  $this->ilias->raiseError("Operation ilObjMedia::createReference() not allowed.", $this->ilias->error_obj->FATAL);
79  }
80 
81  public function setTitle($a_title)
82  {
83  parent::setTitle($a_title);
84  }
85 
86  public function getTitle()
87  {
88  return parent::getTitle();
89  }
90 
98  public static function _exists($a_id, $a_reference = false, $a_type = null)
99  {
100  global $DIC;
101 
102  $ilDB = $DIC->database();
103 
104  include_once("./Services/Link/classes/class.ilInternalLink.php");
105  if (is_int(strpos($a_id, "_"))) {
107  }
108 
109  if (parent::_exists($a_id, false) && ilObject::_lookupType($a_id) == "mob") {
110  return true;
111  }
112  return false;
113  }
114 
118  public function delete()
119  {
120  $mob_logger = ilLoggerFactory::getLogger('mob');
121  $mob_logger->debug("ilObjMediaObject: Delete called for media object ID '" . $this->getId() . "'.");
122 
123  if (!($this->getId() > 0)) {
124  return;
125  }
126 
127  $usages = $this->getUsages();
128 
129  $mob_logger->debug("ilObjMediaObject: ... Found " . count($usages) . " usages.");
130 
131  if (count($usages) == 0) {
132  // remove directory
134 
135  // remove thumbnail directory
137 
138  // delete meta data of mob
139  $this->deleteMetaData();
140 
141  // delete media items
143 
144  // this is just to make sure, there should be no entries left at
145  // this point as they depend on the usage
146  self::handleQuotaUpdate($this);
147 
148  // delete object
149  parent::delete();
150 
151  $mob_logger->debug("ilObjMediaObject: ... deleted.");
152  } else {
153  foreach ($usages as $u) {
154  $mob_logger->debug("ilObjMediaObject: ... usage type:" . $u["type"] .
155  ", id:" . $u["id"] .
156  ", lang:" . $u["lang"] .
157  ", hist_nr:" . $u["hist_nr"] . ".");
158  }
159  $mob_logger->debug("ilObjMediaObject: ... not deleted.");
160  }
161  }
162 
168  public function getDescription()
169  {
170  return parent::getDescription();
171  }
172 
176  public function setDescription($a_description)
177  {
178  parent::setDescription($a_description);
179  }
180 
192  public function MDUpdateListener($a_element)
193  {
194  include_once 'Services/MetaData/classes/class.ilMD.php';
195 
196  switch ($a_element) {
197  case 'General':
198 
199  // Update Title and description
200  $md = new ilMD(0, $this->getId(), $this->getType());
201  $md_gen = $md->getGeneral();
202 
203  if (is_object($md_gen)) {
204  ilObject::_writeTitle($this->getId(), $md_gen->getTitle());
205  $this->setTitle($md_gen->getTitle());
206 
207  foreach ($md_gen->getDescriptionIds() as $id) {
208  $md_des = $md_gen->getDescription($id);
209  ilObject::_writeDescription($this->getId(), $md_des->getDescription());
210  $this->setDescription($md_des->getDescription());
211  break;
212  }
213  }
214 
215  break;
216 
217  default:
218  }
219  return true;
220  }
221 
225  public function createMetaData()
226  {
227  include_once 'Services/MetaData/classes/class.ilMDCreator.php';
228 
230 
231  $md_creator = new ilMDCreator(0, $this->getId(), $this->getType());
232  $md_creator->setTitle($this->getTitle());
233  $md_creator->setTitleLanguage($ilUser->getPref('language'));
234  $md_creator->setDescription($this->getDescription());
235  $md_creator->setDescriptionLanguage($ilUser->getPref('language'));
236  $md_creator->setKeywordLanguage($ilUser->getPref('language'));
237  $md_creator->setLanguage($ilUser->getPref('language'));
238  $md_creator->create();
239 
240  return true;
241  }
242 
246  public function updateMetaData()
247  {
248  include_once("Services/MetaData/classes/class.ilMD.php");
249  include_once("Services/MetaData/classes/class.ilMDGeneral.php");
250  include_once("Services/MetaData/classes/class.ilMDDescription.php");
251 
252  $md = new ilMD(0, $this->getId(), $this->getType());
253  $md_gen = $md->getGeneral();
254  $md_gen->setTitle($this->getTitle());
255 
256  // sets first description (maybe not appropriate)
257  $md_des_ids = $md_gen->getDescriptionIds();
258  if (count($md_des_ids) > 0) {
259  $md_des = $md_gen->getDescription($md_des_ids[0]);
260  $md_des->setDescription($this->getDescription());
261  $md_des->update();
262  }
263  $md_gen->update();
264  }
265 
269  public function deleteMetaData()
270  {
271  // Delete meta data
272  include_once('Services/MetaData/classes/class.ilMD.php');
273  $md = new ilMD(0, $this->getId(), $this->getType());
274  $md->deleteAll();
275  }
276 
277 
283  public function addMediaItem($a_item)
284  {
285  $this->media_items[] = $a_item;
286  }
287 
288 
294  public function &getMediaItems()
295  {
296  return $this->media_items;
297  }
298 
305  public function &getMediaItem($a_purpose)
306  {
307  foreach ($this->media_items as $media_item) {
308  if ($media_item->getPurpose() == $a_purpose) {
309  return $media_item;
310  }
311  }
312  return false;
313  }
314 
315 
319  public function removeMediaItem($a_purpose)
320  {
321  foreach ($this->media_items as $key => $media_item) {
322  if ($media_item->getPurpose() == $a_purpose) {
323  unset($this->media_items[$key]);
324  }
325  }
326  // update numbers and keys
327  $i = 1;
328  $media_items = array();
329  foreach ($this->media_items as $media_item) {
330  $media_items [$i] = $media_item;
331  $media_item->setMobId($this->getId());
332  $media_item->setNr($i);
333  $i++;
334  }
335  $this->media_items = $media_items;
336  }
337 
341  public function removeAllMediaItems()
342  {
343  $this->media_items = array();
344  }
345 
346 
347  public function getMediaItemNr($a_purpose)
348  {
349  for ($i = 0; $i < count($this->media_items); $i++) {
350  if ($this->media_items[$i]->getPurpose() == $a_purpose) {
351  return $i + 1;
352  }
353  }
354  return false;
355  }
356 
357 
358  public function hasFullscreenItem()
359  {
360  return $this->hasPurposeItem("Fullscreen");
361  }
362 
369  public function hasPurposeItem($purpose)
370  {
371  if (is_object($this->getMediaItem($purpose))) {
372  return true;
373  } else {
374  return false;
375  }
376  }
377 
378 
379 
383  public function read()
384  {
385  //echo "<br>ilObjMediaObject:read";
386  parent::read();
387 
388  // get media items
390  }
391 
395  public function setAlias($a_is_alias)
396  {
397  $this->is_alias = $a_is_alias;
398  }
399 
400  public function isAlias()
401  {
402  return $this->is_alias;
403  }
404 
405  public function setOriginID($a_id)
406  {
407  return $this->origin_id = $a_id;
408  }
409 
410  public function getOriginID()
411  {
412  return $this->origin_id;
413  }
414 
415  /*
416  function getimportId()
417  {
418  return $this->meta_data->getImportIdentifierEntryID();
419  }*/
420 
421 
425  public function getImportId()
426  {
427  return $this->import_id;
428  }
429 
430  public function setImportId($a_id)
431  {
432  $this->import_id = $a_id;
433  }
434 
438  public function create($a_create_meta_data = false, $a_save_media_items = true)
439  {
440  parent::create();
441 
442  if (!$a_create_meta_data) {
443  $this->createMetaData();
444  }
445 
446  if ($a_save_media_items) {
447  $media_items = $this->getMediaItems();
448  for ($i = 0; $i < count($media_items); $i++) {
449  $item = $media_items[$i];
450  $item->setMobId($this->getId());
451  $item->setNr($i + 1);
452  $item->create();
453  }
454  }
455 
456  self::handleQuotaUpdate($this);
457 
458  $ilAppEventHandler = $this->app_event_handler;
459  $ilAppEventHandler->raise(
460  'Services/MediaObjects',
461  'create',
462  array('object' => $this,
463  'obj_type' => 'mob',
464  'obj_id' => $this->getId())
465  );
466  }
467 
468 
472  public function update($a_upload = false)
473  {
474  parent::update();
475 
476  if (!$a_upload) {
477  $this->updateMetaData();
478  }
479 
481 
482  // iterate all items
483  $media_items = $this->getMediaItems();
484  $j = 1;
485  foreach ($media_items as $key => $val) {
486  $item = $media_items[$key];
487  if (is_object($item)) {
488  $item->setMobId($this->getId());
489  $item->setNr($j);
490  if ($item->getLocationType() == "Reference") {
491  $item->extractUrlParameters();
492  }
493  $item->create();
494  $j++;
495  }
496  }
497 
498  self::handleQuotaUpdate($this);
499  $ilAppEventHandler = $this->app_event_handler;
500  $ilAppEventHandler->raise(
501  'Services/MediaObjects',
502  'update',
503  array('object' => $this,
504  'obj_type' => 'mob',
505  'obj_id' => $this->getId())
506  );
507  }
508 
509  protected static function handleQuotaUpdate(ilObjMediaObject $a_mob)
510  {
511  global $DIC;
512 
513  $ilSetting = $DIC->settings();
514 
515  // if neither workspace nor portfolios are activated, we skip
516  // the quota update here. this due to performance reasons on installations
517  // that do not use workspace/portfolios, but heavily copy content.
518  // in extreme cases (media object in pool and personal blog, deactivate workspace, change media object,
519  // this may lead to incorrect data in the quota calculation)
520  if ($ilSetting->get("disable_personal_workspace") && !$ilSetting->get('user_portfolios')) {
521  return;
522  }
523 
524  $parent_obj_ids = array();
525  foreach ($a_mob->getUsages() as $item) {
526  $parent_obj_id = $a_mob->getParentObjectIdForUsage($item);
527  if ($parent_obj_id &&
528  !in_array($parent_obj_id, $parent_obj_ids)) {
529  $parent_obj_ids[] = $parent_obj_id;
530  }
531  }
532 
533  // we could suppress this if object is present in a (repository) media pool
534  // but this would lead to "quota-breaches" when the pool item is deleted
535  // and "suddenly" all workspace owners get filesize added to their
536  // respective quotas, regardless of current status
537 
538  include_once "Services/DiskQuota/classes/class.ilDiskQuotaHandler.php";
540  $a_mob->getType(),
541  $a_mob->getId(),
542  ilUtil::dirSize($a_mob->getDataDirectory()),
543  $parent_obj_ids
544  );
545  }
546 
553  public static function _getDirectory($a_mob_id)
554  {
555  return ilUtil::getWebspaceDir() . "/" . self::_getRelativeDirectory($a_mob_id);
556  }
557 
564  public static function _getRelativeDirectory($a_mob_id)
565  {
566  return "mobs/mm_" . $a_mob_id;
567  }
568 
569 
575  public static function _getURL($a_mob_id)
576  {
577  return ilUtil::getHtmlPath(ilUtil::getWebspaceDir() . "/mobs/mm_" . $a_mob_id);
578  }
579 
585  public static function _getThumbnailDirectory($a_mob_id, $a_mode = "filesystem")
586  {
587  return ilUtil::getWebspaceDir($a_mode) . "/thumbs/mm_" . $a_mob_id;
588  }
589 
595  public static function _lookupStandardItemPath(
596  $a_mob_id,
597  $a_url_encode = false,
598  $a_web = true
599  ) {
600  return ilObjMediaObject::_lookupItemPath($a_mob_id, $a_url_encode, $a_web, "Standard");
601  }
602 
608  public static function _lookupItemPath(
609  $a_mob_id,
610  $a_url_encode = false,
611  $a_web = true,
612  $a_purpose = ""
613  ) {
614  if ($a_purpose == "") {
615  $a_purpose = "Standard";
616  }
617  $location = ilMediaItem::_lookupLocationForMobId($a_mob_id, $a_purpose);
618  if (preg_match("/https?\:/i", $location)) {
619  return $location;
620  }
621 
622  if ($a_url_encode) {
623  $location = rawurlencode($location);
624  }
625 
626  $path = ($a_web)
628  : ".";
629 
630  return $path . "/data/" . CLIENT_ID . "/mobs/mm_" . $a_mob_id . "/" . $location;
631  }
632 
636  public function createDirectory()
637  {
638  $path = ilObjMediaObject::_getDirectory($this->getId());
639  ilUtil::makeDirParents($path);
640  if (!is_dir($path)) {
641  $this->ilias->raiseError("Failed to create directory $path.", $this->ilias->error_obj->FATAL);
642  }
643  }
644 
648  public static function _createThumbnailDirectory($a_obj_id)
649  {
651  ilUtil::createDirectory(ilUtil::getWebspaceDir() . "/thumbs/mm_" . $a_obj_id);
652  }
653 
660  public function getFilesOfDirectory($a_subdir = "")
661  {
662  $a_subdir = str_replace("..", "", $a_subdir);
663  $dir = ilObjMediaObject::_getDirectory($this->getId());
664  if ($a_subdir != "") {
665  $dir .= "/" . $a_subdir;
666  }
667 
668  $files = array();
669  if (is_dir($dir)) {
670  $entries = ilUtil::getDir($dir);
671  foreach ($entries as $e) {
672  if (is_file($dir . "/" . $e["entry"]) && $e["entry"] != "." && $e["entry"] != "..") {
673  $files[] = $e["entry"];
674  }
675  }
676  }
677 
678  return $files;
679  }
680 
681 
686  public function getXML($a_mode = IL_MODE_FULL, $a_inst = 0, $a_sign_locals = false)
687  {
689 
690  // TODO: full implementation of all parameters
691  //echo "-".$a_mode."-";
692  switch ($a_mode) {
693  case IL_MODE_ALIAS:
694  $xml = "<MediaObject>";
695  $xml .= "<MediaAlias OriginId=\"il__mob_" . $this->getId() . "\"/>";
696  $media_items = $this->getMediaItems();
697  for ($i = 0; $i < count($media_items); $i++) {
698  $item = $media_items[$i];
699  $xml .= "<MediaAliasItem Purpose=\"" . $item->getPurpose() . "\">";
700 
701  // Layout
702  $width = ($item->getWidth() != "")
703  ? "Width=\"" . $item->getWidth() . "\""
704  : "";
705  $height = ($item->getHeight() != "")
706  ? "Height=\"" . $item->getHeight() . "\""
707  : "";
708  $halign = ($item->getHAlign() != "")
709  ? "HorizontalAlign=\"" . $item->getHAlign() . "\""
710  : "";
711  $xml .= "<Layout $width $height $halign />";
712 
713  // Caption
714  if ($item->getCaption() != "") {
715  $xml .= "<Caption Align=\"bottom\">" .
716  $this->escapeProperty($item->getCaption()) . "</Caption>";
717  }
718 
719  // Text Representation
720  if ($item->getTextRepresentation() != "") {
721  $xml .= "<TextRepresentation>" .
722  $this->escapeProperty($item->getTextRepresentation()) . "</TextRepresentation>";
723  }
724 
725  // Parameter
726  $parameters = $item->getParameters();
727  foreach ($parameters as $name => $value) {
728  $xml .= "<Parameter Name=\"$name\" Value=\"$value\"/>";
729  }
730  $xml .= $item->getMapAreasXML();
731  $xml .= "</MediaAliasItem>";
732  }
733  break;
734 
735  // for output we need technical sections of meta data
736  case IL_MODE_OUTPUT:
737 
738  // get first technical section
739 // $meta = $this->getMetaData();
740  $xml = "<MediaObject Id=\"il__mob_" . $this->getId() . "\">";
741 
742  $media_items = $this->getMediaItems();
743  for ($i = 0; $i < count($media_items); $i++) {
744  $item = $media_items[$i];
745 
746  $xml .= "<MediaItem Purpose=\"" . $item->getPurpose() . "\">";
747 
748  if ($a_sign_locals && $item->getLocationType() == "LocalFile") {
749  require_once 'Services/WebAccessChecker/classes/class.ilWACSignedPath.php';
750  $location = ilWACSignedPath::signFile($this->getDataDirectory() . "/" . $item->getLocation());
751  $location = substr($location, strrpos($location, "/") + 1);
752  } else {
753  $location = $item->getLocation();
754  if ($item->getLocationType() != "LocalFile") { //#25941
756  }
757  }
758 
759  $xml .= "<Location Type=\"" . $item->getLocationType() . "\">" .
760  $this->handleAmps($location) . "</Location>";
761 
762  // Format
763  $xml .= "<Format>" . $item->getFormat() . "</Format>";
764 
765  // Layout
766  $width = ($item->getWidth() != "")
767  ? "Width=\"" . $item->getWidth() . "\""
768  : "";
769  $height = ($item->getHeight() != "")
770  ? "Height=\"" . $item->getHeight() . "\""
771  : "";
772  $halign = ($item->getHAlign() != "")
773  ? "HorizontalAlign=\"" . $item->getHAlign() . "\""
774  : "";
775  $xml .= "<Layout $width $height $halign />";
776 
777  // Caption
778  if ($item->getCaption() != "") {
779  $xml .= "<Caption Align=\"bottom\">" .
780  $this->escapeProperty($item->getCaption()) . "</Caption>";
781  }
782 
783  // Text Representation
784  if ($item->getTextRepresentation() != "") {
785  $xml .= "<TextRepresentation>" .
786  $this->escapeProperty($item->getTextRepresentation()) . "</TextRepresentation>";
787  }
788 
789  // Title
790  if ($this->getTitle() != "") {
791  $xml .= "<Title>" .
792  $this->escapeProperty($this->getTitle()) . "</Title>";
793  }
794 
795  // Parameter
796  $parameters = $item->getParameters();
797  foreach ($parameters as $name => $value) {
798  $xml .= "<Parameter Name=\"$name\" Value=\"$value\"/>";
799  }
800  $xml .= $item->getMapAreasXML();
801 
802  // Subtitles
803  if ($item->getPurpose() == "Standard") {
804  $srts = $this->getSrtFiles();
805  foreach ($srts as $srt) {
806  $def = "";
807  $meta_lang = "";
808  if ($ilUser->getLanguage() != $meta_lang &&
809  $ilUser->getLanguage() == $srt["language"]) {
810  $def = ' Default="true" ';
811  }
812  $xml .= "<Subtitle File=\"" . $srt["full_path"] .
813  "\" Language=\"" . $srt["language"] . "\" " . $def . "/>";
814  }
815  }
816  $xml .= "</MediaItem>";
817  }
818  break;
819 
820  // full xml for export
821  case IL_MODE_FULL:
822 
823 // $meta = $this->getMetaData();
824  $xml = "<MediaObject>";
825 
826  // meta data
827  include_once("Services/MetaData/classes/class.ilMD2XML.php");
828  $md2xml = new ilMD2XML(0, $this->getId(), $this->getType());
829  $md2xml->setExportMode(true);
830  $md2xml->startExport();
831  $xml .= $md2xml->getXML();
832 
833  $media_items = $this->getMediaItems();
834  for ($i = 0; $i < count($media_items); $i++) {
835  $item = $media_items[$i];
836 
837  // highlight mode
838  $xml .= "<MediaItem Purpose=\"" . $item->getPurpose() . "\">";
839 
840  // Location
841  $xml .= "<Location Type=\"" . $item->getLocationType() . "\">" .
842  $this->handleAmps($item->getLocation()) . "</Location>";
843 
844  // Format
845  $xml .= "<Format>" . $item->getFormat() . "</Format>";
846 
847  // Layout
848  $width = ($item->getWidth() != "")
849  ? "Width=\"" . $item->getWidth() . "\""
850  : "";
851  $height = ($item->getHeight() != "")
852  ? "Height=\"" . $item->getHeight() . "\""
853  : "";
854  $halign = ($item->getHAlign() != "")
855  ? "HorizontalAlign=\"" . $item->getHAlign() . "\""
856  : "";
857  $xml .= "<Layout $width $height $halign />";
858 
859  // Caption
860  if ($item->getCaption() != "") {
861  $xml .= "<Caption Align=\"bottom\">" .
862  str_replace("&", "&amp;", $item->getCaption()) . "</Caption>";
863  }
864 
865  // Text Representation
866  if ($item->getTextRepresentation() != "") {
867  $xml .= "<TextRepresentation>" .
868  str_replace("&", "&amp;", $item->getTextRepresentation()) . "</TextRepresentation>";
869  }
870 
871  // Parameter
872  $parameters = $item->getParameters();
873  foreach ($parameters as $name => $value) {
874  $xml .= "<Parameter Name=\"$name\" Value=\"$value\"/>";
875  }
876  $xml .= $item->getMapAreasXML(true, $a_inst);
877  $xml .= "</MediaItem>";
878  }
879  break;
880  }
881  $xml .= "</MediaObject>";
882  return $xml;
883  }
884 
891  protected function escapeProperty($a_value)
892  {
893  return htmlspecialchars($a_value);
894  }
895 
896 
900  public function handleAmps($a_str)
901  {
902  $a_str = str_replace("&amp;", "&", $a_str);
903  $a_str = str_replace("&", "&amp;", $a_str);
904  return $a_str;
905  }
906 
910  public function exportXML(&$a_xml_writer, $a_inst = 0)
911  {
912  $a_xml_writer->appendXML($this->getXML(IL_MODE_FULL, $a_inst));
913  }
914 
915 
923  public function exportFiles($a_target_dir)
924  {
925  $subdir = "il_" . IL_INST_ID . "_mob_" . $this->getId();
926  ilUtil::makeDir($a_target_dir . "/objects/" . $subdir);
927 
928  $mobdir = ilUtil::getWebspaceDir() . "/mobs/mm_" . $this->getId();
929  ilUtil::rCopy($mobdir, $a_target_dir . "/objects/" . $subdir);
930  //echo "from:$mobdir:to:".$a_target_dir."/objects/".$subdir.":<br>";
931  }
932 
933  public function exportMediaFullscreen($a_target_dir, $pg_obj)
934  {
935  $subdir = "il_" . IL_INST_ID . "_mob_" . $this->getId();
936  $a_target_dir = $a_target_dir . "/objects/" . $subdir;
937  ilUtil::makeDir($a_target_dir);
938  $tpl = new ilGlobalTemplate("tpl.fullscreen.html", true, true, "Modules/LearningModule");
939  $tpl->setCurrentBlock("ilMedia");
940 
941  //$int_links = $page_object->getInternalLinks();
942  $med_links = ilMediaItem::_getMapAreasIntLinks($this->getId());
943 
944  // @todo
945  //$link_xml = $this->getLinkXML($med_links, $this->getLayoutLinkTargets());
946 
947  require_once("./Services/MediaObjects/classes/class.ilObjMediaObject.php");
948  //$media_obj = new ilObjMediaObject($_GET["mob_id"]);
949  require_once("./Services/COPage/classes/class.ilPageObject.php");
950 
951  $xml = "<dummy>";
952  // todo: we get always the first alias now (problem if mob is used multiple
953  // times in page)
954  $xml .= $pg_obj->getMediaAliasElement($this->getId());
955  $xml .= $this->getXML(IL_MODE_OUTPUT);
956  //$xml.= $link_xml;
957  $xml .= "</dummy>";
958 
959  //die(htmlspecialchars($xml));
960 
961  $xsl = file_get_contents("./Services/COPage/xsl/page.xsl");
962  $args = array( '/_xml' => $xml, '/_xsl' => $xsl );
963  $xh = xslt_create();
964 
965  //echo "<b>XML:</b>".htmlentities($xml);
966  // determine target frames for internal links
967  $wb_path = "";
968  $enlarge_path = "";
969  $params = array('mode' => "fullscreen", 'enlarge_path' => $enlarge_path,
970  'link_params' => "ref_id=" . $_GET["ref_id"],'fullscreen_link' => "",
971  'ref_id' => $_GET["ref_id"], 'webspace_path' => $wb_path);
972  $output = xslt_process($xh, "arg:/_xml", "arg:/_xsl", null, $args, $params);
973  //echo xslt_error($xh);
974  xslt_free($xh);
975 
976  // unmask user html
977  include_once("./Services/MediaObjects/classes/class.ilPlayerUtil.php");
978  $tpl->setVariable("LOCATION_CONTENT_STYLESHEET", "../../css/style.css");
979  $tpl->setVariable("LOCATION_STYLESHEET", "../../css/system.css");
980  $tpl->setVariable("MEDIA_CONTENT", $output);
981  $output = $tpl->get();
982  //$output = preg_replace("/\/mobs\/mm_(\d+)\/([^\"]+)/i","$2",$output);
983  $output = preg_replace("/mobs\/mm_(\d+)\/([^\"]+)/i", "$2", $output);
984  $output = preg_replace("/\.\/Services\/MediaObjects\/flash_mp3_player/i", "../../players", $output);
985  $output = preg_replace("/\.\/" . str_replace("/", "\/", ilPlayerUtil::getFlashVideoPlayerDirectory()) . "/i", "../../players", $output);
986  $output = preg_replace("/file=..\/..\/..\//i", "file=../objects/" . $subdir . "/", $output);
987  //die(htmlspecialchars($output));
988  fwrite(fopen($a_target_dir . '/fullscreen.html', 'w'), $output);
989  }
990 
991  public function modifyExportIdentifier($a_tag, $a_param, $a_value)
992  {
993  if ($a_tag == "Identifier" && $a_param == "Entry") {
994  $a_value = ilUtil::insertInstIntoID($a_value);
995  }
996 
997  return $a_value;
998  }
999 
1000 
1002  // EDIT METHODS: these methods act on the media alias in the dom
1004 
1011  public function setContainsIntLink($a_contains_link)
1012  {
1013  $this->contains_int_link = $a_contains_link;
1014  }
1015 
1020  public function containsIntLink()
1021  {
1022  return $this->contains_int_link;
1023  }
1024 
1028  public static function _deleteAllUsages($a_type, $a_id, $a_usage_hist_nr = 0, $a_lang = "-")
1029  {
1030  global $DIC;
1031 
1032  $ilDB = $DIC->database();
1033 
1034  $and_hist = "";
1035  if ($a_usage_hist_nr !== false) {
1036  $and_hist = " AND usage_hist_nr = " . $ilDB->quote($a_usage_hist_nr, "integer");
1037  }
1038 
1039  $mob_ids = array();
1040  $set = $ilDB->query("SELECT id FROM mob_usage" .
1041  " WHERE usage_type = " . $ilDB->quote($a_type, "text") .
1042  " AND usage_id = " . $ilDB->quote($a_id, "integer") .
1043  " AND usage_lang = " . $ilDB->quote($a_lang, "text") .
1044  $and_hist);
1045  while ($row = $ilDB->fetchAssoc($set)) {
1046  $mob_ids[] = $row["id"];
1047  }
1048 
1049  $q = "DELETE FROM mob_usage WHERE usage_type = " .
1050  $ilDB->quote($a_type, "text") .
1051  " AND usage_id= " . $ilDB->quote($a_id, "integer") .
1052  " AND usage_lang = " . $ilDB->quote($a_lang, "text") .
1053  $and_hist;
1054  $ilDB->manipulate($q);
1055 
1056  foreach ($mob_ids as $mob_id) {
1057  self::handleQuotaUpdate(new self($mob_id));
1058  }
1059  }
1060 
1064  public static function _getMobsOfObject($a_type, $a_id, $a_usage_hist_nr = 0, $a_lang = "-")
1065  {
1066  global $DIC;
1067 
1068  $ilDB = $DIC->database();
1069 
1070  $lstr = "";
1071  if ($a_lang != "") {
1072  $lstr = " AND usage_lang = " . $ilDB->quote($a_lang, "text");
1073  }
1074  $hist_str = "";
1075  if ($a_usage_hist_nr !== false) {
1076  $hist_str = " AND usage_hist_nr = " . $ilDB->quote($a_usage_hist_nr, "integer");
1077  }
1078 
1079  $q = "SELECT * FROM mob_usage WHERE " .
1080  "usage_type = " . $ilDB->quote($a_type, "text") . " AND " .
1081  "usage_id = " . $ilDB->quote($a_id, "integer") .
1082  $lstr . $hist_str;
1083  $mobs = array();
1084  $mob_set = $ilDB->query($q);
1085  while ($mob_rec = $ilDB->fetchAssoc($mob_set)) {
1086  if (ilObject::_lookupType($mob_rec["id"]) == "mob") {
1087  $mobs[$mob_rec["id"]] = $mob_rec["id"];
1088  }
1089  }
1090 
1091  return $mobs;
1092  }
1093 
1097  public static function _saveUsage($a_mob_id, $a_type, $a_id, $a_usage_hist_nr = 0, $a_lang = "-")
1098  {
1099  global $DIC;
1100 
1101  $ilDB = $DIC->database();
1102 
1103  $ilDB->replace(
1104  "mob_usage",
1105  array(
1106  "id" => array("integer", (int) $a_mob_id),
1107  "usage_type" => array("text", $a_type),
1108  "usage_id" => array("integer", $a_id),
1109  "usage_lang" => array("text", $a_lang),
1110  "usage_hist_nr" => array("integer", (int) $a_usage_hist_nr)
1111  ),
1112  array()
1113  );
1114 
1115  self::handleQuotaUpdate(new self($a_mob_id));
1116  }
1117 
1121  public static function _removeUsage($a_mob_id, $a_type, $a_id, $a_usage_hist_nr = 0, $a_lang = "-")
1122  {
1123  global $DIC;
1124 
1125  $ilDB = $DIC->database();
1126 
1127  $q = "DELETE FROM mob_usage WHERE " .
1128  " id = " . $ilDB->quote((int) $a_mob_id, "integer") . " AND " .
1129  " usage_type = " . $ilDB->quote($a_type, "text") . " AND " .
1130  " usage_id = " . $ilDB->quote((int) $a_id, "integer") . " AND " .
1131  " usage_lang = " . $ilDB->quote($a_lang, "text") . " AND " .
1132  " usage_hist_nr = " . $ilDB->quote((int) $a_usage_hist_nr, "integer");
1133  $ilDB->manipulate($q);
1134 
1135  self::handleQuotaUpdate(new self($a_mob_id));
1136  }
1137 
1141  public function getUsages($a_include_history = true)
1142  {
1143  return self::lookupUsages($this->getId(), $a_include_history);
1144  }
1145 
1151  public static function lookupUsages($a_id, $a_include_history = true)
1152  {
1153  global $DIC;
1154 
1155  $ilDB = $DIC->database();
1156 
1157  $hist_str = "";
1158  if ($a_include_history) {
1159  $hist_str = ", usage_hist_nr";
1160  }
1161 
1162  // get usages in pages
1163  $q = "SELECT DISTINCT usage_type, usage_id, usage_lang" . $hist_str . " FROM mob_usage WHERE id = " .
1164  $ilDB->quote($a_id, "integer");
1165 
1166  if (!$a_include_history) {
1167  $q .= " AND usage_hist_nr = " . $ilDB->quote(0, "integer");
1168  }
1169 
1170  $us_set = $ilDB->query($q);
1171  $ret = array();
1172  while ($us_rec = $ilDB->fetchAssoc($us_set)) {
1173  $ut = "";
1174  if (is_int(strpos($us_rec["usage_type"], ":"))) {
1175  $us_arr = explode(":", $us_rec["usage_type"]);
1176  $ut = $us_arr[1];
1177  $ct = $us_arr[0];
1178  }
1179 
1180  // check whether page exists
1181  $skip = false;
1182  if ($ut == "pg") {
1183  include_once("./Services/COPage/classes/class.ilPageObject.php");
1184  if (!ilPageObject::_exists($ct, $us_rec["usage_id"])) {
1185  $skip = true;
1186  }
1187  }
1188 
1189  if (!$skip) {
1190  $ret[] = array("type" => $us_rec["usage_type"],
1191  "id" => $us_rec["usage_id"],
1192  "lang" => $us_rec["usage_lang"],
1193  "hist_nr" => $us_rec["usage_hist_nr"]);
1194  }
1195  }
1196 
1197  // get usages in media pools
1198  $q = "SELECT DISTINCT mep_id FROM mep_tree JOIN mep_item ON (child = obj_id) WHERE mep_item.foreign_id = " .
1199  $ilDB->quote($a_id, "integer") . " AND mep_item.type = " . $ilDB->quote("mob", "text");
1200  $us_set = $ilDB->query($q);
1201  while ($us_rec = $ilDB->fetchAssoc($us_set)) {
1202  $ret[] = array("type" => "mep",
1203  "id" => $us_rec["mep_id"]);
1204  }
1205 
1206  // get usages in news items (media casts)
1207  include_once("./Services/News/classes/class.ilNewsItem.php");
1208  $news_usages = ilNewsItem::_lookupMediaObjectUsages($a_id);
1209  foreach ($news_usages as $nu) {
1210  $ret[] = $nu;
1211  }
1212 
1213 
1214  // get usages in map areas
1215  $q = "SELECT DISTINCT mob_id FROM media_item it, map_area area " .
1216  " WHERE area.item_id = it.id " .
1217  " AND area.link_type = " . $ilDB->quote("int", "text") . " " .
1218  " AND area.target = " . $ilDB->quote("il__mob_" . $a_id, "text");
1219  $us_set = $ilDB->query($q);
1220  while ($us_rec = $ilDB->fetchAssoc($us_set)) {
1221  $ret[] = array("type" => "map",
1222  "id" => $us_rec["mob_id"]);
1223  }
1224 
1225  // get usages in personal clipboards
1226  $users = ilObjUser::_getUsersForClipboadObject("mob", $a_id);
1227  foreach ($users as $user) {
1228  $ret[] = array("type" => "clip",
1229  "id" => $user);
1230  }
1231 
1232  return $ret;
1233  }
1234 
1240  public static function getParentObjectIdForUsage($a_usage, $a_include_all_access_obj_ids = false)
1241  {
1242  if (is_int(strpos($a_usage["type"], ":"))) {
1243  $us_arr = explode(":", $a_usage["type"]);
1244  $type = $us_arr[1];
1245  $cont_type = $us_arr[0];
1246  } else {
1247  $type = $a_usage["type"];
1248  }
1249 
1250  $id = $a_usage["id"];
1251  $obj_id = false;
1252 
1253  switch ($type) {
1254  // RTE / tiny mce
1255  case "html":
1256 
1257  switch ($cont_type) {
1258  case "qpl":
1259  // Question Pool *Question* Text (Test)
1260  include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
1262  if ($qinfo["original_id"] > 0) {
1263  include_once("./Modules/Test/classes/class.ilObjTest.php");
1264  $obj_id = ilObjTest::_lookupTestObjIdForQuestionId($id); // usage in test
1265  } else {
1266  $obj_id = $qinfo["obj_fi"]; // usage in pool
1267  }
1268  break;
1269 
1270  case "spl":
1271  // Question Pool *Question* Text (Survey)
1273  if ($quest) {
1274  $parent_id = $quest->getObjId();
1275 
1276  // pool question copy - find survey, do not use pool itself
1277  if ($quest->getOriginalId() &&
1278  ilObject::_lookupType($parent_id) == "spl") {
1280  }
1281  // original question (in pool or survey)
1282  else {
1283  $obj_id = $parent_id;
1284  }
1285 
1286  unset($quest);
1287  }
1288  break;
1289 
1290  case "exca":
1291  // Exercise assignment
1292  $returned_pk = $a_usage['id'];
1293  // #15995 - we are just checking against exercise object
1294  include_once 'Modules/Exercise/classes/class.ilExSubmission.php';
1295  $obj_id = ilExSubmission::lookupExerciseIdForReturnedId($returned_pk);
1296  break;
1297 
1298  case "frm":
1299  // Forum
1300  $post_pk = $a_usage['id'];
1301  include_once 'Modules/Forum/classes/class.ilForumPost.php';
1302  include_once 'Modules/Forum/classes/class.ilForum.php';
1303  $oPost = new ilForumPost($post_pk);
1304  $frm_pk = $oPost->getForumId();
1305  $obj_id = ilForum::_lookupObjIdForForumId($frm_pk);
1306  break;
1307 
1308 
1309  case "frm~d":
1310  $draft_id = $a_usage['id'];
1311  include_once 'Modules/Forum/classes/class.ilForumPostDraft.php';
1312  include_once 'Modules/Forum/classes/class.ilForum.php';
1313  $oDraft = ilForumPostDraft::newInstanceByDraftId($draft_id);
1314 
1315  $frm_pk = $oDraft->getForumId();
1316  $obj_id = ilForum::_lookupObjIdForForumId($frm_pk);
1317  break;
1318  case "frm~h":
1319  $history_id = $a_usage['id'];
1320  include_once 'Modules/Forum/classes/class.ilForumDraftsHistory.php';
1321  include_once 'Modules/Forum/classes/class.ilForumPostDraft.php';
1322  include_once 'Modules/Forum/classes/class.ilForum.php';
1323  $oHistoryDraft = new ilForumDraftsHistory($history_id);
1324  $oDraft = ilForumPostDraft::newInstanceByDraftId($oHistoryDraft->getDraftId());
1325 
1326  $frm_pk = $oDraft->getForumId();
1327  $obj_id = ilForum::_lookupObjIdForForumId($frm_pk);
1328  break;
1329  // temporary items (per user)
1330  case "frm~":
1331  case "exca~":
1332  $obj_id = $a_usage['id'];
1333  break;
1334 
1335  // "old" category pages
1336  case "cat":
1337  // InfoScreen Text
1338  case "tst":
1339  case "svy":
1340  // data collection
1341  case "dcl":
1342  $obj_id = $id;
1343  break;
1344  }
1345  break;
1346 
1347  // page editor
1348  case "pg":
1349 
1350  switch ($cont_type) {
1351  // question feedback // parent obj id is q id
1352  case "qfbg":
1353  include_once('./Services/COPage/classes/class.ilPageObject.php');
1355  // note: no break here, we only altered the $id to the question id
1356 
1357  // no break
1358  case "qpl":
1359  // Question Pool Question Pages
1360  include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
1362  if ($qinfo["original_id"] > 0) {
1363  include_once("./Modules/Test/classes/class.ilObjTest.php");
1364  $obj_id = ilObjTest::_lookupTestObjIdForQuestionId($id); // usage in test
1365  } else {
1366  $obj_id = $qinfo["obj_fi"]; // usage in pool
1367  }
1368  if ($obj_id == 0) { // this is the case, if question is in learning module -> get lm id
1369  include_once("./Services/COPage/classes/class.ilPCQuestion.php");
1370  $pinfo = ilPCQuestion::_getPageForQuestionId($id, "lm");
1371  if ($pinfo && $pinfo["parent_type"] == "lm") {
1372  include_once("./Modules/LearningModule/classes/class.ilLMObject.php");
1373  $obj_id = ilLMObject::_lookupContObjID($pinfo["page_id"]);
1374  }
1375  $pinfo = ilPCQuestion::_getPageForQuestionId($id, "sahs");
1376  if ($pinfo && $pinfo["parent_type"] == "sahs") {
1377  include_once("./Modules/Scorm2004/classes/class.ilSCORM2004Node.php");
1378  $obj_id = ilSCORM2004Node::_lookupSLMID($pinfo["page_id"]);
1379  }
1380  }
1381  break;
1382 
1383  case "lm":
1384  // learning modules
1385  include_once("./Modules/LearningModule/classes/class.ilLMObject.php");
1386  $obj_id = ilLMObject::_lookupContObjID($id);
1387  break;
1388 
1389  case "gdf":
1390  // glossary definition
1392  $obj_id = ilGlossaryTerm::_lookGlossaryID($term_id);
1393  break;
1394 
1395  case "wpg":
1396  // wiki page
1397  include_once 'Modules/Wiki/classes/class.ilWikiPage.php';
1399  break;
1400 
1401  case "sahs":
1402  // sahs page
1403  // can this implementation be used for other content types, too?
1404  include_once('./Services/COPage/classes/class.ilPageObject.php');
1405  $obj_id = ilPageObject::lookupParentId($id, 'sahs');
1406  break;
1407 
1408  case "prtf":
1409  // portfolio
1410  include_once "Modules/Portfolio/classes/class.ilPortfolioPage.php";
1412  break;
1413 
1414  case "prtt":
1415  // portfolio template
1416  include_once "Modules/Portfolio/classes/class.ilPortfolioTemplatePage.php";
1418  break;
1419 
1420  case "blp":
1421  // blog
1422  include_once('./Services/COPage/classes/class.ilPageObject.php');
1423  $obj_id = ilPageObject::lookupParentId($id, 'blp');
1424  break;
1425 
1426  case "impr":
1427  // imprint page - always id 1
1428  // fallthrough
1429 
1430  case "crs":
1431  case "grp":
1432  case "cat":
1433  case "fold":
1434  case "root":
1435  case "cont":
1436  case "copa":
1437  case "cstr":
1438  // repository pages
1439  $obj_id = $id;
1440  break;
1441  }
1442  break;
1443 
1444  // Media Pool
1445  case "mep":
1446  $obj_id = $id;
1447  break;
1448 
1449  // News Context Object (e.g. MediaCast)
1450  case "news":
1451  include_once("./Services/News/classes/class.ilNewsItem.php");
1453  break;
1454  }
1455 
1456  return $obj_id;
1457  }
1458 
1466  public static function _resizeImage($a_file, $a_width, $a_height, $a_constrain_prop = false)
1467  {
1468  $file_path = pathinfo($a_file);
1469  $location = substr($file_path["basename"], 0, strlen($file_path["basename"]) -
1470  strlen($file_path["extension"]) - 1) . "_" .
1471  $a_width . "_" .
1472  $a_height . "." . $file_path["extension"];
1473  $target_file = $file_path["dirname"] . "/" .
1474  $location;
1476  $a_file,
1477  $target_file,
1478  (int) $a_width,
1479  (int) $a_height,
1480  $a_constrain_prop
1481  );
1482 
1483  return $location;
1484  }
1485 
1493  public static function getMimeType($a_file, $a_external = null)
1494  {
1495  include_once("./Services/Utilities/classes/class.ilMimeTypeUtil.php");
1497  return $mime;
1498  }
1499 
1503  public static function _determineWidthHeight(
1504  $a_format,
1505  $a_type,
1506  $a_file,
1507  $a_reference,
1508  $a_constrain_proportions,
1509  $a_use_original,
1510  $a_user_width,
1511  $a_user_height
1512  ) {
1513  global $DIC;
1514 
1515  $lng = $DIC->language();
1516 
1517  // determine width and height of known image types
1518  //$width = 640;
1519  //$height = 360;
1520  $info = "";
1521 
1522  if ($a_format == "audio/mpeg") {
1523  $width = 300;
1524  $height = 20;
1525  }
1526 
1527  if (ilUtil::deducibleSize($a_format)) {
1528  include_once("./Services/MediaObjects/classes/class.ilMediaImageUtil.php");
1529  if ($a_type == "File") {
1531  } else {
1532  $size = ilMediaImageUtil::getImageSize($a_reference);
1533  }
1534  }
1535 
1536  if ($a_use_original) {
1537  if ($size[0] > 0 && $size[1] > 0) {
1538  //$width = $size[0];
1539  //$height = $size[1];
1540  $width = "";
1541  $height = "";
1542  } else {
1543  $info = $lng->txt("cont_could_not_determine_resource_size");
1544  }
1545  } else {
1546  $w = (int) $a_user_width;
1547  $h = (int) $a_user_height;
1548  $width = $w;
1549  $height = $h;
1550  //echo "<br>C-$width-$height-";
1551  if (ilUtil::deducibleSize($a_format) && $a_constrain_proportions) {
1552  if ($size[0] > 0 && $size[1] > 0) {
1553  if ($w > 0) {
1554  $wr = $size[0] / $w;
1555  }
1556  if ($h > 0) {
1557  $hr = $size[1] / $h;
1558  }
1559  //echo "<br>+".$wr."+".$size[0]."+".$w."+";
1560  //echo "<br>+".$hr."+".$size[1]."+".$h."+";
1561  $r = max($wr, $hr);
1562  if ($r > 0) {
1563  $width = (int) round($size[0] / $r);
1564  $height = (int) round($size[1] / $r);
1565  }
1566  }
1567  }
1568  //echo "<br>D-$width-$height-";
1569  }
1570  //echo "<br>E-$width-$height-";
1571 
1572  if ($width == 0 && $a_user_width === "") {
1573  $width = "";
1574  }
1575  if ($height == 0 && $a_user_height === "") {
1576  $height = "";
1577  }
1578 
1579  return array("width" => $width, "height" => $height, "info" => $info);
1580  }
1581 
1586  public static function _getSimpleMimeTypes()
1587  {
1588  return array("image/x-ms-bmp", "image/gif", "image/jpeg", "image/x-portable-bitmap",
1589  "image/png", "image/psd", "image/tiff", "application/pdf");
1590  }
1591 
1592  public function getDataDirectory()
1593  {
1594  return ilUtil::getWebspaceDir() . "/mobs/mm_" . $this->getId();
1595  }
1596 
1603  public static function _useAutoStartParameterOnly($a_loc, $a_format)
1604  {
1605  $lpath = pathinfo($a_loc);
1606  if ($lpath["extension"] == "mp3" && $a_format == "audio/mpeg") {
1607  return true;
1608  }
1609  if ($lpath["extension"] == "flv") {
1610  return true;
1611  }
1612  if (in_array($a_format, array("video/mp4", "video/webm"))) {
1613  return true;
1614  }
1615  return false;
1616  }
1617 
1621  public static function _saveTempFileAsMediaObject($name, $tmp_name, $upload = true)
1622  {
1623  // create dummy object in db (we need an id)
1624  $media_object = new ilObjMediaObject();
1625  $media_object->setTitle($name);
1626  $media_object->setDescription("");
1627  $media_object->create();
1628 
1629  // determine and create mob directory, move uploaded file to directory
1630  $media_object->createDirectory();
1631  $mob_dir = ilObjMediaObject::_getDirectory($media_object->getId());
1632 
1633  $media_item = new ilMediaItem();
1634  $media_object->addMediaItem($media_item);
1635  $media_item->setPurpose("Standard");
1636 
1637  $file = $mob_dir . "/" . $name;
1638  if ($upload) {
1639  ilUtil::moveUploadedFile($tmp_name, $name, $file);
1640  } else {
1641  copy($tmp_name, $file);
1642  }
1643  // get mime type
1645  $location = $name;
1646  // set real meta and object data
1647  $media_item->setFormat($format);
1648  $media_item->setLocation($location);
1649  $media_item->setLocationType("LocalFile");
1650  $media_object->setTitle($name);
1651  $media_object->setDescription($format);
1652 
1654  include_once("./Services/MediaObjects/classes/class.ilMediaImageUtil.php");
1656  $media_item->setWidth($size[0]);
1657  $media_item->setHeight($size[1]);
1658  }
1659  $media_item->setHAlign("Left");
1660 
1661  self::renameExecutables($mob_dir);
1662  include_once("./Services/MediaObjects/classes/class.ilMediaSvgSanitizer.php");
1663  ilMediaSvgSanitizer::sanitizeDir($mob_dir); // see #20339
1664 
1665  $media_object->update();
1666 
1667  return $media_object;
1668  }
1669 
1673  public function uploadAdditionalFile($a_name, $tmp_name, $a_subdir = "", $a_mode = "move_uploaded")
1674  {
1675  $a_subdir = str_replace("..", "", $a_subdir);
1676  $dir = $mob_dir = ilObjMediaObject::_getDirectory($this->getId());
1677  if ($a_subdir != "") {
1678  $dir .= "/" . $a_subdir;
1679  }
1680  ilUtil::makeDirParents($dir);
1681  if ($a_mode == "rename") {
1682  rename($tmp_name, $dir . "/" . $a_name);
1683  } else {
1684  ilUtil::moveUploadedFile($tmp_name, $a_name, $dir . "/" . $a_name, true, $a_mode);
1685  }
1686  self::renameExecutables($mob_dir);
1687  include_once("./Services/MediaObjects/classes/class.ilMediaSvgSanitizer.php");
1688  ilMediaSvgSanitizer::sanitizeDir($mob_dir); // see #20339
1689  }
1690 
1697  public function uploadSrtFile($a_tmp_name, $a_language, $a_mode = "move_uploaded")
1698  {
1699  if (is_file($a_tmp_name) && $a_language != "") {
1700  $this->uploadAdditionalFile("subtitle_" . $a_language . ".srt", $a_tmp_name, "srt", $a_mode);
1701  return true;
1702  }
1703  return false;
1704  }
1705 
1709  public function getSrtFiles()
1710  {
1711  $srt_dir = ilObjMediaObject::_getDirectory($this->getId()) . "/srt";
1712 
1713  if (!is_dir($srt_dir)) {
1714  return array();
1715  }
1716 
1717  $items = ilUtil::getDir($srt_dir);
1718 
1719  $srt_files = array();
1720  foreach ($items as $i) {
1721  if (!in_array($i["entry"], array(".", "..")) && $i["type"] == "file") {
1722  $name = explode(".", $i["entry"]);
1723  if ($name[1] == "srt" && substr($name[0], 0, 9) == "subtitle_") {
1724  $srt_files[] = array("file" => $i["entry"],
1725  "full_path" => "srt/" . $i["entry"], "language" => substr($name[0], 9, 2));
1726  }
1727  }
1728  }
1729 
1730  return $srt_files;
1731  }
1732 
1736  public function makeThumbnail(
1737  $a_file,
1738  $a_thumbname,
1739  $a_format = "png",
1740  $a_size = "80"
1741  ) {
1742  $m_dir = ilObjMediaObject::_getDirectory($this->getId());
1744  self::_createThumbnailDirectory($this->getId());
1746  $m_dir . "/" . $a_file,
1747  $t_dir . "/" . $a_thumbname,
1748  $a_format,
1749  $a_size
1750  );
1751  }
1752 
1759  public static function getThumbnailPath($a_mob_id, $a_thumbname)
1760  {
1761  $t_dir = ilObjMediaObject::_getThumbnailDirectory($a_mob_id);
1762  return $t_dir . "/" . $a_thumbname;
1763  }
1764 
1765 
1769  public function removeAdditionalFile($a_file)
1770  {
1771  $file = str_replace("..", "", $a_file);
1772  $file = ilObjMediaObject::_getDirectory($this->getId()) . "/" . $file;
1773  if (is_file($file)) {
1774  unlink($file);
1775  }
1776  }
1777 
1778 
1782  public function getLinkedMediaObjects($a_ignore = "")
1783  {
1784  $linked = array();
1785 
1786  if (!is_array($a_ignore)) {
1787  $a_ignore = array();
1788  }
1789 
1790  // get linked media objects (map areas)
1791  $med_items = $this->getMediaItems();
1792 
1793  foreach ($med_items as $med_item) {
1794  $int_links = ilMapArea::_getIntLinks($med_item->getId());
1795  foreach ($int_links as $k => $int_link) {
1796  if ($int_link["Type"] == "MediaObject") {
1797  include_once("./Services/Link/classes/class.ilInternalLink.php");
1798  $l_id = ilInternalLink::_extractObjIdOfTarget($int_link["Target"]);
1799  if (ilObject::_exists($l_id)) {
1800  if (!in_array($l_id, $linked) &&
1801  !in_array($l_id, $a_ignore)) {
1802  $linked[] = $l_id;
1803  }
1804  }
1805  }
1806  }
1807  }
1808  //var_dump($linked);
1809  return $linked;
1810  }
1811 
1815  public static function getRestrictedFileTypes()
1816  {
1817  return array_filter(self::getAllowedFileTypes(), function ($v) {
1818  return !in_array($v, self::getForbiddenFileTypes());
1819  });
1820  }
1821 
1827  public static function getForbiddenFileTypes()
1828  {
1829  $mset = new ilSetting("mobs");
1830  if (trim($mset->get("black_list_file_types")) == "") {
1831  return array();
1832  }
1833  return array_map(
1834  function ($v) {
1835  return strtolower(trim($v));
1836  },
1837  explode(",", $mset->get("black_list_file_types"))
1838  );
1839  }
1840 
1846  public static function getAllowedFileTypes()
1847  {
1848  $mset = new ilSetting("mobs");
1849  if (trim($mset->get("restricted_file_types")) == "") {
1850  return array();
1851  }
1852  return array_map(
1853  function ($v) {
1854  return strtolower(trim($v));
1855  },
1856  explode(",", $mset->get("restricted_file_types"))
1857  );
1858  }
1859 
1866  public static function isTypeAllowed($a_type)
1867  {
1868  if (in_array($a_type, self::getForbiddenFileTypes())) {
1869  return false;
1870  }
1871  if (count(self::getAllowedFileTypes()) == 0 || in_array($a_type, self::getAllowedFileTypes())) {
1872  return true;
1873  }
1874  return false;
1875  }
1876 
1877 
1881  public function duplicate()
1882  {
1883  $new_obj = new ilObjMediaObject();
1884  $new_obj->setTitle($this->getTitle());
1885  $new_obj->setDescription($this->getDescription());
1886 
1887  // media items
1888  foreach ($this->getMediaItems() as $key => $val) {
1889  $new_obj->addMediaItem($val);
1890  }
1891 
1892  $new_obj->create(false, true);
1893 
1894  // files
1895  $new_obj->createDirectory();
1896  self::_createThumbnailDirectory($new_obj->getId());
1897  ilUtil::rCopy(
1899  ilObjMediaObject::_getDirectory($new_obj->getId())
1900  );
1901  ilUtil::rCopy(
1903  ilObjMediaObject::_getThumbnailDirectory($new_obj->getId())
1904  );
1905 
1906  // meta data
1907  include_once("Services/MetaData/classes/class.ilMD.php");
1908  $md = new ilMD(0, $this->getId(), "mob");
1909  $new_md = $md->cloneMD(0, $new_obj->getId(), "mob");
1910 
1911  return $new_obj;
1912  }
1913 
1920  public function uploadVideoPreviewPic($a_prevpic)
1921  {
1922  // remove old one
1923  if ($this->getVideoPreviewPic(true) != "") {
1924  $this->removeAdditionalFile($this->getVideoPreviewPic(true));
1925  }
1926 
1927  $pi = pathinfo($a_prevpic["name"]);
1928  $ext = $pi["extension"];
1929  if (in_array($ext, array("jpg", "jpeg", "png"))) {
1930  $this->uploadAdditionalFile("mob_vpreview." . $ext, $a_prevpic["tmp_name"]);
1931  }
1932  }
1933 
1940  public function generatePreviewPic($a_width, $a_height)
1941  {
1942  $item = $this->getMediaItem("Standard");
1943 
1944  if ($item->getLocationType() == "LocalFile" &&
1945  is_int(strpos($item->getFormat(), "image/"))) {
1946  $dir = ilObjMediaObject::_getDirectory($this->getId());
1947  $file = $dir . "/" .
1948  $item->getLocation();
1949  if (is_file($file)) {
1950  if (ilUtil::isConvertVersionAtLeast("6.3.8-3")) {
1951  ilUtil::execConvert(ilUtil::escapeShellArg($file) . "[0] -geometry " . $a_width . "x" . $a_height . "^ -gravity center -extent " . $a_width . "x" . $a_height . " PNG:" . $dir . "/mob_vpreview.png");
1952  } else {
1953  ilUtil::convertImage($file, $dir . "/mob_vpreview.png", "PNG", $a_width . "x" . $a_height);
1954  }
1955  }
1956  }
1957  }
1958 
1965  public function getVideoPreviewPic($a_filename_only = false)
1966  {
1967  $dir = ilObjMediaObject::_getDirectory($this->getId());
1968  $ppics = array("mob_vpreview.jpg",
1969  "mob_vpreview.jpeg",
1970  "mob_vpreview.png");
1971  foreach ($ppics as $p) {
1972  if (is_file($dir . "/" . $p)) {
1973  if ($a_filename_only) {
1974  return $p;
1975  } else {
1976  return $dir . "/" . $p;
1977  }
1978  }
1979  }
1980  return "";
1981  }
1982 
1989  public static function fixFilename($a_name)
1990  {
1991  $a_name = ilUtil::getASCIIFilename($a_name);
1992 
1993  $rchars = array("`", "=", "$", "{", "}", "'", ";", " ", "(", ")");
1994  $a_name = str_replace($rchars, "_", $a_name);
1995  $a_name = str_replace("__", "_", $a_name);
1996  return $a_name;
1997  }
1998 
1999 
2006  public function getMultiSrtUploadDir()
2007  {
2008  return ilObjMediaObject::_getDirectory($this->getId() . "/srt/tmp");
2009  }
2010 
2011 
2018  public function uploadMultipleSubtitleFile($a_file)
2019  {
2020  $lng = $this->lng;
2021  $ilUser = $this->user;
2022 
2023  include_once("./Services/MediaObjects/exceptions/class.ilMediaObjectsException.php");
2024  if (!is_file($a_file["tmp_name"])) {
2025  throw new ilMediaObjectsException($lng->txt("mob_file_could_not_be_uploaded"));
2026  }
2027 
2028  $dir = $this->getMultiSrtUploadDir();
2029  ilUtil::delDir($dir, true);
2030  ilUtil::makeDirParents($dir);
2031  ilUtil::moveUploadedFile($a_file["tmp_name"], "multi_srt.zip", $dir . "/" . "multi_srt.zip");
2032  ilUtil::unzip($dir . "/multi_srt.zip", true);
2033  }
2034 
2038  public function clearMultiSrtDirectory()
2039  {
2041  }
2042 
2046  public function getMultiSrtFiles()
2047  {
2048  $items = array();
2049 
2050  include_once("./Services/MetaData/classes/class.ilMDLanguageItem.php");
2052 
2053  $dir = $this->getMultiSrtUploadDir();
2054  $files = ilUtil::getDir($dir);
2055  foreach ($files as $k => $i) {
2056  // check directory
2057  if ($i["type"] == "file" && !in_array($k, array(".", ".."))) {
2058  if (pathinfo($k, PATHINFO_EXTENSION) == "srt") {
2059  $lang = "";
2060  if (substr($k, strlen($k) - 7, 1) == "_") {
2061  $lang = substr($k, strlen($k) - 6, 2);
2062  if (!in_array($lang, $lang_codes)) {
2063  $lang = "";
2064  }
2065  }
2066  $items[] = array("filename" => $k, "lang" => $lang);
2067  }
2068  }
2069  }
2070  return $items;
2071  }
2072 
2078  public static function renameExecutables($a_dir)
2079  {
2080  ilUtil::renameExecutables($a_dir);
2081  if (!self::isTypeAllowed("html")) {
2082  ilUtil::rRenameSuffix($a_dir, "html", "sec"); // see #20187
2083  }
2084  }
2085 }
static isConvertVersionAtLeast($a_version)
Compare convert version numbers.
static _exists($a_parent_type, $a_id, $a_lang="", $a_no_cache=false)
Checks whether page exists.
xslt_create()
static makeDirParents($a_dir)
Create a new directory and all parent directories.
getSrtFiles()
Get srt files.
static _getMobsOfObject($a_type, $a_id, $a_usage_hist_nr=0, $a_lang="-")
get mobs of object
static _lookupLocationForMobId($a_mob_id, $a_purpose)
Lookup location for mob id.
static _getThumbnailDirectory($a_mob_id, $a_mode="filesystem")
get directory for files of media object (static)
static _lookupObjIdForForumId($a_for_id)
$size
Definition: RandomTest.php:84
uploadMultipleSubtitleFile($a_file)
Upload multi srt file.
static deleteAllItemsOfMob($a_mob_id)
Delete all items of a mob.
getVideoPreviewPic($a_filename_only=false)
Get video preview pic.
static getMimeType($a_file, $a_external=null)
get mime type for file
static _getMapAreasIntLinks($a_mob_id)
get all internal links of map areas of a mob
setDescription($a_description)
set description of media object
& getMediaItem($a_purpose)
get item for media purpose
static getImageSize($a_location)
Get image size from location.
static rRenameSuffix($a_dir, $a_old_suffix, $a_new_suffix)
Renames all files with certain suffix and gives them a new suffix.
static _deleteAllUsages($a_type, $a_id, $a_usage_hist_nr=0, $a_lang="-")
static
static _lookupStandardItemPath( $a_mob_id, $a_url_encode=false, $a_web=true)
Get path for standard item.
if(isset($_FILES['img_file']['size']) && $_FILES['img_file']['size'] > 0) $tpl
static _lookupSLMID($a_id)
Lookup Scorm Learning Module ID for node id.
static _lookupTestObjIdForQuestionId($a_q_id)
Get test Object ID for question ID.
escapeProperty($a_value)
Escape property (e.g.
const IL_MODE_FULL
read()
read media object data from db
removeAdditionalFile($a_file)
Remove additional file.
special template class to simplify handling of ITX/PEAR
static _lookupSurveyObjId($a_question_id)
static rCopy($a_sdir, $a_tdir, $preserveTimeAttributes=false)
Copies content of a directory $a_sdir recursively to a directory $a_tdir.
static sanitizeDir($a_path)
Sanitize directory recursively.
static _exists($a_id, $a_reference=false, $a_type=null)
checks if an object exists in object_data
static _resizeImage($a_file, $a_width, $a_height, $a_constrain_prop=false)
resize image and return new image file ("_width_height" string appended)
$_GET["client_id"]
$location
Definition: buildRTE.php:44
xslt_free(&$proc)
static _getUsersForClipboadObject($a_type, $a_id)
get all users, that have a certain object within their clipboard
General exception class for media objects.
getMultiSrtFiles()
Get all srt files of srt multi upload.
static findPortfolioForPage($a_page_id)
Get portfolio id of page id.
static unzip($a_file, $overwrite=false, $a_flat=false)
unzip file
static getDir($a_dir, $a_rec=false, $a_sub_dir="")
get directory
getUsages($a_include_history=true)
get all usages of current media object
__construct($a_id=0)
Constructor public.
static _writeTitle($a_obj_id, $a_title)
write title to db (static)
createDirectory()
Create file directory of media object.
static deducibleSize($a_mime)
checks if mime type is provided by getimagesize()
static _lookupContObjID($a_id)
get learning module / digibook id for lm object
static lookupMimeType($path_to_file, $fallback=self::APPLICATION__OCTET_STREAM, $a_external=null)
static lookupExerciseIdForReturnedId($a_returned_id)
Get exercise from submission id (used in ilObjMediaObject)
static _removeUsage($a_mob_id, $a_type, $a_id, $a_usage_hist_nr=0, $a_lang="-")
Remove usage of mob in another container.
static _saveTempFileAsMediaObject($name, $tmp_name, $upload=true)
Create new media object and update page in db and return new media object.
static _getURL($a_mob_id)
get directory for files of media object (static)
static getASCIIFilename($a_filename)
convert utf8 to ascii filename
user()
Definition: user.php:4
static _getDirectory($a_mob_id)
Get absolute directory.
updateMetaData()
update meta data entry
static lookupUsages($a_id, $a_include_history=true)
Lookup usages of media object.
Class ilForumDraftHistory.
static _lookupTermId($a_def_id)
Looks up term id for a definition id.
static handleQuotaUpdate(ilObjMediaObject $a_mob)
static _getQuestionInfo($question_id)
Returns question information from the database.
static isTypeAllowed($a_type)
Is type allowed.
static lookupParentId($a_id, $a_type)
Lookup parent id.
clearMultiSrtDirectory()
Clear multi feedback directory.
$a_type
Definition: workflow.php:92
static _getIntLinks($a_item_id)
get all internal links of a media items map areas
update($a_upload=false)
update media object in db
if($format !==null) $name
Definition: metadata.php:230
getImportId()
get import id
static resizeImage($a_from, $a_to, $a_width, $a_height, $a_constrain_prop=false)
resize image
static getThumbnailPath($a_mob_id, $a_thumbname)
Get thumbnail path.
static _lookupMediaObjectUsages($a_mob_id)
Lookup media object usage(s)
static execConvert($args)
execute convert command
$mobs
MDUpdateListener($a_element)
Meta data update listener.
getId()
get object id public
uploadSrtFile($a_tmp_name, $a_language, $a_mode="move_uploaded")
Upload srt file.
static renameExecutables($a_dir)
Rename executables.
uploadAdditionalFile($a_name, $tmp_name, $a_subdir="", $a_mode="move_uploaded")
Create new media object and update page in db and return new media object.
static _getPageForQuestionId($a_q_id, $a_parent_type="")
Get page for question id.
makeThumbnail( $a_file, $a_thumbname, $a_format="png", $a_size="80")
Make thumbnail.
modifyExportIdentifier($a_tag, $a_param, $a_value)
static fixFilename($a_name)
Fix filename of uploaded file.
static moveUploadedFile($a_file, $a_name, $a_target, $a_raise_errors=true, $a_mode="move_uploaded")
move uploaded file
Class ilMediaItem.
static getFlashVideoPlayerDirectory()
Get flash video player directory.
$format
Definition: metadata.php:218
static newInstanceByDraftId($draft_id)
getLinkedMediaObjects($a_ignore="")
Get all media objects linked in map areas of this media object.
static convertImage( $a_from, $a_to, $a_target_format="", $a_geometry="", $a_background_color="")
convert image
$ilUser
Definition: imgupload.php:18
redirection script todo: (a better solution should control the processing via a xml file) ...
$xml
Definition: metadata.php:332
static createDirectory($a_dir, $a_mod=0755)
create directory
Class ilObjMediaObject.
generatePreviewPic($a_width, $a_height)
Upload video preview picture.
static _getMediaItemsOfMOb(&$a_mob)
read media items into media objects (static)
static signFile($path_to_file)
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
hasPurposeItem($purpose)
returns wether object has media item with specific purpose
getType()
get object type public
static getHtmlPath($relative_path)
get url of path
exportXML(&$a_xml_writer, $a_inst=0)
export XML
const IL_MODE_ALIAS
static _lookupType($a_id, $a_reference=false)
lookup object type
static getForbiddenFileTypes()
Get forbidden file types.
getMultiSrtUploadDir()
Get directory for multi srt upload.
containsIntLink()
returns true, if mob was marked as containing an intern link (via setContainsIntLink) (this method sh...
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
static _writeDescription($a_obj_id, $a_desc)
write description to db (static)
static _lookGlossaryID($term_id)
get glossary id form term id
$lang
Definition: xapiexit.php:8
deleteMetaData()
delete meta data entry
getFilesOfDirectory($a_subdir="")
Get files of directory.
static secureUrl($url)
Prepare secure href attribute.
static _createThumbnailDirectory($a_obj_id)
Create thumbnail directory.
addMediaItem($a_item)
add media item to media object
exportMediaFullscreen($a_target_dir, $pg_obj)
static getParentObjectIdForUsage($a_usage, $a_include_all_access_obj_ids=false)
Get&#39;s the repository object ID of a parent object, if possible.
static getRestrictedFileTypes()
Get restricted file types (this is for the input form, this list will be empty, if "allowed list" is ...
static renameExecutables($a_dir)
Rename uploaded executables for security reasons.
global $ilSetting
Definition: privfeed.php:17
& getMediaItems()
get all media items
static getAllowedFileTypes()
Get allowed file types.
static escapeShellArg($a_arg)
__construct(Container $dic, ilPlugin $plugin)
static handleUpdatedSourceObject($a_src_obj_type, $a_src_obj_id, $a_src_filesize, $a_owner_obj_ids=null, $a_is_prtf=false)
Find and update/create all related entries for source object.
global $ilDB
static _useAutoStartParameterOnly($a_loc, $a_format)
Check whether only autostart parameter should be supported (instead of parameters input field...
$ret
Definition: parser.php:6
$DIC
Definition: xapitoken.php:46
static _lookupContextObjId($a_news_id)
Context Object ID.
uploadVideoPreviewPic($a_prevpic)
Upload video preview picture.
static _getRelativeDirectory($a_mob_id)
Get relative (to webspace dir) directory.
static insertInstIntoID($a_value)
inserts installation id into ILIAS id
const IL_MODE_OUTPUT
duplicate()
Duplicate media object, return new media object.
removeAllMediaItems()
remove all media items
static getLogger($a_component_id)
Get component logger.
static _exists($a_id, $a_reference=false, $a_type=null)
checks wether a lm content object with specified id exists or not
setAlias($a_is_alias)
set wether page object is an alias
exportFiles($a_target_dir)
export all media files of object to target directory note: target directory must be the export target...
static _getSimpleMimeTypes()
Get simple mime types that deactivate parameter property files tab in ILIAS.
static _determineWidthHeight( $a_format, $a_type, $a_file, $a_reference, $a_constrain_proportions, $a_use_original, $a_user_width, $a_user_height)
Determine width and height.
create($a_create_meta_data=false, $a_save_media_items=true)
create media object in db
handleAmps($a_str)
Replace "&" (if not an "&amp;") with "&amp;".
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
static _saveUsage($a_mob_id, $a_type, $a_id, $a_usage_hist_nr=0, $a_lang="-")
Save usage of mob within another container (e.g.
static getWebspaceDir($mode="filesystem")
get webspace directory
getDescription()
get description of media object
createMetaData()
create meta data entry
getXML($a_mode=IL_MODE_FULL, $a_inst=0, $a_sign_locals=false)
get MediaObject XLM Tag
$i
Definition: metadata.php:24
setContainsIntLink($a_contains_link)
content parser set this flag to true, if the media object contains internal links (this method should...
static _lookupItemPath( $a_mob_id, $a_url_encode=false, $a_web=true, $a_purpose="")
Get path for item with specific purpose.
static lookupObjIdByPage($a_page_id)
returns the wiki/object id to a given page id