X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=php%2Fphpxmlrpc%2Fsrc%2FWrapper.php;h=e000a0630a2cd2adc74d0910436a9771f6666960;hb=c379c0fff5edc592cc5d5d647c7fadb91317db87;hp=ce12d9a323246ae451e6f2a51c31c2796480b4a2;hpb=ae8b10f8363f7a1df02e77cbd820904c4ded10b8;p=plcapi.git diff --git a/php/phpxmlrpc/src/Wrapper.php b/php/phpxmlrpc/src/Wrapper.php index ce12d9a..e000a06 100644 --- a/php/phpxmlrpc/src/Wrapper.php +++ b/php/phpxmlrpc/src/Wrapper.php @@ -1,12 +1,14 @@ getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': syntax for function to be wrapped is wrong'); return false; } if (is_string($callable[0])) { @@ -170,7 +195,7 @@ class Wrapper } else if ($callable instanceof \Closure) { // we do not support creating code which wraps closures, as php does not allow to serialize them if (!$buildIt) { - error_log('XML-RPC: ' . __METHOD__ . ': a closure can not be wrapped in generated source code'); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': a closure can not be wrapped in generated source code'); return false; } @@ -182,7 +207,7 @@ class Wrapper } if (!$exists) { - error_log('XML-RPC: ' . __METHOD__ . ': function to be wrapped is not defined: ' . $plainFuncName); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': function to be wrapped is not defined: ' . $plainFuncName); return false; } @@ -226,23 +251,23 @@ class Wrapper if (is_array($callable)) { $func = new \ReflectionMethod($callable[0], $callable[1]); if ($func->isPrivate()) { - error_log('XML-RPC: ' . __METHOD__ . ': method to be wrapped is private: ' . $plainFuncName); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': method to be wrapped is private: ' . $plainFuncName); return false; } if ($func->isProtected()) { - error_log('XML-RPC: ' . __METHOD__ . ': method to be wrapped is protected: ' . $plainFuncName); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': method to be wrapped is protected: ' . $plainFuncName); return false; } if ($func->isConstructor()) { - error_log('XML-RPC: ' . __METHOD__ . ': method to be wrapped is the constructor: ' . $plainFuncName); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': method to be wrapped is the constructor: ' . $plainFuncName); return false; } if ($func->isDestructor()) { - error_log('XML-RPC: ' . __METHOD__ . ': method to be wrapped is the destructor: ' . $plainFuncName); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': method to be wrapped is the destructor: ' . $plainFuncName); return false; } if ($func->isAbstract()) { - error_log('XML-RPC: ' . __METHOD__ . ': method to be wrapped is abstract: ' . $plainFuncName); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': method to be wrapped is abstract: ' . $plainFuncName); return false; } /// @todo add more checks for static vs. nonstatic? @@ -252,7 +277,7 @@ class Wrapper if ($func->isInternal()) { // Note: from PHP 5.1.0 onward, we will possibly be able to use invokeargs // instead of getparameters to fully reflect internal php functions ? - error_log('XML-RPC: ' . __METHOD__ . ': function to be wrapped is internal: ' . $plainFuncName); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': function to be wrapped is internal: ' . $plainFuncName); return false; } @@ -396,11 +421,15 @@ class Wrapper * @param $callable * @param array $extraOptions * @param string $plainFuncName - * @param string $funcDesc + * @param array $funcDesc * @return \Closure */ protected function buildWrapFunctionClosure($callable, $extraOptions, $plainFuncName, $funcDesc) { + /** + * @param Request $req + * @return mixed + */ $function = function($req) use($callable, $extraOptions, $funcDesc) { $nameSpace = '\\PhpXmlRpc\\'; @@ -552,7 +581,7 @@ class Wrapper } // since we are building source code for later use, if we are given an object instance, - // we go out of our way and store a pointer to it in a static class var var... + // we go out of our way and store a pointer to it in a static class var... if (is_array($callable) && is_object($callable[0])) { self::$objHolder[$newFuncName] = $callable[0]; $innerCode .= "\$obj = PhpXmlRpc\\Wrapper::\$objHolder['$newFuncName'];\n"; @@ -593,15 +622,14 @@ class Wrapper * @param array $extraOptions see the docs for wrapPhpMethod for basic options, plus * - string method_type 'static', 'nonstatic', 'all' and 'auto' (default); the latter will switch between static and non-static depending on whether $className is a class name or object instance * - string method_filter a regexp used to filter methods to wrap based on their names - * - string prefix used for the names of the xmlrpc methods created - * + * - string prefix used for the names of the xmlrpc methods created. + * - string replace_class_name use to completely replace the class name with the prefix in the generated method names. e.g. instead of \Some\Namespace\Class.method use prefixmethod * @return array|false false on failure */ public function wrapPhpClass($className, $extraOptions = array()) { $methodFilter = isset($extraOptions['method_filter']) ? $extraOptions['method_filter'] : ''; $methodType = isset($extraOptions['method_type']) ? $extraOptions['method_type'] : 'auto'; - $prefix = isset($extraOptions['prefix']) ? $extraOptions['prefix'] : ''; $results = array(); $mList = get_class_methods($className); @@ -613,13 +641,9 @@ class Wrapper (!$func->isStatic() && ($methodType == 'all' || $methodType == 'nonstatic' || ($methodType == 'auto' && is_object($className)))) ) { $methodWrap = $this->wrapPhpFunction(array($className, $mName), '', $extraOptions); + if ($methodWrap) { - if (is_object($className)) { - $realClassName = get_class($className); - }else { - $realClassName = $className; - } - $results[$prefix."$realClassName.$mName"] = $methodWrap; + $results[$this->generateMethodNameForClassMethod($className, $mName, $extraOptions)] = $methodWrap; } } } @@ -629,6 +653,26 @@ class Wrapper return $results; } + /** + * @param string|object $className + * @param string $classMethod + * @param array $extraOptions + * @return string + */ + protected function generateMethodNameForClassMethod($className, $classMethod, $extraOptions = array()) + { + if (isset($extraOptions['replace_class_name']) && $extraOptions['replace_class_name']) { + return (isset($extraOptions['prefix']) ? $extraOptions['prefix'] : '') . $classMethod; + } + + if (is_object($className)) { + $realClassName = get_class($className); + } else { + $realClassName = $className; + } + return (isset($extraOptions['prefix']) ? $extraOptions['prefix'] : '') . "$realClassName.$classMethod"; + } + /** * Given an xmlrpc client and a method name, register a php wrapper function * that will call it and return results using native php types for both @@ -672,7 +716,7 @@ class Wrapper * - bool debug set it to 1 or 2 to see debug results of querying server for method synopsis * - int simple_client_copy set it to 1 to have a lightweight copy of the $client object made in the generated code (only used when return_source = true) * - * @return \closure|array|false false on failure, closure by default and array for return_source = true + * @return \closure|string[]|false false on failure, closure by default and array for return_source = true */ public function wrapXmlrpcMethod($client, $methodName, $extraOptions = array()) { @@ -704,7 +748,6 @@ class Wrapper return $results; } - } /** @@ -731,7 +774,7 @@ class Wrapper $client->setDebug($debug); $response = $client->send($req, $timeout, $protocol); if ($response->faultCode()) { - error_log('XML-RPC: ' . __METHOD__ . ': could not retrieve method signature from remote server for method ' . $methodName); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': could not retrieve method signature from remote server for method ' . $methodName); return false; } @@ -742,7 +785,7 @@ class Wrapper } if (!is_array($mSig) || count($mSig) <= $sigNum) { - error_log('XML-RPC: ' . __METHOD__ . ': could not retrieve method signature nr.' . $sigNum . ' from remote server for method ' . $methodName); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': could not retrieve method signature nr.' . $sigNum . ' from remote server for method ' . $methodName); return false; } @@ -785,7 +828,7 @@ class Wrapper * @param Client $client * @param string $methodName * @param array $extraOptions - * @param string $mSig + * @param array $mSig * @return \Closure * * @todo should we allow usage of parameter simple_client_copy to mean 'do not clone' in this case? @@ -879,7 +922,7 @@ class Wrapper * @param string $newFuncName * @param array $mSig * @param string $mDesc - * @return array + * @return string[] keys: source, docstring */ public function buildWrapMethodSource($client, $methodName, array $extraOptions, $newFuncName, $mSig, $mDesc='') { @@ -947,7 +990,7 @@ class Wrapper $mDesc .= "* @param int \$debug when 1 (or 2) will enable debugging of the underlying {$prefix} call (defaults to 0)\n"; } $plist = implode(', ', $plist); - $mDesc .= '* @return ' . $this->xmlrpc2PhpType($mSig[0]) . " (or an {$namespace}Response obj instance if call fails)\n*/\n"; + $mDesc .= '* @return {$namespace}Response|' . $this->xmlrpc2PhpType($mSig[0]) . " (an {$namespace}Response obj instance if call fails)\n*/\n"; $innerCode .= "\$res = \${$this_}client->send(\$req, $timeout, '$protocol');\n"; if ($decodeFault) { @@ -986,7 +1029,7 @@ class Wrapper * - string prefix * - bool simple_client_copy set it to true to avoid copying all properties of $client into the copy made in the new class * - * @return mixed false on error, the name of the created class if all ok or an array with code, class name and comments (if the appropriatevoption is set in extra_options) + * @return mixed false on error, the name of the created class if all ok or an array with code, class name and comments (if the appropriate option is set in extra_options) */ public function wrapXmlrpcServer($client, $extraOptions = array()) { @@ -1007,7 +1050,7 @@ class Wrapper $req = new $reqClass('system.listMethods'); $response = $client->send($req, $timeout, $protocol); if ($response->faultCode()) { - error_log('XML-RPC: ' . __METHOD__ . ': could not retrieve method list from remote server'); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': could not retrieve method list from remote server'); return false; } else { @@ -1017,7 +1060,7 @@ class Wrapper $mList = $decoder->decode($mList); } if (!is_array($mList) || !count($mList)) { - error_log('XML-RPC: ' . __METHOD__ . ': could not retrieve meaningful method list from remote server'); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': could not retrieve meaningful method list from remote server'); return false; } else { @@ -1059,7 +1102,7 @@ class Wrapper } $source .= $methodWrap['source'] . "\n"; } else { - error_log('XML-RPC: ' . __METHOD__ . ': will not create class method to wrap remote method ' . $mName); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': will not create class method to wrap remote method ' . $mName); } } } @@ -1070,7 +1113,7 @@ class Wrapper if ($allOK) { return $xmlrpcClassName; } else { - error_log('XML-RPC: ' . __METHOD__ . ': could not create class ' . $xmlrpcClassName . ' to wrap remote server ' . $client->server); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': could not create class ' . $xmlrpcClassName . ' to wrap remote server ' . $client->server); return false; } } else { @@ -1100,7 +1143,12 @@ class Wrapper // (this provides for future expansion or subclassing of client obj) if ($verbatimClientCopy) { foreach ($client as $fld => $val) { - if ($fld != 'debug' && $fld != 'return_type') { + /// @todo in php 8.0, curl handles became objects, but they have no __set_state, thus var_export will + /// fail for xmlrpc_curl_handle. So we disabled copying it. + /// We should examine in depth if this change can have side effects - at first sight if the + /// client's curl handle is not set, all curl options are (re)set on each http call, so there + /// should be no loss of state... + if ($fld != 'debug' && $fld != 'return_type' && $fld != 'xmlrpc_curl_handle') { $val = var_export($val, true); $code .= "\$client->$fld = $val;\n"; }