8c5455499f1493263198923a78a1b268cc7a47fc
[moodle.git] / admin / mnet / adminlib.php
1 <?php
2 /**
3  * Library functions for mnet
4  *
5  * @author  Donal McMullan  donal@catalyst.net.nz
6  * @version 0.0.1
7  * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
8  * @package mnet
9  */
11 /**
12  * Parse a file to find out what functions/methods exist in it, and add entries
13  * for the remote-call-enabled functions to the database.
14  *
15  * The path to a file, e.g. auth/mnet/auth.php can be thought of as
16  * type/parentname/docname
17  *
18  * @param  string   $type           mod, auth or enrol
19  * @param  string   $parentname     Implementation of type, e.g. 'mnet' in the
20  *                                  case of auth/mnet/auth.php
21  * @return bool                     True on success, else false
22  */
23 function mnet_get_functions($type, $parentname) {
24     global $CFG, $DB;
26     $dataobject = new stdClass();
27     $docname = $type.'.php';
28     $publishes = array();
29     if ('mod' == $type) {
30         $docname = 'rpclib.php';
31         $relname  = '/mod/'.$parentname.'/'.$docname;
32         $filename = $CFG->dirroot.$relname;
33         if (file_exists($filename)) include_once $filename;
34         $mnet_publishes = $parentname.'_mnet_publishes';
35         if (function_exists($mnet_publishes)) {
36             (array)$publishes = $mnet_publishes();
37         }
38     } else {
39         // auth or enrol
40         $relname  = '/'.$type.'/'.$parentname.'/'.$docname;
41         $filename = $CFG->dirroot.$relname;
42         if (file_exists($filename)) include_once $filename;
43         $class = $type.($type=='enrol'? 'ment':'').'_plugin_'.$parentname;
44         if (class_exists($class)) {
45             $object = new $class();
46             if (method_exists($object, 'mnet_publishes')) {
47                 (array)$publishes = $object->mnet_publishes();
48             }
49         }
50     }
52     $methodServiceArray = array();
53     foreach($publishes as $service) {
54         if (is_array($service['methods'])) {
55             foreach($service['methods'] as $methodname) {
56                 $methodServiceArray[$methodname][] = $service;
57             }
58         }
59     }
61     // Disable functions that don't exist (any more) in the source
62     // Should these be deleted? What about their permissions records?
63     $rpcrecords = $DB->get_records('mnet_rpc', array('parent'=>$parentname, 'parent_type'=>$type), 'function_name ASC ');
64     if (!empty($rpcrecords)) {
65         foreach($rpcrecords as $rpc) {
66             if (!array_key_exists($rpc->function_name, $methodServiceArray)) {
67                 $rpc->enabled = 0;
68                 $DB->update_record('mnet_rpc', $rpc);
69             }
70         }
71     }
73     if (!file_exists($filename)) return false;
75     if (extension_loaded('tokenizer')) {
76         include_once "$CFG->dirroot/$CFG->admin/mnet/MethodTable.php";
77         $functions = (array)MethodTable::create($filename,false);
78     }
80     foreach($methodServiceArray as $method => $servicearray) {
81         if (!empty($functions[$method])) {
82             $details = $functions[$method];
83             $profile = $details['arguments'];
84             if (!isset($details['returns'])) {
85                 array_unshift($profile, array('type' => 'void', 'description' => 'No return value'));
86             } else {
87                 array_unshift($profile, $details['returns']);
88             }
89             $dataobject->profile       = serialize($profile);
90             $dataobject->help          = $details['description'];
91         } else {
92             $dataobject->profile       = serialize(array(array('type' => 'void', 'description' => 'No return value')));
93             $dataobject->help          = '';
94         }
96         $dataobject->function_name = $method;
97         $dataobject->xmlrpc_path   = $type.'/'.$parentname.'/'.$docname.'/'.$method;
98         $dataobject->parent_type   = $type;
99         $dataobject->parent        = $parentname;
100         $dataobject->enabled       = '0';
102         if ($record_exists = $DB->get_record('mnet_rpc', array('xmlrpc_path'=>$dataobject->xmlrpc_path))) {
103             $dataobject->id      = $record_exists->id;
104             $dataobject->enabled = $record_exists->enabled;
105             $DB->update_record('mnet_rpc', $dataobject);
106         } else {
107             $dataobject->id = $DB->insert_record('mnet_rpc', $dataobject, true);
108         }
110         foreach($servicearray as $service) {
111             $serviceobj = $DB->get_record('mnet_service', array('name'=>$service['name']));
112             if (false == $serviceobj) {
113                 $serviceobj = new stdClass();
114                 $serviceobj->name        = $service['name'];
115                 $serviceobj->apiversion  = $service['apiversion'];
116                 $serviceobj->offer       = 1;
117                 $serviceobj->id          = $DB->insert_record('mnet_service', $serviceobj, true);
118             }
120             if (false == $DB->get_record('mnet_service2rpc', array('rpcid'=>$dataobject->id, 'serviceid'=>$serviceobj->id))) {
121                 $obj = new stdClass();
122                 $obj->rpcid = $dataobject->id;
123                 $obj->serviceid = $serviceobj->id;
124                 $DB->insert_record('mnet_service2rpc', $obj, true);
125             }
126         }
127     }
128     return true;
131 function upgrade_RPC_functions($returnurl) {
132     global $CFG;
134     $basedir = $CFG->dirroot.'/mod';
135     if (file_exists($basedir) && filetype($basedir) == 'dir') {
136         $dirhandle = opendir($basedir);
137         while (false !== ($dir = readdir($dirhandle))) {
138             $firstchar = substr($dir, 0, 1);
139             if ($firstchar == '.' or $dir == 'CVS' or $dir == '_vti_cnf') {
140                 continue;
141             }
142             if (filetype($basedir .'/'. $dir) != 'dir') {
143                 continue;
144             }
146             mnet_get_functions('mod', $dir);
148         }
149     }
151     $basedir = $CFG->dirroot.'/auth';
152     if (file_exists($basedir) && filetype($basedir) == 'dir') {
153         $dirhandle = opendir($basedir);
154         while (false !== ($dir = readdir($dirhandle))) {
155             $firstchar = substr($dir, 0, 1);
156             if ($firstchar == '.' or $dir == 'CVS' or $dir == '_vti_cnf') {
157                 continue;
158             }
159             if (filetype($basedir .'/'. $dir) != 'dir') {
160                 continue;
161             }
163             mnet_get_functions('auth', $dir);
164         }
165     }
167     $basedir = $CFG->dirroot.'/enrol';
168     if (file_exists($basedir) && filetype($basedir) == 'dir') {
169         $dirhandle = opendir($basedir);
170         while (false !== ($dir = readdir($dirhandle))) {
171             $firstchar = substr($dir, 0, 1);
172             if ($firstchar == '.' or $dir == 'CVS' or $dir == '_vti_cnf') {
173                 continue;
174             }
175             if (filetype($basedir .'/'. $dir) != 'dir') {
176                 continue;
177             }
179             mnet_get_functions('enrol', $dir);
180         }
181     }
183 ?>