Completed
Push — php51 ( e2e917...3c9909 )
by Gaetano
07:04
created
demo/client/agesort.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,1 +1,1 @@
 block discarded – undo
1
-<html>
<head><title>xmlrpc</title></head>
<body>
<h1>Agesort demo</h1>
<h2>Send an array of 'name' => 'age' pairs to the server that will send it back sorted.</h2>
<h3>The source code demonstrates basic lib usage, including handling of xmlrpc arrays and structs</h3>
<p></p>
<?php
include("xmlrpc.inc");

$inAr=array("Dave" => 24, "Edd" => 45, "Joe" => 37, "Fred" => 27);
reset($inAr);
print "This is the input data:<br/><pre>";
while (list($key, $val)=each($inAr)) {
  print $key . ", " . $val . "\n";
}
print "</pre>";

// create parameters from the input array: an xmlrpc array of xmlrpc structs
$p=array();
foreach($inAr as $key => $val) {
  $p[]=new xmlrpcval(array("name" => new xmlrpcval($key),
                           "age" => new xmlrpcval($val, "int")), "struct");
}
$v=new xmlrpcval($p, "array");
print "Encoded into xmlrpc format it looks like this: <pre>\n" .  htmlentities($v->serialize()). "</pre>\n";

// create client and message objects
$f=new xmlrpcmsg('examples.sortByAge',  array($v));
$c=new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80);

// set maximum debug level, to have the complete communication printed to screen
$c->setDebug(2);

// send request
print "Now sending request (detailed debug info follows)";
$r=&$c->send($f);

// check response for errors, and take appropriate action
if (!$r->faultCode()) {
  print "The server gave me these results:<pre>";
  $v=$r->value();
  $max=$v->arraysize();
  for($i=0; $i<$max; $i++) {
    $rec=$v->arraymem($i);
    $n=$rec->structmem("name");
    $a=$rec->structmem("age");
    print htmlspecialchars($n->scalarval()) . ", " . htmlspecialchars($a->scalarval()) . "\n";
  }

  print "<hr/>For nerds: I got this value back<br/><pre>" .
    htmlentities($r->serialize()). "</pre><hr/>\n";
} else {
  print "An error occurred:<pre>";
  print "Code: " . htmlspecialchars($r->faultCode()) .
    "\nReason: '" . htmlspecialchars($r->faultString()).'\'</pre><hr/>';
}

?>
</body>
</html>
2 1
\ No newline at end of file
2
+<html>
<head><title>xmlrpc</title></head>
<body>
<h1>Agesort demo</h1>
<h2>Send an array of 'name' => 'age' pairs to the server that will send it back sorted.</h2>
<h3>The source code demonstrates basic lib usage, including handling of xmlrpc arrays and structs</h3>
<p></p>
<?php
include("xmlrpc.inc"); $inAr = array("Dave" => 24, "Edd" => 45, "Joe" => 37, "Fred" => 27); reset($inAr); print "This is the input data:<br/><pre>"; while (list($key, $val) = each($inAr)) {
  print $key.", ".$val."\n"; }
print "</pre>"; // create parameters from the input array: an xmlrpc array of xmlrpc structs
$p = array(); foreach ($inAr as $key => $val) {
  $p[] = new xmlrpcval(array("name" => new xmlrpcval($key), "age" => new xmlrpcval($val, "int")), "struct"); }
$v = new xmlrpcval($p, "array"); print "Encoded into xmlrpc format it looks like this: <pre>\n".htmlentities($v->serialize())."</pre>\n"; // create client and message objects
$f = new xmlrpcmsg('examples.sortByAge', array($v)); $c = new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80); // set maximum debug level, to have the complete communication printed to screen
$c->setDebug(2); // send request
print "Now sending request (detailed debug info follows)"; $r = &$c->send($f); // check response for errors, and take appropriate action
if (!$r->faultCode()) {
  print "The server gave me these results:<pre>"; $v = $r->value(); $max = $v->arraysize(); for ($i = 0; $i<$max; $i++) {
    $rec = $v->arraymem($i); $n = $rec->structmem("name"); $a = $rec->structmem("age"); print htmlspecialchars($n->scalarval()).", ".htmlspecialchars($a->scalarval())."\n"; }

  print "<hr/>For nerds: I got this value back<br/><pre>".htmlentities($r->serialize())."</pre><hr/>\n"; } else {
  print "An error occurred:<pre>"; print "Code: ".htmlspecialchars($r->faultCode())."\nReason: '".htmlspecialchars($r->faultString()).'\'</pre><hr/>'; }

?>
</body>
</html>
3 3
\ No newline at end of file
Please login to merge, or discard this patch.
demo/client/client.php 3 patches
Indentation   +36 added lines, -36 removed lines patch added patch discarded remove patch
@@ -5,45 +5,45 @@
 block discarded – undo
5 5
 <h2>Send a U.S. state number to the server and get back the state name</h2>
6 6
 <h3>The code demonstrates usage of the php_xmlrpc_encode function</h3>
7 7
 <?php
8
-	include("xmlrpc.inc");
8
+    include("xmlrpc.inc");
9 9
 
10
-	// Play nice to PHP 5 installations with REGISTER_LONG_ARRAYS off
11
-	if(!isset($HTTP_POST_VARS) && isset($_POST))
12
-	{
13
-		$HTTP_POST_VARS = $_POST;
14
-	}
10
+    // Play nice to PHP 5 installations with REGISTER_LONG_ARRAYS off
11
+    if(!isset($HTTP_POST_VARS) && isset($_POST))
12
+    {
13
+        $HTTP_POST_VARS = $_POST;
14
+    }
15 15
 
16
-	if(isset($HTTP_POST_VARS["stateno"]) && $HTTP_POST_VARS["stateno"]!="")
17
-	{
18
-		$stateno=(integer)$HTTP_POST_VARS["stateno"];
19
-		$f=new xmlrpcmsg('examples.getStateName',
20
-			array(php_xmlrpc_encode($stateno))
21
-		);
22
-		print "<pre>Sending the following request:\n\n" . htmlentities($f->serialize()) . "\n\nDebug info of server data follows...\n\n";
23
-		$c=new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80);
24
-		$c->setDebug(1);
25
-		$r=&$c->send($f);
26
-		if(!$r->faultCode())
27
-		{
28
-			$v=$r->value();
29
-			print "</pre><br/>State number " . $stateno . " is "
30
-				. htmlspecialchars($v->scalarval()) . "<br/>";
31
-			// print "<HR>I got this value back<BR><PRE>" .
32
-			//  htmlentities($r->serialize()). "</PRE><HR>\n";
33
-		}
34
-		else
35
-		{
36
-			print "An error occurred: ";
37
-			print "Code: " . htmlspecialchars($r->faultCode())
38
-				. " Reason: '" . htmlspecialchars($r->faultString()) . "'</pre><br/>";
39
-		}
40
-	}
41
-	else
42
-	{
43
-		$stateno = "";
44
-	}
16
+    if(isset($HTTP_POST_VARS["stateno"]) && $HTTP_POST_VARS["stateno"]!="")
17
+    {
18
+        $stateno=(integer)$HTTP_POST_VARS["stateno"];
19
+        $f=new xmlrpcmsg('examples.getStateName',
20
+            array(php_xmlrpc_encode($stateno))
21
+        );
22
+        print "<pre>Sending the following request:\n\n" . htmlentities($f->serialize()) . "\n\nDebug info of server data follows...\n\n";
23
+        $c=new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80);
24
+        $c->setDebug(1);
25
+        $r=&$c->send($f);
26
+        if(!$r->faultCode())
27
+        {
28
+            $v=$r->value();
29
+            print "</pre><br/>State number " . $stateno . " is "
30
+                . htmlspecialchars($v->scalarval()) . "<br/>";
31
+            // print "<HR>I got this value back<BR><PRE>" .
32
+            //  htmlentities($r->serialize()). "</PRE><HR>\n";
33
+        }
34
+        else
35
+        {
36
+            print "An error occurred: ";
37
+            print "Code: " . htmlspecialchars($r->faultCode())
38
+                . " Reason: '" . htmlspecialchars($r->faultString()) . "'</pre><br/>";
39
+        }
40
+    }
41
+    else
42
+    {
43
+        $stateno = "";
44
+    }
45 45
 
46
-	print "<form action=\"client.php\" method=\"POST\">
46
+    print "<form action=\"client.php\" method=\"POST\">
47 47
 <input name=\"stateno\" value=\"" . $stateno . "\"><input type=\"submit\" value=\"go\" name=\"submit\"></form>
48 48
 <p>Enter a state number to query its name</p>";
49 49
 
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -8,34 +8,34 @@  discard block
 block discarded – undo
8 8
 	include("xmlrpc.inc");
9 9
 
10 10
 	// Play nice to PHP 5 installations with REGISTER_LONG_ARRAYS off
11
-	if(!isset($HTTP_POST_VARS) && isset($_POST))
11
+	if (!isset($HTTP_POST_VARS) && isset($_POST))
12 12
 	{
13 13
 		$HTTP_POST_VARS = $_POST;
14 14
 	}
15 15
 
16
-	if(isset($HTTP_POST_VARS["stateno"]) && $HTTP_POST_VARS["stateno"]!="")
16
+	if (isset($HTTP_POST_VARS["stateno"]) && $HTTP_POST_VARS["stateno"] != "")
17 17
 	{
18
-		$stateno=(integer)$HTTP_POST_VARS["stateno"];
19
-		$f=new xmlrpcmsg('examples.getStateName',
18
+		$stateno = (integer) $HTTP_POST_VARS["stateno"];
19
+		$f = new xmlrpcmsg('examples.getStateName',
20 20
 			array(php_xmlrpc_encode($stateno))
21 21
 		);
22
-		print "<pre>Sending the following request:\n\n" . htmlentities($f->serialize()) . "\n\nDebug info of server data follows...\n\n";
23
-		$c=new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80);
22
+		print "<pre>Sending the following request:\n\n".htmlentities($f->serialize())."\n\nDebug info of server data follows...\n\n";
23
+		$c = new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80);
24 24
 		$c->setDebug(1);
25
-		$r=&$c->send($f);
26
-		if(!$r->faultCode())
25
+		$r = &$c->send($f);
26
+		if (!$r->faultCode())
27 27
 		{
28
-			$v=$r->value();
29
-			print "</pre><br/>State number " . $stateno . " is "
30
-				. htmlspecialchars($v->scalarval()) . "<br/>";
28
+			$v = $r->value();
29
+			print "</pre><br/>State number ".$stateno." is "
30
+				. htmlspecialchars($v->scalarval())."<br/>";
31 31
 			// print "<HR>I got this value back<BR><PRE>" .
32 32
 			//  htmlentities($r->serialize()). "</PRE><HR>\n";
33 33
 		}
34 34
 		else
35 35
 		{
36 36
 			print "An error occurred: ";
37
-			print "Code: " . htmlspecialchars($r->faultCode())
38
-				. " Reason: '" . htmlspecialchars($r->faultString()) . "'</pre><br/>";
37
+			print "Code: ".htmlspecialchars($r->faultCode())
38
+				. " Reason: '".htmlspecialchars($r->faultString())."'</pre><br/>";
39 39
 		}
40 40
 	}
41 41
 	else
@@ -44,7 +44,7 @@  discard block
 block discarded – undo
44 44
 	}
45 45
 
46 46
 	print "<form action=\"client.php\" method=\"POST\">
47
-<input name=\"stateno\" value=\"" . $stateno . "\"><input type=\"submit\" value=\"go\" name=\"submit\"></form>
47
+<input name=\"stateno\" value=\"" . $stateno."\"><input type=\"submit\" value=\"go\" name=\"submit\"></form>
48 48
 <p>Enter a state number to query its name</p>";
49 49
 
50 50
 ?>
Please login to merge, or discard this patch.
Braces   +2 added lines, -4 removed lines patch added patch discarded remove patch
@@ -30,15 +30,13 @@
 block discarded – undo
30 30
 				. htmlspecialchars($v->scalarval()) . "<br/>";
31 31
 			// print "<HR>I got this value back<BR><PRE>" .
32 32
 			//  htmlentities($r->serialize()). "</PRE><HR>\n";
33
-		}
34
-		else
33
+		} else
35 34
 		{
36 35
 			print "An error occurred: ";
37 36
 			print "Code: " . htmlspecialchars($r->faultCode())
38 37
 				. " Reason: '" . htmlspecialchars($r->faultString()) . "'</pre><br/>";
39 38
 		}
40
-	}
41
-	else
39
+	} else
42 40
 	{
43 41
 		$stateno = "";
44 42
 	}
Please login to merge, or discard this patch.
demo/client/simple_call.php 3 patches
Indentation   +47 added lines, -47 removed lines patch added patch discarded remove patch
@@ -6,53 +6,53 @@
 block discarded – undo
6 6
  * @license code licensed under the BSD License: http://phpxmlrpc.sourceforge.net/license.txt
7 7
  */
8 8
 
9
-	/**
10
-	 * Takes a client object, a remote method name, and a variable numbers of
11
-	 * php values, and calls the method with the supplied parameters. The
12
-	 * parameters are native php values and the result is an xmlrpcresp object.
13
-	 *
14
-	 * Notes:
15
-	 * The function encodes the received parameters using php_xmlrpc_encode:
16
-	 * the limitations of automatic encoding apply to this function too);
17
-	 *
18
-	 * the type of the value returned by the function can be changed setting
19
-	 * beforehand the 'return_type' member of the client object to 'phpvals' -
20
-	 * see the manual for more details about this capability).
21
-	 *
22
-	 *
23
-	 * @author Toth Istvan
24
-	 *
25
-	 * @param xmlrpc_client client object, properly set up to connect to server
26
-	 * @param string remote function name
27
-	 * @param mixed $parameter1
28
-	 * @param mixed $parameter2
29
-	 * @param mixed $parameter3 ...
30
-	 * @return xmlrpcresp or false on error
31
-	 */
32
-	function xmlrpccall_simple()
33
-	{
34
-		if(func_num_args() < 2)
35
-		{
36
-			// Incorrect
37
-			return false;
38
-		}
39
-		else
40
-		{
41
-			$varargs = func_get_args();
42
-			$client = array_shift($varargs);
43
-			$remote_function_name = array_shift($varargs);
44
-			if (!is_a($client, 'xmlrpc_client') || !is_string($remote_function_name))
45
-			{
46
-				return false;
47
-			}
9
+    /**
10
+     * Takes a client object, a remote method name, and a variable numbers of
11
+     * php values, and calls the method with the supplied parameters. The
12
+     * parameters are native php values and the result is an xmlrpcresp object.
13
+     *
14
+     * Notes:
15
+     * The function encodes the received parameters using php_xmlrpc_encode:
16
+     * the limitations of automatic encoding apply to this function too);
17
+     *
18
+     * the type of the value returned by the function can be changed setting
19
+     * beforehand the 'return_type' member of the client object to 'phpvals' -
20
+     * see the manual for more details about this capability).
21
+     *
22
+     *
23
+     * @author Toth Istvan
24
+     *
25
+     * @param xmlrpc_client client object, properly set up to connect to server
26
+     * @param string remote function name
27
+     * @param mixed $parameter1
28
+     * @param mixed $parameter2
29
+     * @param mixed $parameter3 ...
30
+     * @return xmlrpcresp or false on error
31
+     */
32
+    function xmlrpccall_simple()
33
+    {
34
+        if(func_num_args() < 2)
35
+        {
36
+            // Incorrect
37
+            return false;
38
+        }
39
+        else
40
+        {
41
+            $varargs = func_get_args();
42
+            $client = array_shift($varargs);
43
+            $remote_function_name = array_shift($varargs);
44
+            if (!is_a($client, 'xmlrpc_client') || !is_string($remote_function_name))
45
+            {
46
+                return false;
47
+            }
48 48
 
49
-			$xmlrpcval_array = array();
50
-			foreach($varargs as $parameter)
51
-			{
52
-				$xmlrpcval_array[] = php_xmlrpc_encode($parameter);
53
-			}
49
+            $xmlrpcval_array = array();
50
+            foreach($varargs as $parameter)
51
+            {
52
+                $xmlrpcval_array[] = php_xmlrpc_encode($parameter);
53
+            }
54 54
 
55
-			return $client->send(new xmlrpcmsg($remote_function_name, $xmlrpcval_array));
56
-		}
57
-	}
55
+            return $client->send(new xmlrpcmsg($remote_function_name, $xmlrpcval_array));
56
+        }
57
+    }
58 58
 ?>
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -31,7 +31,7 @@  discard block
 block discarded – undo
31 31
 	 */
32 32
 	function xmlrpccall_simple()
33 33
 	{
34
-		if(func_num_args() < 2)
34
+		if (func_num_args()<2)
35 35
 		{
36 36
 			// Incorrect
37 37
 			return false;
@@ -47,7 +47,7 @@  discard block
 block discarded – undo
47 47
 			}
48 48
 
49 49
 			$xmlrpcval_array = array();
50
-			foreach($varargs as $parameter)
50
+			foreach ($varargs as $parameter)
51 51
 			{
52 52
 				$xmlrpcval_array[] = php_xmlrpc_encode($parameter);
53 53
 			}
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -35,8 +35,7 @@
 block discarded – undo
35 35
 		{
36 36
 			// Incorrect
37 37
 			return false;
38
-		}
39
-		else
38
+		} else
40 39
 		{
41 40
 			$varargs = func_get_args();
42 41
 			$client = array_shift($varargs);
Please login to merge, or discard this patch.
demo/client/mail.php 3 patches
Indentation   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -1,8 +1,8 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 // Allow users to see the source of this file even if PHP is not configured for it
3 3
 if ((isset($HTTP_GET_VARS['showSource']) && $HTTP_GET_VARS['showSource']) ||
4
-	(isset($_GET['showSource']) && $_GET['showSource']))
5
-	{ highlight_file(__FILE__); die(); }
4
+    (isset($_GET['showSource']) && $_GET['showSource']))
5
+    { highlight_file(__FILE__); die(); }
6 6
 ?>
7 7
 <html>
8 8
 <head><title>xmlrpc</title></head>
@@ -18,36 +18,36 @@  discard block
 block discarded – undo
18 18
 
19 19
 // Play nice to PHP 5 installations with REGISTER_LONG_ARRAYS off
20 20
 if (!isset($HTTP_POST_VARS) && isset($_POST))
21
-	$HTTP_POST_VARS = $_POST;
21
+    $HTTP_POST_VARS = $_POST;
22 22
 
23 23
 if (isset($HTTP_POST_VARS["server"]) && $HTTP_POST_VARS["server"]) {
24
-	if ($HTTP_POST_VARS["server"]=="Userland") {
25
-		$XP="/RPC2"; $XS="206.204.24.2";
26
-	} else {
27
-		$XP="/xmlrpc/server.php"; $XS="pingu.heddley.com";
28
-	}
29
-	$f=new xmlrpcmsg('mail.send');
30
-	$f->addParam(new xmlrpcval($HTTP_POST_VARS["mailto"]));
31
-	$f->addParam(new xmlrpcval($HTTP_POST_VARS["mailsub"]));
32
-	$f->addParam(new xmlrpcval($HTTP_POST_VARS["mailmsg"]));
33
-	$f->addParam(new xmlrpcval($HTTP_POST_VARS["mailfrom"]));
34
-	$f->addParam(new xmlrpcval($HTTP_POST_VARS["mailcc"]));
35
-	$f->addParam(new xmlrpcval($HTTP_POST_VARS["mailbcc"]));
36
-	$f->addParam(new xmlrpcval("text/plain"));
24
+    if ($HTTP_POST_VARS["server"]=="Userland") {
25
+        $XP="/RPC2"; $XS="206.204.24.2";
26
+    } else {
27
+        $XP="/xmlrpc/server.php"; $XS="pingu.heddley.com";
28
+    }
29
+    $f=new xmlrpcmsg('mail.send');
30
+    $f->addParam(new xmlrpcval($HTTP_POST_VARS["mailto"]));
31
+    $f->addParam(new xmlrpcval($HTTP_POST_VARS["mailsub"]));
32
+    $f->addParam(new xmlrpcval($HTTP_POST_VARS["mailmsg"]));
33
+    $f->addParam(new xmlrpcval($HTTP_POST_VARS["mailfrom"]));
34
+    $f->addParam(new xmlrpcval($HTTP_POST_VARS["mailcc"]));
35
+    $f->addParam(new xmlrpcval($HTTP_POST_VARS["mailbcc"]));
36
+    $f->addParam(new xmlrpcval("text/plain"));
37 37
 
38
-	$c=new xmlrpc_client($XP, $XS, 80);
39
-	$c->setDebug(2);
40
-	$r=&$c->send($f);
41
-	if (!$r->faultCode()) {
42
-		print "Mail sent OK<br/>\n";
43
-	} else {
44
-		print "<fonr color=\"red\">";
45
-		print "Mail send failed<br/>\n";
46
-		print "Fault: ";
47
-		print "Code: " . htmlspecialchars($r->faultCode()) .
48
-	  " Reason: '" . htmlspecialchars($r->faultString()) . "'<br/>";
49
-		print "</font><br/>";
50
-	}
38
+    $c=new xmlrpc_client($XP, $XS, 80);
39
+    $c->setDebug(2);
40
+    $r=&$c->send($f);
41
+    if (!$r->faultCode()) {
42
+        print "Mail sent OK<br/>\n";
43
+    } else {
44
+        print "<fonr color=\"red\">";
45
+        print "Mail send failed<br/>\n";
46
+        print "Fault: ";
47
+        print "Code: " . htmlspecialchars($r->faultCode()) .
48
+        " Reason: '" . htmlspecialchars($r->faultString()) . "'<br/>";
49
+        print "</font><br/>";
50
+    }
51 51
 }
