"MDL-13766, fixed context default value"
[moodle.git] / repository / url / repository.class.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * repository_url class
20  * A subclass of repository, which is used to download a file from a specific url
21  *
22  * @since 2.0
23  * @package moodlecore
24  * @subpackage repository
25  * @copyright 2009 Dongsheng Cai
26  * @author Dongsheng Cai <dongsheng@moodle.com>
27  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
28  */
30 require_once(dirname(__FILE__).'/lib.php');
32 class repository_url extends repository {
34     /**
35      * @param int $repositoryid
36      * @param object $context
37      * @param array $options
38      */
39     public function __construct($repositoryid, $context = SYSCONTEXTID, $options = array()){
40         global $CFG;
41         parent::__construct($repositoryid, $context, $options);
42         if (!empty($options['client_id'])) {
43             // will be used to construct download form
44             $this->client_id = $options['client_id'];
45         }
46         $this->file_url = optional_param('file', '', PARAM_RAW);
47     }
49     public function get_file($url, $file = '') {
50         global $CFG;
51         //$CFG->repository_no_delete = true;
52         $path = $this->prepare_file($file);
53         $fp = fopen($path, 'w');
54         $c = new curl;
55         $c->download(array(array('url'=>$url, 'file'=>$fp)));
56         return $path;
57     }
59     public function check_login() {
60         if (!empty($this->file_url)) {
61             return true;
62         } else {
63             return false;
64         }
65     }
66     /**
67      * @return mixed
68      */
69     public function print_login() {
70         $strdownload = get_string('download', 'repository');
71         $strname     = get_string('rename', 'repository_url');
72         $strurl      = get_string('url', 'repository_url');
73         if ($this->options['ajax']) {
74             $url = new stdclass;
75             $url->label = $strurl.': ';
76             $url->id   = 'fileurl-'.$this->client_id;
77             $url->type = 'text';
78             $url->name = 'file';
80             $ret['login'] = array($url);
81             $ret['login_btn_label'] = get_string('download', 'repository_url');
82             return $ret;
83         } else {
84             echo <<<EOD
85 <table>
86 <tr>
87 <td>{$strurl}: </td><td><input name="file" type="text" /></td>
88 </tr>
89 </table>
90 <input type="submit" value="{$strdownload}" />
91 EOD;
93         }
94     }
96     /**
97      * @param mixed $path
98      * @param string $search
99      * @return array
100      */
101     public function get_listing($path='', $page='') {
102         global $CFG, $OUTPUT;
103         $ret = array();
104         $curl = new curl;
105         $msg = $curl->head($this->file_url);
106         $info = $curl->get_info();
107         if ($info['http_code'] != 200) {
108             $ret['e'] = $msg;
109         } else {
110             $ret['list'] = array();
111             $ret['nosearch'] = true;
112             $ret['nologin'] = true;
113             $filename = $this->guess_filename($info['url'], $info['content_type']);
114             if (strstr($info['content_type'], 'text/html') || empty($info['content_type'])) {
115                 // analysis this web page, general file list
116                 $ret['list'] = array();
117                 $content = $curl->get($info['url']);
118                 $this->analyse_page($info['url'], $content, $ret);
119             } else {
120                 // download this file
121                 $ret['list'][] = array(
122                     'title'=>$filename,
123                     'source'=>$this->file_url,
124                     'thumbnail' => $OUTPUT->pix_url(file_extension_icon($filename, 32))
125                     );
126             }
127         }
128         return $ret;
129     }
130     public function analyse_page($baseurl, $content, &$list) {
131         global $CFG, $OUTPUT;
132         $urls = extract_html_urls($content);
133         $images = $urls['img']['src'];
134         $pattern = '#img(.+)src="?\'?([[:alnum:]:?=&@/._+-]+)"?\'?#i';
135         if (!empty($images)) {
136             foreach($images as $url) {
137                 $list['list'][] = array(
138                     'title'=>$this->guess_filename($url, ''),
139                     'source'=>url_to_absolute($baseurl, $url),
140                     'thumbnail'=>url_to_absolute($baseurl, $url),
141                     'thumbnail_height'=>84,
142                     'thumbnail_width'=>84
143                 );
144             }
145         }
146     }
147     public function guess_filename($url, $type) {
148         $pattern = '#\/([\w_\?\-.]+)$#';
149         $matches = null;
150         preg_match($pattern, $url, $matches);
151         if (empty($matches[1])) {
152             return $url;
153         } else {
154             return $matches[1];
155         }
156     }
158     public function get_name(){
159         return get_string('repositoryname', 'repository_url');;
160     }
161     public function supported_returntypes() {
162         return (FILE_INTERNAL | FILE_EXTERNAL);
163     }