34cd55ba5a22729a03d12bcccb6ebe598ff0a9d8
[moodle.git] / repository / mahara / 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_mahara class
20  * This plugin allowed to connect a retrieve a file from Mahara site
21  * This is a subclass of repository class
22  *
23  * @since 2.0
24  * @package moodlecore
25  * @subpackage repository
26  * @copyright 2009 Jerome Mouneyrac <mouneyrac@moodle.org>
27  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
28  */
29 require_once($CFG->dirroot.'/repository/lib.php');
31 class repository_mahara extends repository {
33     /**
34      * Constructor
35      * @global <type> $SESSION
36      * @global <type> $action
37      * @global <type> $CFG
38      * @param <type> $repositoryid
39      * @param <type> $context
40      * @param <type> $options
41      */
42     public function __construct($repositoryid, $context = SITEID, $options = array()) {
43         global $SESSION, $action, $CFG;
44         parent::__construct($repositoryid, $context, $options);
45         $this->mnet = get_mnet_environment();
46     }
48   /**
49      *
50      * @return <type>
51      */
52     public function check_login() {
53         //check session
54         global $SESSION;
55         return !empty($SESSION->loginmahara);
56     }
59     /**
60      * Display the file listing - no login required
61      * @global <type> $SESSION
62      * @param <type> $ajax
63      * @return <type>
64      */
65     public function print_login($ajax = true) {
66         global $SESSION, $CFG, $DB;
67         //jump to the peer to create a session
69         $mnetauth = get_auth_plugin('mnet');
70         $host = $DB->get_record('mnet_host',array('id' => $this->options['peer'])); //need to retrieve the host url
71         $url = $mnetauth->start_jump_session($host->id, '/repository/repository_ajax.php?callback=yes&repo_id='.$this->id, true);
73         //set session
74         $SESSION->loginmahara = true;
76         $ret = array();
77         $popup_btn = new stdclass;
78         $popup_btn->type = 'popup';
79         $popup_btn->url = $url;
80         $ret['login'] = array($popup_btn);
81         return $ret;
82     }
84     /**
85      * Display the file listing for the search term
86      * @param <type> $search_text
87      * @return <type>
88      */
89     public function search($search_text) {
90         return $this->get_listing('', '', $search_text);
91     }
93     /**
94      * Retrieve the file listing - file picker function
95      * @global <type> $CFG
96      * @global <type> $DB
97      * @global <type> $USER
98      * @param <type> $encodedpath
99      * @param <type> $search
100      * @return <type>
101      */
102     public function get_listing($path = null, $page = 1, $search = '') {
103         global $CFG, $DB, $USER, $OUTPUT;
105         ///check that Mahara has a good version
106         ///We also check that the "get file list" method has been activated (if it is not
107         ///the method will not be returned by the system method system/listMethods)
108         require_once($CFG->dirroot . '/mnet/xmlrpc/client.php');
110         ///check that the peer has been setup
111         if (!array_key_exists('peer',$this->options)) {
112             echo json_encode(array('e'=>get_string('error').' 9010: '.get_string('hostnotfound','repository_mahara')));
113             exit;
114         }
116         $host = $DB->get_record('mnet_host',array('id' => $this->options['peer'])); //need to retrieve the host url
118         ///check that the peer host exists into the database
119         if (empty($host)) {
120             echo json_encode(array('e'=>get_string('error').' 9011: '.get_string('hostnotfound','repository_mahara')));
121             exit;
122         }
124         $mnet_peer = new mnet_peer();
125         $mnet_peer->set_wwwroot($host->wwwroot);
126         $client = new mnet_xmlrpc_client();
127         $client->set_method('system/listMethods');
128         $client->send($mnet_peer);
129         $services = $client->response;
131         if (empty($search)) {
132             $methodname = 'get_folder_files';
133         } else {
134             $methodname = 'search_folders_and_files';
135         }
137         if (array_key_exists('repository/mahara/repository.class.php/'.$methodname, $services) === false) {
138             echo json_encode(array('e'=>get_string('connectionfailure','repository_mahara')));
139             exit;
140         }
142         ///connect to the remote moodle and retrieve the list of files
143         $client->set_method('repository/mahara/repository.class.php/'.$methodname);
144         $client->add_param($USER->username);
145         if (empty($search)) {
146              $client->add_param($path);
147         } else {
148              $client->add_param($search);
149         }
151         ///call the method and manage host error
152         if (!$client->send($mnet_peer)) {
153             $message =" ";
154             foreach ($client->error as $errormessage) {
155                 $message .= "ERROR: $errormessage . ";
156             }
157             echo json_encode(array('e'=>$message)); //display all error messages
158             exit;
159         }
161         $services = $client->response;
162         if (empty($search)) {
163              $newpath = $services[0];
164             $filesandfolders = $services[1];
165         } else {
166             $newpath = '';
167             $filesandfolders = $services;
168         }
170         ///display error message if we could retrieve the list or if nothing were returned
171         if (empty($filesandfolders)) {
172             echo json_encode(array('e'=>get_string('failtoretrievelist','repository_mahara')));
173             exit;
174         }
177         $list = array();
178          if (!empty($filesandfolders['folders'])) {
179             foreach ($filesandfolders['folders'] as $folder) {
180                 $list[] =  array('path'=>$folder['id'], 'title'=>$folder['title'], 'date'=>$folder['mtime'], 'size'=>'0', 'children'=>array(), 'thumbnail' => $OUTPUT->pix_url('f/folder'));
181             }
182         }
183         if (!empty($filesandfolders['files'])) {
184             foreach ($filesandfolders['files'] as $file) {
185                 if ($file['artefacttype'] == 'image') {
186                     $thumbnail = $host->wwwroot."/artefact/file/download.php?file=".$file['id']."&size=70x55";
187                 } else {
188                     $thumbnail = $OUTPUT->pix_url(file_extension_icon( $file['title'], 32));
189                 }
190                 $list[] = array( 'title'=>$file['title'], 'date'=>$file['mtime'], 'source'=>$file['id'], 'thumbnail' => $thumbnail);
191             }
192         }
195         $filepickerlisting = array(
196             'path' => $newpath,
197             'dynload' => 1,
198             'nosearch' => 0,
199             'list'=> $list,
200             'manage'=> $host->wwwroot.'/artefact/file/'
201         );
203         return $filepickerlisting;
204     }
208     /**
209      * Download a file
210      * @global object $CFG
211      * @param string $url the url of file
212      * @param string $file save location
213      * @return string the location of the file
214      * @see curl package
215      */
216     public function get_file($id, $file = '') {
217         global $CFG, $DB, $USER;
219         ///set mnet environment and set the mnet host
220         $host = $DB->get_record('mnet_host',array('id' => $this->options['peer'])); //retrieve the host url
221         $mnet_peer = new mnet_peer();
222         $mnet_peer->set_wwwroot($host->wwwroot);
224         ///create the client and set the method to call
225         $client = new mnet_xmlrpc_client();
226         $client->set_method('repository/mahara/repository.class.php/get_file');
227         $client->add_param($USER->username);
228         $client->add_param($id);
230         ///call the method and manage host error
231         if (!$client->send($mnet_peer)) {
232             $message =" ";
233             foreach ($client->error as $errormessage) {
234                 $message .= "ERROR: $errormessage . ";
235             }
236             echo json_encode(array('e'=>$message));
237             exit;
238         }
240         $services = $client->response; //service contains the file content in the first case of the array,
241         //and the filename in the second
244         //the content has been encoded in base64, need to decode it
245         $content = base64_decode($services[0]);
246         $file = $services[1]; //filename
248         ///create a temporary folder with a file
249         $path = $this->prepare_file($file);
250         ///fill the file with the content
251         $fp = fopen($path, 'w');
252         fwrite($fp,$content);
253         fclose($fp);
255         return $path;
257     }
259     /**
260      * Add Instance settings input to Moodle form
261      * @global <type> $CFG
262      * @global <type> $DB
263      * @param <type> $
264      */
265     public function instance_config_form($mform) {
266         global $CFG, $DB;
268         //retrieve only Moodle peers
269         $hosts = $DB->get_records_sql('  SELECT
270                                     h.id,
271                                     h.wwwroot,
272                                     h.ip_address,
273                                     h.name,
274                                     h.public_key,
275                                     h.public_key_expires,
276                                     h.transport,
277                                     h.portno,
278                                     h.last_connect_time,
279                                     h.last_log_id,
280                                     h.applicationid,
281                                     a.name as app_name,
282                                     a.display_name as app_display_name,
283                                     a.xmlrpc_server_url
284                                 FROM {mnet_host} h
285                                     JOIN {mnet_application} a ON h.applicationid=a.id
286                                 WHERE
287                                     h.id <> ? AND
288                                     h.deleted = 0 AND
289                                     a.name = ? AND
290                                     h.name <> ?',
291             array($CFG->mnet_localhost_id, 'mahara', 'All Hosts'));
292         $peers = array();
293         foreach($hosts as $host) {
294             $peers[$host->id] = $host->name;
295         }
298         $mform->addElement('select', 'peer', get_string('peer', 'repository_mahara'),$peers);
299         $mform->addRule('peer', get_string('required'), 'required', null, 'client');
301         if (empty($peers)) {
302             $mform->addElement('static', null, '',  get_string('nopeer','repository_mahara'));
303         }
304     }
306     /**
307      * Names of the instance settings
308      * @return <type>
309      */
310     public static function get_instance_option_names() {
311         ///the administrator just need to set a peer
312         return array('peer');
313     }
314     public function supported_returntypes() {
315         return FILE_INTERNAL;
316     }