52 52
 ?>
53 53
 <form method="POST">
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -21,12 +21,12 @@  discard block
 block discarded – undo
21 21
 	$HTTP_POST_VARS = $_POST;
22 22
 
23 23
 if (isset($HTTP_POST_VARS["server"]) && $HTTP_POST_VARS["server"]) {
24
-	if ($HTTP_POST_VARS["server"]=="Userland") {
25
-		$XP="/RPC2"; $XS="206.204.24.2";
24
+	if ($HTTP_POST_VARS["server"] == "Userland") {
25
+		$XP = "/RPC2"; $XS = "206.204.24.2";
26 26
 	} else {
27
-		$XP="/xmlrpc/server.php"; $XS="pingu.heddley.com";
27
+		$XP = "/xmlrpc/server.php"; $XS = "pingu.heddley.com";
28 28
 	}
29
-	$f=new xmlrpcmsg('mail.send');
29
+	$f = new xmlrpcmsg('mail.send');
30 30
 	$f->addParam(new xmlrpcval($HTTP_POST_VARS["mailto"]));
31 31
 	$f->addParam(new xmlrpcval($HTTP_POST_VARS["mailsub"]));
32 32
 	$f->addParam(new xmlrpcval($HTTP_POST_VARS["mailmsg"]));
@@ -35,17 +35,17 @@  discard block
 block discarded – undo
35 35
 	$f->addParam(new xmlrpcval($HTTP_POST_VARS["mailbcc"]));
36 36
 	$f->addParam(new xmlrpcval("text/plain"));
37 37
 
38
-	$c=new xmlrpc_client($XP, $XS, 80);
38
+	$c = new xmlrpc_client($XP, $XS, 80);
39 39
 	$c->setDebug(2);
40
-	$r=&$c->send($f);
40
+	$r = &$c->send($f);
41 41
 	if (!$r->faultCode()) {
42 42
 		print "Mail sent OK<br/>\n";
43 43
 	} else {
44 44
 		print "<fonr color=\"red\">";
45 45
 		print "Mail send failed<br/>\n";
46 46
 		print "Fault: ";
47
-		print "Code: " . htmlspecialchars($r->faultCode()) .
48
-	  " Reason: '" . htmlspecialchars($r->faultString()) . "'<br/>";
47
+		print "Code: ".htmlspecialchars($r->faultCode()).
48
+	  " Reason: '".htmlspecialchars($r->faultString())."'<br/>";
49 49
 		print "</font><br/>";
50 50
 	}
51 51
 }
Please login to merge, or discard this patch.
Braces   +2 added lines, -1 removed lines patch added patch discarded remove patch
@@ -17,8 +17,9 @@
 block discarded – undo
17 17
 include("xmlrpc.inc");
18 18
 
19 19
 // Play nice to PHP 5 installations with REGISTER_LONG_ARRAYS off
20
-if (!isset($HTTP_POST_VARS) && isset($_POST))
20
+if (!isset($HTTP_POST_VARS) && isset($_POST)) {
21 21
 	$HTTP_POST_VARS = $_POST;
22
+}
22 23
 
23 24
 if (isset($HTTP_POST_VARS["server"]) && $HTTP_POST_VARS["server"]) {
24 25
 	if ($HTTP_POST_VARS["server"]=="Userland") {
Please login to merge, or discard this patch.
demo/client/zopetest.php 3 patches
Indentation   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -4,26 +4,26 @@
 block discarded – undo
4 4
 <h1>Zope test demo</h1>
5 5
 <h3>The code demonstrates usage of basic authentication to connect to the server</h3>
6 6
 <?php
7
-	include("xmlrpc.inc");
7
+    include("xmlrpc.inc");
8 8
 
9
-	$f = new xmlrpcmsg('document_src', array());
10
-	$c = new xmlrpc_client("/index_html", "pingu.heddley.com", 9080);
11
-	$c->setCredentials("username", "password");
12
-	$c->setDebug(2);
13
-	$r = $c->send($f);
14
-	if(!$r->faultCode())
15
-	{
16
-		$v = $r->value();
17
-		print "I received:" . htmlspecialchars($v->scalarval()) . "<br/>";
18
-		print "<hr/>I got this value back<br/>pre>" .
19
-		htmlentities($r->serialize()). "</pre>\n";
20
-	}
21
-	else
22
-	{
23
-		print "An error occurred: ";
24
-		print "Code: " . htmlspecialchars($r->faultCode())
25
-			. " Reason: '" . ($r->faultString()) . "'<br/>";
26
-	}
9
+    $f = new xmlrpcmsg('document_src', array());
10
+    $c = new xmlrpc_client("/index_html", "pingu.heddley.com", 9080);
11
+    $c->setCredentials("username", "password");
12
+    $c->setDebug(2);
13
+    $r = $c->send($f);
14
+    if(!$r->faultCode())
15
+    {
16
+        $v = $r->value();
17
+        print "I received:" . htmlspecialchars($v->scalarval()) . "<br/>";
18
+        print "<hr/>I got this value back<br/>pre>" .
19
+        htmlentities($r->serialize()). "</pre>\n";
20
+    }
21
+    else
22
+    {
23
+        print "An error occurred: ";
24
+        print "Code: " . htmlspecialchars($r->faultCode())
25
+            . " Reason: '" . ($r->faultString()) . "'<br/>";
26
+    }
27 27
 ?>
28 28
 </body>
29 29
 </html>
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -11,18 +11,18 @@
 block discarded – undo
11 11
 	$c->setCredentials("username", "password");
12 12
 	$c->setDebug(2);
13 13
 	$r = $c->send($f);
14
-	if(!$r->faultCode())
14
+	if (!$r->faultCode())
15 15
 	{
16 16
 		$v = $r->value();
17
-		print "I received:" . htmlspecialchars($v->scalarval()) . "<br/>";
18
-		print "<hr/>I got this value back<br/>pre>" .
19
-		htmlentities($r->serialize()). "</pre>\n";
17
+		print "I received:".htmlspecialchars($v->scalarval())."<br/>";
18
+		print "<hr/>I got this value back<br/>pre>".
19
+		htmlentities($r->serialize())."</pre>\n";
20 20
 	}
21 21
 	else
22 22
 	{
23 23
 		print "An error occurred: ";
24
-		print "Code: " . htmlspecialchars($r->faultCode())
25
-			. " Reason: '" . ($r->faultString()) . "'<br/>";
24
+		print "Code: ".htmlspecialchars($r->faultCode())
25
+			. " Reason: '".($r->faultString())."'<br/>";
26 26
 	}
27 27
 ?>
28 28
 </body>
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -17,8 +17,7 @@
 block discarded – undo
17 17
 		print "I received:" . htmlspecialchars($v->scalarval()) . "<br/>";
18 18
 		print "<hr/>I got this value back<br/>pre>" .
19 19
 		htmlentities($r->serialize()). "</pre>\n";
20
-	}
21
-	else
20
+	} else
22 21
 	{
23 22
 		print "An error occurred: ";
24 23
 		print "Code: " . htmlspecialchars($r->faultCode())
Please login to merge, or discard this patch.
demo/client/introspect.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,1 +1,1 @@
 block discarded – undo
1
-<html>

<head><title>xmlrpc</title></head>

<body>

<h1>Introspect demo</h1>

<h2>Query server for available methods and their description</h2>

<h3>The code demonstrates usage of multicall and introspection methods</h3>

<?php

	include("xmlrpc.inc");



	function display_error($r)

	{

		print "An error occurred: ";

		print "Code: " . $r->faultCode()

			. " Reason: '" .$r->faultString()."'<br/>";

	}



	// 'new style' client constuctor

	$c = new xmlrpc_client("http://phpxmlrpc.sourceforge.net/server.php");

	print "<h3>methods available at http://" . $c->server . $c->path .  "</h3>\n";



	$m = new xmlrpcmsg('system.listMethods');

	$r =& $c->send($m);

	if($r->faultCode())

	{

		display_error($r);

	}

	else

	{

		$v=$r->value();

		for($i=0; $i<$v->arraysize(); $i++)

		{

			$mname=$v->arraymem($i);

			print "<h4>" . $mname->scalarval() . "</h4>\n";



			// build messages first, add params later

			$m1  = new xmlrpcmsg('system.methodHelp');

			$m2  = new xmlrpcmsg('system.methodSignature');

			$val = new xmlrpcval($mname->scalarval(), "string");

			$m1->addParam($val);

			$m2->addParam($val);



			// send multiple messages in one pass.

			// If server does not support multicall, client will fall back to 2 separate calls

			$ms = array($m1, $m2);

			$rs =& $c->send($ms);



			if($rs[0]->faultCode())

			{

				display_error($rs[0]);

			}

			else

			{

				$val=$rs[0]->value();

				$txt=$val->scalarval();

				if($txt != "")

				{

					print "<h4>Documentation</h4><p>${txt}</p>\n";

				}

				else

				{

					print "<p>No documentation available.</p>\n";

				}

			}



			if($rs[1]->faultCode())

			{

				display_error($rs[1]);

			}

			else

			{

				print "<h4>Signature</h4><p>\n";

				$val = $rs[1]->value();

				if($val->kindOf()=="array")

				{

					for($j=0; $j<$val->arraysize(); $j++)

					{

						$x = $val->arraymem($j);

						$ret = $x->arraymem(0);

						print "<code>" . $ret->scalarval() . " "

							. $mname->scalarval() . "(";

						if($x->arraysize()>1)

						{

							for($k=1; $k<$x->arraysize(); $k++)

							{

								$y = $x->arraymem($k);

								print $y->scalarval();

								if($k < $x->arraysize()-1)

								{

									print ", ";

								}

							}

						}

						print ")</code><br/>\n";

					}

				}

				else

				{

					print "Signature unknown\n";

				}

				print "</p>\n";

			}

		}

	}

?>

</body>

</html>

2 1
\ No newline at end of file
2
+<html>

<head><title>xmlrpc</title></head>

<body>

<h1>Introspect demo</h1>

<h2>Query server for available methods and their description</h2>

<h3>The code demonstrates usage of multicall and introspection methods</h3>

<?php

	include("xmlrpc.inc"); function display_error($r) {

		print "An error occurred: "; print "Code: ".$r->faultCode()." Reason: '".$r->faultString()."'<br/>"; }



	// 'new style' client constuctor

	$c = new xmlrpc_client("http://phpxmlrpc.sourceforge.net/server.php"); print "<h3>methods available at http://".$c->server.$c->path."</h3>\n"; $m = new xmlrpcmsg('system.listMethods'); $r = & $c->send($m); if ($r->faultCode()) {

		display_error($r); } else {

		$v = $r->value(); for ($i = 0; $i<$v->arraysize(); $i++) {

			$mname = $v->arraymem($i); print "<h4>".$mname->scalarval()."</h4>\n"; // build messages first, add params later

			$m1 = new xmlrpcmsg('system.methodHelp'); $m2 = new xmlrpcmsg('system.methodSignature'); $val = new xmlrpcval($mname->scalarval(), "string"); $m1->addParam($val); $m2->addParam($val); // send multiple messages in one pass.

			// If server does not support multicall, client will fall back to 2 separate calls

			$ms = array($m1, $m2); $rs = & $c->send($ms); if ($rs[0]->faultCode()) {

				display_error($rs[0]); } else {

				$val = $rs[0]->value(); $txt = $val->scalarval(); if ($txt != "") {

					print "<h4>Documentation</h4><p>${txt}</p>\n"; } else {

					print "<p>No documentation available.</p>\n"; }

			}



			if ($rs[1]->faultCode()) {

				display_error($rs[1]); } else {

				print "<h4>Signature</h4><p>\n"; $val = $rs[1]->value(); if ($val->kindOf() == "array") {

					for ($j = 0; $j<$val->arraysize(); $j++) {

						$x = $val->arraymem($j); $ret = $x->arraymem(0); print "<code>".$ret->scalarval()." ".$mname->scalarval()."("; if ($x->arraysize()>1) {

							for ($k = 1; $k<$x->arraysize(); $k++) {

								$y = $x->arraymem($k); print $y->scalarval(); if ($k<$x->arraysize()-1) {

									print ", "; }

							}

						}

						print ")</code><br/>\n"; }

				} else {

					print "Signature unknown\n"; }

				print "</p>\n"; }

		}

	}

?>

</body>

</html>

3 3
\ No newline at end of file
Please login to merge, or discard this patch.
Braces   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,1 +1,1 @@
 block discarded – undo
1
-<html>

<head><title>xmlrpc</title></head>

<body>

<h1>Introspect demo</h1>

<h2>Query server for available methods and their description</h2>

<h3>The code demonstrates usage of multicall and introspection methods</h3>

<?php

	include("xmlrpc.inc");



	function display_error($r)

	{

		print "An error occurred: ";

		print "Code: " . $r->faultCode()

			. " Reason: '" .$r->faultString()."'<br/>";

	}



	// 'new style' client constuctor

	$c = new xmlrpc_client("http://phpxmlrpc.sourceforge.net/server.php");

	print "<h3>methods available at http://" . $c->server . $c->path .  "</h3>\n";



	$m = new xmlrpcmsg('system.listMethods');

	$r =& $c->send($m);

	if($r->faultCode())

	{

		display_error($r);

	}

	else

	{

		$v=$r->value();

		for($i=0; $i<$v->arraysize(); $i++)

		{

			$mname=$v->arraymem($i);

			print "<h4>" . $mname->scalarval() . "</h4>\n";



			// build messages first, add params later

			$m1  = new xmlrpcmsg('system.methodHelp');

			$m2  = new xmlrpcmsg('system.methodSignature');

			$val = new xmlrpcval($mname->scalarval(), "string");

			$m1->addParam($val);

			$m2->addParam($val);



			// send multiple messages in one pass.

			// If server does not support multicall, client will fall back to 2 separate calls

			$ms = array($m1, $m2);

			$rs =& $c->send($ms);



			if($rs[0]->faultCode())

			{

				display_error($rs[0]);

			}

			else

			{

				$val=$rs[0]->value();

				$txt=$val->scalarval();

				if($txt != "")

				{

					print "<h4>Documentation</h4><p>${txt}</p>\n";

				}

				else

				{

					print "<p>No documentation available.</p>\n";

				}

			}



			if($rs[1]->faultCode())

			{

				display_error($rs[1]);

			}

			else

			{

				print "<h4>Signature</h4><p>\n";

				$val = $rs[1]->value();

				if($val->kindOf()=="array")

				{

					for($j=0; $j<$val->arraysize(); $j++)

					{

						$x = $val->arraymem($j);

						$ret = $x->arraymem(0);

						print "<code>" . $ret->scalarval() . " "

							. $mname->scalarval() . "(";

						if($x->arraysize()>1)

						{

							for($k=1; $k<$x->arraysize(); $k++)

							{

								$y = $x->arraymem($k);

								print $y->scalarval();

								if($k < $x->arraysize()-1)

								{

									print ", ";

								}

							}

						}

						print ")</code><br/>\n";

					}

				}

				else

				{

					print "Signature unknown\n";

				}

				print "</p>\n";

			}

		}

	}

?>

</body>

</html>

2 1
\ No newline at end of file
2
+<html>

<head><title>xmlrpc</title></head>

<body>

<h1>Introspect demo</h1>

<h2>Query server for available methods and their description</h2>

<h3>The code demonstrates usage of multicall and introspection methods</h3>

<?php

	include("xmlrpc.inc");



	function display_error($r)

	{

		print "An error occurred: ";

		print "Code: " . $r->faultCode()

			. " Reason: '" .$r->faultString()."'<br/>";

	}



	// 'new style' client constuctor

	$c = new xmlrpc_client("http://phpxmlrpc.sourceforge.net/server.php");

	print "<h3>methods available at http://" . $c->server . $c->path .  "</h3>\n";



	$m = new xmlrpcmsg('system.listMethods');

	$r =& $c->send($m);

	if($r->faultCode())

	{

		display_error($r);

	} else

	{

		$v=$r->value();

		for($i=0; $i<$v->arraysize(); $i++)

		{

			$mname=$v->arraymem($i);

			print "<h4>" . $mname->scalarval() . "</h4>\n";



			// build messages first, add params later

			$m1  = new xmlrpcmsg('system.methodHelp');

			$m2  = new xmlrpcmsg('system.methodSignature');

			$val = new xmlrpcval($mname->scalarval(), "string");

			$m1->addParam($val);

			$m2->addParam($val);



			// send multiple messages in one pass.

			// If server does not support multicall, client will fall back to 2 separate calls

			$ms = array($m1, $m2);

			$rs =& $c->send($ms);



			if($rs[0]->faultCode())

			{

				display_error($rs[0]);

			} else

			{

				$val=$rs[0]->value();

				$txt=$val->scalarval();

				if($txt != "")

				{

					print "<h4>Documentation</h4><p>${txt}</p>\n";

				} else

				{

					print "<p>No documentation available.</p>\n";

				}

			}



			if($rs[1]->faultCode())

			{

				display_error($rs[1]);

			} else

			{

				print "<h4>Signature</h4><p>\n";

				$val = $rs[1]->value();

				if($val->kindOf()=="array")

				{

					for($j=0; $j<$val->arraysize(); $j++)

					{

						$x = $val->arraymem($j);

						$ret = $x->arraymem(0);

						print "<code>" . $ret->scalarval() . " "

							. $mname->scalarval() . "(";

						if($x->arraysize()>1)

						{

							for($k=1; $k<$x->arraysize(); $k++)

							{

								$y = $x->arraymem($k);

								print $y->scalarval();

								if($k < $x->arraysize()-1)

								{

									print ", ";

								}

							}

						}

						print ")</code><br/>\n";

					}

				} else

				{

					print "Signature unknown\n";

				}

				print "</p>\n";

			}

		}

	}

?>

</body>

</html>

3 3
\ No newline at end of file
Please login to merge, or discard this patch.
demo/client/which.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,1 +1,1 @@
 block discarded – undo
1
-<html>

<head><title>xmlrpc</title></head>

<body>

<h1>Which toolkit demo</h1>

<h2>Query server for toolkit information</h2>

<h3>The code demonstrates usage of the php_xmlrpc_decode function</h3>

<?php

	include("xmlrpc.inc");



	$f = new xmlrpcmsg('interopEchoTests.whichToolkit', array());

	$c = new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80);

	$r = $c->send($f);

	if(!$r->faultCode())

	{

		$v = php_xmlrpc_decode($r->value());

		print "<pre>";

		print "name: " . htmlspecialchars($v["toolkitName"]) . "\n";

		print "version: " . htmlspecialchars($v["toolkitVersion"]) . "\n";

		print "docs: " . htmlspecialchars($v["toolkitDocsUrl"]) . "\n";

		print "os: " . htmlspecialchars($v["toolkitOperatingSystem"]) . "\n";

		print "</pre>";

	}

	else

	{

		print "An error occurred: ";

		print "Code: " . htmlspecialchars($r->faultCode()) . " Reason: '" . htmlspecialchars($r->faultString()) . "'\n";

	}

?>

</body>

</html>

2 1
\ No newline at end of file
2
+<html>

<head><title>xmlrpc</title></head>

<body>

<h1>Which toolkit demo</h1>

<h2>Query server for toolkit information</h2>

<h3>The code demonstrates usage of the php_xmlrpc_decode function</h3>

<?php

	include("xmlrpc.inc"); $f = new xmlrpcmsg('interopEchoTests.whichToolkit', array()); $c = new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80); $r = $c->send($f); if (!$r->faultCode()) {

		$v = php_xmlrpc_decode($r->value()); print "<pre>"; print "name: ".htmlspecialchars($v["toolkitName"])."\n"; print "version: ".htmlspecialchars($v["toolkitVersion"])."\n"; print "docs: ".htmlspecialchars($v["toolkitDocsUrl"])."\n"; print "os: ".htmlspecialchars($v["toolkitOperatingSystem"])."\n"; print "</pre>"; } else {

		print "An error occurred: "; print "Code: ".htmlspecialchars($r->faultCode())." Reason: '".htmlspecialchars($r->faultString())."'\n"; }

?>

</body>

</html>

3 3
\ No newline at end of file
Please login to merge, or discard this patch.
Braces   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,1 +1,1 @@
 block discarded – undo
1
-<html>

<head><title>xmlrpc</title></head>

<body>

<h1>Which toolkit demo</h1>

<h2>Query server for toolkit information</h2>

<h3>The code demonstrates usage of the php_xmlrpc_decode function</h3>

