1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10:
11:
12: 13: 14: 15: 16: 17: 18:
19:
20: 21: 22:
23: class XoopsXmlRpcDocument
24: {
25: public $_tags = array();
26:
27: 28: 29:
30: public function __construct()
31: {
32: }
33:
34: 35: 36:
37: public function add(&$tagobj)
38: {
39: $this->_tags[] =& $tagobj;
40: }
41:
42: public function render()
43: {
44: }
45: }
46:
47: 48: 49:
50: class XoopsXmlRpcResponse extends XoopsXmlRpcDocument
51: {
52: 53: 54:
55: public function render()
56: {
57: $count = count($this->_tags);
58: $payload = '';
59: for ($i = 0; $i < $count; ++$i) {
60: if (!$this->_tags[$i]->isFault()) {
61: $payload .= $this->_tags[$i]->render();
62: } else {
63: return '<?xml version="1.0"?><methodResponse>' . $this->_tags[$i]->render() . '</methodResponse>';
64: }
65: }
66:
67: return '<?xml version="1.0"?><methodResponse><params><param>' . $payload . '</param></params></methodResponse>';
68: }
69: }
70:
71: 72: 73:
74: class XoopsXmlRpcRequest extends XoopsXmlRpcDocument
75: {
76: public $methodName;
77:
78: 79: 80:
81: public function __construct($methodName)
82: {
83: $this->methodName = trim($methodName);
84: }
85:
86: 87: 88:
89: public function render()
90: {
91: $count = count($this->_tags);
92: $payload = '';
93: for ($i = 0; $i < $count; ++$i) {
94: $payload .= '<param>' . $this->_tags[$i]->render() . '</param>';
95: }
96:
97: return '<?xml version="1.0"?><methodCall><methodName>' . $this->methodName . '</methodName><params>' . $payload . '</params></methodCall>';
98: }
99: }
100:
101: 102: 103:
104: class XoopsXmlRpcTag
105: {
106: public $_fault = false;
107:
108: 109: 110:
111: public function __construct()
112: {
113: }
114:
115: 116: 117: 118: 119:
120: public function &encode(&$text)
121: {
122: $text = preg_replace(array("/\&([a-z\d\#]+)\;/i", "/\&/", "/\#\|\|([a-z\d\#]+)\|\|\#/i"), array(
123: "#||\\1||#",
124: '&',
125: "&\\1;"), str_replace(array(
126: '<',
127: '>'), array(
128: '<',
129: '>'), $text));
130:
131: return $text;
132: }
133:
134: 135: 136:
137: public function setFault($fault = true)
138: {
139: $this->_fault = ((int)$fault > 0);
140: }
141:
142: 143: 144:
145: public function isFault()
146: {
147: return $this->_fault;
148: }
149:
150: public function render()
151: {
152: }
153: }
154:
155: 156: 157:
158: class XoopsXmlRpcFault extends XoopsXmlRpcTag
159: {
160: public $_code;
161: public $_extra;
162:
163: 164: 165: 166:
167: public function __construct($code, $extra = null)
168: {
169: $this->setFault(true);
170: $this->_code = (int)$code;
171: $this->_extra = isset($extra) ? trim($extra) : '';
172: }
173:
174: 175: 176:
177: public function render()
178: {
179: switch ($this->_code) {
180: case 101:
181: $string = 'Invalid server URI';
182: break;
183: case 102:
184: $string = 'Parser parse error';
185: break;
186: case 103:
187: $string = 'Module not found';
188: break;
189: case 104:
190: $string = 'User authentication failed';
191: break;
192: case 105:
193: $string = 'Module API not found';
194: break;
195: case 106:
196: $string = 'Method response error';
197: break;
198: case 107:
199: $string = 'Method not supported';
200: break;
201: case 108:
202: $string = 'Invalid parameter';
203: break;
204: case 109:
205: $string = 'Missing parameters';
206: break;
207: case 110:
208: $string = 'Selected blog application does not exist';
209: break;
210: case 111:
211: $string = 'Method permission denied';
212: break;
213: default:
214: $string = 'Method response error';
215: break;
216: }
217: $string .= "\n" . $this->_extra;
218:
219: return '<fault><value><struct><member><name>faultCode</name><value>' . $this->_code . '</value></member><member><name>faultString</name><value>' . $this->encode($string) . '</value></member></struct></value></fault>';
220: }
221: }
222:
223: 224: 225:
226: class XoopsXmlRpcInt extends XoopsXmlRpcTag
227: {
228: public $_value;
229:
230: 231: 232:
233: public function __construct($value)
234: {
235: $this->_value = (int)$value;
236: }
237:
238: 239: 240:
241: public function render()
242: {
243: return '<value><int>' . $this->_value . '</int></value>';
244: }
245: }
246:
247: 248: 249:
250: class XoopsXmlRpcDouble extends XoopsXmlRpcTag
251: {
252: public $_value;
253:
254: 255: 256:
257: public function __construct($value)
258: {
259: $this->_value = (float)$value;
260: }
261:
262: 263: 264:
265: public function render()
266: {
267: return '<value><double>' . $this->_value . '</double></value>';
268: }
269: }
270:
271: 272: 273:
274: class XoopsXmlRpcBoolean extends XoopsXmlRpcTag
275: {
276: public $_value;
277:
278: 279: 280:
281: public function __construct($value)
282: {
283: $this->_value = (!empty($value) && $value != false) ? 1 : 0;
284: }
285:
286: 287: 288:
289: public function render()
290: {
291: return '<value><boolean>' . $this->_value . '</boolean></value>';
292: }
293: }
294:
295: 296: 297:
298: class XoopsXmlRpcString extends XoopsXmlRpcTag
299: {
300: public $_value;
301:
302: 303: 304:
305: public function __construct($value)
306: {
307: $this->_value = (string)$value;
308: }
309:
310: 311: 312:
313: public function render()
314: {
315: return '<value><string>' . $this->encode($this->_value) . '</string></value>';
316: }
317: }
318:
319: 320: 321:
322: class XoopsXmlRpcDatetime extends XoopsXmlRpcTag
323: {
324: public $_value;
325:
326: 327: 328:
329: public function __construct($value)
330: {
331: if (!is_numeric($value)) {
332: $this->_value = strtotime($value);
333: } else {
334: $this->_value = (int)$value;
335: }
336: }
337:
338: 339: 340:
341: public function render()
342: {
343: return '<value><dateTime.iso8601>' . gmstrftime('%Y%m%dT%H:%M:%S', $this->_value) . '</dateTime.iso8601></value>';
344: }
345: }
346:
347: 348: 349:
350: class XoopsXmlRpcBase64 extends XoopsXmlRpcTag
351: {
352: public $_value;
353:
354: 355: 356:
357: public function __construct($value)
358: {
359: $this->_value = base64_encode($value);
360: }
361:
362: 363: 364:
365: public function render()
366: {
367: return '<value><base64>' . $this->_value . '</base64></value>';
368: }
369: }
370:
371: 372: 373:
374: class XoopsXmlRpcArray extends XoopsXmlRpcTag
375: {
376: public $_tags = array();
377:
378: 379: 380:
381: public function __construct()
382: {
383: }
384:
385: 386: 387:
388: public function add(&$tagobj)
389: {
390: $this->_tags[] =& $tagobj;
391: }
392:
393: 394: 395:
396: public function render()
397: {
398: $count = count($this->_tags);
399: $ret = '<value><array><data>';
400: for ($i = 0; $i < $count; ++$i) {
401: $ret .= $this->_tags[$i]->render();
402: }
403: $ret .= '</data></array></value>';
404:
405: return $ret;
406: }
407: }
408:
409: 410: 411:
412: class XoopsXmlRpcStruct extends XoopsXmlRpcTag
413: {
414: public $_tags = array();
415:
416: 417: 418:
419: public function __construct()
420: {
421: }
422:
423: 424: 425: 426:
427: public function add($name, &$tagobj)
428: {
429: $this->_tags[] = array('name' => $name, 'value' => $tagobj);
430: }
431:
432: 433: 434:
435: public function render()
436: {
437: $count = count($this->_tags);
438: $ret = '<value><struct>';
439: for ($i = 0; $i < $count; ++$i) {
440: $ret .= '<member><name>' . $this->encode($this->_tags[$i]['name']) . '</name>' . $this->_tags[$i]['value']->render() . '</member>';
441: }
442: $ret .= '</struct></value>';
443:
444: return $ret;
445: }
446: }
447: