Merge branch 'wip-MDL-33144-master' of git://github.com/marinaglancy/moodle
authorDan Poltawski <dan@moodle.com>
Thu, 24 May 2012 08:32:32 +0000 (16:32 +0800)
committerDan Poltawski <dan@moodle.com>
Thu, 24 May 2012 08:32:32 +0000 (16:32 +0800)
lib/filelib.php
lib/filestorage/file_storage.php
lib/form/editor.php
mod/data/field/picture/field.class.php
mod/data/field/textarea/field.class.php
mod/resource/locallib.php
repository/upload/lib.php

index 71ba2df..bd8a311 100644 (file)
@@ -1367,7 +1367,7 @@ function &get_mimetypes_array() {
         'asc'  => array ('type'=>'text/plain', 'icon'=>'text'),
         'asm'  => array ('type'=>'text/plain', 'icon'=>'text'),
         'au'   => array ('type'=>'audio/au', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
-        'avi'  => array ('type'=>'video/x-ms-wm', 'icon'=>'avi', 'groups'=>array('video'), 'string'=>'video'),
+        'avi'  => array ('type'=>'video/x-ms-wm', 'icon'=>'avi', 'groups'=>array('video','web_video'), 'string'=>'video'),
         'bmp'  => array ('type'=>'image/bmp', 'icon'=>'bmp', 'groups'=>array('image'), 'string'=>'image'),
         'c'    => array ('type'=>'text/plain', 'icon'=>'text'),
         'cct'  => array ('type'=>'shockwave/director', 'icon'=>'flash'),
@@ -1390,8 +1390,8 @@ function &get_mimetypes_array() {
         'dxr'  => array ('type'=>'application/x-director', 'icon'=>'flash'),
         'eps'  => array ('type'=>'application/postscript', 'icon'=>'eps'),
         'fdf'  => array ('type'=>'application/pdf', 'icon'=>'pdf'),
-        'flv'  => array ('type'=>'video/x-flv', 'icon'=>'flash', 'groups'=>array('video'), 'string'=>'video'),
-        'f4v'  => array ('type'=>'video/mp4', 'icon'=>'flash', 'groups'=>array('video'), 'string'=>'video'),
+        'flv'  => array ('type'=>'video/x-flv', 'icon'=>'flash', 'groups'=>array('video','web_video'), 'string'=>'video'),
+        'f4v'  => array ('type'=>'video/mp4', 'icon'=>'flash', 'groups'=>array('video','web_video'), 'string'=>'video'),
         'gif'  => array ('type'=>'image/gif', 'icon'=>'gif', 'groups'=>array('image', 'web_image'), 'string'=>'image'),
         'gtar' => array ('type'=>'application/x-gtar', 'icon'=>'zip', 'groups'=>array('archive'), 'string'=>'archive'),
         'tgz'  => array ('type'=>'application/g-zip', 'icon'=>'zip', 'groups'=>array('archive'), 'string'=>'archive'),
@@ -1422,16 +1422,16 @@ function &get_mimetypes_array() {
         'latex'=> array ('type'=>'application/x-latex', 'icon'=>'text'),
         'm'    => array ('type'=>'text/plain', 'icon'=>'text'),
         'mbz'  => array ('type'=>'application/vnd.moodle.backup', 'icon'=>'moodle'),
-        'mov'  => array ('type'=>'video/quicktime', 'icon'=>'mov', 'groups'=>array('video'), 'string'=>'video'),
+        'mov'  => array ('type'=>'video/quicktime', 'icon'=>'mov', 'groups'=>array('video','web_video'), 'string'=>'video'),
         'movie'=> array ('type'=>'video/x-sgi-movie', 'icon'=>'mov', 'groups'=>array('video'), 'string'=>'video'),
         'm3u'  => array ('type'=>'audio/x-mpegurl', 'icon'=>'mp3', 'groups'=>array('audio'), 'string'=>'audio'),
-        'mp3'  => array ('type'=>'audio/mp3', 'icon'=>'mp3', 'groups'=>array('audio'), 'string'=>'audio'),
-        'mp4'  => array ('type'=>'video/mp4', 'icon'=>'mpeg', 'groups'=>array('video'), 'string'=>'video'),
-        'm4v'  => array ('type'=>'video/mp4', 'icon'=>'mpeg', 'groups'=>array('video'), 'string'=>'video'),
+        'mp3'  => array ('type'=>'audio/mp3', 'icon'=>'mp3', 'groups'=>array('audio','web_audio'), 'string'=>'audio'),
+        'mp4'  => array ('type'=>'video/mp4', 'icon'=>'mpeg', 'groups'=>array('video','web_video'), 'string'=>'video'),
+        'm4v'  => array ('type'=>'video/mp4', 'icon'=>'mpeg', 'groups'=>array('video','web_video'), 'string'=>'video'),
         'm4a'  => array ('type'=>'audio/mp4', 'icon'=>'mp3', 'groups'=>array('audio'), 'string'=>'audio'),
-        'mpeg' => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video'), 'string'=>'video'),
-        'mpe'  => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video'), 'string'=>'video'),
-        'mpg'  => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video'), 'string'=>'video'),
+        'mpeg' => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video','web_video'), 'string'=>'video'),
+        'mpe'  => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video','web_video'), 'string'=>'video'),
+        'mpg'  => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video','web_video'), 'string'=>'video'),
 
         'odt'  => array ('type'=>'application/vnd.oasis.opendocument.text', 'icon'=>'odt', 'groups'=>array('document')),
         'ott'  => array ('type'=>'application/vnd.oasis.opendocument.text-template', 'icon'=>'odt', 'groups'=>array('document')),
@@ -1469,8 +1469,8 @@ function &get_mimetypes_array() {
         'ppsm' => array ('type'=>'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 'icon'=>'pptx'),
 
         'ps'   => array ('type'=>'application/postscript', 'icon'=>'pdf'),
-        'qt'   => array ('type'=>'video/quicktime', 'icon'=>'mov', 'groups'=>array('video'), 'string'=>'video'),
-        'ra'   => array ('type'=>'audio/x-realaudio-plugin', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
+        'qt'   => array ('type'=>'video/quicktime', 'icon'=>'mov', 'groups'=>array('video','web_video'), 'string'=>'video'),
+        'ra'   => array ('type'=>'audio/x-realaudio-plugin', 'icon'=>'audio', 'groups'=>array('audio','web_audio'), 'string'=>'audio'),
         'ram'  => array ('type'=>'audio/x-pn-realaudio-plugin', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
         'rhb'  => array ('type'=>'text/xml', 'icon'=>'xml'),
         'rm'   => array ('type'=>'audio/x-pn-realaudio-plugin', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
@@ -1483,11 +1483,11 @@ function &get_mimetypes_array() {
         'smi'  => array ('type'=>'application/smil', 'icon'=>'text'),
         'smil' => array ('type'=>'application/smil', 'icon'=>'text'),
         'sqt'  => array ('type'=>'text/xml', 'icon'=>'xml'),
-        'svg'  => array ('type'=>'image/svg+xml', 'icon'=>'image', 'groups'=>array('image'), 'string'=>'image'),
-        'svgz' => array ('type'=>'image/svg+xml', 'icon'=>'image', 'groups'=>array('image'), 'string'=>'image'),
+        'svg'  => array ('type'=>'image/svg+xml', 'icon'=>'image', 'groups'=>array('image','web_image'), 'string'=>'image'),
+        'svgz' => array ('type'=>'image/svg+xml', 'icon'=>'image', 'groups'=>array('image','web_image'), 'string'=>'image'),
         'swa'  => array ('type'=>'application/x-director', 'icon'=>'flash'),
-        'swf'  => array ('type'=>'application/x-shockwave-flash', 'icon'=>'flash'),
-        'swfl' => array ('type'=>'application/x-shockwave-flash', 'icon'=>'flash'),
+        'swf'  => array ('type'=>'application/x-shockwave-flash', 'icon'=>'flash', 'groups'=>array('video','web_video')),
+        'swfl' => array ('type'=>'application/x-shockwave-flash', 'icon'=>'flash', 'groups'=>array('video','web_video')),
 
         'sxw'  => array ('type'=>'application/vnd.sun.xml.writer', 'icon'=>'odt'),
         'stw'  => array ('type'=>'application/vnd.sun.xml.writer.template', 'icon'=>'odt'),
@@ -1653,14 +1653,15 @@ function file_file_icon($file, $size = null) {
     } else {
         $mimetype = '';
     }
-    if ($filename && pathinfo($filename, PATHINFO_EXTENSION) &&
-            (!$mimetype || mimeinfo('type', $filename) === $mimetype)) {
-        // files with different extensions sharing the same mimetype (i.e. 'text/plain') may have different icons
-        return file_extension_icon($filename, $size);
-    } else {
-        // if mimetype and extension do not match we assume that mimetype is more correct
-        return file_mimetype_icon($mimetype, $size);
+    $mimetypes = &get_mimetypes_array();
+    if ($filename) {
+        $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
+        if ($extension && !empty($mimetypes[$extension])) {
+            // if file name has known extension, return icon for this extension
+            return file_extension_icon($filename, $size);
+        }
     }
+    return file_mimetype_icon($mimetype, $size);
 }
 
 /**
@@ -1682,13 +1683,18 @@ function file_file_icon($file, $size = null) {
 function file_folder_icon($iconsize = null) {
     global $CFG;
     static $iconpostfixes = array(256=>'-256', 128=>'-128', 96=>'-96', 80=>'-80', 72=>'-72', 64=>'-64', 48=>'-48', 32=>'-32', 24=>'-24', 16=>'');
+    static $cached = array();
     $iconsize = max(array(16, (int)$iconsize));
-    foreach ($iconpostfixes as $size => $postfix) {
-        $fullname = $CFG->dirroot.'/pix/f/folder'.$postfix;
-        if ($iconsize >= $size && (file_exists($fullname.'.png') || file_exists($fullname.'.gif'))) {
-            return 'f/folder'.$postfix;
+    if (!array_key_exists($iconsize, $cached)) {
+        foreach ($iconpostfixes as $size => $postfix) {
+            $fullname = $CFG->dirroot.'/pix/f/folder'.$postfix;
+            if ($iconsize >= $size && (file_exists($fullname.'.png') || file_exists($fullname.'.gif'))) {
+                $cached[$iconsize] = 'f/folder'.$postfix;
+                break;
+            }
         }
     }
+    return $cached[$iconsize];
 }
 
 /**
@@ -1749,6 +1755,7 @@ function file_extension_icon($filename, $size = NULL) {
  * @return string Text description
  */
 function get_mimetype_description($obj, $capitalise=false) {
+    $filename = $mimetype = '';
     if (is_object($obj) && method_exists($obj, 'get_filename') && method_exists($obj, 'get_mimetype')) {
         // this is an instance of stored_file
         $mimetype = $obj->get_mimetype();
@@ -1761,22 +1768,22 @@ function get_mimetype_description($obj, $capitalise=false) {
         $obj = (array)$obj;
         if (!empty($obj['filename'])) {
             $filename = $obj['filename'];
-        } else {
-            $filename = '';
         }
         if (!empty($obj['mimetype'])) {
             $mimetype = $obj['mimetype'];
-        } else {
-            $mimetype = mimeinfo('type', $filename);
         }
     } else {
         $mimetype = $obj;
-        $filename = '';
+    }
+    $mimetypefromext = mimeinfo('type', $filename);
+    if (empty($mimetype) || $mimetypefromext !== 'document/unknown') {
+        // if file has a known extension, overwrite the specified mimetype
+        $mimetype = $mimetypefromext;
     }
     $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
     if (empty($extension)) {
         $mimetypestr = mimeinfo_from_type('string', $mimetype);
-        $extension = mimeinfo_from_type('extension', $mimetype);
+        $extension = str_replace('.', '', mimeinfo_from_type('extension', $mimetype));
     } else {
         $mimetypestr = mimeinfo('string', $filename);
     }
@@ -1835,7 +1842,7 @@ function file_get_typegroup($element, $groups) {
                 if (empty($value[$element])) {
                     continue;
                 }
-                if (($group === $extension || $group === $value['type'] ||
+                if (($group === '.'.$extension || $group === $value['type'] ||
                         (!empty($value['groups']) && in_array($group, $value['groups']))) &&
                         !in_array($value[$element], $cached[$element][$group])) {
                     $cached[$element][$group][] = $value[$element];
index 149936b..ab71c42 100644 (file)
@@ -1794,19 +1794,19 @@ class file_storage {
     /**
      * Return mimetype by given file pathname
      *
-     * This method uses fileinfo module to get mimetype using magic bytes if file exists.
-     * If not, it will get mimetype based on filename
+     * If file has a known extension, we return the mimetype based on extension.
+     * Otherwise (when possible) we try to get the mimetype from file contents.
      *
      * @param string $pathname
      * @return string
      */
     public static function mimetype($pathname) {
-        if (file_exists($pathname)) {
+        $type = mimeinfo('type', $pathname);
+        if ($type === 'document/unknown' && class_exists('finfo') && file_exists($pathname)) {
             $finfo = new finfo(FILEINFO_MIME_TYPE);
-            return mimeinfo_from_type('type', $finfo->file($pathname));
-        } else {
-            return mimeinfo('type', $pathname);
+            $type = mimeinfo_from_type('type', $finfo->file($pathname));
         }
+        return $type;
     }
 
     /**
index fdbbaf9..f36580b 100644 (file)
@@ -302,7 +302,7 @@ class MoodleQuickForm_editor extends HTML_QuickForm_element {
 
             $args = new stdClass();
             // need these three to filter repositories list
-            $args->accepted_types = array('image');
+            $args->accepted_types = array('web_image');
             $args->return_types = (FILE_INTERNAL | FILE_EXTERNAL | FILE_REFERENCE);
             $args->context = $ctx;
             $args->env = 'filepicker';
index 290558b..fe2053d 100644 (file)
@@ -75,7 +75,7 @@ class data_field_picture extends data_field_base {
         $options = new stdClass();
         $options->maxbytes  = $this->field->param3;
         $options->itemid    = $itemid;
-        $options->accepted_types = array('image');
+        $options->accepted_types = array('web_image');
         $options->return_types = FILE_INTERNAL;
         $options->context = $PAGE->context;
         if (!empty($file)) {
index a15dfb2..089a98d 100644 (file)
@@ -82,7 +82,7 @@ class data_field_textarea extends data_field_base {
         if ($options['maxfiles'] != 0 ) {
             $args = new stdClass();
             // need these three to filter repositories list
-            $args->accepted_types = array('image');
+            $args->accepted_types = array('web_image');
             $args->return_types = (FILE_INTERNAL | FILE_EXTERNAL);
             $args->context = $this->context;
             $args->env = 'filepicker';
index 64f7fcc..e2d9758 100644 (file)
@@ -82,7 +82,7 @@ function resource_display_embed($resource, $cm, $course, $file) {
         core_media::OPTION_BLOCK => true,
     );
 
-    if (in_array($mimetype, array('image/gif','image/jpeg','image/png'))) {  // It's an image
+    if (file_mimetype_in_typegroup($mimetype, 'web_image')) {  // It's an image
         $code = resourcelib_embed_image($fullurl, $title);
 
     } else if ($mimetype === 'application/pdf') {
@@ -409,30 +409,22 @@ function resource_print_filenotfound($resource, $cm, $course) {
  * @return int display type constant
  */
 function resource_get_final_display_type($resource) {
-    global $CFG;
+    global $CFG, $PAGE;
 
     if ($resource->display != RESOURCELIB_DISPLAY_AUTO) {
         return $resource->display;
     }
 
-    static $download = array('application/zip', 'application/x-tar', 'application/g-zip');    // binary formats
-    static $embed    = array('image/gif', 'image/jpeg', 'image/png', 'image/svg+xml',         // images
-                             'application/x-shockwave-flash', 'video/x-flv', 'video/x-ms-wm', // video formats
-                             'video/quicktime', 'video/mpeg', 'video/mp4',
-                             'audio/mp3', 'audio/x-realaudio-plugin', 'x-realaudio-plugin',   // audio formats
-                             'application/pdf', 'text/html',
-                            );
-
     if (empty($resource->mainfile)) {
         return RESOURCELIB_DISPLAY_DOWNLOAD;
     } else {
         $mimetype = mimeinfo('type', $resource->mainfile);
     }
 
-    if (in_array($mimetype, $download)) {
+    if (file_mimetype_in_typegroup($mimetype, 'archive')) {
         return RESOURCELIB_DISPLAY_DOWNLOAD;
     }
-    if (in_array($mimetype, $embed)) {
+    if (file_mimetype_in_typegroup($mimetype, array('web_image', '.pdf', '.htm', 'web_video', 'web_audio'))) {
         return RESOURCELIB_DISPLAY_EMBED;
     }
 
index 4abad67..fa7eaf3 100644 (file)
@@ -171,7 +171,7 @@ class repository_upload extends repository {
 
         if ($this->mimetypes != '*') {
             // check filetype
-            $filemimetype = mimeinfo('type', $_FILES[$elname]['name']);
+            $filemimetype = file_storage::mimetype($_FILES[$elname]['tmp_name']);
             if (!in_array($filemimetype, $this->mimetypes)) {
                 throw new moodle_exception('invalidfiletype', 'repository', '', get_mimetype_description(array('filename' => $_FILES[$elname]['name'])));
             }