<?php

	include("xmlrpc.inc");



	$f = new xmlrpcmsg('interopEchoTests.whichToolkit', array());

	$c = new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80);

	$r = $c->send($f);

	if(!$r->faultCode())

	{

		$v = php_xmlrpc_decode($r->value());

		print "<pre>";

		print "name: " . htmlspecialchars($v["toolkitName"]) . "\n";

		print "version: " . htmlspecialchars($v["toolkitVersion"]) . "\n";

		print "docs: " . htmlspecialchars($v["toolkitDocsUrl"]) . "\n";

		print "os: " . htmlspecialchars($v["toolkitOperatingSystem"]) . "\n";

		print "</pre>";

	}

	else

	{

		print "An error occurred: ";

		print "Code: " . htmlspecialchars($r->faultCode()) . " Reason: '" . htmlspecialchars($r->faultString()) . "'\n";

	}

?>

</body>

</html>

2 1
\ No newline at end of file
2
+<html>

<head><title>xmlrpc</title></head>

<body>

<h1>Which toolkit demo</h1>

<h2>Query server for toolkit information</h2>

<h3>The code demonstrates usage of the php_xmlrpc_decode function</h3>

<?php

	include("xmlrpc.inc");



	$f = new xmlrpcmsg('interopEchoTests.whichToolkit', array());

	$c = new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80);

	$r = $c->send($f);

	if(!$r->faultCode())

	{

		$v = php_xmlrpc_decode($r->value());

		print "<pre>";

		print "name: " . htmlspecialchars($v["toolkitName"]) . "\n";

		print "version: " . htmlspecialchars($v["toolkitVersion"]) . "\n";

		print "docs: " . htmlspecialchars($v["toolkitDocsUrl"]) . "\n";

		print "os: " . htmlspecialchars($v["toolkitOperatingSystem"]) . "\n";

		print "</pre>";

	} else

	{

		print "An error occurred: ";

		print "Code: " . htmlspecialchars($r->faultCode()) . " Reason: '" . htmlspecialchars($r->faultString()) . "'\n";

	}

?>

</body>

</html>

3 3
\ No newline at end of file
Please login to merge, or discard this patch.
doc/highlight.php 2 patches
Indentation   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -8,29 +8,29 @@  discard block
 block discarded – undo
8 8
 
9 9
 function highlight($file)
10 10
 {
11
-  $starttag = '<pre class="programlisting">';
12
-  $endtag = '</pre>';
11
+    $starttag = '<pre class="programlisting">';
12
+    $endtag = '</pre>';
13 13
 
14
-  $content = file_get_contents($file);
15
-  $last = 0;
16
-  $out = '';
17
-  while(($start = strpos($content, $starttag, $last)) !== false)
18
-  {
14
+    $content = file_get_contents($file);
15
+    $last = 0;
16
+    $out = '';
17
+    while(($start = strpos($content, $starttag, $last)) !== false)
18
+    {
19 19
     $end = strpos($content, $endtag, $start);
20
-	$code = substr($content, $start+strlen($starttag), $end-$start-strlen($starttag));
21
-	if ($code[strlen($code)-1] == "\n") {
22
-		$code = substr($code, 0, -1);
23
-	}
20
+    $code = substr($content, $start+strlen($starttag), $end-$start-strlen($starttag));
21
+    if ($code[strlen($code)-1] == "\n") {
22
+        $code = substr($code, 0, -1);
23
+    }
24 24
 //var_dump($code);
25
-	$code = str_replace(array('&gt;', '&lt;'), array('>', '<'), $code);
25
+    $code = str_replace(array('&gt;', '&lt;'), array('>', '<'), $code);
26 26
     $code = highlight_string('<?php '.$code, true);
27 27
     $code = str_replace('<span style="color: #0000BB">&lt;?php&nbsp;<br />', '<span style="color: #0000BB">', $code);
28 28
 //echo($code);
29 29
     $out = $out . substr($content, $last, $start+strlen($starttag)-$last) . $code . $endtag;
30 30
     $last = $end+strlen($endtag);
31
-  }
32
-  $out .= substr($content, $last, strlen($content));
33
-  return $out;
31
+    }
32
+    $out .= substr($content, $last, strlen($content));
33
+    return $out;
34 34
 }
35 35
 
36 36
 $dir = $argv[1];
@@ -38,11 +38,11 @@  discard block
 block discarded – undo
38 38
 $files = scandir($dir);
39 39
 foreach($files as $file)
40 40
 {
41
-	if (substr($file, -5, 5) == '.html')
42
-	{
43
-		$out = highlight($dir.'/'.$file);
44
-		file_put_contents($dir.'/'.$file, $out);
45
-	}
41
+    if (substr($file, -5, 5) == '.html')
42
+    {
43
+        $out = highlight($dir.'/'.$file);
44
+        file_put_contents($dir.'/'.$file, $out);
45
+    }
46 46
 }
47 47
 
48 48
 ?>
49 49
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -14,7 +14,7 @@  discard block
 block discarded – undo
14 14
   $content = file_get_contents($file);
15 15
   $last = 0;
16 16
   $out = '';
17
-  while(($start = strpos($content, $starttag, $last)) !== false)
17
+  while (($start = strpos($content, $starttag, $last)) !== false)
18 18
   {
19 19
     $end = strpos($content, $endtag, $start);
20 20
 	$code = substr($content, $start+strlen($starttag), $end-$start-strlen($starttag));
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
     $code = highlight_string('<?php '.$code, true);
27 27
     $code = str_replace('<span style="color: #0000BB">&lt;?php&nbsp;<br />', '<span style="color: #0000BB">', $code);
28 28
 //echo($code);
29
-    $out = $out . substr($content, $last, $start+strlen($starttag)-$last) . $code . $endtag;
29
+    $out = $out.substr($content, $last, $start+strlen($starttag)-$last).$code.$endtag;
30 30
     $last = $end+strlen($endtag);
31 31
   }
32 32
   $out .= substr($content, $last, strlen($content));
@@ -36,7 +36,7 @@  discard block
 block discarded – undo
36 36
 $dir = $argv[1];
37 37
 
38 38
 $files = scandir($dir);
