webmaster@1
|
1 <?php |
webmaster@11
|
2 // $Id: xmlrpc.inc,v 1.47.2.3 2008/09/17 06:28:54 goba Exp $ |
webmaster@1
|
3 |
webmaster@1
|
4 /** |
webmaster@1
|
5 * @file |
webmaster@1
|
6 * Drupal XML-RPC library. Based on the IXR - The Incutio XML-RPC Library - (c) Incutio Ltd 2002-2005 |
webmaster@1
|
7 * Version 1.7 (beta) - Simon Willison, 23rd May 2005 |
webmaster@1
|
8 * Site: http://scripts.incutio.com/xmlrpc/ |
webmaster@1
|
9 * Manual: http://scripts.incutio.com/xmlrpc/manual.php |
webmaster@1
|
10 * This version is made available under the GNU GPL License |
webmaster@1
|
11 */ |
webmaster@1
|
12 |
webmaster@1
|
13 /** |
webmaster@1
|
14 * Recursively turn a data structure into objects with 'data' and 'type' attributes. |
webmaster@1
|
15 * |
webmaster@1
|
16 * @param $data |
webmaster@1
|
17 * The data structure. |
webmaster@1
|
18 * @param $type |
webmaster@1
|
19 * Optional type assign to $data. |
webmaster@1
|
20 * @return |
webmaster@1
|
21 * Object. |
webmaster@1
|
22 */ |
webmaster@1
|
23 function xmlrpc_value($data, $type = FALSE) { |
webmaster@1
|
24 $xmlrpc_value = new stdClass(); |
webmaster@1
|
25 $xmlrpc_value->data = $data; |
webmaster@1
|
26 if (!$type) { |
webmaster@1
|
27 $type = xmlrpc_value_calculate_type($xmlrpc_value); |
webmaster@1
|
28 } |
webmaster@1
|
29 $xmlrpc_value->type = $type; |
webmaster@1
|
30 if ($type == 'struct') { |
webmaster@1
|
31 // Turn all the values in the array into new xmlrpc_values |
webmaster@1
|
32 foreach ($xmlrpc_value->data as $key => $value) { |
webmaster@1
|
33 $xmlrpc_value->data[$key] = xmlrpc_value($value); |
webmaster@1
|
34 } |
webmaster@1
|
35 } |
webmaster@1
|
36 if ($type == 'array') { |
webmaster@1
|
37 for ($i = 0, $j = count($xmlrpc_value->data); $i < $j; $i++) { |
webmaster@1
|
38 $xmlrpc_value->data[$i] = xmlrpc_value($xmlrpc_value->data[$i]); |
webmaster@1
|
39 } |
webmaster@1
|
40 } |
webmaster@1
|
41 return $xmlrpc_value; |
webmaster@1
|
42 } |
webmaster@1
|
43 |
webmaster@1
|
44 /** |
webmaster@1
|
45 * Map PHP type to XML-RPC type. |
webmaster@1
|
46 * |
webmaster@1
|
47 * @param $xmlrpc_value |
webmaster@1
|
48 * Variable whose type should be mapped. |
webmaster@1
|
49 * @return |
webmaster@1
|
50 * XML-RPC type as string. |
webmaster@1
|
51 * @see |
webmaster@1
|
52 * http://www.xmlrpc.com/spec#scalars |
webmaster@1
|
53 */ |
webmaster@1
|
54 function xmlrpc_value_calculate_type(&$xmlrpc_value) { |
webmaster@1
|
55 // http://www.php.net/gettype: Never use gettype() to test for a certain type [...] Instead, use the is_* functions. |
webmaster@1
|
56 if (is_bool($xmlrpc_value->data)) { |
webmaster@1
|
57 return 'boolean'; |
webmaster@1
|
58 } |
webmaster@1
|
59 if (is_double($xmlrpc_value->data)) { |
webmaster@1
|
60 return 'double'; |
webmaster@1
|
61 } |
webmaster@1
|
62 if (is_int($xmlrpc_value->data)) { |
webmaster@1
|
63 return 'int'; |
webmaster@1
|
64 } |
webmaster@1
|
65 if (is_array($xmlrpc_value->data)) { |
webmaster@1
|
66 // empty or integer-indexed arrays are 'array', string-indexed arrays 'struct' |
webmaster@1
|
67 return empty($xmlrpc_value->data) || range(0, count($xmlrpc_value->data) - 1) === array_keys($xmlrpc_value->data) ? 'array' : 'struct'; |
webmaster@1
|
68 } |
webmaster@1
|
69 if (is_object($xmlrpc_value->data)) { |
webmaster@1
|
70 if ($xmlrpc_value->data->is_date) { |
webmaster@1
|
71 return 'date'; |
webmaster@1
|
72 } |
webmaster@1
|
73 if ($xmlrpc_value->data->is_base64) { |
webmaster@1
|
74 return 'base64'; |
webmaster@1
|
75 } |
webmaster@1
|
76 $xmlrpc_value->data = get_object_vars($xmlrpc_value->data); |
webmaster@1
|
77 return 'struct'; |
webmaster@1
|
78 } |
webmaster@1
|
79 // default |
webmaster@1
|
80 return 'string'; |
webmaster@1
|
81 } |
webmaster@1
|
82 |
webmaster@1
|
83 /** |
webmaster@1
|
84 * Generate XML representing the given value. |
webmaster@1
|
85 * |
webmaster@1
|
86 * @param $xmlrpc_value |
webmaster@1
|
87 * @return |
webmaster@1
|
88 * XML representation of value. |
webmaster@1
|
89 */ |
webmaster@1
|
90 function xmlrpc_value_get_xml($xmlrpc_value) { |
webmaster@1
|
91 switch ($xmlrpc_value->type) { |
webmaster@1
|
92 case 'boolean': |
webmaster@1
|
93 return '<boolean>'. (($xmlrpc_value->data) ? '1' : '0') .'</boolean>'; |
webmaster@1
|
94 break; |
webmaster@1
|
95 case 'int': |
webmaster@1
|
96 return '<int>'. $xmlrpc_value->data .'</int>'; |
webmaster@1
|
97 break; |
webmaster@1
|
98 case 'double': |
webmaster@1
|
99 return '<double>'. $xmlrpc_value->data .'</double>'; |
webmaster@1
|
100 break; |
webmaster@1
|
101 case 'string': |
webmaster@1
|
102 // Note: we don't escape apostrophes because of the many blogging clients |
webmaster@1
|
103 // that don't support numerical entities (and XML in general) properly. |
webmaster@1
|
104 return '<string>'. htmlspecialchars($xmlrpc_value->data) .'</string>'; |
webmaster@1
|
105 break; |
webmaster@1
|
106 case 'array': |
webmaster@1
|
107 $return = '<array><data>'."\n"; |
webmaster@1
|
108 foreach ($xmlrpc_value->data as $item) { |
webmaster@1
|
109 $return .= ' <value>'. xmlrpc_value_get_xml($item) ."</value>\n"; |
webmaster@1
|
110 } |
webmaster@1
|
111 $return .= '</data></array>'; |
webmaster@1
|
112 return $return; |
webmaster@1
|
113 break; |
webmaster@1
|
114 case 'struct': |
webmaster@1
|
115 $return = '<struct>'."\n"; |
webmaster@1
|
116 foreach ($xmlrpc_value->data as $name => $value) { |
webmaster@1
|
117 $return .= " <member><name>". check_plain($name) ."</name><value>"; |
webmaster@1
|
118 $return .= xmlrpc_value_get_xml($value) ."</value></member>\n"; |
webmaster@1
|
119 } |
webmaster@1
|
120 $return .= '</struct>'; |
webmaster@1
|
121 return $return; |
webmaster@1
|
122 break; |
webmaster@1
|
123 case 'date': |
webmaster@1
|
124 return xmlrpc_date_get_xml($xmlrpc_value->data); |
webmaster@1
|
125 break; |
webmaster@1
|
126 case 'base64': |
webmaster@1
|
127 return xmlrpc_base64_get_xml($xmlrpc_value->data); |
webmaster@1
|
128 break; |
webmaster@1
|
129 } |
webmaster@1
|
130 return FALSE; |
webmaster@1
|
131 } |
webmaster@1
|
132 |
webmaster@1
|
133 /** |
webmaster@1
|
134 * Construct an object representing an XML-RPC message. |
webmaster@1
|
135 * |
webmaster@1
|
136 * @param $message |
webmaster@1
|
137 * String containing XML as defined at http://www.xmlrpc.com/spec |
webmaster@1
|
138 * @return |
webmaster@1
|
139 * Object |
webmaster@1
|
140 */ |
webmaster@1
|
141 function xmlrpc_message($message) { |
webmaster@1
|
142 $xmlrpc_message = new stdClass(); |
webmaster@1
|
143 $xmlrpc_message->array_structs = array(); // The stack used to keep track of the current array/struct |
webmaster@1
|
144 $xmlrpc_message->array_structs_types = array(); // The stack used to keep track of if things are structs or array |
webmaster@1
|
145 $xmlrpc_message->current_struct_name = array(); // A stack as well |
webmaster@1
|
146 $xmlrpc_message->message = $message; |
webmaster@1
|
147 return $xmlrpc_message; |
webmaster@1
|
148 } |
webmaster@1
|
149 |
webmaster@1
|
150 /** |
webmaster@1
|
151 * Parse an XML-RPC message. If parsing fails, the faultCode and faultString |
webmaster@1
|
152 * will be added to the message object. |
webmaster@1
|
153 * |
webmaster@1
|
154 * @param $xmlrpc_message |
webmaster@1
|
155 * Object generated by xmlrpc_message() |
webmaster@1
|
156 * @return |
webmaster@1
|
157 * TRUE if parsing succeeded; FALSE otherwise |
webmaster@1
|
158 */ |
webmaster@1
|
159 function xmlrpc_message_parse(&$xmlrpc_message) { |
webmaster@1
|
160 // First remove the XML declaration |
webmaster@1
|
161 $xmlrpc_message->message = preg_replace('/<\?xml(.*)?\?'.'>/', '', $xmlrpc_message->message); |
webmaster@1
|
162 if (trim($xmlrpc_message->message) == '') { |
webmaster@1
|
163 return FALSE; |
webmaster@1
|
164 } |
webmaster@1
|
165 $xmlrpc_message->_parser = xml_parser_create(); |
webmaster@1
|
166 // Set XML parser to take the case of tags into account. |
webmaster@1
|
167 xml_parser_set_option($xmlrpc_message->_parser, XML_OPTION_CASE_FOLDING, FALSE); |
webmaster@1
|
168 // Set XML parser callback functions |
webmaster@1
|
169 xml_set_element_handler($xmlrpc_message->_parser, 'xmlrpc_message_tag_open', 'xmlrpc_message_tag_close'); |
webmaster@1
|
170 xml_set_character_data_handler($xmlrpc_message->_parser, 'xmlrpc_message_cdata'); |
webmaster@1
|
171 xmlrpc_message_set($xmlrpc_message); |
webmaster@1
|
172 if (!xml_parse($xmlrpc_message->_parser, $xmlrpc_message->message)) { |
webmaster@1
|
173 return FALSE; |
webmaster@1
|
174 } |
webmaster@1
|
175 xml_parser_free($xmlrpc_message->_parser); |
webmaster@1
|
176 // Grab the error messages, if any |
webmaster@1
|
177 $xmlrpc_message = xmlrpc_message_get(); |
webmaster@1
|
178 if ($xmlrpc_message->messagetype == 'fault') { |
webmaster@1
|
179 $xmlrpc_message->fault_code = $xmlrpc_message->params[0]['faultCode']; |
webmaster@1
|
180 $xmlrpc_message->fault_string = $xmlrpc_message->params[0]['faultString']; |
webmaster@1
|
181 } |
webmaster@1
|
182 return TRUE; |
webmaster@1
|
183 } |
webmaster@1
|
184 |
webmaster@1
|
185 /** |
webmaster@1
|
186 * Store a copy of the $xmlrpc_message object temporarily. |
webmaster@1
|
187 * |
webmaster@1
|
188 * @param $value |
webmaster@1
|
189 * Object |
webmaster@1
|
190 * @return |
webmaster@1
|
191 * The most recently stored $xmlrpc_message |
webmaster@1
|
192 */ |
webmaster@1
|
193 function xmlrpc_message_set($value = NULL) { |
webmaster@1
|
194 static $xmlrpc_message; |
webmaster@1
|
195 if ($value) { |
webmaster@1
|
196 $xmlrpc_message = $value; |
webmaster@1
|
197 } |
webmaster@1
|
198 return $xmlrpc_message; |
webmaster@1
|
199 } |
webmaster@1
|
200 |
webmaster@1
|
201 function xmlrpc_message_get() { |
webmaster@1
|
202 return xmlrpc_message_set(); |
webmaster@1
|
203 } |
webmaster@1
|
204 |
webmaster@1
|
205 function xmlrpc_message_tag_open($parser, $tag, $attr) { |
webmaster@1
|
206 $xmlrpc_message = xmlrpc_message_get(); |
webmaster@1
|
207 $xmlrpc_message->current_tag_contents = ''; |
webmaster@1
|
208 $xmlrpc_message->last_open = $tag; |
webmaster@1
|
209 switch ($tag) { |
webmaster@1
|
210 case 'methodCall': |
webmaster@1
|
211 case 'methodResponse': |
webmaster@1
|
212 case 'fault': |
webmaster@1
|
213 $xmlrpc_message->messagetype = $tag; |
webmaster@1
|
214 break; |
webmaster@1
|
215 // Deal with stacks of arrays and structs |
webmaster@1
|
216 case 'data': |
webmaster@1
|
217 $xmlrpc_message->array_structs_types[] = 'array'; |
webmaster@1
|
218 $xmlrpc_message->array_structs[] = array(); |
webmaster@1
|
219 break; |
webmaster@1
|
220 case 'struct': |
webmaster@1
|
221 $xmlrpc_message->array_structs_types[] = 'struct'; |
webmaster@1
|
222 $xmlrpc_message->array_structs[] = array(); |
webmaster@1
|
223 break; |
webmaster@1
|
224 } |
webmaster@1
|
225 xmlrpc_message_set($xmlrpc_message); |
webmaster@1
|
226 } |
webmaster@1
|
227 |
webmaster@1
|
228 function xmlrpc_message_cdata($parser, $cdata) { |
webmaster@1
|
229 $xmlrpc_message = xmlrpc_message_get(); |
webmaster@1
|
230 $xmlrpc_message->current_tag_contents .= $cdata; |
webmaster@1
|
231 xmlrpc_message_set($xmlrpc_message); |
webmaster@1
|
232 } |
webmaster@1
|
233 |
webmaster@1
|
234 function xmlrpc_message_tag_close($parser, $tag) { |
webmaster@1
|
235 $xmlrpc_message = xmlrpc_message_get(); |
webmaster@1
|
236 $value_flag = FALSE; |
webmaster@1
|
237 switch ($tag) { |
webmaster@1
|
238 case 'int': |
webmaster@1
|
239 case 'i4': |
webmaster@1
|
240 $value = (int)trim($xmlrpc_message->current_tag_contents); |
webmaster@1
|
241 $value_flag = TRUE; |
webmaster@1
|
242 break; |
webmaster@1
|
243 case 'double': |
webmaster@1
|
244 $value = (double)trim($xmlrpc_message->current_tag_contents); |
webmaster@1
|
245 $value_flag = TRUE; |
webmaster@1
|
246 break; |
webmaster@1
|
247 case 'string': |
webmaster@1
|
248 $value = $xmlrpc_message->current_tag_contents; |
webmaster@1
|
249 $value_flag = TRUE; |
webmaster@1
|
250 break; |
webmaster@1
|
251 case 'dateTime.iso8601': |
webmaster@1
|
252 $value = xmlrpc_date(trim($xmlrpc_message->current_tag_contents)); |
webmaster@1
|
253 // $value = $iso->getTimestamp(); |
webmaster@1
|
254 $value_flag = TRUE; |
webmaster@1
|
255 break; |
webmaster@1
|
256 case 'value': |
webmaster@1
|
257 // If no type is indicated, the type is string |
webmaster@1
|
258 // We take special care for empty values |
webmaster@5
|
259 if (trim($xmlrpc_message->current_tag_contents) != '' || (isset($xmlrpc_message->last_open) && ($xmlrpc_message->last_open == 'value'))) { |
webmaster@1
|
260 $value = (string)$xmlrpc_message->current_tag_contents; |
webmaster@1
|
261 $value_flag = TRUE; |
webmaster@1
|
262 } |
webmaster@1
|
263 unset($xmlrpc_message->last_open); |
webmaster@1
|
264 break; |
webmaster@1
|
265 case 'boolean': |
webmaster@1
|
266 $value = (boolean)trim($xmlrpc_message->current_tag_contents); |
webmaster@1
|
267 $value_flag = TRUE; |
webmaster@1
|
268 break; |
webmaster@1
|
269 case 'base64': |
webmaster@1
|
270 $value = base64_decode(trim($xmlrpc_message->current_tag_contents)); |
webmaster@1
|
271 $value_flag = TRUE; |
webmaster@1
|
272 break; |
webmaster@1
|
273 // Deal with stacks of arrays and structs |
webmaster@1
|
274 case 'data': |
webmaster@1
|
275 case 'struct': |
webmaster@1
|
276 $value = array_pop($xmlrpc_message->array_structs ); |
webmaster@1
|
277 array_pop($xmlrpc_message->array_structs_types); |
webmaster@1
|
278 $value_flag = TRUE; |
webmaster@1
|
279 break; |
webmaster@1
|
280 case 'member': |
webmaster@1
|
281 array_pop($xmlrpc_message->current_struct_name); |
webmaster@1
|
282 break; |
webmaster@1
|
283 case 'name': |
webmaster@1
|
284 $xmlrpc_message->current_struct_name[] = trim($xmlrpc_message->current_tag_contents); |
webmaster@1
|
285 break; |
webmaster@1
|
286 case 'methodName': |
webmaster@1
|
287 $xmlrpc_message->methodname = trim($xmlrpc_message->current_tag_contents); |
webmaster@1
|
288 break; |
webmaster@1
|
289 } |
webmaster@1
|
290 if ($value_flag) { |
webmaster@1
|
291 if (count($xmlrpc_message->array_structs ) > 0) { |
webmaster@1
|
292 // Add value to struct or array |
webmaster@1
|
293 if ($xmlrpc_message->array_structs_types[count($xmlrpc_message->array_structs_types)-1] == 'struct') { |
webmaster@1
|
294 // Add to struct |
webmaster@1
|
295 $xmlrpc_message->array_structs [count($xmlrpc_message->array_structs )-1][$xmlrpc_message->current_struct_name[count($xmlrpc_message->current_struct_name)-1]] = $value; |
webmaster@1
|
296 } |
webmaster@1
|
297 else { |
webmaster@1
|
298 // Add to array |
webmaster@1
|
299 $xmlrpc_message->array_structs [count($xmlrpc_message->array_structs )-1][] = $value; |
webmaster@1
|
300 } |
webmaster@1
|
301 } |
webmaster@1
|
302 else { |
webmaster@1
|
303 // Just add as a parameter |
webmaster@1
|
304 $xmlrpc_message->params[] = $value; |
webmaster@1
|
305 } |
webmaster@1
|
306 } |
webmaster@1
|
307 if (!in_array($tag, array("data", "struct", "member"))) { |
webmaster@1
|
308 $xmlrpc_message->current_tag_contents = ''; |
webmaster@1
|
309 } |
webmaster@1
|
310 xmlrpc_message_set($xmlrpc_message); |
webmaster@1
|
311 } |
webmaster@1
|
312 |
webmaster@1
|
313 /** |
webmaster@1
|
314 * Construct an object representing an XML-RPC request |
webmaster@1
|
315 * |
webmaster@1
|
316 * @param $method |
webmaster@1
|
317 * The name of the method to be called |
webmaster@1
|
318 * @param $args |
webmaster@1
|
319 * An array of parameters to send with the method. |
webmaster@1
|
320 * @return |
webmaster@1
|
321 * Object |
webmaster@1
|
322 */ |
webmaster@1
|
323 function xmlrpc_request($method, $args) { |
webmaster@1
|
324 $xmlrpc_request = new stdClass(); |
webmaster@1
|
325 $xmlrpc_request->method = $method; |
webmaster@1
|
326 $xmlrpc_request->args = $args; |
webmaster@1
|
327 $xmlrpc_request->xml = <<<EOD |
webmaster@1
|
328 <?xml version="1.0"?> |
webmaster@1
|
329 <methodCall> |
webmaster@1
|
330 <methodName>{$xmlrpc_request->method}</methodName> |
webmaster@1
|
331 <params> |
webmaster@1
|
332 |
webmaster@1
|
333 EOD; |
webmaster@1
|
334 foreach ($xmlrpc_request->args as $arg) { |
webmaster@1
|
335 $xmlrpc_request->xml .= '<param><value>'; |
webmaster@1
|
336 $v = xmlrpc_value($arg); |
webmaster@1
|
337 $xmlrpc_request->xml .= xmlrpc_value_get_xml($v); |
webmaster@1
|
338 $xmlrpc_request->xml .= "</value></param>\n"; |
webmaster@1
|
339 } |
webmaster@1
|
340 $xmlrpc_request->xml .= '</params></methodCall>'; |
webmaster@1
|
341 return $xmlrpc_request; |
webmaster@1
|
342 } |
webmaster@1
|
343 |
webmaster@1
|
344 |
webmaster@11
|
345 function xmlrpc_error($code = NULL, $message = NULL, $reset = FALSE) { |
webmaster@1
|
346 static $xmlrpc_error; |
webmaster@1
|
347 if (isset($code)) { |
webmaster@1
|
348 $xmlrpc_error = new stdClass(); |
webmaster@1
|
349 $xmlrpc_error->is_error = TRUE; |
webmaster@1
|
350 $xmlrpc_error->code = $code; |
webmaster@1
|
351 $xmlrpc_error->message = $message; |
webmaster@1
|
352 module_invoke('system', 'check_http_request'); |
webmaster@1
|
353 } |
webmaster@11
|
354 elseif ($reset) { |
webmaster@11
|
355 $xmlrpc_error = NULL; |
webmaster@11
|
356 } |
webmaster@1
|
357 return $xmlrpc_error; |
webmaster@1
|
358 } |
webmaster@1
|
359 |
webmaster@1
|
360 function xmlrpc_error_get_xml($xmlrpc_error) { |
webmaster@1
|
361 return <<<EOD |
webmaster@1
|
362 <methodResponse> |
webmaster@1
|
363 <fault> |
webmaster@1
|
364 <value> |
webmaster@1
|
365 <struct> |
webmaster@1
|
366 <member> |
webmaster@1
|
367 <name>faultCode</name> |
webmaster@1
|
368 <value><int>{$xmlrpc_error->code}</int></value> |
webmaster@1
|
369 </member> |
webmaster@1
|
370 <member> |
webmaster@1
|
371 <name>faultString</name> |
webmaster@1
|
372 <value><string>{$xmlrpc_error->message}</string></value> |
webmaster@1
|
373 </member> |
webmaster@1
|
374 </struct> |
webmaster@1
|
375 </value> |
webmaster@1
|
376 </fault> |
webmaster@1
|
377 </methodResponse> |
webmaster@1
|
378 |
webmaster@1
|
379 EOD; |
webmaster@1
|
380 } |
webmaster@1
|
381 |
webmaster@1
|
382 function xmlrpc_date($time) { |
webmaster@1
|
383 $xmlrpc_date = new stdClass(); |
webmaster@1
|
384 $xmlrpc_date->is_date = TRUE; |
webmaster@1
|
385 // $time can be a PHP timestamp or an ISO one |
webmaster@1
|
386 if (is_numeric($time)) { |
webmaster@1
|
387 $xmlrpc_date->year = date('Y', $time); |
webmaster@1
|
388 $xmlrpc_date->month = date('m', $time); |
webmaster@1
|
389 $xmlrpc_date->day = date('d', $time); |
webmaster@1
|
390 $xmlrpc_date->hour = date('H', $time); |
webmaster@1
|
391 $xmlrpc_date->minute = date('i', $time); |
webmaster@1
|
392 $xmlrpc_date->second = date('s', $time); |
webmaster@1
|
393 $xmlrpc_date->iso8601 = date('Ymd\TH:i:s', $time); |
webmaster@1
|
394 } |
webmaster@1
|
395 else { |
webmaster@1
|
396 $xmlrpc_date->iso8601 = $time; |
webmaster@1
|
397 $time = str_replace(array('-', ':'), '', $time); |
webmaster@1
|
398 $xmlrpc_date->year = substr($time, 0, 4); |
webmaster@1
|
399 $xmlrpc_date->month = substr($time, 4, 2); |
webmaster@1
|
400 $xmlrpc_date->day = substr($time, 6, 2); |
webmaster@1
|
401 $xmlrpc_date->hour = substr($time, 9, 2); |
webmaster@1
|
402 $xmlrpc_date->minute = substr($time, 11, 2); |
webmaster@1
|
403 $xmlrpc_date->second = substr($time, 13, 2); |
webmaster@1
|
404 } |
webmaster@1
|
405 return $xmlrpc_date; |
webmaster@1
|
406 } |
webmaster@1
|
407 |
webmaster@1
|
408 function xmlrpc_date_get_xml($xmlrpc_date) { |
webmaster@1
|
409 return '<dateTime.iso8601>'. $xmlrpc_date->year . $xmlrpc_date->month . $xmlrpc_date->day .'T'. $xmlrpc_date->hour .':'. $xmlrpc_date->minute .':'. $xmlrpc_date->second .'</dateTime.iso8601>'; |
webmaster@1
|
410 } |
webmaster@1
|
411 |
webmaster@1
|
412 function xmlrpc_base64($data) { |
webmaster@1
|
413 $xmlrpc_base64 = new stdClass(); |
webmaster@1
|
414 $xmlrpc_base64->is_base64 = TRUE; |
webmaster@1
|
415 $xmlrpc_base64->data = $data; |
webmaster@1
|
416 return $xmlrpc_base64; |
webmaster@1
|
417 } |
webmaster@1
|
418 |
webmaster@1
|
419 function xmlrpc_base64_get_xml($xmlrpc_base64) { |
webmaster@1
|
420 return '<base64>'. base64_encode($xmlrpc_base64->data) .'</base64>'; |
webmaster@1
|
421 } |
webmaster@1
|
422 |
webmaster@1
|
423 /** |
webmaster@1
|
424 * Execute an XML remote procedural call. This is private function; call xmlrpc() |
webmaster@1
|
425 * in common.inc instead of this function. |
webmaster@1
|
426 * |
webmaster@1
|
427 * @return |
webmaster@1
|
428 * A $xmlrpc_message object if the call succeeded; FALSE if the call failed |
webmaster@1
|
429 */ |
webmaster@1
|
430 function _xmlrpc() { |
webmaster@1
|
431 $args = func_get_args(); |
webmaster@1
|
432 $url = array_shift($args); |
webmaster@11
|
433 xmlrpc_clear_error(); |
webmaster@1
|
434 if (is_array($args[0])) { |
webmaster@1
|
435 $method = 'system.multicall'; |
webmaster@1
|
436 $multicall_args = array(); |
webmaster@1
|
437 foreach ($args[0] as $call) { |
webmaster@1
|
438 $multicall_args[] = array('methodName' => array_shift($call), 'params' => $call); |
webmaster@1
|
439 } |
webmaster@1
|
440 $args = array($multicall_args); |
webmaster@1
|
441 } |
webmaster@1
|
442 else { |
webmaster@1
|
443 $method = array_shift($args); |
webmaster@1
|
444 } |
webmaster@1
|
445 $xmlrpc_request = xmlrpc_request($method, $args); |
webmaster@1
|
446 $result = drupal_http_request($url, array("Content-Type" => "text/xml"), 'POST', $xmlrpc_request->xml); |
webmaster@1
|
447 if ($result->code != 200) { |
webmaster@1
|
448 xmlrpc_error($result->code, $result->error); |
webmaster@1
|
449 return FALSE; |
webmaster@1
|
450 } |
webmaster@1
|
451 $message = xmlrpc_message($result->data); |
webmaster@1
|
452 // Now parse what we've got back |
webmaster@1
|
453 if (!xmlrpc_message_parse($message)) { |
webmaster@1
|
454 // XML error |
webmaster@1
|
455 xmlrpc_error(-32700, t('Parse error. Not well formed')); |
webmaster@1
|
456 return FALSE; |
webmaster@1
|
457 } |
webmaster@1
|
458 // Is the message a fault? |
webmaster@1
|
459 if ($message->messagetype == 'fault') { |
webmaster@1
|
460 xmlrpc_error($message->fault_code, $message->fault_string); |
webmaster@1
|
461 return FALSE; |
webmaster@1
|
462 } |
webmaster@1
|
463 // Message must be OK |
webmaster@1
|
464 return $message->params[0]; |
webmaster@1
|
465 } |
webmaster@1
|
466 |
webmaster@1
|
467 /** |
webmaster@1
|
468 * Returns the last XML-RPC client error number |
webmaster@1
|
469 */ |
webmaster@1
|
470 function xmlrpc_errno() { |
webmaster@1
|
471 $error = xmlrpc_error(); |
webmaster@7
|
472 return ($error != NULL ? $error->code : NULL); |
webmaster@1
|
473 } |
webmaster@1
|
474 |
webmaster@1
|
475 /** |
webmaster@1
|
476 * Returns the last XML-RPC client error message |
webmaster@1
|
477 */ |
webmaster@1
|
478 function xmlrpc_error_msg() { |
webmaster@1
|
479 $error = xmlrpc_error(); |
webmaster@7
|
480 return ($error != NULL ? $error->message : NULL); |
webmaster@1
|
481 } |
webmaster@11
|
482 |
webmaster@11
|
483 /** |
webmaster@11
|
484 * Clears any previous error. |
webmaster@11
|
485 */ |
webmaster@11
|
486 function xmlrpc_clear_error() { |
webmaster@11
|
487 xmlrpc_error(NULL, NULL, TRUE); |
webmaster@11
|
488 } |