MDL-33513: Make files->source field consistent
authorDongsheng Cai <dongsheng@moodle.com>
Sun, 10 Jun 2012 07:47:00 +0000 (17:47 +1000)
committerDan Poltawski <dan@moodle.com>
Fri, 15 Jun 2012 06:51:07 +0000 (14:51 +0800)
13 files changed:
lib/boxlib.php
lib/filelib.php
repository/boxnet/lib.php
repository/dropbox/lib.php
repository/filesystem/lib.php
repository/flickr/lib.php
repository/flickr_public/lib.php
repository/lib.php
repository/repository_ajax.php
repository/s3/lib.php
repository/upload/lib.php
repository/url/lib.php
repository/wikimedia/lib.php

index a647223..e1e8387 100644 (file)
@@ -188,6 +188,29 @@ class boxclient {
         return $ret;
     }
 
+    /**
+     * Get box.net file info
+     *
+     * @param string $fileid
+     * @return string|null
+     */
+    function get_file_info($fileid) {
+        $this->_clearErrors();
+        $params = array();
+        $params['action']     = 'get_file_info';
+        $params['file_id']    = $fileid;
+        $params['auth_token'] = $this->auth_token;
+        $params['api_key']    = $this->api_key;
+        $http = new curl(array('debug'=>$this->debug, 'cache'=>true, 'module_cache'=>'repository'));
+        $xml = $http->get($this->_box_api_url, $params);
+        $o = simplexml_load_string(trim($xml));
+        if ($o->status == 's_get_file_info') {
+            return $o->info;
+        } else {
+            return null;
+        }
+    }
+
     /**
      * @param array $sax
      * @param array $tree Passed by reference
index 3d8b8cd..0d18cfa 100644 (file)
@@ -773,6 +773,7 @@ function file_save_draft_area_files($draftitemid, $contextid, $component, $filea
         $newhashes = array();
         foreach ($draftfiles as $file) {
             $newhash = $fs->get_pathname_hash($contextid, $component, $filearea, $itemid, $file->get_filepath(), $file->get_filename());
+            file_restore_source_field_from_draft_file($file);
             $newhashes[$newhash] = $file;
         }
         $filecount = 0;
@@ -793,7 +794,6 @@ function file_save_draft_area_files($draftitemid, $contextid, $component, $filea
                 continue;
             }
 
-            file_restore_source_field_from_draft_file($newfile);
             // Replaced file content
             if ($oldfile->get_contenthash() != $newfile->get_contenthash()) {
                 $oldfile->replace_content_with($newfile);
index b64d36a..6578afe 100644 (file)
@@ -308,6 +308,23 @@ class repository_boxnet extends repository {
         }
     }
 
+    /**
+     * Return the source information
+     *
+     * @param stdClass $url
+     * @return string|null
+     */
+    public function get_file_source_info($url) {
+        $array = explode('/', $url);
+        $fileid = array_pop($array);
+        $fileinfo = $this->boxclient->get_file_info($fileid);
+        if (!empty($fileinfo)) {
+            return 'Box:' . (string)$fileinfo->file_name;
+        } else {
+            return $url;
+        }
+    }
+
     /**
      * Repository method to serve the referenced file
      *
index dccf84f..7a12bb9 100644 (file)
@@ -425,6 +425,16 @@ class repository_dropbox extends repository {
         }
     }
 
+    /**
+     * Return the source information
+     *
+     * @param stdClass $filepath
+     * @return string|null
+     */
+    public function get_file_source_info($filepath) {
+        return 'Dropbox:' . $filepath;
+    }
+
     /**
      * Repository method to serve the referenced file
      *
index 5282715..b295113 100644 (file)
@@ -152,6 +152,16 @@ class repository_filesystem extends repository {
         return array('path'=>$file, 'url'=>'');
     }
 
+    /**
+     * Return the source information
+     *
+     * @param stdClass $filepath
+     * @return string|null
+     */
+    public function get_file_source_info($filepath) {
+        return $filepath;
+    }
+
     public function logout() {
         return true;
     }
index b54ad93..6886638 100644 (file)
@@ -222,9 +222,13 @@ class repository_flickr extends repository {
         return $this->search('', $page);
     }
 