39
-foreach($files as $file)
39
+foreach ($files as $file)
40 40
 {
41 41
 	if (substr($file, -5, 5) == '.html')
42 42
 	{
Please login to merge, or discard this patch.
lib/xmlrpc_wrappers.inc 3 patches
Indentation   +917 added lines, -917 removed lines patch added patch discarded remove patch
@@ -14,921 +14,921 @@
 block discarded – undo
14 14
  * @todo implement self-parsing of php code for PHP <= 4
15 15
  */
16 16
 
17
-	// requires: xmlrpc.inc
18
-
19
-	/**
20
-	* Given a string defining a php type or phpxmlrpc type (loosely defined: strings
21
-	* accepted come from javadoc blocks), return corresponding phpxmlrpc type.
22
-	* NB: for php 'resource' types returns empty string, since resources cannot be serialized;
23
-	* for php class names returns 'struct', since php objects can be serialized as xmlrpc structs
24
-	* for php arrays always return array, even though arrays sometiles serialize as json structs
25
-	* @param string $phptype
26
-	* @return string
27
-	*/
28
-	function php_2_xmlrpc_type($phptype)
29
-	{
30
-		switch(strtolower($phptype))
31
-		{
32
-			case 'string':
33
-				return $GLOBALS['xmlrpcString'];
34
-			case 'integer':
35
-			case $GLOBALS['xmlrpcInt']: // 'int'
36
-			case $GLOBALS['xmlrpcI4']:
37
-				return $GLOBALS['xmlrpcInt'];
38
-			case 'double':
39
-				return $GLOBALS['xmlrpcDouble'];
40
-			case 'boolean':
41
-				return $GLOBALS['xmlrpcBoolean'];
42
-			case 'array':
43
-				return $GLOBALS['xmlrpcArray'];
44
-			case 'object':
45
-				return $GLOBALS['xmlrpcStruct'];
46
-			case $GLOBALS['xmlrpcBase64']:
47
-			case $GLOBALS['xmlrpcStruct']:
48
-				return strtolower($phptype);
49
-			case 'resource':
50
-				return '';
51
-			default:
52
-				if(class_exists($phptype))
53
-				{
54
-					return $GLOBALS['xmlrpcStruct'];
55
-				}
56
-				else
57
-				{
58
-					// unknown: might be any 'extended' xmlrpc type
59
-					return $GLOBALS['xmlrpcValue'];
60
-				}
61
-		}
62
-	}
63
-
64
-	/**
65
-	* Given a string defining a phpxmlrpc type return corresponding php type.
66
-	* @param string $xmlrpctype
67
-	* @return string
68
-	*/
69
-	function xmlrpc_2_php_type($xmlrpctype)
70
-	{
71
-		switch(strtolower($xmlrpctype))
72
-		{
73
-			case 'base64':
74
-			case 'datetime.iso8601':
75
-			case 'string':
76
-				return $GLOBALS['xmlrpcString'];
77
-			case 'int':
78
-			case 'i4':
79
-				return 'integer';
80
-			case 'struct':
81
-			case 'array':
82
-				return 'array';
83
-			case 'double':
84
-				return 'float';
85
-			case 'undefined':
86
-				return 'mixed';
87
-			case 'boolean':
88
-			case 'null':
89
-			default:
90
-				// unknown: might be any xmlrpc type
91
-				return strtolower($xmlrpctype);
92
-		}
93
-	}
94
-
95
-	/**
96
-	* Given a user-defined PHP function, create a PHP 'wrapper' function that can
97
-	* be exposed as xmlrpc method from an xmlrpc_server object and called from remote
98
-	* clients (as well as its corresponding signature info).
99
-	*
100
-	* Since php is a typeless language, to infer types of input and output parameters,
101
-	* it relies on parsing the javadoc-style comment block associated with the given
102
-	* function. Usage of xmlrpc native types (such as datetime.dateTime.iso8601 and base64)
103
-	* in the @param tag is also allowed, if you need the php function to receive/send
104
-	* data in that particular format (note that base64 encoding/decoding is transparently
105
-	* carried out by the lib, while datetime vals are passed around as strings)
106
-	*
107
-	* Known limitations:
108
-	* - only works for user-defined functions, not for PHP internal functions
109
-	*   (reflection does not support retrieving number/type of params for those)
110
-	* - functions returning php objects will generate special xmlrpc responses:
111
-	*   when the xmlrpc decoding of those responses is carried out by this same lib, using
112
-	*   the appropriate param in php_xmlrpc_decode, the php objects will be rebuilt.
113
-	*   In short: php objects can be serialized, too (except for their resource members),
114
-	*   using this function.
115
-	*   Other libs might choke on the very same xml that will be generated in this case
116
-	*   (i.e. it has a nonstandard attribute on struct element tags)
117
-	* - usage of javadoc @param tags using param names in a different order from the
118
-	*   function prototype is not considered valid (to be fixed?)
119
-	*
120
-	* Note that since rel. 2.0RC3 the preferred method to have the server call 'standard'
121
-	* php functions (ie. functions not expecting a single xmlrpcmsg obj as parameter)
122
-	* is by making use of the functions_parameters_type class member.
123
-	*
124
-	* @param string $funcname the name of the PHP user function to be exposed as xmlrpc method; array($obj, 'methodname') and array('class', 'methodname') are ok too
125
-	* @param string $newfuncname (optional) name for function to be created
126
-	* @param array $extra_options (optional) array of options for conversion. valid values include:
127
-	*        bool  return_source when true, php code w. function definition will be returned, not evaluated
128
-	*        bool  encode_php_objs let php objects be sent to server using the 'improved' xmlrpc notation, so server can deserialize them as php objects
129
-	*        bool  decode_php_objs --- WARNING !!! possible security hazard. only use it with trusted servers ---
130
-	*        bool  suppress_warnings  remove from produced xml any runtime warnings due to the php function being invoked
131
-	* @return false on error, or an array containing the name of the new php function,
132
-	*         its signature and docs, to be used in the server dispatch map
133
-	*
134
-	* @todo decide how to deal with params passed by ref: bomb out or allow?
135
-	* @todo finish using javadoc info to build method sig if all params are named but out of order
136
-	* @todo add a check for params of 'resource' type
137
-	* @todo add some trigger_errors / error_log when returning false?
138
-	* @todo what to do when the PHP function returns NULL? we are currently returning an empty string value...
139
-	* @todo add an option to suppress php warnings in invocation of user function, similar to server debug level 3?
140
-	* @todo if $newfuncname is empty, we could use create_user_func instead of eval, as it is possibly faster
141
-	* @todo add a verbatim_object_copy parameter to allow avoiding the same obj instance?
142
-	*/
143
-	function wrap_php_function($funcname, $newfuncname='', $extra_options=array())
144
-	{
145
-		$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
146
-		$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
147
-		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
148
-		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
149
-		$catch_warnings = isset($extra_options['suppress_warnings']) && $extra_options['suppress_warnings'] ? '@' : '';
150
-
151
-		$exists = false;
152
-		if (is_string($funcname) && strpos($funcname, '::') !== false)
153
-		{
154
-			$funcname = explode('::', $funcname);
155
-		}
156
-		if(is_array($funcname))
157
-		{
158
-			if(count($funcname) < 2 || (!is_string($funcname[0]) && !is_object($funcname[0])))
159
-			{
160
-				error_log('XML-RPC: syntax for function to be wrapped is wrong');
161
-				return false;
162
-			}
163
-			if(is_string($funcname[0]))
164
-			{
165
-				$plainfuncname = implode('::', $funcname);
166
-			}
167
-			elseif(is_object($funcname[0]))
168
-			{
169
-				$plainfuncname = get_class($funcname[0]) . '->' . $funcname[1];
170
-			}
171
-			$exists = method_exists($funcname[0], $funcname[1]);
172
-		}
173
-		else
174
-		{
175
-			$plainfuncname = $funcname;
176
-			$exists = function_exists($funcname);
177
-		}
178
-
179
-		if(!$exists)
180
-		{
181
-			error_log('XML-RPC: function to be wrapped is not defined: '.$plainfuncname);
182
-			return false;
183
-		}
184
-		else
185
-		{
186
-			// determine name of new php function
187
-			if($newfuncname == '')
188
-			{
189
-				if(is_array($funcname))
190
-				{
191
-					if(is_string($funcname[0]))
192
-						$xmlrpcfuncname = "{$prefix}_".implode('_', $funcname);
193
-					else
194
-						$xmlrpcfuncname = "{$prefix}_".get_class($funcname[0]) . '_' . $funcname[1];
195
-				}
196
-				else
197
-				{
198
-					$xmlrpcfuncname = "{$prefix}_$funcname";
199
-				}
200
-			}
201
-			else
202
-			{
203
-				$xmlrpcfuncname = $newfuncname;
204
-			}
205
-			while($buildit && function_exists($xmlrpcfuncname))
206
-			{
207
-				$xmlrpcfuncname .= 'x';
208
-			}
209
-
210
-			// start to introspect PHP code
211
-			if(is_array($funcname))
212
-			{
213
-				$func = new ReflectionMethod($funcname[0], $funcname[1]);
214
-				if($func->isPrivate())
215
-				{
216
-					error_log('XML-RPC: method to be wrapped is private: '.$plainfuncname);
217
-					return false;
218
-				}
219
-				if($func->isProtected())
220
-				{
221
-					error_log('XML-RPC: method to be wrapped is protected: '.$plainfuncname);
222
-					return false;
223
-				}
224
-	 			if($func->isConstructor())
225
-				{
226
-					error_log('XML-RPC: method to be wrapped is the constructor: '.$plainfuncname);
227
-					return false;
228
-				}
229
-				if($func->isDestructor())
230
-				{
231
-					error_log('XML-RPC: method to be wrapped is the destructor: '.$plainfuncname);
232
-					return false;
233
-				}
234
-				if($func->isAbstract())
235
-				{
236
-					error_log('XML-RPC: method to be wrapped is abstract: '.$plainfuncname);
237
-					return false;
238
-				}
239
-				/// @todo add more checks for static vs. nonstatic?
240
-			}
241
-			else
242
-			{
243
-				$func = new ReflectionFunction($funcname);
244
-			}
245
-			if($func->isInternal())
246
-			{
247
-				// Note: from PHP 5.1.0 onward, we will possibly be able to use invokeargs
248
-				// instead of getparameters to fully reflect internal php functions ?
249
-				error_log('XML-RPC: function to be wrapped is internal: '.$plainfuncname);
250
-				return false;
251
-			}
252
-
253
-			// retrieve parameter names, types and description from javadoc comments
254
-
255
-			// function description
256
-			$desc = '';
257
-			// type of return val: by default 'any'
258
-			$returns = $GLOBALS['xmlrpcValue'];
259
-			// desc of return val
260
-			$returnsDocs = '';
261
-			// type + name of function parameters
262
-			$paramDocs = array();
263
-
264
-			$docs = $func->getDocComment();
265
-			if($docs != '')
266
-			{
267
-				$docs = explode("\n", $docs);
268
-				$i = 0;
269
-				foreach($docs as $doc)
270
-				{
271
-					$doc = trim($doc, " \r\t/*");
272
-					if(strlen($doc) && strpos($doc, '@') !== 0 && !$i)
273
-					{
274
-						if($desc)
275
-						{
276
-							$desc .= "\n";
277
-						}
278
-						$desc .= $doc;
279
-					}
280
-					elseif(strpos($doc, '@param') === 0)
281
-					{
282
-						// syntax: @param type [$name] desc
283
-						if(preg_match('/@param\s+(\S+)(\s+\$\S+)?\s+(.+)/', $doc, $matches))
284
-						{
285
-							if(strpos($matches[1], '|'))
286
-							{
287
-								//$paramDocs[$i]['type'] = explode('|', $matches[1]);
288
-								$paramDocs[$i]['type'] = 'mixed';
289
-							}
290
-							else
291
-							{
292
-								$paramDocs[$i]['type'] = $matches[1];
293
-							}
294
-							$paramDocs[$i]['name'] = trim($matches[2]);
295
-							$paramDocs[$i]['doc'] = $matches[3];
296
-						}
297
-						$i++;
298
-					}
299
-					elseif(strpos($doc, '@return') === 0)
300
-					{
301
-						// syntax: @return type desc
302
-						//$returns = preg_split('/\s+/', $doc);
303
-						if(preg_match('/@return\s+(\S+)\s+(.+)/', $doc, $matches))
304
-						{
305
-							$returns = php_2_xmlrpc_type($matches[1]);
306
-							if(isset($matches[2]))
307
-							{
308
-								$returnsDocs = $matches[2];
309
-							}
310
-						}
311
-					}
312
-				}
313
-			}
314
-
315
-			// execute introspection of actual function prototype
316
-			$params = array();
317
-			$i = 0;
318
-			foreach($func->getParameters() as $paramobj)
319
-			{
320
-				$params[$i] = array();
321
-				$params[$i]['name'] = '$'.$paramobj->getName();
322
-				$params[$i]['isoptional'] = $paramobj->isOptional();
323
-				$i++;
324
-			}
325
-
326
-
327
-			// start  building of PHP code to be eval'd
328
-			$innercode = '';
329
-			$i = 0;
330
-			$parsvariations = array();
331
-			$pars = array();
332
-			$pnum = count($params);
333
-			foreach($params as $param)
334
-			{
335
-				if (isset($paramDocs[$i]['name']) && $paramDocs[$i]['name'] && strtolower($paramDocs[$i]['name']) != strtolower($param['name']))
336
-				{
337
-					// param name from phpdoc info does not match param definition!
338
-					$paramDocs[$i]['type'] = 'mixed';
339
-				}
340
-
341
-				if($param['isoptional'])
342
-				{
343
-					// this particular parameter is optional. save as valid previous list of parameters
344
-					$innercode .= "if (\$paramcount > $i) {\n";
345
-					$parsvariations[] = $pars;
346
-				}
347
-				$innercode .= "\$p$i = \$msg->getParam($i);\n";
348
-				if ($decode_php_objects)
349
-				{
350
-					$innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i, array('decode_php_objs'));\n";
351
-				}
352
-				else
353
-				{
354
-					$innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i);\n";
355
-				}
356
-
357
-				$pars[] = "\$p$i";
358
-				$i++;
359
-				if($param['isoptional'])
360
-				{
361
-					$innercode .= "}\n";
362
-				}
363
-				if($i == $pnum)
364
-				{
365
-					// last allowed parameters combination
366
-					$parsvariations[] = $pars;
367
-				}
368
-			}
369
-
370
-			$sigs = array();
371
-			$psigs = array();
372
-			if(count($parsvariations) == 0)
373
-			{
374
-				// only known good synopsis = no parameters
375
-				$parsvariations[] = array();
376
-				$minpars = 0;
377
-			}
378
-			else
379
-			{
380
-				$minpars = count($parsvariations[0]);
381
-			}
382
-
383
-			if($minpars)
384
-			{
385
-				// add to code the check for min params number
386
-				// NB: this check needs to be done BEFORE decoding param values
387
-				$innercode = "\$paramcount = \$msg->getNumParams();\n" .
388
-				"if (\$paramcount < $minpars) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}');\n" . $innercode;
389
-			}
390
-			else
391
-			{
392
-				$innercode = "\$paramcount = \$msg->getNumParams();\n" . $innercode;
393
-			}
394
-
395
-			$innercode .= "\$np = false;\n";
396
-			// since there are no closures in php, if we are given an object instance,
397
-			// we store a pointer to it in a global var...
398
-			if ( is_array($funcname) && is_object($funcname[0]) )
399
-			{
400
-				$GLOBALS['xmlrpcWPFObjHolder'][$xmlrpcfuncname] =& $funcname[0];
401
-				$innercode .= "\$obj =& \$GLOBALS['xmlrpcWPFObjHolder']['$xmlrpcfuncname'];\n";
402
-				$realfuncname = '$obj->'.$funcname[1];
403
-			}
404
-			else
405
-			{
406
-				$realfuncname = $plainfuncname;
407
-			}
408
-			foreach($parsvariations as $pars)
409
-			{
410
-				$innercode .= "if (\$paramcount == " . count($pars) . ") \$retval = {$catch_warnings}$realfuncname(" . implode(',', $pars) . "); else\n";
411
-				// build a 'generic' signature (only use an appropriate return type)
412
-				$sig = array($returns);
413
-				$psig = array($returnsDocs);
414
-				for($i=0; $i < count($pars); $i++)
415
-				{
416
-					if (isset($paramDocs[$i]['type']))
417
-					{
418
-						$sig[] = php_2_xmlrpc_type($paramDocs[$i]['type']);
419
-					}
420
-					else
421
-					{
422
-						$sig[] = $GLOBALS['xmlrpcValue'];
423
-					}
424
-					$psig[] = isset($paramDocs[$i]['doc']) ? $paramDocs[$i]['doc'] : '';
425
-				}
426
-				$sigs[] = $sig;
427
-				$psigs[] = $psig;
428
-			}
429
-			$innercode .= "\$np = true;\n";
430
-			$innercode .= "if (\$np) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}'); else {\n";
431
-			//$innercode .= "if (\$_xmlrpcs_error_occurred) return new xmlrpcresp(0, $GLOBALS['xmlrpcerr']user, \$_xmlrpcs_error_occurred); else\n";
432
-			$innercode .= "if (is_a(\$retval, '{$prefix}resp')) return \$retval; else\n";
433
-			if($returns == $GLOBALS['xmlrpcDateTime'] || $returns == $GLOBALS['xmlrpcBase64'])
434
-			{
435
-				$innercode .= "return new {$prefix}resp(new {$prefix}val(\$retval, '$returns'));";
436
-			}
437
-			else
438
-			{
439
-				if ($encode_php_objects)
440
-					$innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval, array('encode_php_objs')));\n";
441
-				else
442
-					$innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval));\n";
443
-			}
444
-			// shall we exclude functions returning by ref?
445
-			// if($func->returnsReference())
446
-			// 	return false;
447
-			$code = "function $xmlrpcfuncname(\$msg) {\n" . $innercode . "}\n}";
448
-			//print_r($code);
449
-			if ($buildit)
450
-			{
451
-				$allOK = 0;
452
-				eval($code.'$allOK=1;');
453
-				// alternative
454
-				//$xmlrpcfuncname = create_function('$m', $innercode);
455
-
456
-				if(!$allOK)
457
-				{
458
-					error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap php function '.$plainfuncname);
459
-					return false;
460
-				}
461
-			}
462
-
463
-			/// @todo examine if $paramDocs matches $parsvariations and build array for
464
-			/// usage as method signature, plus put together a nice string for docs
465
-
466
-			$ret = array('function' => $xmlrpcfuncname, 'signature' => $sigs, 'docstring' => $desc, 'signature_docs' => $psigs, 'source' => $code);
467
-			return $ret;
468
-		}
469
-	}
470
-
471
-	/**
472
-	* Given a user-defined PHP class or php object, map its methods onto a list of
473
-	* PHP 'wrapper' functions that can be exposed as xmlrpc methods from an xmlrpc_server
474
-	* object and called from remote clients (as well as their corresponding signature info).
475
-	*
476
-	* @param mixed $classname the name of the class whose methods are to be exposed as xmlrpc methods, or an object instance of that class
477
-	* @param array $extra_options see the docs for wrap_php_method for more options
478
-	*        string method_type 'static', 'nonstatic', 'all' and 'auto' (default); the latter will switch between static and non-static depending on wheter $classname is a class name or object instance
479
-	* @return array or false on failure
480
-	*
481
-	* @todo get_class_methods will return both static and non-static methods.
482
-	*       we have to differentiate the action, depending on whether we received a class name or object
483
-	*/
484
-	function wrap_php_class($classname, $extra_options=array())
485
-	{
486
-		$methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : '';
487
-		$methodtype = isset($extra_options['method_type']) ? $extra_options['method_type'] : 'auto';
488
-
489
-		$result = array();
490
-		$mlist = get_class_methods($classname);
491
-		foreach($mlist as $mname)
492
-		{
493
-			if ($methodfilter == '' || preg_match($methodfilter, $mname))
494
-			{
495
-				// echo $mlist."\n";
496
-				$func = new ReflectionMethod($classname, $mname);
497
-				if(!$func->isPrivate() && !$func->isProtected() && !$func->isConstructor() && !$func->isDestructor() && !$func->isAbstract())
498
-				{
499
-					if(($func->isStatic && ($methodtype == 'all' || $methodtype == 'static' || ($methodtype == 'auto' && is_string($classname)))) ||
500
-						(!$func->isStatic && ($methodtype == 'all' || $methodtype == 'nonstatic' || ($methodtype == 'auto' && is_object($classname)))))
501
-					{
502
-						$methodwrap = wrap_php_function(array($classname, $mname), '', $extra_options);
503
-						if ( $methodwrap )
504
-						{
505
-							$result[$methodwrap['function']] = $methodwrap['function'];
506
-						}
507
-					}
508
-				}
509
-			}
510
-		}
511
-		return $result;
512
-	}
513
-
514
-	/**
515
-	* Given an xmlrpc client and a method name, register a php wrapper function
516
-	* that will call it and return results using native php types for both
517
-	* params and results. The generated php function will return an xmlrpcresp
518
-	* object for failed xmlrpc calls
519
-	*
520
-	* Known limitations:
521
-	* - server must support system.methodsignature for the wanted xmlrpc method
522
-	* - for methods that expose many signatures, only one can be picked (we
523
-	*   could in principle check if signatures differ only by number of params
524
-	*   and not by type, but it would be more complication than we can spare time)
525
-	* - nested xmlrpc params: the caller of the generated php function has to
526
-	*   encode on its own the params passed to the php function if these are structs
527
-	*   or arrays whose (sub)members include values of type datetime or base64
528
-	*
529
-	* Notes: the connection properties of the given client will be copied
530
-	* and reused for the connection used during the call to the generated
531
-	* php function.
532
-	* Calling the generated php function 'might' be slow: a new xmlrpc client
533
-	* is created on every invocation and an xmlrpc-connection opened+closed.
534
-	* An extra 'debug' param is appended to param list of xmlrpc method, useful
535
-	* for debugging purposes.
536
-	*
537
-	* @param xmlrpc_client $client     an xmlrpc client set up correctly to communicate with target server
538
-	* @param string        $methodname the xmlrpc method to be mapped to a php function
539
-	* @param array         $extra_options array of options that specify conversion details. valid options include
540
-	*        integer       signum      the index of the method signature to use in mapping (if method exposes many sigs)
541
-	*        integer       timeout     timeout (in secs) to be used when executing function/calling remote method
542
-	*        string        protocol    'http' (default), 'http11' or 'https'
543
-	*        string        new_function_name the name of php function to create. If unspecified, lib will pick an appropriate name
544
-	*        string        return_source if true return php code w. function definition instead fo function name
545
-	*        bool          encode_php_objs let php objects be sent to server using the 'improved' xmlrpc notation, so server can deserialize them as php objects
546
-	*        bool          decode_php_objs --- WARNING !!! possible security hazard. only use it with trusted servers ---
547
-	*        mixed         return_on_fault a php value to be returned when the xmlrpc call fails/returns a fault response (by default the xmlrpcresp object is returned in this case). If a string is used, '%faultCode%' and '%faultString%' tokens will be substituted with actual error values
548
-	*        bool          debug        set it to 1 or 2 to see debug results of querying server for method synopsis
549
-	* @return string                   the name of the generated php function (or false) - OR AN ARRAY...
550
-	*/
551
-	function wrap_xmlrpc_method($client, $methodname, $extra_options=0, $timeout=0, $protocol='', $newfuncname='')
552
-	{
553
-		// mind numbing: let caller use sane calling convention (as per javadoc, 3 params),
554
-		// OR the 2.0 calling convention (no options) - we really love backward compat, don't we?
555
-		if (!is_array($extra_options))
556
-		{
557
-			$signum = $extra_options;
558
-			$extra_options = array();
559
-		}
560
-		else
561
-		{
562
-			$signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0;
563
-			$timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0;
564
-			$protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : '';
565
-			$newfuncname = isset($extra_options['new_function_name']) ? $extra_options['new_function_name'] : '';
566
-		}
567
-		//$encode_php_objects = in_array('encode_php_objects', $extra_options);
568
-		//$verbatim_client_copy = in_array('simple_client_copy', $extra_options) ? 1 :
569
-		//	in_array('build_class_code', $extra_options) ? 2 : 0;
570
-
571
-		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
572
-		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
573
-		// it seems like the meaning of 'simple_client_copy' here is swapped wrt client_copy_mode later on...
574
-		$simple_client_copy = isset($extra_options['simple_client_copy']) ? (int)($extra_options['simple_client_copy']) : 0;
575
-		$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
576
-		$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
577
-		if (isset($extra_options['return_on_fault']))
578
-		{
579
-			$decode_fault = true;
580
-			$fault_response = $extra_options['return_on_fault'];
581
-		}
582
-		else
583
-		{
584
-			$decode_fault = false;
585
-			$fault_response = '';
586
-		}
587
-		$debug = isset($extra_options['debug']) ? ($extra_options['debug']) : 0;
588
-
589
-		$msgclass = $prefix.'msg';
590
-		$valclass = $prefix.'val';
591
-		$decodefunc = 'php_'.$prefix.'_decode';
592
-
593
-		$msg = new $msgclass('system.methodSignature');
594
-		$msg->addparam(new $valclass($methodname));
595
-		$client->setDebug($debug);
596
-		$response =& $client->send($msg, $timeout, $protocol);
597
-		if($response->faultCode())
598
-		{
599
-			error_log('XML-RPC: could not retrieve method signature from remote server for method '.$methodname);
600
-			return false;
601
-		}
602
-		else
603
-		{
604
-			$msig = $response->value();
605
-			if ($client->return_type != 'phpvals')
606
-			{
607
-				$msig = $decodefunc($msig);
608
-			}
609
-			if(!is_array($msig) || count($msig) <= $signum)
610
-			{
611
-				error_log('XML-RPC: could not retrieve method signature nr.'.$signum.' from remote server for method '.$methodname);
612
-				return false;
613
-			}
614
-			else
615
-			{
616
-				// pick a suitable name for the new function, avoiding collisions
617
-				if($newfuncname != '')
618
-				{
619
-					$xmlrpcfuncname = $newfuncname;
620
-				}
621
-				else
622
-				{
623
-					// take care to insure that methodname is translated to valid
624
-					// php function name
625
-					$xmlrpcfuncname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
626
-						array('_', ''), $methodname);
627
-				}
628
-				while($buildit && function_exists($xmlrpcfuncname))
629
-				{
630
-					$xmlrpcfuncname .= 'x';
631
-				}
632
-
633
-				$msig = $msig[$signum];
634
-				$mdesc = '';
635
-				// if in 'offline' mode, get method description too.
636
-				// in online mode, favour speed of operation
637
-				if(!$buildit)
638
-				{
639
-					$msg = new $msgclass('system.methodHelp');
640
-					$msg->addparam(new $valclass($methodname));
641
-					$response =& $client->send($msg, $timeout, $protocol);
642
-					if (!$response->faultCode())
643
-					{
644
-						$mdesc = $response->value();
645
-						if ($client->return_type != 'phpvals')
646
-						{
647
-							$mdesc = $mdesc->scalarval();
648
-						}
649
-					}
650
-				}
651
-
652
-				$results = build_remote_method_wrapper_code($client, $methodname,
653
-					$xmlrpcfuncname, $msig, $mdesc, $timeout, $protocol, $simple_client_copy,
654
-					$prefix, $decode_php_objects, $encode_php_objects, $decode_fault,
655
-					$fault_response);
656
-
657
-				//print_r($code);
658
-				if ($buildit)
659
-				{
660
-					$allOK = 0;
661
-					eval($results['source'].'$allOK=1;');
662
-					// alternative
663
-					//$xmlrpcfuncname = create_function('$m', $innercode);
664
-					if($allOK)
665
-					{
666
-						return $xmlrpcfuncname;
667
-					}
668
-					else
669
-					{
670
-						error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap remote method '.$methodname);
671
-						return false;
672
-					}
673
-				}
674
-				else
675
-				{
676
-					$results['function'] = $xmlrpcfuncname;
677
-					return $results;
678
-				}
679
-			}
680
-		}
681
-	}
682
-
683
-	/**
684
-	* Similar to wrap_xmlrpc_method, but will generate a php class that wraps
685
-	* all xmlrpc methods exposed by the remote server as own methods.
686
-	* For more details see wrap_xmlrpc_method.
687
-	* @param xmlrpc_client $client the client obj all set to query the desired server
688
-	* @param array $extra_options list of options for wrapped code
689
-	* @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)
690
-	*/
691
-	function wrap_xmlrpc_server($client, $extra_options=array())
692
-	{
693
-		$methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : '';
694
-		//$signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0;
695
-		$timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0;
696
-		$protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : '';
697
-		$newclassname = isset($extra_options['new_class_name']) ? $extra_options['new_class_name'] : '';
698
-		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
699
-		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
700
-		$verbatim_client_copy = isset($extra_options['simple_client_copy']) ? !($extra_options['simple_client_copy']) : true;
701
-		$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
702
-		$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
703
-
704
-		$msgclass = $prefix.'msg';
705
-		//$valclass = $prefix.'val';
706
-		$decodefunc = 'php_'.$prefix.'_decode';
707
-
708
-		$msg = new $msgclass('system.listMethods');
709
-		$response =& $client->send($msg, $timeout, $protocol);
710
-		if($response->faultCode())
711
-		{
712
-			error_log('XML-RPC: could not retrieve method list from remote server');
713
-			return false;
714
-		}
715
-		else
716
-		{
717
-			$mlist = $response->value();
718
-			if ($client->return_type != 'phpvals')
719
-			{
720
-				$mlist = $decodefunc($mlist);
721
-			}
722
-			if(!is_array($mlist) || !count($mlist))
723
-			{
724
-				error_log('XML-RPC: could not retrieve meaningful method list from remote server');
725
-				return false;
726
-			}
727
-			else
728
-			{
729
-				// pick a suitable name for the new function, avoiding collisions
730
-				if($newclassname != '')
731
-				{
732
-					$xmlrpcclassname = $newclassname;
733
-				}
734
-				else
735
-				{
736
-					$xmlrpcclassname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
737
-						array('_', ''), $client->server).'_client';
738
-				}
739
-				while($buildit && class_exists($xmlrpcclassname))
740
-				{
741
-					$xmlrpcclassname .= 'x';
742
-				}
743
-
744
-				/// @todo add function setdebug() to new class, to enable/disable debugging
745
-				$source = "class $xmlrpcclassname\n{\nvar \$client;\n\n";
746
-				$source .= "function $xmlrpcclassname()\n{\n";
747
-				$source .= build_client_wrapper_code($client, $verbatim_client_copy, $prefix);
748
-				$source .= "\$this->client =& \$client;\n}\n\n";
749
-				$opts = array('simple_client_copy' => 2, 'return_source' => true,
750
-					'timeout' => $timeout, 'protocol' => $protocol,
751
-					'encode_php_objs' => $encode_php_objects, 'prefix' => $prefix,
752
-					'decode_php_objs' => $decode_php_objects
753
-					);
754
-				/// @todo build javadoc for class definition, too
755
-				foreach($mlist as $mname)
756
-				{
757
-					if ($methodfilter == '' || preg_match($methodfilter, $mname))
758
-					{
759
-						$opts['new_function_name'] = preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
760
-							array('_', ''), $mname);
761
-						$methodwrap = wrap_xmlrpc_method($client, $mname, $opts);
762
-						if ($methodwrap)
763
-						{
764
-							if (!$buildit)
765
-							{
766
-								$source .= $methodwrap['docstring'];
767
-							}
768
-							$source .= $methodwrap['source']."\n";
769
-						}
770
-						else
771
-						{
772
-							error_log('XML-RPC: will not create class method to wrap remote method '.$mname);
773
-						}
774
-					}
775
-				}
776
-				$source .= "}\n";
777
-				if ($buildit)
778
-				{
779
-					$allOK = 0;
780
-					eval($source.'$allOK=1;');
781
-					// alternative
782
-					//$xmlrpcfuncname = create_function('$m', $innercode);
783
-					if($allOK)
784
-					{
785
-						return $xmlrpcclassname;
786
-					}
787
-					else
788
-					{
789
-						error_log('XML-RPC: could not create class '.$xmlrpcclassname.' to wrap remote server '.$client->server);
790
-						return false;
791
-					}
792
-				}
793
-				else
794
-				{
795
-					return array('class' => $xmlrpcclassname, 'code' => $source, 'docstring' => '');
796
-				}
797
-			}
798
-		}
799
-	}
800
-
801
-	/**
802
-	* Given the necessary info, build php code that creates a new function to
803
-	* invoke a remote xmlrpc method.
804
-	* Take care that no full checking of input parameters is done to ensure that
805
-	* valid php code is emitted.
806
-	* Note: real spaghetti code follows...
807
-	* @access private
808
-	*/
809
-	function build_remote_method_wrapper_code($client, $methodname, $xmlrpcfuncname,
810
-		$msig, $mdesc='', $timeout=0, $protocol='', $client_copy_mode=0, $prefix='xmlrpc',
811
-		$decode_php_objects=false, $encode_php_objects=false, $decode_fault=false,
812
-		$fault_response='')
813
-	{
814
-		$code = "function $xmlrpcfuncname (";
815
-		if ($client_copy_mode < 2)
816
-		{
817
-			// client copy mode 0 or 1 == partial / full client copy in emitted code
818
-			$innercode = build_client_wrapper_code($client, $client_copy_mode, $prefix);
819
-			$innercode .= "\$client->setDebug(\$debug);\n";
820
-			$this_ = '';
821
-		}
822
-		else
823
-		{
824
-			// client copy mode 2 == no client copy in emitted code
825
-			$innercode = '';
826
-			$this_ = 'this->';
827
-		}
828
-		$innercode .= "\$msg = new {$prefix}msg('$methodname');\n";
829
-
830
-		if ($mdesc != '')
831
-		{
832
-			// take care that PHP comment is not terminated unwillingly by method description
833
-			$mdesc = "/**\n* ".str_replace('*/', '* /', $mdesc)."\n";
834
-		}
835
-		else
836
-		{
837
-			$mdesc = "/**\nFunction $xmlrpcfuncname\n";
838
-		}
839
-
840
-		// param parsing
841
-		$plist = array();
842
-		$pcount = count($msig);
843
-		for($i = 1; $i < $pcount; $i++)
844
-		{
845
-			$plist[] = "\$p$i";
846
-			$ptype = $msig[$i];
847
-			if($ptype == 'i4' || $ptype == 'int' || $ptype == 'boolean' || $ptype == 'double' ||
848
-				$ptype == 'string' || $ptype == 'dateTime.iso8601' || $ptype == 'base64' || $ptype == 'null')
849
-			{
850
-				// only build directly xmlrpcvals when type is known and scalar
851
-				$innercode .= "\$p$i = new {$prefix}val(\$p$i, '$ptype');\n";
852
-			}
853
-			else
854
-			{
855
-				if ($encode_php_objects)
856
-				{
857
-					$innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i, array('encode_php_objs'));\n";
858
-				}
859
-				else
860
-				{
861
-					$innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i);\n";
862
-				}
863
-			}
864
-			$innercode .= "\$msg->addparam(\$p$i);\n";
865
-			$mdesc .= '* @param '.xmlrpc_2_php_type($ptype)." \$p$i\n";
866
-		}
867
-		if ($client_copy_mode < 2)
868
-		{
869
-			$plist[] = '$debug=0';
870
-			$mdesc .= "* @param int \$debug when 1 (or 2) will enable debugging of the underlying {$prefix} call (defaults to 0)\n";
871
-		}
872
-		$plist = implode(', ', $plist);
873
-		$mdesc .= '* @return '.xmlrpc_2_php_type($msig[0])." (or an {$prefix}resp obj instance if call fails)\n*/\n";
874
-
875
-		$innercode .= "\$res =& \${$this_}client->send(\$msg, $timeout, '$protocol');\n";
876
-		if ($decode_fault)
877
-		{
878
-			if (is_string($fault_response) && ((strpos($fault_response, '%faultCode%') !== false) || (strpos($fault_response, '%faultString%') !== false)))
879
-			{
880
-				$respcode = "str_replace(array('%faultCode%', '%faultString%'), array(\$res->faultCode(), \$res->faultString()), '".str_replace("'", "''", $fault_response)."')";
881
-			}
882
-			else
883
-			{
884
-				$respcode = var_export($fault_response, true);
885
-			}
886
-		}
887
-		else
888
-		{
889
-			$respcode = '$res';
890
-		}
891
-		if ($decode_php_objects)
892
-		{
893
-			$innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value(), array('decode_php_objs'));";
894
-		}
895
-		else
896
-		{
897
-			$innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value());";
898
-		}
899
-
900
-		$code = $code . $plist. ") {\n" . $innercode . "\n}\n";
901
-
902
-		return array('source' => $code, 'docstring' => $mdesc);
903
-	}
904
-
905
-	/**
906
-	* Given necessary info, generate php code that will rebuild a client object
907
-	* Take care that no full checking of input parameters is done to ensure that
908
-	* valid php code is emitted.
909
-	* @access private
910
-	*/
911
-	function build_client_wrapper_code($client, $verbatim_client_copy, $prefix='xmlrpc')
912
-	{
913
-		$code = "\$client = new {$prefix}_client('".str_replace("'", "\'", $client->path).
914
-			"', '" . str_replace("'", "\'", $client->server) . "', $client->port);\n";
915
-
916
-		// copy all client fields to the client that will be generated runtime
917
-		// (this provides for future expansion or subclassing of client obj)
918
-		if ($verbatim_client_copy)
919
-		{
920
-			foreach($client as $fld => $val)
921
-			{
922
-				if($fld != 'debug' && $fld != 'return_type')
923
-				{
924
-					$val = var_export($val, true);
925
-					$code .= "\$client->$fld = $val;\n";
926
-				}
927
-			}
928
-		}
929
-		// only make sure that client always returns the correct data type
930
-		$code .= "\$client->return_type = '{$prefix}vals';\n";
931
-		//$code .= "\$client->setDebug(\$debug);\n";
932
-		return $code;
933
-	}
17
+    // requires: xmlrpc.inc
18
+
19
+    /**
20
+     * Given a string defining a php type or phpxmlrpc type (loosely defined: strings
21
+     * accepted come from javadoc blocks), return corresponding phpxmlrpc type.
22
+     * NB: for php 'resource' types returns empty string, since resources cannot be serialized;
23
+     * for php class names returns 'struct', since php objects can be serialized as xmlrpc structs
24
+     * for php arrays always return array, even though arrays sometiles serialize as json structs
25
+     * @param string $phptype
26
+     * @return string
27
+     */
28
+    function php_2_xmlrpc_type($phptype)
29
+    {
30
+        switch(strtolower($phptype))
31
+        {
32
+            case 'string':
33
+                return $GLOBALS['xmlrpcString'];
34
+            case 'integer':
35
+            case $GLOBALS['xmlrpcInt']: // 'int'
36
+            case $GLOBALS['xmlrpcI4']:
37
+                return $GLOBALS['xmlrpcInt'];
38
+            case 'double':
39
+                return $GLOBALS['xmlrpcDouble'];
40
+            case 'boolean':
41
+                return $GLOBALS['xmlrpcBoolean'];
42
+            case 'array':
43
+                return $GLOBALS['xmlrpcArray'];
44
+            case 'object':
45
+                return $GLOBALS['xmlrpcStruct'];
46
+            case $GLOBALS['xmlrpcBase64']:
47
+            case $GLOBALS['xmlrpcStruct']:
48
+                return strtolower($phptype);
49
+            case 'resource':
50
+                return '';
51
+            default:
52
+                if(class_exists($phptype))
53
+                {
54
+                    return $GLOBALS['xmlrpcStruct'];
55
+                }
56
+                else
57
+                {
58
+                    // unknown: might be any 'extended' xmlrpc type
59
+                    return $GLOBALS['xmlrpcValue'];
60
+                }
61
+        }
62
+    }
63
+
64
+    /**
65
+     * Given a string defining a phpxmlrpc type return corresponding php type.
66
+     * @param string $xmlrpctype
67
+     * @return string
68
+     */
69
+    function xmlrpc_2_php_type($xmlrpctype)
70
+    {
71
+        switch(strtolower($xmlrpctype))
72
+        {
73
+            case 'base64':
74
+            case 'datetime.iso8601':
75
+            case 'string':
76
+                return $GLOBALS['xmlrpcString'];
77
+            case 'int':
78
+            case 'i4':
79
+                return 'integer';
80
+            case 'struct':
81
+            case 'array':
82
+                return 'array';
83
+            case 'double':
84
+                return 'float';
85
+            case 'undefined':
86
+                return 'mixed';
87
+            case 'boolean':
88
+            case 'null':
89
+            default:
90
+                // unknown: might be any xmlrpc type
91
+                return strtolower($xmlrpctype);
92
+        }
93
+    }
94
+
95
+    /**
96
+     * Given a user-defined PHP function, create a PHP 'wrapper' function that can
97
+     * be exposed as xmlrpc method from an xmlrpc_server object and called from remote
98
+     * clients (as well as its corresponding signature info).
99
+     *
100
+     * Since php is a typeless language, to infer types of input and output parameters,
101
+     * it relies on parsing the javadoc-style comment block associated with the given
102
+     * function. Usage of xmlrpc native types (such as datetime.dateTime.iso8601 and base64)
103
+     * in the @param tag is also allowed, if you need the php function to receive/send
104
+     * data in that particular format (note that base64 encoding/decoding is transparently
105
+     * carried out by the lib, while datetime vals are passed around as strings)
106
+     *
107
+     * Known limitations:
108
+     * - only works for user-defined functions, not for PHP internal functions
109
+     *   (reflection does not support retrieving number/type of params for those)
110
+     * - functions returning php objects will generate special xmlrpc responses:
111
+     *   when the xmlrpc decoding of those responses is carried out by this same lib, using
112
+     *   the appropriate param in php_xmlrpc_decode, the php objects will be rebuilt.
113
+     *   In short: php objects can be serialized, too (except for their resource members),
114
+     *   using this function.
115
+     *   Other libs might choke on the very same xml that will be generated in this case
116
+     *   (i.e. it has a nonstandard attribute on struct element tags)
117
+     * - usage of javadoc @param tags using param names in a different order from the
118
+     *   function prototype is not considered valid (to be fixed?)
119
+     *
120
+     * Note that since rel. 2.0RC3 the preferred method to have the server call 'standard'
121
+     * php functions (ie. functions not expecting a single xmlrpcmsg obj as parameter)
122
+     * is by making use of the functions_parameters_type class member.
123
+     *
124
+     * @param string $funcname the name of the PHP user function to be exposed as xmlrpc method; array($obj, 'methodname') and array('class', 'methodname') are ok too
125
+     * @param string $newfuncname (optional) name for function to be created
126
+     * @param array $extra_options (optional) array of options for conversion. valid values include:
127
+     *        bool  return_source when true, php code w. function definition will be returned, not evaluated
128
+     *        bool  encode_php_objs let php objects be sent to server using the 'improved' xmlrpc notation, so server can deserialize them as php objects
129
+     *        bool  decode_php_objs --- WARNING !!! possible security hazard. only use it with trusted servers ---
130
+     *        bool  suppress_warnings  remove from produced xml any runtime warnings due to the php function being invoked
131
+     * @return false on error, or an array containing the name of the new php function,
132
+     *         its signature and docs, to be used in the server dispatch map
133
+     *
134
+     * @todo decide how to deal with params passed by ref: bomb out or allow?
135
+     * @todo finish using javadoc info to build method sig if all params are named but out of order
136
+     * @todo add a check for params of 'resource' type
137
+     * @todo add some trigger_errors / error_log when returning false?
138
+     * @todo what to do when the PHP function returns NULL? we are currently returning an empty string value...
139
+     * @todo add an option to suppress php warnings in invocation of user function, similar to server debug level 3?
140
+     * @todo if $newfuncname is empty, we could use create_user_func instead of eval, as it is possibly faster
141
+     * @todo add a verbatim_object_copy parameter to allow avoiding the same obj instance?
142
+     */
143
+    function wrap_php_function($funcname, $newfuncname='', $extra_options=array())
144
+    {
145
+        $buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
146
+        $prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
147
+        $encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
148
+        $decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
149
+        $catch_warnings = isset($extra_options['suppress_warnings']) && $extra_options['suppress_warnings'] ? '@' : '';
150
+
151
+        $exists = false;
152
+        if (is_string($funcname) && strpos($funcname, '::') !== false)
153
+        {
154
+            $funcname = explode('::', $funcname);
155
+        }
156
+        if(is_array($funcname))
157
+        {
158
+            if(count($funcname) < 2 || (!is_string($funcname[0]) && !is_object($funcname[0])))
159
+            {
160
+                error_log('XML-RPC: syntax for function to be wrapped is wrong');
161
+                return false;
162
+            }
163
+            if(is_string($funcname[0]))
164
+            {
165
+                $plainfuncname = implode('::', $funcname);
166
+            }
167
+            elseif(is_object($funcname[0]))
168
+            {
169
+                $plainfuncname = get_class($funcname[0]) . '->' . $funcname[1];
170
+            }
171
+            $exists = method_exists($funcname[0], $funcname[1]);
172
+        }
173
+        else
174
+        {
175
+            $plainfuncname = $funcname;
176
+            $exists = function_exists($funcname);
177
+        }
178
+
179
+        if(!$exists)
180
+        {
181
+            error_log('XML-RPC: function to be wrapped is not defined: '.$plainfuncname);
182
+            return false;
183
+        }
184
+        else
185
+        {
186
+            // determine name of new php function
187
+            if($newfuncname == '')
188
+            {
189
+                if(is_array($funcname))
190
+                {
191
+                    if(is_string($funcname[0]))
192
+                        $xmlrpcfuncname = "{$prefix}_".implode('_', $funcname);
193
+                    else
194
+                        $xmlrpcfuncname = "{$prefix}_".get_class($funcname[0]) . '_' . $funcname[1];
195
+                }
196
+                else
197
+                {
198
+                    $xmlrpcfuncname = "{$prefix}_$funcname";
199
+                }
200
+            }
201
+            else
202
+            {
203
+                $xmlrpcfuncname = $newfuncname;
204
+            }
205
+            while($buildit && function_exists($xmlrpcfuncname))
206
+            {
207
+                $xmlrpcfuncname .= 'x';
208
+            }
209
+
210
+            // start to introspect PHP code
211
+            if(is_array($funcname))
212
+            {
213
+                $func = new ReflectionMethod($funcname[0], $funcname[1]);
214
+                if($func->isPrivate())
215
+                {
216
+                    error_log('XML-RPC: method to be wrapped is private: '.$plainfuncname);
217
+                    return false;
218
+                }
219
+                if($func->isProtected())
220
+                {
221
+                    error_log('XML-RPC: method to be wrapped is protected: '.$plainfuncname);
222
+                    return false;
223
+                }
224
+                    if($func->isConstructor())
225
+                {
226
+                    error_log('XML-RPC: method to be wrapped is the constructor: '.$plainfuncname);
227
+                    return false;
228
+                }
229
+                if($func->isDestructor())
230
+                {
231
+                    error_log('XML-RPC: method to be wrapped is the destructor: '.$plainfuncname);
232
+                    return false;
233
+                }
234
+                if($func->isAbstract())
235
+                {
236
+                    error_log('XML-RPC: method to be wrapped is abstract: '.$plainfuncname);
237
+                    return false;
238
+                }
239
+                /// @todo add more checks for static vs. nonstatic?
240
+            }
241
+            else
242
+            {
243
+                $func = new ReflectionFunction($funcname);
244
+            }
245
+            if($func->isInternal())
246
+            {
247
+                // Note: from PHP 5.1.0 onward, we will possibly be able to use invokeargs
248
+                // instead of getparameters to fully reflect internal php functions ?
249
+                error_log('XML-RPC: function to be wrapped is internal: '.$plainfuncname);
250
+                return false;
251
+            }
252
+
253
+            // retrieve parameter names, types and description from javadoc comments
254
+
255
+            // function description
256
+            $desc = '';
257
+            // type of return val: by default 'any'
258
+            $returns = $GLOBALS['xmlrpcValue'];
259
+            // desc of return val
260
+            $returnsDocs = '';
261
+            // type + name of function parameters
262
+            $paramDocs = array();
263
+
264
+            $docs = $func->getDocComment();
265
+            if($docs != '')
266
+            {
267
+                $docs = explode("\n", $docs);
268
+                $i = 0;
269
+                foreach($docs as $doc)
270
+                {
271
+                    $doc = trim($doc, " \r\t/*");
272
+                    if(strlen($doc) && strpos($doc, '@') !== 0 && !$i)
273
+                    {
274
+                        if($desc)
275
+                        {
276
+                            $desc .= "\n";
277
+                        }
278
+                        $desc .= $doc;
279
+                    }
280
+                    elseif(strpos($doc, '@param') === 0)
281
+                    {
282
+                        // syntax: @param type [$name] desc
283
+                        if(preg_match('/@param\s+(\S+)(\s+\$\S+)?\s+(.+)/', $doc, $matches))
284
+                        {
285
+                            if(strpos($matches[1], '|'))
286
+                            {
287
+                                //$paramDocs[$i]['type'] = explode('|', $matches[1]);
288
+                                $paramDocs[$i]['type'] = 'mixed';
289
+                            }
290
+                            else
291
+                            {
292
+                                $paramDocs[$i]['type'] = $matches[1];
293
+                            }
294
+                            $paramDocs[$i]['name'] = trim($matches[2]);
295
+                            $paramDocs[$i]['doc'] = $matches[3];
296
+                        }
297
+                        $i++;
298
+                    }
299
+                    elseif(strpos($doc, '@return') === 0)
300
+                    {
301
+                        // syntax: @return type desc
302
+                        //$returns = preg_split('/\s+/', $doc);
303
+                        if(preg_match('/@return\s+(\S+)\s+(.+)/', $doc, $matches))
304
+                        {
305
+                            $returns = php_2_xmlrpc_type($matches[1]);
306
+                            if(isset($matches[2]))
307
+                            {
308
+                                $returnsDocs = $matches[2];
309
+                            }
310
+                        }
311
+                    }
312
+                }
313
+            }
314
+
315
+            // execute introspection of actual function prototype
316
+            $params = array();
317
+            $i = 0;
318
+            foreach($func->getParameters() as $paramobj)
319
+            {
320
+                $params[$i] = array();
321
+                $params[$i]['name'] = '$'.$paramobj->getName();
322
+                $params[$i]['isoptional'] = $paramobj->isOptional();
323
+                $i++;
324
+            }
325
+
326
+
327
+            // start  building of PHP code to be eval'd
328
+            $innercode = '';
329
+            $i = 0;
330
+            $parsvariations = array();
331
+            $pars = array();
332
+            $pnum = count($params);
333
+            foreach($params as $param)
334
+            {
335
+                if (isset($paramDocs[$i]['name']) && $paramDocs[$i]['name'] && strtolower($paramDocs[$i]['name']) != strtolower($param['name']))
336
+                {
337
+                    // param name from phpdoc info does not match param definition!
338
+                    $paramDocs[$i]['type'] = 'mixed';
339
+                }
340
+
341
+                if($param['isoptional'])
342
+                {
343
+                    // this particular parameter is optional. save as valid previous list of parameters
344
+                    $innercode .= "if (\$paramcount > $i) {\n";
345
+                    $parsvariations[] = $pars;
346
+                }
347
+                $innercode .= "\$p$i = \$msg->getParam($i);\n";
348
+                if ($decode_php_objects)
349
+                {
350
+                    $innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i, array('decode_php_objs'));\n";
351
+                }
352
+                else
353
+                {
354
+                    $innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i);\n";
355
+                }
356
+
357
+                $pars[] = "\$p$i";
358
+                $i++;
359
+                if($param['isoptional'])
360
+                {
361
+                    $innercode .= "}\n";
362
+                }
363
+                if($i == $pnum)
364
+                {
365
+                    // last allowed parameters combination
366
+                    $parsvariations[] = $pars;
367
+                }
368
+            }
369
+
370
+            $sigs = array();
371
+            $psigs = array();
372
+            if(count($parsvariations) == 0)
373
+            {
374
+                // only known good synopsis = no parameters
375
+                $parsvariations[] = array();
376
+                $minpars = 0;
377
+            }
378
+            else
379
+            {
380
+                $minpars = count($parsvariations[0]);
381
+            }
382
+
383
+            if($minpars)
384
+            {
385
+                // add to code the check for min params number
386
+                // NB: this check needs to be done BEFORE decoding param values
387
+                $innercode = "\$paramcount = \$msg->getNumParams();\n" .
388
+                "if (\$paramcount < $minpars) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}');\n" . $innercode;
389
+            }
390
+            else
391
+            {
392
+                $innercode = "\$paramcount = \$msg->getNumParams();\n" . $innercode;
393
+            }
394
+
395
+            $innercode .= "\$np = false;\n";
396
+            // since there are no closures in php, if we are given an object instance,
397
+            // we store a pointer to it in a global var...
398
+            if ( is_array($funcname) && is_object($funcname[0]) )
399
+            {
400
+                $GLOBALS['xmlrpcWPFObjHolder'][$xmlrpcfuncname] =& $funcname[0];
401
+                $innercode .= "\$obj =& \$GLOBALS['xmlrpcWPFObjHolder']['$xmlrpcfuncname'];\n";
402
+                $realfuncname = '$obj->'.$funcname[1];
403
+            }
404
+            else
405
+            {
406
+                $realfuncname = $plainfuncname;
407
+            }
408
+            foreach($parsvariations as $pars)
409
+            {
410
+                $innercode .= "if (\$paramcount == " . count($pars) . ") \$retval = {$catch_warnings}$realfuncname(" . implode(',', $pars) . "); else\n";
411
+                // build a 'generic' signature (only use an appropriate return type)
412
+                $sig = array($returns);
413
+                $psig = array($returnsDocs);
414
+                for($i=0; $i < count($pars); $i++)
415
+                {
416
+                    if (isset($paramDocs[$i]['type']))
417
+                    {
418
+                        $sig[] = php_2_xmlrpc_type($paramDocs[$i]['type']);
419
+                    }
420
+                    else
421
+                    {
422
+                        $sig[] = $GLOBALS['xmlrpcValue'];
423
+                    }
424
+                    $psig[] = isset($paramDocs[$i]['doc']) ? $paramDocs[$i]['doc'] : '';
425
+                }
426
+                $sigs[] = $sig;
427
+                $psigs[] = $psig;
428
+            }
429
+            $innercode .= "\$np = true;\n";
430
+            $innercode .= "if (\$np) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}'); else {\n";
431
+            //$innercode .= "if (\$_xmlrpcs_error_occurred) return new xmlrpcresp(0, $GLOBALS['xmlrpcerr']user, \$_xmlrpcs_error_occurred); else\n";
432
+            $innercode .= "if (is_a(\$retval, '{$prefix}resp')) return \$retval; else\n";
433
+            if($returns == $GLOBALS['xmlrpcDateTime'] || $returns == $GLOBALS['xmlrpcBase64'])
434
+            {
435
+                $innercode .= "return new {$prefix}resp(new {$prefix}val(\$retval, '$returns'));";
436
+            }
437
+            else
438
+            {
439
+                if ($encode_php_objects)
440
+                    $innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval, array('encode_php_objs')));\n";
441
+                else
442
+                    $innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval));\n";
443
+            }
444
+            // shall we exclude functions returning by ref?
445
+            // if($func->returnsReference())
446
+            // 	return false;
447
+            $code = "function $xmlrpcfuncname(\$msg) {\n" . $innercode . "}\n}";
448
+            //print_r($code);
449
+            if ($buildit)
450
+            {
451
+                $allOK = 0;
452
+                eval($code.'$allOK=1;');
453
+                // alternative
454
+                //$xmlrpcfuncname = create_function('$m', $innercode);
455
+
456
+                if(!$allOK)
457
+                {
458
+                    error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap php function '.$plainfuncname);
459
+                    return false;
460
+                }
461
+            }
462
+
463
+            /// @todo examine if $paramDocs matches $parsvariations and build array for
464
+            /// usage as method signature, plus put together a nice string for docs
465
+
466
+            $ret = array('function' => $xmlrpcfuncname, 'signature' => $sigs, 'docstring' => $desc, 'signature_docs' => $psigs, 'source' => $code);
467
+            return $ret;
468
+        }
469
+    }
470
+
471
+    /**
472
+     * Given a user-defined PHP class or php object, map its methods onto a list of
473
+     * PHP 'wrapper' functions that can be exposed as xmlrpc methods from an xmlrpc_server
474
+     * object and called from remote clients (as well as their corresponding signature info).
475
+     *
476
+     * @param mixed $classname the name of the class whose methods are to be exposed as xmlrpc methods, or an object instance of that class
477
+     * @param array $extra_options see the docs for wrap_php_method for more options
478
+     *        string method_type 'static', 'nonstatic', 'all' and 'auto' (default); the latter will switch between static and non-static depending on wheter $classname is a class name or object instance
479
+     * @return array or false on failure
480
+     *
481
+     * @todo get_class_methods will return both static and non-static methods.
482
+     *       we have to differentiate the action, depending on whether we received a class name or object
483
+     */
484
+    function wrap_php_class($classname, $extra_options=array())
485
+    {
486
+        $methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : '';
487
+        $methodtype = isset($extra_options['method_type']) ? $extra_options['method_type'] : 'auto';
488
+
489
+        $result = array();
490
+        $mlist = get_class_methods($classname);
491
+        foreach($mlist as $mname)
492
+        {
493
+            if ($methodfilter == '' || preg_match($methodfilter, $mname))
494
+            {
495
+                // echo $mlist."\n";
496
+                $func = new ReflectionMethod($classname, $mname);
497
+                if(!$func->isPrivate() && !$func->isProtected() && !$func->isConstructor() && !$func->isDestructor() && !$func->isAbstract())
498
+                {
499
+                    if(($func->isStatic && ($methodtype == 'all' || $methodtype == 'static' || ($methodtype == 'auto' && is_string($classname)))) ||
500
+                        (!$func->isStatic && ($methodtype == 'all' || $methodtype == 'nonstatic' || ($methodtype == 'auto' && is_object($classname)))))
501
+                    {
502
+                        $methodwrap = wrap_php_function(array($classname, $mname), '', $extra_options);
503
+                        if ( $methodwrap )
504
+                        {
505
+                            $result[$methodwrap['function']] = $methodwrap['function'];
506
+                        }
507
+                    }
508
+                }
509
+            }
510
+        }
511
+        return $result;
512
+    }
513
+
514
+    /**
515
+     * Given an xmlrpc client and a method name, register a php wrapper function
516
+     * that will call it and return results using native php types for both
517
+     * params and results. The generated php function will return an xmlrpcresp
518
+     * object for failed xmlrpc calls
519
+     *
520
+     * Known limitations:
521
+     * - server must support system.methodsignature for the wanted xmlrpc method
522
+     * - for methods that expose many signatures, only one can be picked (we
523
+     *   could in principle check if signatures differ only by number of params
524
+     *   and not by type, but it would be more complication than we can spare time)
525
+     * - nested xmlrpc params: the caller of the generated php function has to
526
+     *   encode on its own the params passed to the php function if these are structs
527
+     *   or arrays whose (sub)members include values of type datetime or base64
528
+     *
529
+     * Notes: the connection properties of the given client will be copied
530
+     * and reused for the connection used during the call to the generated
531
+     * php function.
532
+     * Calling the generated php function 'might' be slow: a new xmlrpc client
533
+     * is created on every invocation and an xmlrpc-connection opened+closed.
534
+     * An extra 'debug' param is appended to param list of xmlrpc method, useful
535
+     * for debugging purposes.
536
+     *
537
+     * @param xmlrpc_client $client     an xmlrpc client set up correctly to communicate with target server
538
+     * @param string        $methodname the xmlrpc method to be mapped to a php function
539
+     * @param array         $extra_options array of options that specify conversion details. valid options include
540
+     *        integer       signum      the index of the method signature to use in mapping (if method exposes many sigs)
541
+     *        integer       timeout     timeout (in secs) to be used when executing function/calling remote method
542
+     *        string        protocol    'http' (default), 'http11' or 'https'
543
+     *        string        new_function_name the name of php function to create. If unspecified, lib will pick an appropriate name
544
+     *        string        return_source if true return php code w. function definition instead fo function name
545
+     *        bool          encode_php_objs let php objects be sent to server using the 'improved' xmlrpc notation, so server can deserialize them as php objects
546
+     *        bool          decode_php_objs --- WARNING !!! possible security hazard. only use it with trusted servers ---
547
+     *        mixed         return_on_fault a php value to be returned when the xmlrpc call fails/returns a fault response (by default the xmlrpcresp object is returned in this case). If a string is used, '%faultCode%' and '%faultString%' tokens will be substituted with actual error values
548
+     *        bool          debug        set it to 1 or 2 to see debug results of querying server for method synopsis
549
+     * @return string                   the name of the generated php function (or false) - OR AN ARRAY...
550
+     */
551
+    function wrap_xmlrpc_method($client, $methodname, $extra_options=0, $timeout=0, $protocol='', $newfuncname='')
552
+    {
553
+        // mind numbing: let caller use sane calling convention (as per javadoc, 3 params),
554
+        // OR the 2.0 calling convention (no options) - we really love backward compat, don't we?
555
+        if (!is_array($extra_options))
556
+        {
557
+            $signum = $extra_options;
558
+            $extra_options = array();
559
+        }
560
+        else
561
+        {
562
+            $signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0;
563
+            $timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0;
564
+            $protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : '';
565
+            $newfuncname = isset($extra_options['new_function_name']) ? $extra_options['new_function_name'] : '';
566
+        }
567
+        //$encode_php_objects = in_array('encode_php_objects', $extra_options);
568
+        //$verbatim_client_copy = in_array('simple_client_copy', $extra_options) ? 1 :
569
+        //	in_array('build_class_code', $extra_options) ? 2 : 0;
570
+
571
+        $encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
572
+        $decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
573
+        // it seems like the meaning of 'simple_client_copy' here is swapped wrt client_copy_mode later on...
574
+        $simple_client_copy = isset($extra_options['simple_client_copy']) ? (int)($extra_options['simple_client_copy']) : 0;
575
+        $buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
576
+        $prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
577
+        if (isset($extra_options['return_on_fault']))
578
+        {
579
+            $decode_fault = true;
580
+            $fault_response = $extra_options['return_on_fault'];
581
+        }
582
+        else
583
+        {
584
+            $decode_fault = false;
585
+            $fault_response = '';
586
+        }
587
+        $debug = isset($extra_options['debug']) ? ($extra_options['debug']) : 0;
588
+
589
+        $msgclass = $prefix.'msg';
590
+        $valclass = $prefix.'val';
591
+        $decodefunc = 'php_'.$prefix.'_decode';
592
+
593
+        $msg = new $msgclass('system.methodSignature');
594
+        $msg->addparam(new $valclass($methodname));
595
+        $client->setDebug($debug);
596
+        $response =& $client->send($msg, $timeout, $protocol);
597
+        if($response->faultCode())
598
+        {
599
+            error_log('XML-RPC: could not retrieve method signature from remote server for method '.$methodname);
600
+            return false;
601
+        }
602
+        else
603
+        {
604
+            $msig = $response->value();
605
+            if ($client->return_type != 'phpvals')
606
+            {
607
+                $msig = $decodefunc($msig);
608
+            }
609
+            if(!is_array($msig) || count($msig) <= $signum)
610
+            {
611
+                error_log('XML-RPC: could not retrieve method signature nr.'.$signum.' from remote server for method '.$methodname);
612
+                return false;
613
+            }
614
+            else
615
+            {
616
+                // pick a suitable name for the new function, avoiding collisions
617
+                if($newfuncname != '')
618
+                {
619
+                    $xmlrpcfuncname = $newfuncname;
620
+                }
621
+                else
622
+                {
623
+                    // take care to insure that methodname is translated to valid
624
+                    // php function name
625
+                    $xmlrpcfuncname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
626
+                        array('_', ''), $methodname);
627
+                }
628
+                while($buildit && function_exists($xmlrpcfuncname))
629
+                {
630
+                    $xmlrpcfuncname .= 'x';
631
+                }
632
+
633
+                $msig = $msig[$signum];
634
+                $mdesc = '';
635
+                // if in 'offline' mode, get method description too.
636
+                // in online mode, favour speed of operation
637
+                if(!$buildit)
638
+                {
639
+                    $msg = new $msgclass('system.methodHelp');
640
+                    $msg->addparam(new $valclass($methodname));
641
+                    $response =& $client->send($msg, $timeout, $protocol);
642
+                    if (!$response->faultCode())
643
+                    {
644
+                        $mdesc = $response->value();
645
+                        if ($client->return_type != 'phpvals')
646
+                        {
647
+                            $mdesc = $mdesc->scalarval();
648
+                        }
649
+                    }
650
+                }
651
+
652
+                $results = build_remote_method_wrapper_code($client, $methodname,
653
+                    $xmlrpcfuncname, $msig, $mdesc, $timeout, $protocol, $simple_client_copy,
654
+                    $prefix, $decode_php_objects, $encode_php_objects, $decode_fault,
655
+                    $fault_response);
656
+
657
+                //print_r($code);
658
+                if ($buildit)
659
+                {
660
+                    $allOK = 0;
661
+                    eval($results['source'].'$allOK=1;');
662
+                    // alternative
663
+                    //$xmlrpcfuncname = create_function('$m', $innercode);
664
+                    if($allOK)
665
+                    {
666
+                        return $xmlrpcfuncname;
667
+                    }
668
+                    else
669
+                    {
670
+                        error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap remote method '.$methodname);
671
+                        return false;
672
+                    }
673
+                }
674
+                else
675
+                {
676
+                    $results['function'] = $xmlrpcfuncname;
677
+                    return $results;
678
+                }
679
+            }
680
+        }
681
+    }
682
+
683
+    /**
684
+     * Similar to wrap_xmlrpc_method, but will generate a php class that wraps
685
+     * all xmlrpc methods exposed by the remote server as own methods.
686
+     * For more details see wrap_xmlrpc_method.
687
+     * @param xmlrpc_client $client the client obj all set to query the desired server
688
+     * @param array $extra_options list of options for wrapped code
689
+     * @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)
690
+     */
691
+    function wrap_xmlrpc_server($client, $extra_options=array())
692
+    {
693
+        $methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : '';
694
+        //$signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0;
695
+        $timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0;
696
+        $protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : '';
697
+        $newclassname = isset($extra_options['new_class_name']) ? $extra_options['new_class_name'] : '';
698
+        $encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
699
+        $decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
700
+        $verbatim_client_copy = isset($extra_options['simple_client_copy']) ? !($extra_options['simple_client_copy']) : true;
701
+        $buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
702
+        $prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
703
+
704
+        $msgclass = $prefix.'msg';
705
+        //$valclass = $prefix.'val';
706
+        $decodefunc = 'php_'.$prefix.'_decode';
707
+
708
+        $msg = new $msgclass('system.listMethods');
709
+        $response =& $client->send($msg, $timeout, $protocol);
710
+        if($response->faultCode())
711
+        {
712
+            error_log('XML-RPC: could not retrieve method list from remote server');
713
+            return false;
714
+        }
715
+        else
716
+        {
717
+            $mlist = $response->value();
718
+            if ($client->return_type != 'phpvals')
719
+            {
720
+                $mlist = $decodefunc($mlist);
721
+            }
722
+            if(!is_array($mlist) || !count($mlist))
723
+            {
724
+                error_log('XML-RPC: could not retrieve meaningful method list from remote server');
725
+                return false;
726
+            }
727
+            else
728
+            {
729
+                // pick a suitable name for the new function, avoiding collisions
730
+                if($newclassname != '')
731
+                {
732
+                    $xmlrpcclassname = $newclassname;
733
+                }
734
+                else
735
+                {
736
+                    $xmlrpcclassname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
737
+                        array('_', ''), $client->server).'_client';
738
+                }
739
+                while($buildit && class_exists($xmlrpcclassname))
740
+                {
741
+                    $xmlrpcclassname .= 'x';
742
+                }
743
+
744
+                /// @todo add function setdebug() to new class, to enable/disable debugging
745
+                $source = "class $xmlrpcclassname\n{\nvar \$client;\n\n";
746
+                $source .= "function $xmlrpcclassname()\n{\n";
747
+                $source .= build_client_wrapper_code($client, $verbatim_client_copy, $prefix);
748
+                $source .= "\$this->client =& \$client;\n}\n\n";
749
+                $opts = array('simple_client_copy' => 2, 'return_source' => true,
750
+                    'timeout' => $timeout, 'protocol' => $protocol,
751
+                    'encode_php_objs' => $encode_php_objects, 'prefix' => $prefix,
752
+                    'decode_php_objs' => $decode_php_objects
753
+                    );
754
+                /// @todo build javadoc for class definition, too
755
+                foreach($mlist as $mname)
756
+                {
757
+                    if ($methodfilter == '' || preg_match($methodfilter, $mname))
758
+                    {
759
+                        $opts['new_function_name'] = preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
760
+                            array('_', ''), $mname);
761
+                        $methodwrap = wrap_xmlrpc_method($client, $mname, $opts);
762
+                        if ($methodwrap)
763
+                        {
764
+                            if (!$buildit)
765
+                            {
766
+                                $source .= $methodwrap['docstring'];
767
+                            }
768
+                            $source .= $methodwrap['source']."\n";
769
+                        }
770
+                        else
771
+                        {
772
+                            error_log('XML-RPC: will not create class method to wrap remote method '.$mname);
773
+                        }
774
+                    }
775
+                }
776
+                $source .= "}\n";
777
+                if ($buildit)
778
+                {
779
+                    $allOK = 0;
780
+                    eval($source.'$allOK=1;');
781
+                    // alternative
782
+                    //$xmlrpcfuncname = create_function('$m', $innercode);
783
+                    if($allOK)
784
+                    {
785
+                        return $xmlrpcclassname;
786
+                    }
787
+                    else
788
+                    {
789
+                        error_log('XML-RPC: could not create class '.$xmlrpcclassname.' to wrap remote server '.$client->server);
790
+                        return false;
791
+                    }
792
+                }
793
+                else
794
+                {
795
+                    return array('class' => $xmlrpcclassname, 'code' => $source, 'docstring' => '');
796
+                }
797
+            }
798
+        }
799
+    }
800
+
801
+    /**
802
+     * Given the necessary info, build php code that creates a new function to
803
+     * invoke a remote xmlrpc method.
804
+     * Take care that no full checking of input parameters is done to ensure that
805
+     * valid php code is emitted.
806
+     * Note: real spaghetti code follows...
807
+     * @access private
808
+     */
809
+    function build_remote_method_wrapper_code($client, $methodname, $xmlrpcfuncname,
810
+        $msig, $mdesc='', $timeout=0, $protocol='', $client_copy_mode=0, $prefix='xmlrpc',
811
+        $decode_php_objects=false, $encode_php_objects=false, $decode_fault=false,
812
+        $fault_response='')
813
+    {
814
+        $code = "function $xmlrpcfuncname (";
815
+        if ($client_copy_mode < 2)
816
+        {
817
+            // client copy mode 0 or 1 == partial / full client copy in emitted code
818
+            $innercode = build_client_wrapper_code($client, $client_copy_mode, $prefix);
819
+            $innercode .= "\$client->setDebug(\$debug);\n";
820
+            $this_ = '';
821
+        }
822
+        else
823
+        {
824
+            // client copy mode 2 == no client copy in emitted code
825
+            $innercode = '';
826
+            $this_ = 'this->';
827
+        }
828
+        $innercode .= "\$msg = new {$prefix}msg('$methodname');\n";
829
+
830
+        if ($mdesc != '')
831
+        {
832
+            // take care that PHP comment is not terminated unwillingly by method description
833
+            $mdesc = "/**\n* ".str_replace('*/', '* /', $mdesc)."\n";
834
+        }
835
+        else
836
+        {
837
+            $mdesc = "/**\nFunction $xmlrpcfuncname\n";
838
+        }
839
+
840
+        // param parsing
841
+        $plist = array();
842
+        $pcount = count($msig);
843
+        for($i = 1; $i < $pcount; $i++)
844
+        {
845
+            $plist[] = "\$p$i";
846
+            $ptype = $msig[$i];
847
+            if($ptype == 'i4' || $ptype == 'int' || $ptype == 'boolean' || $ptype == 'double' ||
848
+                $ptype == 'string' || $ptype == 'dateTime.iso8601' || $ptype == 'base64' || $ptype == 'null')
849
+            {
850
+                // only build directly xmlrpcvals when type is known and scalar
851
+                $innercode .= "\$p$i = new {$prefix}val(\$p$i, '$ptype');\n";
852
+            }
853
+            else
854
+            {
855
+                if ($encode_php_objects)
856
+                {
857
+                    $innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i, array('encode_php_objs'));\n";
858
+                }
859
+                else
860
+                {
861
+                    $innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i);\n";
862
+                }
863
+            }
864
+            $innercode .= "\$msg->addparam(\$p$i);\n";
865
+            $mdesc .= '* @param '.xmlrpc_2_php_type($ptype)." \$p$i\n";
866
+        }
867
+        if ($client_copy_mode < 2)
868
+        {
869
+            $plist[] = '$debug=0';
870
+            $mdesc .= "* @param int \$debug when 1 (or 2) will enable debugging of the underlying {$prefix} call (defaults to 0)\n";
871
+        }
872
+        $plist = implode(', ', $plist);
873
+        $mdesc .= '* @return '.xmlrpc_2_php_type($msig[0])." (or an {$prefix}resp obj instance if call fails)\n*/\n";
874
+
875
+        $innercode .= "\$res =& \${$this_}client->send(\$msg, $timeout, '$protocol');\n";
876
+        if ($decode_fault)
877
+        {
878
+            if (is_string($fault_response) && ((strpos($fault_response, '%faultCode%') !== false) || (strpos($fault_response, '%faultString%') !== false)))
879
+            {
880
+                $respcode = "str_replace(array('%faultCode%', '%faultString%'), array(\$res->faultCode(), \$res->faultString()), '".str_replace("'", "''", $fault_response)."')";
881
+            }
882
+            else
883
+            {
884
+                $respcode = var_export($fault_response, true);
885
+            }
886
+        }
887
+        else
888
+        {
889
+            $respcode = '$res';
890
+        }
891
+        if ($decode_php_objects)
892
+        {
893
+            $innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value(), array('decode_php_objs'));";
894
+        }
895
+        else
896
+        {
897
+            $innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value());";
898
+        }
899
+
900
+        $code = $code . $plist. ") {\n" . $innercode . "\n}\n";
901
+
902
+        return array('source' => $code, 'docstring' => $mdesc);
903
+    }
904
+
905
+    /**
906
+     * Given necessary info, generate php code that will rebuild a client object
907
+     * Take care that no full checking of input parameters is done to ensure that
908
+     * valid php code is emitted.
909
+     * @access private
910
+     */
911
+    function build_client_wrapper_code($client, $verbatim_client_copy, $prefix='xmlrpc')
912
+    {
913
+        $code = "\$client = new {$prefix}_client('".str_replace("'", "\'", $client->path).
914
+            "', '" . str_replace("'", "\'", $client->server) . "', $client->port);\n";
915
+
916
+        // copy all client fields to the client that will be generated runtime
917
+        // (this provides for future expansion or subclassing of client obj)
918
+        if ($verbatim_client_copy)
919
+        {
920
+            foreach($client as $fld => $val)
921
+            {
922
+                if($fld != 'debug' && $fld != 'return_type')
923
+                {
924
+                    $val = var_export($val, true);
925
+                    $code .= "\$client->$fld = $val;\n";
926
+                }
927
+            }
928
+        }
929
+        // only make sure that client always returns the correct data type
930
+        $code .= "\$client->return_type = '{$prefix}vals';\n";
931
+        //$code .= "\$client->setDebug(\$debug);\n";
932
+        return $code;
933
+    }
934 934
 ?>
