Merge branch 'MDL-27125_master_2' of git://git.catalyst.net.nz/moodle-r2
authorSam Hemelryk <sam@moodle.com>
Tue, 3 Jul 2012 21:32:45 +0000 (09:32 +1200)
committerSam Hemelryk <sam@moodle.com>
Tue, 3 Jul 2012 21:32:45 +0000 (09:32 +1200)
1  2 
lib/filelib.php

diff --combined lib/filelib.php
@@@ -601,7 -601,7 +601,7 @@@ function file_get_drafarea_files($draft
              }
              // find the file this draft file was created from and count all references in local
              // system pointing to that file
 -            $source = unserialize($file->get_source());
 +            $source = @unserialize($file->get_source());
              if (isset($source->original)) {
                  $item->refcount = $fs->search_references_count($source->original);
              }
@@@ -679,7 -679,7 +679,7 @@@ function file_get_submitted_draft_itemi
   * @return stored_file
   */
  function file_restore_source_field_from_draft_file($storedfile) {
 -    $source = unserialize($storedfile->get_source());
 +    $source = @unserialize($storedfile->get_source());
      if (!empty($source)) {
          if (is_object($source)) {
              $restoredsource = $source->source;
@@@ -721,16 -721,9 +721,16 @@@ function file_save_draft_area_files($dr
      if (!isset($options['maxfiles'])) {
          $options['maxfiles'] = -1; // unlimited
      }
 -    if (!isset($options['maxbytes'])) {
 +    if (!isset($options['maxbytes']) || $options['maxbytes'] == USER_CAN_IGNORE_FILE_SIZE_LIMITS) {
          $options['maxbytes'] = 0; // unlimited
      }
 +    $allowreferences = true;
 +    if (isset($options['return_types']) && !($options['return_types'] & FILE_REFERENCE)) {
 +        // we assume that if $options['return_types'] is NOT specified, we DO allow references.
 +        // this is not exactly right. BUT there are many places in code where filemanager options
 +        // are not passed to file_save_draft_area_files()
 +        $allowreferences = false;
 +    }
  
      $draftfiles = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftitemid, 'id');
      $oldfiles   = $fs->get_area_files($contextid, $component, $filearea, $itemid, 'id');
              }
  
              if ($file->is_external_file()) {
 +                if (!$allowreferences) {
 +                    continue;
 +                }
                  $repoid = $file->get_repository_id();
                  if (!empty($repoid)) {
                      $file_record['repositoryid'] = $repoid;
              }
  
              if ($file->is_external_file()) {
 +                if (!$allowreferences) {
 +                    continue;
 +                }
                  $repoid = $file->get_repository_id();
                  if (!empty($repoid)) {
                      $file_record['repositoryid'] = $repoid;
@@@ -1373,35 -1360,35 +1373,35 @@@ function download_file_content_write_ha
  function &get_mimetypes_array() {
      static $mimearray = array (
          'xxx'  => array ('type'=>'document/unknown', 'icon'=>'unknown'),
 -        '3gp'  => array ('type'=>'video/quicktime', 'icon'=>'mov', 'groups'=>array('video'), 'string'=>'video'),
 -        'aac'  => array ('type'=>'audio/aac', 'icon'=>'mp3', 'groups'=>array('audio'), 'string'=>'audio'),
 +        '3gp'  => array ('type'=>'video/quicktime', 'icon'=>'quicktime', 'groups'=>array('video'), 'string'=>'video'),
 +        'aac'  => array ('type'=>'audio/aac', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
          'ai'   => array ('type'=>'application/postscript', 'icon'=>'eps', 'groups'=>array('image'), 'string'=>'image'),
          'aif'  => array ('type'=>'audio/x-aiff', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
          'aiff' => array ('type'=>'audio/x-aiff', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
          'aifc' => array ('type'=>'audio/x-aiff', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
          'applescript'  => array ('type'=>'text/plain', 'icon'=>'text'),
 -        'asc'  => array ('type'=>'text/plain', 'icon'=>'text'),
 -        'asm'  => array ('type'=>'text/plain', 'icon'=>'text'),
 +        'asc'  => array ('type'=>'text/plain', 'icon'=>'sourcecode'),
 +        'asm'  => array ('type'=>'text/plain', 'icon'=>'sourcecode'),
          'au'   => array ('type'=>'audio/au', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
          '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'),
 +        'c'    => array ('type'=>'text/plain', 'icon'=>'sourcecode'),
          'cct'  => array ('type'=>'shockwave/director', 'icon'=>'flash'),
 -        'cpp'  => array ('type'=>'text/plain', 'icon'=>'text'),
 -        'cs'   => array ('type'=>'application/x-csh', 'icon'=>'text'),
 +        'cpp'  => array ('type'=>'text/plain', 'icon'=>'sourcecode'),
 +        'cs'   => array ('type'=>'application/x-csh', 'icon'=>'sourcecode'),
          'css'  => array ('type'=>'text/css', 'icon'=>'text', 'groups'=>array('web_file')),
 -        'csv'  => array ('type'=>'text/csv', 'icon'=>'xlsx', 'groups'=>array('spreadsheet')),
 -        'dv'   => array ('type'=>'video/x-dv', 'icon'=>'mov', 'groups'=>array('video'), 'string'=>'video'),
 -        'dmg'  => array ('type'=>'application/octet-stream', 'icon'=>'dmg'),
 +        'csv'  => array ('type'=>'text/csv', 'icon'=>'spreadsheet', 'groups'=>array('spreadsheet')),
 +        'dv'   => array ('type'=>'video/x-dv', 'icon'=>'quicktime', 'groups'=>array('video'), 'string'=>'video'),
 +        'dmg'  => array ('type'=>'application/octet-stream', 'icon'=>'unknown'),
  
 -        'doc'  => array ('type'=>'application/msword', 'icon'=>'docx', 'groups'=>array('document')),
 -        'docx' => array ('type'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'icon'=>'docx', 'groups'=>array('document')),
 -        'docm' => array ('type'=>'application/vnd.ms-word.document.macroEnabled.12', 'icon'=>'docx'),
 -        'dotx' => array ('type'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'icon'=>'docx'),
 -        'dotm' => array ('type'=>'application/vnd.ms-word.template.macroEnabled.12', 'icon'=>'docx'),
 +        'doc'  => array ('type'=>'application/msword', 'icon'=>'document', 'groups'=>array('document')),
 +        'docx' => array ('type'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'icon'=>'document', 'groups'=>array('document')),
 +        'docm' => array ('type'=>'application/vnd.ms-word.document.macroEnabled.12', 'icon'=>'document'),
 +        'dotx' => array ('type'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'icon'=>'document'),
 +        'dotm' => array ('type'=>'application/vnd.ms-word.template.macroEnabled.12', 'icon'=>'document'),
  
          'dcr'  => array ('type'=>'application/x-director', 'icon'=>'flash'),
 -        'dif'  => array ('type'=>'video/x-dv', 'icon'=>'mov', 'groups'=>array('video'), 'string'=>'video'),
 +        'dif'  => array ('type'=>'video/x-dv', 'icon'=>'quicktime', 'groups'=>array('video'), 'string'=>'video'),
          'dir'  => array ('type'=>'application/x-director', 'icon'=>'flash'),
          'dxr'  => array ('type'=>'application/x-director', 'icon'=>'flash'),
          'eps'  => array ('type'=>'application/postscript', 'icon'=>'eps'),
          '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'),
 -        'gz'   => array ('type'=>'application/g-zip', 'icon'=>'zip', 'groups'=>array('archive'), 'string'=>'archive'),
 -        'gzip' => array ('type'=>'application/g-zip', 'icon'=>'zip', 'groups'=>array('archive'), 'string'=>'archive'),
 -        'h'    => array ('type'=>'text/plain', 'icon'=>'text'),
 -        'hpp'  => array ('type'=>'text/plain', 'icon'=>'text'),
 -        'hqx'  => array ('type'=>'application/mac-binhex40', 'icon'=>'zip', 'groups'=>array('archive'), 'string'=>'archive'),
 -        'htc'  => array ('type'=>'text/x-component', 'icon'=>'html'),
 +        'gtar' => array ('type'=>'application/x-gtar', 'icon'=>'archive', 'groups'=>array('archive'), 'string'=>'archive'),
 +        'tgz'  => array ('type'=>'application/g-zip', 'icon'=>'archive', 'groups'=>array('archive'), 'string'=>'archive'),
 +        'gz'   => array ('type'=>'application/g-zip', 'icon'=>'archive', 'groups'=>array('archive'), 'string'=>'archive'),
 +        'gzip' => array ('type'=>'application/g-zip', 'icon'=>'archive', 'groups'=>array('archive'), 'string'=>'archive'),
 +        'h'    => array ('type'=>'text/plain', 'icon'=>'sourcecode'),
 +        'hpp'  => array ('type'=>'text/plain', 'icon'=>'sourcecode'),
 +        'hqx'  => array ('type'=>'application/mac-binhex40', 'icon'=>'archive', 'groups'=>array('archive'), 'string'=>'archive'),
 +        'htc'  => array ('type'=>'text/x-component', 'icon'=>'markup'),
          'html' => array ('type'=>'text/html', 'icon'=>'html', 'groups'=>array('web_file')),
 -        'xhtml'=> array ('type'=>'application/xhtml+xml', 'icon'=>'html', 'groups'=>array('web_file')),
 +        'xhtml'=> array ('type'=>'application/xhtml+xml', 'icon'=>'markup', 'groups'=>array('web_file')),
          'htm'  => array ('type'=>'text/html', 'icon'=>'html', 'groups'=>array('web_file')),
          'ico'  => array ('type'=>'image/vnd.microsoft.icon', 'icon'=>'image', 'groups'=>array('image'), 'string'=>'image'),
          'ics'  => array ('type'=>'text/calendar', 'icon'=>'text'),
          'isf'  => array ('type'=>'application/inspiration', 'icon'=>'isf'),
          'ist'  => array ('type'=>'application/inspiration.template', 'icon'=>'isf'),
 -        'java' => array ('type'=>'text/plain', 'icon'=>'text'),
 -        'jcb'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 -        'jcl'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 -        'jcw'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 -        'jmt'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 -        'jmx'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 +        'java' => array ('type'=>'text/plain', 'icon'=>'sourcecode'),
 +        'jcb'  => array ('type'=>'text/xml', 'icon'=>'markup'),
 +        'jcl'  => array ('type'=>'text/xml', 'icon'=>'markup'),
 +        'jcw'  => array ('type'=>'text/xml', 'icon'=>'markup'),
 +        'jmt'  => array ('type'=>'text/xml', 'icon'=>'markup'),
 +        'jmx'  => array ('type'=>'text/xml', 'icon'=>'markup'),
          'jpe'  => array ('type'=>'image/jpeg', 'icon'=>'jpeg', 'groups'=>array('image', 'web_image'), 'string'=>'image'),
          'jpeg' => array ('type'=>'image/jpeg', 'icon'=>'jpeg', 'groups'=>array('image', 'web_image'), 'string'=>'image'),
          'jpg'  => array ('type'=>'image/jpeg', 'icon'=>'jpeg', 'groups'=>array('image', 'web_image'), 'string'=>'image'),
 -        'jqz'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 +        'jqz'  => array ('type'=>'text/xml', 'icon'=>'markup'),
          'js'   => array ('type'=>'application/x-javascript', 'icon'=>'text', 'groups'=>array('web_file')),
          'latex'=> array ('type'=>'application/x-latex', 'icon'=>'text'),
 -        'm'    => array ('type'=>'text/plain', 'icon'=>'text'),
 +        'm'    => array ('type'=>'text/plain', 'icon'=>'sourcecode'),
          'mbz'  => array ('type'=>'application/vnd.moodle.backup', 'icon'=>'moodle'),
 -        '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'),
 +        'mov'  => array ('type'=>'video/quicktime', 'icon'=>'quicktime', 'groups'=>array('video','web_video'), 'string'=>'video'),
 +        'movie'=> array ('type'=>'video/x-sgi-movie', 'icon'=>'quicktime', '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','web_audio'), 'string'=>'audio'),
          'mp4'  => array ('type'=>'video/mp4', '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')),
 +        'odt'  => array ('type'=>'application/vnd.oasis.opendocument.text', 'icon'=>'writer', 'groups'=>array('document')),
 +        'ott'  => array ('type'=>'application/vnd.oasis.opendocument.text-template', 'icon'=>'writer', 'groups'=>array('document')),
          'oth'  => array ('type'=>'application/vnd.oasis.opendocument.text-web', 'icon'=>'oth', 'groups'=>array('document')),
 -        'odm'  => array ('type'=>'application/vnd.oasis.opendocument.text-master', 'icon'=>'odt'),
 -        'odg'  => array ('type'=>'application/vnd.oasis.opendocument.graphics', 'icon'=>'odg'),
 -        'otg'  => array ('type'=>'application/vnd.oasis.opendocument.graphics-template', 'icon'=>'odg'),
 -        'odp'  => array ('type'=>'application/vnd.oasis.opendocument.presentation', 'icon'=>'odp'),
 -        'otp'  => array ('type'=>'application/vnd.oasis.opendocument.presentation-template', 'icon'=>'odp'),
 -        'ods'  => array ('type'=>'application/vnd.oasis.opendocument.spreadsheet', 'icon'=>'ods', 'groups'=>array('spreadsheet')),
 -        'ots'  => array ('type'=>'application/vnd.oasis.opendocument.spreadsheet-template', 'icon'=>'ods', 'groups'=>array('spreadsheet')),
 -        'odc'  => array ('type'=>'application/vnd.oasis.opendocument.chart', 'icon'=>'odc'),
 -        'odf'  => array ('type'=>'application/vnd.oasis.opendocument.formula', 'icon'=>'odf'),
 -        'odb'  => array ('type'=>'application/vnd.oasis.opendocument.database', 'icon'=>'odb'),
 -        'odi'  => array ('type'=>'application/vnd.oasis.opendocument.image', 'icon'=>'odg'),
 -        'oga'  => array ('type'=>'audio/ogg', 'icon'=>'wma', 'groups'=>array('audio'), 'string'=>'audio'),
 -        'ogg'  => array ('type'=>'audio/ogg', 'icon'=>'wma', 'groups'=>array('audio'), 'string'=>'audio'),
 -        'ogv'  => array ('type'=>'video/ogg', 'icon'=>'wmv', 'groups'=>array('video'), 'string'=>'video'),
 +        'odm'  => array ('type'=>'application/vnd.oasis.opendocument.text-master', 'icon'=>'writer'),
 +        'odg'  => array ('type'=>'application/vnd.oasis.opendocument.graphics', 'icon'=>'draw'),
 +        'otg'  => array ('type'=>'application/vnd.oasis.opendocument.graphics-template', 'icon'=>'draw'),
 +        'odp'  => array ('type'=>'application/vnd.oasis.opendocument.presentation', 'icon'=>'impress'),
 +        'otp'  => array ('type'=>'application/vnd.oasis.opendocument.presentation-template', 'icon'=>'impress'),
 +        'ods'  => array ('type'=>'application/vnd.oasis.opendocument.spreadsheet', 'icon'=>'calc', 'groups'=>array('spreadsheet')),
 +        'ots'  => array ('type'=>'application/vnd.oasis.opendocument.spreadsheet-template', 'icon'=>'calc', 'groups'=>array('spreadsheet')),
 +        'odc'  => array ('type'=>'application/vnd.oasis.opendocument.chart', 'icon'=>'chart'),
 +        'odf'  => array ('type'=>'application/vnd.oasis.opendocument.formula', 'icon'=>'math'),
 +        'odb'  => array ('type'=>'application/vnd.oasis.opendocument.database', 'icon'=>'base'),
 +        'odi'  => array ('type'=>'application/vnd.oasis.opendocument.image', 'icon'=>'draw'),
 +        'oga'  => array ('type'=>'audio/ogg', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
 +        'ogg'  => array ('type'=>'audio/ogg', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
 +        'ogv'  => array ('type'=>'video/ogg', 'icon'=>'video', 'groups'=>array('video'), 'string'=>'video'),
  
          'pct'  => array ('type'=>'image/pict', 'icon'=>'image', 'groups'=>array('image'), 'string'=>'image'),
          'pdf'  => array ('type'=>'application/pdf', 'icon'=>'pdf'),
 -        'php'  => array ('type'=>'text/plain', 'icon'=>'text'),
 +        'php'  => array ('type'=>'text/plain', 'icon'=>'sourcecode'),
          'pic'  => array ('type'=>'image/pict', 'icon'=>'image', 'groups'=>array('image'), 'string'=>'image'),
          'pict' => array ('type'=>'image/pict', 'icon'=>'image', 'groups'=>array('image'), 'string'=>'image'),
          'png'  => array ('type'=>'image/png', 'icon'=>'png', 'groups'=>array('image', 'web_image'), 'string'=>'image'),
  
 -        'pps'  => array ('type'=>'application/vnd.ms-powerpoint', 'icon'=>'pptx', 'groups'=>array('presentation')),
 -        'ppt'  => array ('type'=>'application/vnd.ms-powerpoint', 'icon'=>'pptx', 'groups'=>array('presentation')),
 -        'pptx' => array ('type'=>'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'icon'=>'pptx'),
 -        'pptm' => array ('type'=>'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'icon'=>'pptx'),
 -        'potx' => array ('type'=>'application/vnd.openxmlformats-officedocument.presentationml.template', 'icon'=>'pptx'),
 -        'potm' => array ('type'=>'application/vnd.ms-powerpoint.template.macroEnabled.12', 'icon'=>'pptx'),
 -        'ppam' => array ('type'=>'application/vnd.ms-powerpoint.addin.macroEnabled.12', 'icon'=>'pptx'),
 -        'ppsx' => array ('type'=>'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'icon'=>'pptx'),
 -        'ppsm' => array ('type'=>'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 'icon'=>'pptx'),
 +        'pps'  => array ('type'=>'application/vnd.ms-powerpoint', 'icon'=>'powerpoint', 'groups'=>array('presentation')),
 +        'ppt'  => array ('type'=>'application/vnd.ms-powerpoint', 'icon'=>'powerpoint', 'groups'=>array('presentation')),
 +        'pptx' => array ('type'=>'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'icon'=>'powerpoint'),
 +        'pptm' => array ('type'=>'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'icon'=>'powerpoint'),
 +        'potx' => array ('type'=>'application/vnd.openxmlformats-officedocument.presentationml.template', 'icon'=>'powerpoint'),
 +        'potm' => array ('type'=>'application/vnd.ms-powerpoint.template.macroEnabled.12', 'icon'=>'powerpoint'),
 +        'ppam' => array ('type'=>'application/vnd.ms-powerpoint.addin.macroEnabled.12', 'icon'=>'powerpoint'),
 +        'ppsx' => array ('type'=>'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'icon'=>'powerpoint'),
 +        'ppsm' => array ('type'=>'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 'icon'=>'powerpoint'),
  
          'ps'   => array ('type'=>'application/postscript', 'icon'=>'pdf'),
 -        'qt'   => array ('type'=>'video/quicktime', 'icon'=>'mov', 'groups'=>array('video','web_video'), 'string'=>'video'),
 +        'qt'   => array ('type'=>'video/quicktime', 'icon'=>'quicktime', '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'),
 +        'rhb'  => array ('type'=>'text/xml', 'icon'=>'markup'),
          'rm'   => array ('type'=>'audio/x-pn-realaudio-plugin', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
          'rmvb' => array ('type'=>'application/vnd.rn-realmedia-vbr', 'icon'=>'video', 'groups'=>array('video'), 'string'=>'video'),
          'rtf'  => array ('type'=>'text/rtf', 'icon'=>'text', 'groups'=>array('document')),
          'rtx'  => array ('type'=>'text/richtext', 'icon'=>'text'),
          'rv'   => array ('type'=>'audio/x-pn-realaudio-plugin', 'icon'=>'audio', 'groups'=>array('video'), 'string'=>'video'),
 -        'sh'   => array ('type'=>'application/x-sh', 'icon'=>'text'),
 -        'sit'  => array ('type'=>'application/x-stuffit', 'icon'=>'zip', 'groups'=>array('archive'), 'string'=>'archive'),
 +        'sh'   => array ('type'=>'application/x-sh', 'icon'=>'sourcecode'),
 +        'sit'  => array ('type'=>'application/x-stuffit', 'icon'=>'archive', 'groups'=>array('archive'), 'string'=>'archive'),
          'smi'  => array ('type'=>'application/smil', 'icon'=>'text'),
          'smil' => array ('type'=>'application/smil', 'icon'=>'text'),
 -        'sqt'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 +        'sqt'  => array ('type'=>'text/xml', 'icon'=>'markup'),
          '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', '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'),
 -        'sxc'  => array ('type'=>'application/vnd.sun.xml.calc', 'icon'=>'ods'),
 -        'stc'  => array ('type'=>'application/vnd.sun.xml.calc.template', 'icon'=>'ods'),
 -        'sxd'  => array ('type'=>'application/vnd.sun.xml.draw', 'icon'=>'odg'),
 -        'std'  => array ('type'=>'application/vnd.sun.xml.draw.template', 'icon'=>'odg'),
 -        'sxi'  => array ('type'=>'application/vnd.sun.xml.impress', 'icon'=>'odp'),
 -        'sti'  => array ('type'=>'application/vnd.sun.xml.impress.template', 'icon'=>'odp'),
 -        'sxg'  => array ('type'=>'application/vnd.sun.xml.writer.global', 'icon'=>'odt'),
 -        'sxm'  => array ('type'=>'application/vnd.sun.xml.math', 'icon'=>'odf'),
 -
 -        'tar'  => array ('type'=>'application/x-tar', 'icon'=>'zip', 'groups'=>array('archive'), 'string'=>'archive'),
 +        'sxw'  => array ('type'=>'application/vnd.sun.xml.writer', 'icon'=>'writer'),
 +        'stw'  => array ('type'=>'application/vnd.sun.xml.writer.template', 'icon'=>'writer'),
 +        'sxc'  => array ('type'=>'application/vnd.sun.xml.calc', 'icon'=>'calc'),
 +        'stc'  => array ('type'=>'application/vnd.sun.xml.calc.template', 'icon'=>'calc'),
 +        'sxd'  => array ('type'=>'application/vnd.sun.xml.draw', 'icon'=>'draw'),
 +        'std'  => array ('type'=>'application/vnd.sun.xml.draw.template', 'icon'=>'draw'),
 +        'sxi'  => array ('type'=>'application/vnd.sun.xml.impress', 'icon'=>'impress'),
 +        'sti'  => array ('type'=>'application/vnd.sun.xml.impress.template', 'icon'=>'impress'),
 +        'sxg'  => array ('type'=>'application/vnd.sun.xml.writer.global', 'icon'=>'writer'),
 +        'sxm'  => array ('type'=>'application/vnd.sun.xml.math', 'icon'=>'math'),
 +
 +        'tar'  => array ('type'=>'application/x-tar', 'icon'=>'archive', 'groups'=>array('archive'), 'string'=>'archive'),
          'tif'  => array ('type'=>'image/tiff', 'icon'=>'tiff', 'groups'=>array('image'), 'string'=>'image'),
          'tiff' => array ('type'=>'image/tiff', 'icon'=>'tiff', 'groups'=>array('image'), 'string'=>'image'),
          'tex'  => array ('type'=>'application/x-tex', 'icon'=>'text'),
          'tsv'  => array ('type'=>'text/tab-separated-values', 'icon'=>'text'),
          'txt'  => array ('type'=>'text/plain', 'icon'=>'text', 'defaulticon'=>true),
          'wav'  => array ('type'=>'audio/wav', 'icon'=>'wav', 'groups'=>array('audio'), 'string'=>'audio'),
 -        'webm'  => array ('type'=>'video/webm', 'icon'=>'wmv', 'groups'=>array('video'), 'string'=>'video'),
 +        'webm'  => array ('type'=>'video/webm', 'icon'=>'video', 'groups'=>array('video'), 'string'=>'video'),
          'wmv'  => array ('type'=>'video/x-ms-wmv', 'icon'=>'wmv', 'groups'=>array('video'), 'string'=>'video'),
          'asf'  => array ('type'=>'video/x-ms-asf', 'icon'=>'wmv', 'groups'=>array('video'), 'string'=>'video'),
          'xdp'  => array ('type'=>'application/pdf', 'icon'=>'pdf'),
          'xfd'  => array ('type'=>'application/pdf', 'icon'=>'pdf'),
          'xfdf' => array ('type'=>'application/pdf', 'icon'=>'pdf'),
  
 -        'xls'  => array ('type'=>'application/vnd.ms-excel', 'icon'=>'xlsx', 'groups'=>array('spreadsheet')),
 -        'xlsx' => array ('type'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'icon'=>'xlsx'),
 -        'xlsm' => array ('type'=>'application/vnd.ms-excel.sheet.macroEnabled.12', 'icon'=>'xlsx', 'groups'=>array('spreadsheet')),
 -        'xltx' => array ('type'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'icon'=>'xlsx'),
 -        'xltm' => array ('type'=>'application/vnd.ms-excel.template.macroEnabled.12', 'icon'=>'xlsx'),
 -        'xlsb' => array ('type'=>'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'icon'=>'xlsx'),
 -        'xlam' => array ('type'=>'application/vnd.ms-excel.addin.macroEnabled.12', 'icon'=>'xlsx'),
 -
 -        'xml'  => array ('type'=>'application/xml', 'icon'=>'xml'),
 -        'xsl'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 -        'zip'  => array ('type'=>'application/zip', 'icon'=>'zip', 'groups'=>array('archive'), 'string'=>'archive')
 +        'xls'  => array ('type'=>'application/vnd.ms-excel', 'icon'=>'spreadsheet', 'groups'=>array('spreadsheet')),
 +        'xlsx' => array ('type'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'icon'=>'spreadsheet'),
 +        'xlsm' => array ('type'=>'application/vnd.ms-excel.sheet.macroEnabled.12', 'icon'=>'spreadsheet', 'groups'=>array('spreadsheet')),
 +        'xltx' => array ('type'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'icon'=>'spreadsheet'),
 +        'xltm' => array ('type'=>'application/vnd.ms-excel.template.macroEnabled.12', 'icon'=>'spreadsheet'),
 +        'xlsb' => array ('type'=>'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'icon'=>'spreadsheet'),
 +        'xlam' => array ('type'=>'application/vnd.ms-excel.addin.macroEnabled.12', 'icon'=>'spreadsheet'),
 +
 +        'xml'  => array ('type'=>'application/xml', 'icon'=>'markup'),
 +        'xsl'  => array ('type'=>'text/xml', 'icon'=>'markup'),
 +        'zip'  => array ('type'=>'application/zip', 'icon'=>'archive', 'groups'=>array('archive'), 'string'=>'archive')
      );
      return $mimearray;
  }
@@@ -3006,14 -2993,36 +3006,36 @@@ class curl 
       * Calls {@link multi()} with specific download headers
       *
       * <code>
-      * $c = new curl;
+      * $c = new curl();
+      * $file1 = fopen('a', 'wb');
+      * $file2 = fopen('b', 'wb');
       * $c->download(array(
-      *              array('url'=>'http://localhost/', 'file'=>fopen('a', 'wb')),
-      *              array('url'=>'http://localhost/20/', 'file'=>fopen('b', 'wb'))
+      *     array('url'=>'http://localhost/', 'file'=>$file1),
+      *     array('url'=>'http://localhost/20/', 'file'=>$file2)
+      * ));
+      * fclose($file1);
+      * fclose($file2);
+      * </code>
+      *
+      * or
+      *
+      * <code>
+      * $c = new curl();
+      * $c->download(array(
+      *              array('url'=>'http://localhost/', 'filepath'=>'/tmp/file1.tmp'),
+      *              array('url'=>'http://localhost/20/', 'filepath'=>'/tmp/file2.tmp')
       *              ));
       * </code>
       *
-      * @param array $requests An array of files to request
+      * @param array $requests An array of files to request {
+      *                  url => url to download the file [required]
+      *                  file => file handler, or
+      *                  filepath => file path
+      * }
+      * If 'file' and 'filepath' parameters are both specified in one request, the
+      * open file handle in the 'file' parameter will take precedence and 'filepath'
+      * will be ignored.
+      *
       * @param array $options An array of options to set
       * @return array An array of results
       */
          $results = array();
          $main    = curl_multi_init();
          for ($i = 0; $i < $count; $i++) {
-             $url = $requests[$i];
-             foreach($url as $n=>$v){
-                 $options[$n] = $url[$n];
+             if (!empty($requests[$i]['filepath']) and empty($requests[$i]['file'])) {
+                 // open file
+                 $requests[$i]['file'] = fopen($requests[$i]['filepath'], 'w');
+                 $requests[$i]['auto-handle'] = true;
+             }
+             foreach($requests[$i] as $n=>$v){
+                 $options[$n] = $v;
              }
-             $handles[$i] = curl_init($url['url']);
+             $handles[$i] = curl_init($requests[$i]['url']);
              $this->apply_opt($handles[$i], $options);
              curl_multi_add_handle($main, $handles[$i]);
          }
              curl_multi_remove_handle($main, $handles[$i]);
          }
          curl_multi_close($main);
+         for ($i = 0; $i < $count; $i++) {
+             if (!empty($requests[$i]['filepath']) and !empty($requests[$i]['auto-handle'])) {
+                 // close file handler if file is opened in this function
+                 fclose($requests[$i]['file']);
+             }
+         }
          return $results;
      }