| 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: | |