935 935
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +94 added lines, -94 removed lines patch added patch discarded remove patch
@@ -27,7 +27,7 @@  discard block
 block discarded – undo
27 27
 	*/
28 28
 	function php_2_xmlrpc_type($phptype)
29 29
 	{
30
-		switch(strtolower($phptype))
30
+		switch (strtolower($phptype))
31 31
 		{
32 32
 			case 'string':
33 33
 				return $GLOBALS['xmlrpcString'];
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
 			case 'resource':
50 50
 				return '';
51 51
 			default:
52
-				if(class_exists($phptype))
52
+				if (class_exists($phptype))
53 53
 				{
54 54
 					return $GLOBALS['xmlrpcStruct'];
55 55
 				}
@@ -68,7 +68,7 @@  discard block
 block discarded – undo
68 68
 	*/
69 69
 	function xmlrpc_2_php_type($xmlrpctype)
70 70
 	{
71
-		switch(strtolower($xmlrpctype))
71
+		switch (strtolower($xmlrpctype))
72 72
 		{
73 73
 			case 'base64':
74 74
 			case 'datetime.iso8601':
@@ -140,12 +140,12 @@  discard block
 block discarded – undo
140 140
 	* @todo if $newfuncname is empty, we could use create_user_func instead of eval, as it is possibly faster
141 141
 	* @todo add a verbatim_object_copy parameter to allow avoiding the same obj instance?
142 142
 	*/
143
-	function wrap_php_function($funcname, $newfuncname='', $extra_options=array())
143
+	function wrap_php_function($funcname, $newfuncname = '', $extra_options = array())
144 144
 	{
145 145
 		$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
146 146
 		$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
147
-		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
148
-		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
147
+		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool) $extra_options['encode_php_objs'] : false;
148
+		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool) $extra_options['decode_php_objs'] : false;
149 149
 		$catch_warnings = isset($extra_options['suppress_warnings']) && $extra_options['suppress_warnings'] ? '@' : '';
150 150
 
151 151
 		$exists = false;
@@ -153,20 +153,20 @@  discard block
 block discarded – undo
153 153
 		{
154 154
 			$funcname = explode('::', $funcname);
155 155
 		}
156
-		if(is_array($funcname))
156
+		if (is_array($funcname))
157 157
 		{
158
-			if(count($funcname) < 2 || (!is_string($funcname[0]) && !is_object($funcname[0])))
158
+			if (count($funcname)<2 || (!is_string($funcname[0]) && !is_object($funcname[0])))
159 159
 			{
160 160
 				error_log('XML-RPC: syntax for function to be wrapped is wrong');
161 161
 				return false;
162 162
 			}
163
-			if(is_string($funcname[0]))
163
+			if (is_string($funcname[0]))
164 164
 			{
165 165
 				$plainfuncname = implode('::', $funcname);
166 166
 			}
167
-			elseif(is_object($funcname[0]))
167
+			elseif (is_object($funcname[0]))
168 168
 			{
169
-				$plainfuncname = get_class($funcname[0]) . '->' . $funcname[1];
169
+				$plainfuncname = get_class($funcname[0]).'->'.$funcname[1];
170 170
 			}
171 171
 			$exists = method_exists($funcname[0], $funcname[1]);
172 172
 		}
@@ -176,7 +176,7 @@  discard block
 block discarded – undo
176 176
 			$exists = function_exists($funcname);
177 177
 		}
178 178
 
179
-		if(!$exists)
179
+		if (!$exists)
180 180
 		{
181 181
 			error_log('XML-RPC: function to be wrapped is not defined: '.$plainfuncname);
182 182
 			return false;
@@ -184,14 +184,14 @@  discard block
 block discarded – undo
184 184
 		else
185 185
 		{
186 186
 			// determine name of new php function
187
-			if($newfuncname == '')
187
+			if ($newfuncname == '')
188 188
 			{
189
-				if(is_array($funcname))
189
+				if (is_array($funcname))
190 190
 				{
191
-					if(is_string($funcname[0]))
191
+					if (is_string($funcname[0]))
192 192
 						$xmlrpcfuncname = "{$prefix}_".implode('_', $funcname);
193 193
 					else
194
-						$xmlrpcfuncname = "{$prefix}_".get_class($funcname[0]) . '_' . $funcname[1];
194
+						$xmlrpcfuncname = "{$prefix}_".get_class($funcname[0]).'_'.$funcname[1];
195 195
 				}
196 196
 				else
197 197
 				{
@@ -202,36 +202,36 @@  discard block
 block discarded – undo
202 202
 			{
203 203
 				$xmlrpcfuncname = $newfuncname;
204 204
 			}
205
-			while($buildit && function_exists($xmlrpcfuncname))
205
+			while ($buildit && function_exists($xmlrpcfuncname))
206 206
 			{
207 207
 				$xmlrpcfuncname .= 'x';
208 208
 			}
209 209
 
210 210
 			// start to introspect PHP code
211
-			if(is_array($funcname))
211
+			if (is_array($funcname))
212 212
 			{
213 213
 				$func = new ReflectionMethod($funcname[0], $funcname[1]);
214
-				if($func->isPrivate())
214
+				if ($func->isPrivate())
215 215
 				{
216 216
 					error_log('XML-RPC: method to be wrapped is private: '.$plainfuncname);
217 217
 					return false;
218 218
 				}
219
-				if($func->isProtected())
219
+				if ($func->isProtected())
220 220
 				{
221 221
 					error_log('XML-RPC: method to be wrapped is protected: '.$plainfuncname);
222 222
 					return false;
223 223
 				}
224
-	 			if($func->isConstructor())
224
+	 			if ($func->isConstructor())
225 225
 				{
226 226
 					error_log('XML-RPC: method to be wrapped is the constructor: '.$plainfuncname);
227 227
 					return false;
228 228
 				}
229
-				if($func->isDestructor())
229
+				if ($func->isDestructor())
230 230
 				{
231 231
 					error_log('XML-RPC: method to be wrapped is the destructor: '.$plainfuncname);
232 232
 					return false;
233 233
 				}
234
-				if($func->isAbstract())
234
+				if ($func->isAbstract())
235 235
 				{
236 236
 					error_log('XML-RPC: method to be wrapped is abstract: '.$plainfuncname);
237 237
 					return false;
@@ -242,7 +242,7 @@  discard block
 block discarded – undo
242 242
 			{
243 243
 				$func = new ReflectionFunction($funcname);
244 244
 			}
245
-			if($func->isInternal())
245
+			if ($func->isInternal())
246 246
 			{
247 247
 				// Note: from PHP 5.1.0 onward, we will possibly be able to use invokeargs
248 248
 				// instead of getparameters to fully reflect internal php functions ?
@@ -262,27 +262,27 @@  discard block
 block discarded – undo
262 262
 			$paramDocs = array();
263 263
 
264 264
 			$docs = $func->getDocComment();
265
-			if($docs != '')
265
+			if ($docs != '')
266 266
 			{
267 267
 				$docs = explode("\n", $docs);
268 268
 				$i = 0;
269
-				foreach($docs as $doc)
269
+				foreach ($docs as $doc)
270 270
 				{
271 271
 					$doc = trim($doc, " \r\t/*");
272
-					if(strlen($doc) && strpos($doc, '@') !== 0 && !$i)
272
+					if (strlen($doc) && strpos($doc, '@') !== 0 && !$i)
273 273
 					{
274
-						if($desc)
274
+						if ($desc)
275 275
 						{
276 276
 							$desc .= "\n";
277 277
 						}
278 278
 						$desc .= $doc;
279 279
 					}
280
-					elseif(strpos($doc, '@param') === 0)
280
+					elseif (strpos($doc, '@param') === 0)
281 281
 					{
282 282
 						// syntax: @param type [$name] desc
283
-						if(preg_match('/@param\s+(\S+)(\s+\$\S+)?\s+(.+)/', $doc, $matches))
283
+						if (preg_match('/@param\s+(\S+)(\s+\$\S+)?\s+(.+)/', $doc, $matches))
284 284
 						{
285
-							if(strpos($matches[1], '|'))
285
+							if (strpos($matches[1], '|'))
286 286
 							{
287 287
 								//$paramDocs[$i]['type'] = explode('|', $matches[1]);
288 288
 								$paramDocs[$i]['type'] = 'mixed';
@@ -296,14 +296,14 @@  discard block
 block discarded – undo
296 296
 						}
297 297
 						$i++;
298 298
 					}
299
-					elseif(strpos($doc, '@return') === 0)
299
+					elseif (strpos($doc, '@return') === 0)
300 300
 					{
301 301
 						// syntax: @return type desc
302 302
 						//$returns = preg_split('/\s+/', $doc);
303
-						if(preg_match('/@return\s+(\S+)\s+(.+)/', $doc, $matches))
303
+						if (preg_match('/@return\s+(\S+)\s+(.+)/', $doc, $matches))
304 304
 						{
305 305
 							$returns = php_2_xmlrpc_type($matches[1]);
306
-							if(isset($matches[2]))
306
+							if (isset($matches[2]))
307 307
 							{
308 308
 								$returnsDocs = $matches[2];
309 309
 							}
@@ -315,7 +315,7 @@  discard block
 block discarded – undo
315 315
 			// execute introspection of actual function prototype
316 316
 			$params = array();
317 317
 			$i = 0;
318
-			foreach($func->getParameters() as $paramobj)
318
+			foreach ($func->getParameters() as $paramobj)
319 319
 			{
320 320
 				$params[$i] = array();
321 321
 				$params[$i]['name'] = '$'.$paramobj->getName();
@@ -330,7 +330,7 @@  discard block
 block discarded – undo
330 330
 			$parsvariations = array();
331 331
 			$pars = array();
332 332
 			$pnum = count($params);
333
-			foreach($params as $param)
333
+			foreach ($params as $param)
334 334
 			{
335 335
 				if (isset($paramDocs[$i]['name']) && $paramDocs[$i]['name'] && strtolower($paramDocs[$i]['name']) != strtolower($param['name']))
336 336
 				{
@@ -338,7 +338,7 @@  discard block
 block discarded – undo
338 338
 					$paramDocs[$i]['type'] = 'mixed';
339 339
 				}
340 340
 
341
-				if($param['isoptional'])
341
+				if ($param['isoptional'])
342 342
 				{
343 343
 					// this particular parameter is optional. save as valid previous list of parameters
344 344
 					$innercode .= "if (\$paramcount > $i) {\n";
@@ -356,11 +356,11 @@  discard block
 block discarded – undo
356 356
 
357 357
 				$pars[] = "\$p$i";
358 358
 				$i++;
359
-				if($param['isoptional'])
359
+				if ($param['isoptional'])
360 360
 				{
361 361
 					$innercode .= "}\n";
362 362
 				}
363
-				if($i == $pnum)
363
+				if ($i == $pnum)
364 364
 				{
365 365
 					// last allowed parameters combination
366 366
 					$parsvariations[] = $pars;
@@ -369,7 +369,7 @@  discard block
 block discarded – undo
369 369
 
370 370
 			$sigs = array();
371 371
 			$psigs = array();
372
-			if(count($parsvariations) == 0)
372
+			if (count($parsvariations) == 0)
373 373
 			{
374 374
 				// only known good synopsis = no parameters
375 375
 				$parsvariations[] = array();
@@ -380,24 +380,24 @@  discard block
 block discarded – undo
380 380
 				$minpars = count($parsvariations[0]);
381 381
 			}
382 382
 
383
-			if($minpars)
383
+			if ($minpars)
384 384
 			{
385 385
 				// add to code the check for min params number
386 386
 				// NB: this check needs to be done BEFORE decoding param values
387
-				$innercode = "\$paramcount = \$msg->getNumParams();\n" .
388
-				"if (\$paramcount < $minpars) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}');\n" . $innercode;
387
+				$innercode = "\$paramcount = \$msg->getNumParams();\n".
388
+				"if (\$paramcount < $minpars) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}');\n".$innercode;
389 389
 			}
390 390
 			else
391 391
 			{
392
-				$innercode = "\$paramcount = \$msg->getNumParams();\n" . $innercode;
392
+				$innercode = "\$paramcount = \$msg->getNumParams();\n".$innercode;
393 393
 			}
394 394
 
395 395
 			$innercode .= "\$np = false;\n";
396 396
 			// since there are no closures in php, if we are given an object instance,
397 397
 			// we store a pointer to it in a global var...
398
-			if ( is_array($funcname) && is_object($funcname[0]) )
398
+			if (is_array($funcname) && is_object($funcname[0]))
399 399
 			{
400
-				$GLOBALS['xmlrpcWPFObjHolder'][$xmlrpcfuncname] =& $funcname[0];
400
+				$GLOBALS['xmlrpcWPFObjHolder'][$xmlrpcfuncname] = & $funcname[0];
401 401
 				$innercode .= "\$obj =& \$GLOBALS['xmlrpcWPFObjHolder']['$xmlrpcfuncname'];\n";
402 402
 				$realfuncname = '$obj->'.$funcname[1];
403 403
 			}
@@ -405,13 +405,13 @@  discard block
 block discarded – undo
405 405
 			{
406 406
 				$realfuncname = $plainfuncname;
407 407
 			}
408
-			foreach($parsvariations as $pars)
408
+			foreach ($parsvariations as $pars)
409 409
 			{
410
-				$innercode .= "if (\$paramcount == " . count($pars) . ") \$retval = {$catch_warnings}$realfuncname(" . implode(',', $pars) . "); else\n";
410
+				$innercode .= "if (\$paramcount == ".count($pars).") \$retval = {$catch_warnings}$realfuncname(".implode(',', $pars)."); else\n";
411 411
 				// build a 'generic' signature (only use an appropriate return type)
412 412
 				$sig = array($returns);
413 413
 				$psig = array($returnsDocs);
414
-				for($i=0; $i < count($pars); $i++)
414
+				for ($i = 0; $i<count($pars); $i++)
415 415
 				{
416 416
 					if (isset($paramDocs[$i]['type']))
417 417
 					{
@@ -430,7 +430,7 @@  discard block
 block discarded – undo
430 430
 			$innercode .= "if (\$np) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}'); else {\n";
431 431
 			//$innercode .= "if (\$_xmlrpcs_error_occurred) return new xmlrpcresp(0, $GLOBALS['xmlrpcerr']user, \$_xmlrpcs_error_occurred); else\n";
432 432
 			$innercode .= "if (is_a(\$retval, '{$prefix}resp')) return \$retval; else\n";
433
-			if($returns == $GLOBALS['xmlrpcDateTime'] || $returns == $GLOBALS['xmlrpcBase64'])
433
+			if ($returns == $GLOBALS['xmlrpcDateTime'] || $returns == $GLOBALS['xmlrpcBase64'])
434 434
 			{
435 435
 				$innercode .= "return new {$prefix}resp(new {$prefix}val(\$retval, '$returns'));";
436 436
 			}
@@ -444,7 +444,7 @@  discard block
 block discarded – undo
444 444
 			// shall we exclude functions returning by ref?
445 445
 			// if($func->returnsReference())
446 446
 			// 	return false;
447
-			$code = "function $xmlrpcfuncname(\$msg) {\n" . $innercode . "}\n}";
447
+			$code = "function $xmlrpcfuncname(\$msg) {\n".$innercode."}\n}";
448 448
 			//print_r($code);
449 449
 			if ($buildit)
450 450
 			{
@@ -453,7 +453,7 @@  discard block
 block discarded – undo
453 453
 				// alternative
454 454
 				//$xmlrpcfuncname = create_function('$m', $innercode);
455 455
 
456
-				if(!$allOK)
456
+				if (!$allOK)
457 457
 				{
458 458
 					error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap php function '.$plainfuncname);
459 459
 					return false;
@@ -481,26 +481,26 @@  discard block
 block discarded – undo
481 481
 	* @todo get_class_methods will return both static and non-static methods.
482 482
 	*       we have to differentiate the action, depending on whether we received a class name or object
483 483
 	*/
484
-	function wrap_php_class($classname, $extra_options=array())
484
+	function wrap_php_class($classname, $extra_options = array())
485 485
 	{
486 486
 		$methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : '';
487 487
 		$methodtype = isset($extra_options['method_type']) ? $extra_options['method_type'] : 'auto';
488 488
 
489 489
 		$result = array();
490 490
 		$mlist = get_class_methods($classname);
491
-		foreach($mlist as $mname)
491
+		foreach ($mlist as $mname)
492 492
 		{
493 493
 			if ($methodfilter == '' || preg_match($methodfilter, $mname))
494 494
 			{
495 495
 				// echo $mlist."\n";
496 496
 				$func = new ReflectionMethod($classname, $mname);
497
-				if(!$func->isPrivate() && !$func->isProtected() && !$func->isConstructor() && !$func->isDestructor() && !$func->isAbstract())
497
+				if (!$func->isPrivate() && !$func->isProtected() && !$func->isConstructor() && !$func->isDestructor() && !$func->isAbstract())
498 498
 				{
499
-					if(($func->isStatic && ($methodtype == 'all' || $methodtype == 'static' || ($methodtype == 'auto' && is_string($classname)))) ||
499
+					if (($func->isStatic && ($methodtype == 'all' || $methodtype == 'static' || ($methodtype == 'auto' && is_string($classname)))) ||
500 500
 						(!$func->isStatic && ($methodtype == 'all' || $methodtype == 'nonstatic' || ($methodtype == 'auto' && is_object($classname)))))
501 501
 					{
502 502
 						$methodwrap = wrap_php_function(array($classname, $mname), '', $extra_options);
503
-						if ( $methodwrap )
503
+						if ($methodwrap)
504 504
 						{
505 505
 							$result[$methodwrap['function']] = $methodwrap['function'];
506 506
 						}
@@ -548,7 +548,7 @@  discard block
 block discarded – undo
548 548
 	*        bool          debug        set it to 1 or 2 to see debug results of querying server for method synopsis
549 549
 	* @return string                   the name of the generated php function (or false) - OR AN ARRAY...
550 550
 	*/
551
-	function wrap_xmlrpc_method($client, $methodname, $extra_options=0, $timeout=0, $protocol='', $newfuncname='')
551
+	function wrap_xmlrpc_method($client, $methodname, $extra_options = 0, $timeout = 0, $protocol = '', $newfuncname = '')
552 552
 	{
553 553
 		// mind numbing: let caller use sane calling convention (as per javadoc, 3 params),
554 554
 		// OR the 2.0 calling convention (no options) - we really love backward compat, don't we?
@@ -559,8 +559,8 @@  discard block
 block discarded – undo
559 559
 		}
560 560
 		else
561 561
 		{
562
-			$signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0;
563
-			$timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0;
562
+			$signum = isset($extra_options['signum']) ? (int) $extra_options['signum'] : 0;
563
+			$timeout = isset($extra_options['timeout']) ? (int) $extra_options['timeout'] : 0;
564 564
 			$protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : '';
565 565
 			$newfuncname = isset($extra_options['new_function_name']) ? $extra_options['new_function_name'] : '';
566 566
 		}
@@ -568,10 +568,10 @@  discard block
 block discarded – undo
568 568
 		//$verbatim_client_copy = in_array('simple_client_copy', $extra_options) ? 1 :
569 569
 		//	in_array('build_class_code', $extra_options) ? 2 : 0;
570 570
 
571
-		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
572
-		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
571
+		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool) $extra_options['encode_php_objs'] : false;
572
+		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool) $extra_options['decode_php_objs'] : false;
573 573
 		// it seems like the meaning of 'simple_client_copy' here is swapped wrt client_copy_mode later on...
574
-		$simple_client_copy = isset($extra_options['simple_client_copy']) ? (int)($extra_options['simple_client_copy']) : 0;
574
+		$simple_client_copy = isset($extra_options['simple_client_copy']) ? (int) ($extra_options['simple_client_copy']) : 0;
575 575
 		$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
576 576
 		$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
577 577
 		if (isset($extra_options['return_on_fault']))
@@ -593,8 +593,8 @@  discard block
 block discarded – undo
593 593
 		$msg = new $msgclass('system.methodSignature');
594 594
 		$msg->addparam(new $valclass($methodname));
595 595
 		$client->setDebug($debug);
596
-		$response =& $client->send($msg, $timeout, $protocol);
597
-		if($response->faultCode())
596
+		$response = & $client->send($msg, $timeout, $protocol);
597
+		if ($response->faultCode())
598 598
 		{
599 599
 			error_log('XML-RPC: could not retrieve method signature from remote server for method '.$methodname);
600 600
 			return false;
@@ -606,7 +606,7 @@  discard block
 block discarded – undo
606 606
 			{
607 607
 				$msig = $decodefunc($msig);
608 608
 			}
609
-			if(!is_array($msig) || count($msig) <= $signum)
609
+			if (!is_array($msig) || count($msig)<=$signum)
610 610
 			{
611 611
 				error_log('XML-RPC: could not retrieve method signature nr.'.$signum.' from remote server for method '.$methodname);
612 612
 				return false;
@@ -614,7 +614,7 @@  discard block
 block discarded – undo
614 614
 			else
615 615
 			{
616 616
 				// pick a suitable name for the new function, avoiding collisions
617
-				if($newfuncname != '')
617
+				if ($newfuncname != '')
618 618
 				{
619 619
 					$xmlrpcfuncname = $newfuncname;
620 620
 				}
@@ -625,7 +625,7 @@  discard block
 block discarded – undo
625 625
 					$xmlrpcfuncname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
626 626
 						array('_', ''), $methodname);
627 627
 				}
628
-				while($buildit && function_exists($xmlrpcfuncname))
628
+				while ($buildit && function_exists($xmlrpcfuncname))
629 629
 				{
630 630
 					$xmlrpcfuncname .= 'x';
631 631
 				}
@@ -634,11 +634,11 @@  discard block
 block discarded – undo
634 634
 				$mdesc = '';
635 635
 				// if in 'offline' mode, get method description too.
636 636
 				// in online mode, favour speed of operation
637
-				if(!$buildit)
637
+				if (!$buildit)
638 638
 				{
639 639
 					$msg = new $msgclass('system.methodHelp');
640 640
 					$msg->addparam(new $valclass($methodname));
641
-					$response =& $client->send($msg, $timeout, $protocol);
641
+					$response = & $client->send($msg, $timeout, $protocol);
642 642
 					if (!$response->faultCode())
643 643
 					{
644 644
 						$mdesc = $response->value();
@@ -661,7 +661,7 @@  discard block
 block discarded – undo
661 661
 					eval($results['source'].'$allOK=1;');
662 662
 					// alternative
663 663
 					//$xmlrpcfuncname = create_function('$m', $innercode);
664
-					if($allOK)
664
+					if ($allOK)
665 665
 					{
666 666
 						return $xmlrpcfuncname;
667 667
 					}
@@ -688,15 +688,15 @@  discard block
 block discarded – undo
688 688
 	* @param array $extra_options list of options for wrapped code
689 689
 	* @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)
690 690
 	*/
691
-	function wrap_xmlrpc_server($client, $extra_options=array())
691
+	function wrap_xmlrpc_server($client, $extra_options = array())
692 692
 	{
693 693
 		$methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : '';
694 694
 		//$signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0;
695
-		$timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0;
695
+		$timeout = isset($extra_options['timeout']) ? (int) $extra_options['timeout'] : 0;
696 696
 		$protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : '';
697 697
 		$newclassname = isset($extra_options['new_class_name']) ? $extra_options['new_class_name'] : '';
698
-		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
699
-		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
698
+		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool) $extra_options['encode_php_objs'] : false;
699
+		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool) $extra_options['decode_php_objs'] : false;
700 700
 		$verbatim_client_copy = isset($extra_options['simple_client_copy']) ? !($extra_options['simple_client_copy']) : true;
701 701
 		$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
702 702
 		$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
@@ -706,8 +706,8 @@  discard block
 block discarded – undo
706 706
 		$decodefunc = 'php_'.$prefix.'_decode';
707 707
 
708 708
 		$msg = new $msgclass('system.listMethods');
709
-		$response =& $client->send($msg, $timeout, $protocol);
710
-		if($response->faultCode())
709
+		$response = & $client->send($msg, $timeout, $protocol);
710
+		if ($response->faultCode())
711 711
 		{
712 712
 			error_log('XML-RPC: could not retrieve method list from remote server');
713 713
 			return false;
@@ -719,7 +719,7 @@  discard block
 block discarded – undo
719 719
 			{
720 720
 				$mlist = $decodefunc($mlist);
721 721
 			}
722
-			if(!is_array($mlist) || !count($mlist))
722
+			if (!is_array($mlist) || !count($mlist))
723 723
 			{
724 724
 				error_log('XML-RPC: could not retrieve meaningful method list from remote server');
725 725
 				return false;
@@ -727,7 +727,7 @@  discard block
 block discarded – undo
727 727
 			else
728 728
 			{
729 729
 				// pick a suitable name for the new function, avoiding collisions
730
-				if($newclassname != '')
730
+				if ($newclassname != '')
731 731
 				{
732 732
 					$xmlrpcclassname = $newclassname;
733 733
 				}
@@ -736,7 +736,7 @@  discard block
 block discarded – undo
736 736
 					$xmlrpcclassname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
737 737
 						array('_', ''), $client->server).'_client';
738 738
 				}
739
-				while($buildit && class_exists($xmlrpcclassname))
739
+				while ($buildit && class_exists($xmlrpcclassname))
740 740
 				{
741 741
 					$xmlrpcclassname .= 'x';
742 742
 				}
@@ -752,7 +752,7 @@  discard block
 block discarded – undo
752 752
 					'decode_php_objs' => $decode_php_objects
753 753
 					);
754 754
 				/// @todo build javadoc for class definition, too
755
-				foreach($mlist as $mname)
755
+				foreach ($mlist as $mname)
756 756
 				{
757 757
 					if ($methodfilter == '' || preg_match($methodfilter, $mname))
758 758
 					{
@@ -780,7 +780,7 @@  discard block
 block discarded – undo
780 780
 					eval($source.'$allOK=1;');
781 781
 					// alternative
782 782
 					//$xmlrpcfuncname = create_function('$m', $innercode);
783
-					if($allOK)
783
+					if ($allOK)
784 784
 					{
785 785
 						return $xmlrpcclassname;
786 786
 					}
@@ -807,12 +807,12 @@  discard block
 block discarded – undo
807 807
 	* @access private
808 808
 	*/
809 809
 	function build_remote_method_wrapper_code($client, $methodname, $xmlrpcfuncname,
810
-		$msig, $mdesc='', $timeout=0, $protocol='', $client_copy_mode=0, $prefix='xmlrpc',
811
-		$decode_php_objects=false, $encode_php_objects=false, $decode_fault=false,
812
-		$fault_response='')
810
+		$msig, $mdesc = '', $timeout = 0, $protocol = '', $client_copy_mode = 0, $prefix = 'xmlrpc',
811
+		$decode_php_objects = false, $encode_php_objects = false, $decode_fault = false,
812
+		$fault_response = '')
813 813
 	{
814 814
 		$code = "function $xmlrpcfuncname (";
815
-		if ($client_copy_mode < 2)
815
+		if ($client_copy_mode<2)
816 816
 		{
817 817
 			// client copy mode 0 or 1 == partial / full client copy in emitted code
818 818
 			$innercode = build_client_wrapper_code($client, $client_copy_mode, $prefix);
@@ -840,11 +840,11 @@  discard block
 block discarded – undo
840 840
 		// param parsing
841 841
 		$plist = array();
842 842
 		$pcount = count($msig);
843
-		for($i = 1; $i < $pcount; $i++)
843
+		for ($i = 1; $i<$pcount; $i++)
844 844
 		{
845 845
 			$plist[] = "\$p$i";
846 846
 			$ptype = $msig[$i];
847
-			if($ptype == 'i4' || $ptype == 'int' || $ptype == 'boolean' || $ptype == 'double' ||
847
+			if ($ptype == 'i4' || $ptype == 'int' || $ptype == 'boolean' || $ptype == 'double' ||
848 848
 				$ptype == 'string' || $ptype == 'dateTime.iso8601' || $ptype == 'base64' || $ptype == 'null')
849 849
 			{
850 850
 				// only build directly xmlrpcvals when type is known and scalar
@@ -864,7 +864,7 @@  discard block
 block discarded – undo
864 864
 			$innercode .= "\$msg->addparam(\$p$i);\n";
865 865
 			$mdesc .= '* @param '.xmlrpc_2_php_type($ptype)." \$p$i\n";
866 866
 		}
867
-		if ($client_copy_mode < 2)
867
+		if ($client_copy_mode<2)
868 868
 		{
869 869
 			$plist[] = '$debug=0';
870 870
 			$mdesc .= "* @param int \$debug when 1 (or 2) will enable debugging of the underlying {$prefix} call (defaults to 0)\n";
@@ -897,7 +897,7 @@  discard block
 block discarded – undo
897 897
 			$innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value());";
898 898
 		}
899 899
 
900
-		$code = $code . $plist. ") {\n" . $innercode . "\n}\n";
900
+		$code = $code.$plist.") {\n".$innercode."\n}\n";
901 901
 
902 902
 		return array('source' => $code, 'docstring' => $mdesc);
903 903
 	}
@@ -908,18 +908,18 @@  discard block
 block discarded – undo
908 908
 	* valid php code is emitted.
909 909
 	* @access private
910 910
 	*/
911
-	function build_client_wrapper_code($client, $verbatim_client_copy, $prefix='xmlrpc')
911
+	function build_client_wrapper_code($client, $verbatim_client_copy, $prefix = 'xmlrpc')
912 912
 	{
913 913
 		$code = "\$client = new {$prefix}_client('".str_replace("'", "\'", $client->path).
914
-			"', '" . str_replace("'", "\'", $client->server) . "', $client->port);\n";
914
+			"', '".str_replace("'", "\'", $client->server)."', $client->port);\n";
915 915
 
916 916
 		// copy all client fields to the client that will be generated runtime
917 917
 		// (this provides for future expansion or subclassing of client obj)
918 918
 		if ($verbatim_client_copy)
919 919
 		{
920
-			foreach($client as $fld => $val)
920
+			foreach ($client as $fld => $val)
921 921
 			{
922
-				if($fld != 'debug' && $fld != 'return_type')
922
+				if ($fld != 'debug' && $fld != 'return_type')
923 923
 				{
924 924
 					$val = var_export($val, true);
925 925
 					$code .= "\$client->$fld = $val;\n";
Please login to merge, or discard this patch.
Braces   +46 added lines, -80 removed lines patch added patch discarded remove patch
@@ -52,8 +52,7 @@  discard block
 block discarded – undo
52 52
 				if(class_exists($phptype))
53 53
 				{
54 54
 					return $GLOBALS['xmlrpcStruct'];
55
-				}
56
-				else
55
+				} else
57 56
 				{
58 57
 					// unknown: might be any 'extended' xmlrpc type
59 58
 					return $GLOBALS['xmlrpcValue'];
@@ -163,14 +162,12 @@  discard block
 block discarded – undo
163 162
 			if(is_string($funcname[0]))
164 163
 			{
165 164
 				$plainfuncname = implode('::', $funcname);
166
-			}
167
-			elseif(is_object($funcname[0]))
165
+			} elseif(is_object($funcname[0]))
168 166
 			{
169 167
 				$plainfuncname = get_class($funcname[0]) . '->' . $funcname[1];
170 168
 			}
171 169
 			$exists = method_exists($funcname[0], $funcname[1]);
172
-		}
173
-		else
170
+		} else
174 171
 		{
175 172
 			$plainfuncname = $funcname;
176 173
 			$exists = function_exists($funcname);
@@ -180,25 +177,23 @@  discard block
 block discarded – undo
180 177
 		{
181 178
 			error_log('XML-RPC: function to be wrapped is not defined: '.$plainfuncname);
182 179
 			return false;
183
-		}
184
-		else
180
+		} else
185 181
 		{
186 182
 			// determine name of new php function
187 183
 			if($newfuncname == '')
188 184
 			{
189 185
 				if(is_array($funcname))
190 186
 				{
191
-					if(is_string($funcname[0]))
192
-						$xmlrpcfuncname = "{$prefix}_".implode('_', $funcname);
193
-					else
194
-						$xmlrpcfuncname = "{$prefix}_".get_class($funcname[0]) . '_' . $funcname[1];
195
-				}
196
-				else
187
+					if(is_string($funcname[0])) {
188
+											$xmlrpcfuncname = "{$prefix}_".implode('_', $funcname);
189
+					} else {
190
+											$xmlrpcfuncname = "{$prefix}_".get_class($funcname[0]) . '_' . $funcname[1];
191
+					}
192
+				} else
197 193
 				{
198 194
 					$xmlrpcfuncname = "{$prefix}_$funcname";
199 195
 				}
200
-			}
201
-			else
196
+			} else
202 197
 			{
203 198
 				$xmlrpcfuncname = $newfuncname;
204 199
 			}
@@ -237,8 +232,7 @@  discard block
 block discarded – undo
237 232
 					return false;
238 233
 				}
239 234
 				/// @todo add more checks for static vs. nonstatic?
240
-			}
241
-			else
235
+			} else
242 236
 			{
243 237
 				$func = new ReflectionFunction($funcname);
244 238
 			}
@@ -276,8 +270,7 @@  discard block
 block discarded – undo
276 270
 							$desc .= "\n";
277 271
 						}
278 272
 						$desc .= $doc;
279
-					}
280
-					elseif(strpos($doc, '@param') === 0)
273
+					} elseif(strpos($doc, '@param') === 0)
281 274
 					{
282 275
 						// syntax: @param type [$name] desc
283 276
 						if(preg_match('/@param\s+(\S+)(\s+\$\S+)?\s+(.+)/', $doc, $matches))
@@ -286,8 +279,7 @@  discard block
 block discarded – undo
286 279
 							{
287 280
 								//$paramDocs[$i]['type'] = explode('|', $matches[1]);
288 281
 								$paramDocs[$i]['type'] = 'mixed';
289
-							}
290
-							else
282
+							} else
291 283
 							{
292 284
 								$paramDocs[$i]['type'] = $matches[1];
293 285
 							}
@@ -295,8 +287,7 @@  discard block
 block discarded – undo
295 287
 							$paramDocs[$i]['doc'] = $matches[3];
296 288
 						}
297 289
 						$i++;
298
-					}
299
-					elseif(strpos($doc, '@return') === 0)
290
+					} elseif(strpos($doc, '@return') === 0)
300 291
 					{
301 292
 						// syntax: @return type desc
302 293
 						//$returns = preg_split('/\s+/', $doc);
@@ -348,8 +339,7 @@  discard block
 block discarded – undo
348 339
 				if ($decode_php_objects)
349 340
 				{
350 341
 					$innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i, array('decode_php_objs'));\n";
351
-				}
352
-				else
342
+				} else
353 343
 				{
354 344
 					$innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i);\n";
355 345
 				}
@@ -374,8 +364,7 @@  discard block
 block discarded – undo
374 364
 				// only known good synopsis = no parameters
375 365
 				$parsvariations[] = array();
376 366
 				$minpars = 0;
377
-			}
378
-			else
367
+			} else
379 368
 			{
380 369
 				$minpars = count($parsvariations[0]);
381 370
 			}
@@ -386,8 +375,7 @@  discard block
 block discarded – undo
386 375
 				// NB: this check needs to be done BEFORE decoding param values
387 376
 				$innercode = "\$paramcount = \$msg->getNumParams();\n" .
388 377
 				"if (\$paramcount < $minpars) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}');\n" . $innercode;
389
-			}
390
-			else
378
+			} else
391 379
 			{
392 380
 				$innercode = "\$paramcount = \$msg->getNumParams();\n" . $innercode;
393 381
 			}
@@ -400,8 +388,7 @@  discard block
 block discarded – undo
400 388
 				$GLOBALS['xmlrpcWPFObjHolder'][$xmlrpcfuncname] =& $funcname[0];
401 389
 				$innercode .= "\$obj =& \$GLOBALS['xmlrpcWPFObjHolder']['$xmlrpcfuncname'];\n";
402 390
 				$realfuncname = '$obj->'.$funcname[1];
403
-			}
404
-			else
391
+			} else
405 392
 			{
406 393
 				$realfuncname = $plainfuncname;
407 394
 			}
@@ -416,8 +403,7 @@  discard block
 block discarded – undo
416 403
 					if (isset($paramDocs[$i]['type']))
417 404
 					{
418 405
 						$sig[] = php_2_xmlrpc_type($paramDocs[$i]['type']);
419
-					}
420
-					else
406
+					} else
421 407
 					{
422 408
 						$sig[] = $GLOBALS['xmlrpcValue'];
423 409
 					}
@@ -433,13 +419,13 @@  discard block
 block discarded – undo
433 419
 			if($returns == $GLOBALS['xmlrpcDateTime'] || $returns == $GLOBALS['xmlrpcBase64'])
434 420
 			{
435 421
 				$innercode .= "return new {$prefix}resp(new {$prefix}val(\$retval, '$returns'));";
436
-			}
437
-			else
422
+			} else
438 423
 			{
439
-				if ($encode_php_objects)
440
-					$innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval, array('encode_php_objs')));\n";
441
-				else
442
-					$innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval));\n";
424
+				if ($encode_php_objects) {
425
+									$innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval, array('encode_php_objs')));\n";
426
+				} else {
427
+									$innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval));\n";
428
+				}
443 429
 			}
444 430
 			// shall we exclude functions returning by ref?
445 431
 			// if($func->returnsReference())
@@ -556,8 +542,7 @@  discard block
 block discarded – undo
556 542
 		{
557 543
 			$signum = $extra_options;
558 544
 			$extra_options = array();
559
-		}
560
-		else
545
+		} else
561 546
 		{
562 547
 			$signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0;
563 548
 			$timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0;
@@ -578,8 +563,7 @@  discard block
 block discarded – undo
578 563
 		{
579 564
 			$decode_fault = true;
580 565
 			$fault_response = $extra_options['return_on_fault'];
581
-		}
582
-		else
566
+		} else
583 567
 		{
584 568
 			$decode_fault = false;
585 569
 			$fault_response = '';
@@ -598,8 +582,7 @@  discard block
 block discarded – undo
598 582
 		{
599 583
 			error_log('XML-RPC: could not retrieve method signature from remote server for method '.$methodname);
600 584
 			return false;
601
-		}
602
-		else
585
+		} else
603 586
 		{
604 587
 			$msig = $response->value();
605 588
 			if ($client->return_type != 'phpvals')
@@ -610,15 +593,13 @@  discard block
 block discarded – undo
610 593
 			{
611 594
 				error_log('XML-RPC: could not retrieve method signature nr.'.$signum.' from remote server for method '.$methodname);
612 595
 				return false;
613
-			}
614
-			else
596
+			} else
615 597
 			{
616 598
 				// pick a suitable name for the new function, avoiding collisions
617 599
 				if($newfuncname != '')
618 600
 				{
619 601
 					$xmlrpcfuncname = $newfuncname;
620
-				}
621
-				else
602
+				} else
622 603
 				{
623 604
 					// take care to insure that methodname is translated to valid
624 605
 					// php function name
@@ -664,14 +645,12 @@  discard block
 block discarded – undo
664 645
 					if($allOK)
665 646
 					{
666 647
 						return $xmlrpcfuncname;
667
-					}
668
-					else
648
+					} else
669 649
 					{
670 650
 						error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap remote method '.$methodname);
671 651
 						return false;
672 652
 					}
673
-				}
674
-				else
653
+				} else
675 654
 				{
676 655
 					$results['function'] = $xmlrpcfuncname;
677 656
 					return $results;
@@ -711,8 +690,7 @@  discard block
 block discarded – undo
711 690
 		{
712 691
 			error_log('XML-RPC: could not retrieve method list from remote server');
713 692
 			return false;
714
-		}
715
-		else
693
+		} else
716 694
 		{
717 695
 			$mlist = $response->value();
718 696
 			if ($client->return_type != 'phpvals')
@@ -723,15 +701,13 @@  discard block
 block discarded – undo
723 701
 			{
724 702
 				error_log('XML-RPC: could not retrieve meaningful method list from remote server');
725 703
 				return false;
726
-			}
727
-			else
704
+			} else
728 705
 			{
729 706
 				// pick a suitable name for the new function, avoiding collisions
730 707
 				if($newclassname != '')
731 708
 				{
732 709
 					$xmlrpcclassname = $newclassname;
733
-				}
734
-				else
710
+				} else
735 711
 				{
736 712
 					$xmlrpcclassname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
737 713
 						array('_', ''), $client->server).'_client';
@@ -766,8 +742,7 @@  discard block
 block discarded – undo
766 742
 								$source .= $methodwrap['docstring'];
767 743
 							}