-    public function get_link($photo_id) {
-        global $CFG;
-        $result = $this->flickr->photos_getSizes($photo_id);
+    /**
+     * Return photo url by given photo id
+     * @param string $photoid
+     * @return string
+     */
+    private function build_photo_url($photoid) {
+        $result = $this->flickr->photos_getSizes($photoid);
         $url = '';
         if(!empty($result[4])) {
             $url = $result[4]['source'];
@@ -236,23 +240,18 @@ class repository_flickr extends repository {
         return $url;
     }
 
+    public function get_link($photoid) {
+        return $this->build_photo_url($photoid);
+    }
+
     /**
      *
-     * @param string $photo_id
+     * @param string $photoid
      * @param string $file
      * @return string
      */
-    public function get_file($photo_id, $file = '') {
-        global $CFG;
-        $result = $this->flickr->photos_getSizes($photo_id);
-        $url = '';
-        if(!empty($result[4])) {
-            $url = $result[4]['source'];
-        } elseif(!empty($result[3])) {
-            $url = $result[3]['source'];
-        } elseif(!empty($result[2])) {
-            $url = $result[2]['source'];
-        }
+    public function get_file($photoid, $file = '') {
+        $url = $this->build_photo_url($photoid);
         $path = $this->prepare_file($file);
         $fp = fopen($path, 'w');
         $c = new curl;
@@ -315,4 +314,14 @@ class repository_flickr extends repository {
     public function supported_returntypes() {
         return (FILE_INTERNAL | FILE_EXTERNAL);
     }
+
+    /**
+     * Return the source information
+     *
+     * @param string $photoid
+     * @return string|null
+     */
+    public function get_file_source_info($photoid) {
+        return $this->build_photo_url($photoid);
+    }
 }
index d422483..083e4c7 100644 (file)
@@ -396,9 +396,13 @@ class repository_flickr_public extends repository {
         return $str;
     }
 
-    public function get_link($photo_id) {
-        global $CFG;
-        $result = $this->flickr->photos_getSizes($photo_id);
+    /**
+     * Return photo url by given photo id
+     * @param string $photoid
+     * @return string
+     */
+    private function build_photo_url($photoid) {
+        $result = $this->flickr->photos_getSizes($photoid);
         $url = '';
         if(!empty($result[4])) {
             $url = $result[4]['source'];
@@ -410,23 +414,27 @@ class repository_flickr_public extends repository {
         return $url;
     }
 
+    public function get_link($photoid) {
+        return $this->build_photo_id($photoid);
+    }
+
     /**
      *
      * @global object $CFG
-     * @param string $photo_id
+     * @param string $photoid
      * @param string $file
      * @return string
      */
-    public function get_file($photo_id, $file = '') {
+    public function get_file($photoid, $file = '') {
         global $CFG;
-        $info = $this->flickr->photos_getInfo($photo_id);
+        $info = $this->flickr->photos_getInfo($photoid);
         if ($info['owner']['realname']) {
             $author = $info['owner']['realname'];
         } else {
             $author = $info['owner']['username'];
         }
         $copyright = get_string('author', 'repository') . ': ' . $author;
-        $result = $this->flickr->photos_getSizes($photo_id);
+        $result = $this->flickr->photos_getSizes($photoid);
         // download link
         $source = '';
         // flickr photo page
@@ -517,4 +525,14 @@ class repository_flickr_public extends repository {
     public function supported_returntypes() {
         return (FILE_INTERNAL | FILE_EXTERNAL);
     }
+
+    /**
+     * Return the source information
+     *
+     * @param string $photoid photo id
+     * @return string|null
+     */
+    public function get_file_source_info($photoid) {
+        return $this->build_photo_url($photoid);
+    }
 }
index ce97d71..db4e45b 100644 (file)
@@ -1226,6 +1226,16 @@ abstract class repository {
         return null;
     }
 
+    /**
+     * Return the source information
+     *
+     * @param stdClass $url
+     * @return string|null
+     */
+    public function get_file_source_info($url) {
+        return $url;
+    }
+
     /**
      * Move file from download folder to file pool using FILE API
      *
@@ -2308,6 +2318,25 @@ abstract class repository {
         $synchronized[$file->get_id()] = true;
         return true;
     }
+
+    /**
+     * Build draft file's source field
+     *
+     * {@link file_restore_source_field_from_draft_file()}
+     * XXX: This is a hack for file manager (MDL-28666)
+     * For newly created  draft files we have to construct
+     * source filed in php serialized data format.
+     * File manager needs to know the original file information before copying
+     * to draft area, so we append these information in mdl_files.source field
+     *
+     * @param string $source
+     * @return string serialised source field
+     */
+    public static function build_source_field($source) {
+        $sourcefield = new stdClass;
+        $sourcefield->source = $source;
+        return serialize($sourcefield);
+    }
 }
 
 /**
index 3c06412..45f0662 100644 (file)
@@ -265,6 +265,11 @@ switch ($action) {
                     $event['existingfile']->filename = $saveas_filename;
                     $event['existingfile']->url      = moodle_url::make_draftfile_url($itemid, $saveas_path, $saveas_filename)->out();;
                 } else {
+
+                    // {@link repository::build_source_field()}
+                    $sourcefield = $repo->get_file_source_info($source);
+                    $record->source = $repo::build_source_field($sourcefield);
+
                     $storedfile = $fs->create_file_from_reference($record, $repo_id, $reference);
                     $event = array(
                         'url'=>moodle_url::make_draftfile_url($storedfile->get_itemid(), $storedfile->get_filepath(), $storedfile->get_filename())->out(),
@@ -302,14 +307,9 @@ switch ($action) {
                     throw new file_exception('maxbytes');
                 }
 
-                // {@link file_restore_source_field_from_draft_file()}
-                $sourcefield = '';
-                if (!empty($downloadedfile['url'])) {
-                    $source = new stdClass;
-                    $source->source = $downloadedfile['url'];
-                    $sourcefield = serialize($source);
-                }
-                $record->source = $sourcefield;
+                // {@link repository::build_source_field()}
+                $sourcefield = $repo->get_file_source_info($source);
+                $record->source = $repo::build_source_field($sourcefield);
 
                 $info = repository::move_to_filepool($downloadedfile['path'], $record);
                 if (empty($info)) {
index 2479050..5558620 100644 (file)
@@ -119,6 +119,16 @@ class repository_s3 extends repository {
         return array('path'=>$path);
     }
 
+    /**
+     * Return the source information
+     *
+     * @param stdClass $filepath
+     * @return string
+     */
+    public function get_file_source_info($filepath) {
+        return 'Amazon S3:' . $filepath;
+    }
+
     /**
      * S3 doesn't require login
      *
index a307ab6..cf023dd 100644 (file)
@@ -143,6 +143,9 @@ class repository_upload extends repository {
         self::antivir_scan_file($_FILES[$elname]['tmp_name'], $_FILES[$elname]['name'], true);
         @chmod($_FILES[$elname]['tmp_name'], $permissions);
 
+        // {@link repository::build_source_field()}
+        $record->source = self::build_source_field($_FILES[$elname]['name']);
+
         if (empty($saveas_filename)) {
             $record->filename = clean_param($_FILES[$elname]['name'], PARAM_FILE);
         } else {
@@ -186,7 +189,6 @@ class repository_upload extends repository {
         }
         $record->contextid = $context->id;
         $record->userid    = $USER->id;
-        $record->source    = '';
 
         if (repository::draftfile_exists($record->itemid, $record->filepath, $record->filename)) {
             $existingfilename = $record->filename;
index 16f2eb0..20725c8 100644 (file)
@@ -217,5 +217,15 @@ EOD;
     public function supported_returntypes() {
         return (FILE_INTERNAL | FILE_EXTERNAL);
     }
+
+    /**
+     * Return the source information
+     *
+     * @param stdClass $url
+     * @return string|null
+     */
+    public function get_file_source_info($url) {
+        return $url;
+    }
 }
 
index 50d8556..cc4bf2b 100644 (file)
@@ -127,4 +127,14 @@ EOD;
     public function supported_returntypes() {
         return (FILE_INTERNAL | FILE_EXTERNAL);
     }
+
+    /**
+     * Return the source information
+     *
+     * @param stdClass $url
+     * @return string|null
+     */
+    public function get_file_source_info($url) {
+        return $url;
+    }
 }