fix backwards compatibility in xmlrpc_wrappers.inc
[plcapi.git] / lib / xmlrpc_wrappers.inc
index c9e3449..3c2390a 100644 (file)
@@ -2,7 +2,7 @@
 
 /******************************************************************************
  *
- *** DEPRECATED ***
+ * *** DEPRECATED ***
  *
  * This file is only used to insure backwards compatibility
  * with the API of the library <= rev. 3
@@ -34,7 +34,6 @@ function xmlrpc_2_php_type($xmlrpcType)
     return $wrapper->xmlrpc2PhpType($xmlrpcType);
 }
 
-/// @todo backwards compat: return string instead of callable
 /**
  * @see PhpXmlRpc\Wrapper::wrap_php_function
  * @param callable $funcName
@@ -45,11 +44,21 @@ function xmlrpc_2_php_type($xmlrpcType)
 function wrap_php_function($funcName, $newFuncName='', $extraOptions=array())
 {
     $wrapper = new PhpXmlRpc\Wrapper();
-    return $wrapper->wrapPhpFunction($funcName, $newFuncName, $extraOptions);
+    if (!isset($extraOptions['return_source'])  || $extraOptions['return_source'] == false) {
+        // backwards compat: return string instead of callable
+        $extraOptions['return_source'] = true;
+        $wrapped = $wrapper->wrapPhpFunction($funcName, $newFuncName, $extraOptions);
+        eval($wrapped['source']);
+    } else {
+        $wrapped = $wrapper->wrapPhpFunction($funcName, $newFuncName, $extraOptions);
+    }
+    return $wrapped;
 }
 
-/// @todo backwards compat: return strings instead of callables
 /**
+ * NB: this function returns an array in a format which is unsuitable for direct use in the server dispatch map, unlike
+ * PhpXmlRpc\Wrapper::wrapPhpClass. This behaviour might seem like a bug, but has been kept for backwards compatibility.
+ *
  * @see PhpXmlRpc\Wrapper::wrap_php_class
  * @param string|object $className
  * @param array $extraOptions
@@ -58,10 +67,22 @@ function wrap_php_function($funcName, $newFuncName='', $extraOptions=array())
 function wrap_php_class($className, $extraOptions=array())
 {
     $wrapper = new PhpXmlRpc\Wrapper();
-    return $wrapper->wrapPhpClass($className, $extraOptions);
+    $fix = false;
+    if (!isset($extraOptions['return_source'])  || $extraOptions['return_source'] == false) {
+        // backwards compat: return string instead of callable
+        $extraOptions['return_source'] = true;
+        $fix = true;
+    }
+    $wrapped = $wrapper->wrapPhpClass($className, $extraOptions);
+    foreach($wrapped as $name => $value) {
+        if ($fix) {
+            eval($value['source']);
+        }
+        $wrapped[$name] = $value['function'];
+    }
+    return $wrapped;
 }
 
-/// @todo backwards compat: return string instead of callable
 /**
  * @see PhpXmlRpc\Wrapper::wrapXmlrpcMethod
  * @param xmlrpc_client $client
@@ -86,10 +107,19 @@ function wrap_xmlrpc_method($client, $methodName, $extraOptions=0, $timeout=0, $
     }
 
     $wrapper = new PhpXmlRpc\Wrapper();
-    return $wrapper->wrapXmlrpcMethod($client, $methodName, $extraOptions);
+
+    if (!isset($extraOptions['return_source'])  || $extraOptions['return_source'] == false) {
+        // backwards compat: return string instead of callable
+        $extraOptions['return_source'] = true;
+        $wrapped = $wrapper->wrapXmlrpcMethod($client, $methodName, $extraOptions);
+        eval($wrapped['source']);
+        $wrapped = $wrapped['function'];
+    } else {
+        $wrapped = $wrapper->wrapXmlrpcMethod($client, $methodName, $extraOptions);
+    }
+    return $wrapped;
 }
 
-/// @todo backwards compat: return strings instead of callables
 /**
  * @see PhpXmlRpc\Wrapper::wrap_xmlrpc_server
  * @param xmlrpc_client $client
@@ -102,7 +132,6 @@ function wrap_xmlrpc_server($client, $extraOptions=array())
     return $wrapper->wrapXmlrpcServer($client, $extraOptions);
 }
 
-/// @todo fix dangling usage of $this->
 /**
  * Given the necessary info, build php code that creates a new function to invoke a remote xmlrpc method.
  * Take care that no full checking of input parameters is done to ensure that valid php code is emitted.
@@ -119,7 +148,7 @@ function build_remote_method_wrapper_code($client, $methodName, $xmlrpcFuncName,
     $code = "function $xmlrpcFuncName (";
     if ($clientCopyMode < 2) {
         // client copy mode 0 or 1 == partial / full client copy in emitted code
-        $innerCode = $this->build_client_wrapper_code($client, $clientCopyMode, $prefix, $namespace);
+        $innerCode = build_client_wrapper_code($client, $clientCopyMode, $prefix, $namespace);
         $innerCode .= "\$client->setDebug(\$debug);\n";
         $this_ = '';
     } else {
@@ -185,3 +214,30 @@ function build_remote_method_wrapper_code($client, $methodName, $xmlrpcFuncName,
 
     return array('source' => $code, 'docstring' => $mDesc);
 }
+
+/**
+ * @deprecated
+ */
+function build_client_wrapper_code($client, $verbatim_client_copy, $prefix='xmlrpc')
+{
+    $code = "\$client = new {$prefix}_client('".str_replace("'", "\'", $client->path).
+        "', '" . str_replace("'", "\'", $client->server) . "', $client->port);\n";
+
+    // copy all client fields to the client that will be generated runtime
+    // (this provides for future expansion or subclassing of client obj)
+    if ($verbatim_client_copy)
+    {
+        foreach($client as $fld => $val)
+        {
+            if($fld != 'debug' && $fld != 'return_type')
+            {
+                $val = var_export($val, true);
+                $code .= "\$client->$fld = $val;\n";
+            }
+        }
+    }
+    // only make sure that client always returns the correct data type
+    $code .= "\$client->return_type = '{$prefix}vals';\n";
+    //$code .= "\$client->setDebug(\$debug);\n";
+    return $code;
+}