768 744
 							$source .= $methodwrap['source']."\n";
769
-						}
770
-						else
745
+						} else
771 746
 						{
772 747
 							error_log('XML-RPC: will not create class method to wrap remote method '.$mname);
773 748
 						}
@@ -783,14 +758,12 @@  discard block
 block discarded – undo
783 758
 					if($allOK)
784 759
 					{
785 760
 						return $xmlrpcclassname;
786
-					}
787
-					else
761
+					} else
788 762
 					{
789 763
 						error_log('XML-RPC: could not create class '.$xmlrpcclassname.' to wrap remote server '.$client->server);
790 764
 						return false;
791 765
 					}
792
-				}
793
-				else
766
+				} else
794 767
 				{
795 768
 					return array('class' => $xmlrpcclassname, 'code' => $source, 'docstring' => '');
796 769
 				}
@@ -818,8 +791,7 @@  discard block
 block discarded – undo
818 791
 			$innercode = build_client_wrapper_code($client, $client_copy_mode, $prefix);
819 792
 			$innercode .= "\$client->setDebug(\$debug);\n";
820 793
 			$this_ = '';
821
-		}
822
-		else
794
+		} else
823 795
 		{
824 796
 			// client copy mode 2 == no client copy in emitted code
825 797
 			$innercode = '';
@@ -831,8 +803,7 @@  discard block
 block discarded – undo
831 803
 		{
832 804
 			// take care that PHP comment is not terminated unwillingly by method description
833 805
 			$mdesc = "/**\n* ".str_replace('*/', '* /', $mdesc)."\n";
834
-		}
835
-		else
806
+		} else
836 807
 		{
837 808
 			$mdesc = "/**\nFunction $xmlrpcfuncname\n";
838 809
 		}
