[ Index ] |
PHP Cross Reference of WordPress |
[Summary view] [Print] [Text view]
1 <?php 2 3 /** 4 * IXR_IntrospectionServer 5 * 6 * @package IXR 7 * @since 1.5.0 8 */ 9 class IXR_IntrospectionServer extends IXR_Server 10 { 11 var $signatures; 12 var $help; 13 14 /** 15 * PHP5 constructor. 16 */ 17 function __construct() 18 { 19 $this->setCallbacks(); 20 $this->setCapabilities(); 21 $this->capabilities['introspection'] = array( 22 'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html', 23 'specVersion' => 1 24 ); 25 $this->addCallback( 26 'system.methodSignature', 27 'this:methodSignature', 28 array('array', 'string'), 29 'Returns an array describing the return type and required parameters of a method' 30 ); 31 $this->addCallback( 32 'system.getCapabilities', 33 'this:getCapabilities', 34 array('struct'), 35 'Returns a struct describing the XML-RPC specifications supported by this server' 36 ); 37 $this->addCallback( 38 'system.listMethods', 39 'this:listMethods', 40 array('array'), 41 'Returns an array of available methods on this server' 42 ); 43 $this->addCallback( 44 'system.methodHelp', 45 'this:methodHelp', 46 array('string', 'string'), 47 'Returns a documentation string for the specified method' 48 ); 49 } 50 51 /** 52 * PHP4 constructor. 53 */ 54 public function IXR_IntrospectionServer() { 55 self::__construct(); 56 } 57 58 function addCallback($method, $callback, $args, $help) 59 { 60 $this->callbacks[$method] = $callback; 61 $this->signatures[$method] = $args; 62 $this->help[$method] = $help; 63 } 64 65 function call($methodname, $args) 66 { 67 // Make sure it's in an array 68 if ($args && !is_array($args)) { 69 $args = array($args); 70 } 71 72 // Over-rides default call method, adds signature check 73 if (!$this->hasMethod($methodname)) { 74 return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.'); 75 } 76 $method = $this->callbacks[$methodname]; 77 $signature = $this->signatures[$methodname]; 78 $returnType = array_shift($signature); 79 80 // Check the number of arguments 81 if (count($args) != count($signature)) { 82 return new IXR_Error(-32602, 'server error. wrong number of method parameters'); 83 } 84 85 // Check the argument types 86 $ok = true; 87 $argsbackup = $args; 88 for ($i = 0, $j = count($args); $i < $j; $i++) { 89 $arg = array_shift($args); 90 $type = array_shift($signature); 91 switch ($type) { 92 case 'int': 93 case 'i4': 94 if (is_array($arg) || !is_int($arg)) { 95 $ok = false; 96 } 97 break; 98 case 'base64': 99 case 'string': 100 if (!is_string($arg)) { 101 $ok = false; 102 } 103 break; 104 case 'boolean': 105 if ($arg !== false && $arg !== true) { 106 $ok = false; 107 } 108 break; 109 case 'float': 110 case 'double': 111 if (!is_float($arg)) { 112 $ok = false; 113 } 114 break; 115 case 'date': 116 case 'dateTime.iso8601': 117 if (!is_a($arg, 'IXR_Date')) { 118 $ok = false; 119 } 120 break; 121 } 122 if (!$ok) { 123 return new IXR_Error(-32602, 'server error. invalid method parameters'); 124 } 125 } 126 // It passed the test - run the "real" method call 127 return parent::call($methodname, $argsbackup); 128 } 129 130 function methodSignature($method) 131 { 132 if (!$this->hasMethod($method)) { 133 return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.'); 134 } 135 // We should be returning an array of types 136 $types = $this->signatures[$method]; 137 $return = array(); 138 foreach ($types as $type) { 139 switch ($type) { 140 case 'string': 141 $return[] = 'string'; 142 break; 143 case 'int': 144 case 'i4': 145 $return[] = 42; 146 break; 147 case 'double': 148 $return[] = 3.1415; 149 break; 150 case 'dateTime.iso8601': 151 $return[] = new IXR_Date(time()); 152 break; 153 case 'boolean': 154 $return[] = true; 155 break; 156 case 'base64': 157 $return[] = new IXR_Base64('base64'); 158 break; 159 case 'array': 160 $return[] = array('array'); 161 break; 162 case 'struct': 163 $return[] = array('struct' => 'struct'); 164 break; 165 } 166 } 167 return $return; 168 } 169 170 function methodHelp($method) 171 { 172 return $this->help[$method]; 173 } 174 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Dec 24 01:00:02 2024 | Cross-referenced by PHPXref 0.7.1 |