@@ -849,14 +820,12 @@  discard block
 block discarded – undo
849 820
 			{
850 821
 				// only build directly xmlrpcvals when type is known and scalar
851 822
 				$innercode .= "\$p$i = new {$prefix}val(\$p$i, '$ptype');\n";
852
-			}
853
-			else
823
+			} else
854 824
 			{
855 825
 				if ($encode_php_objects)
856 826
 				{
857 827
 					$innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i, array('encode_php_objs'));\n";
858
-				}
859
-				else
828
+				} else
860 829
 				{
861 830
 					$innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i);\n";
862 831
 				}
@@ -878,21 +847,18 @@  discard block
 block discarded – undo
878 847
 			if (is_string($fault_response) && ((strpos($fault_response, '%faultCode%') !== false) || (strpos($fault_response, '%faultString%') !== false)))
879 848
 			{
880 849
 				$respcode = "str_replace(array('%faultCode%', '%faultString%'), array(\$res->faultCode(), \$res->faultString()), '".str_replace("'", "''", $fault_response)."')";
881
-			}
882
-			else
850
+			} else
883 851
 			{
884 852
 				$respcode = var_export($fault_response, true);
885 853
 			}
886
-		}
887
-		else
854
+		} else
888 855
 		{
889 856
 			$respcode = '$res';
890 857
 		}
891 858
 		if ($decode_php_objects)
892 859
 		{
893 860
 			$innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value(), array('decode_php_objs'));";
894
-		}
895
-		else
861
+		} else
896 862
 		{
897 863
 			$innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value());";
898 864
 		}
Please login to merge, or discard this patch.