1 <html>
\r\r<head><title>xmlrpc</title></head>
\r\r<body>
\r\r<h1>Introspect demo</h1>
\r\r<h2>Query server for available methods and their description</h2>
\r\r<h3>The code demonstrates usage of multicall and introspection methods</h3>
\r\r<?php
\r\rinclude "xmlrpc.inc";
\r\r\rfunction display_error($r)
\r\r\r{
\r\r\r print "An error occurred: ";
\r\r\r print "Code: " . $r->faultCode()
\r\r . " Reason: '" . $r->faultString() . "'<br/>";
\r\r\r}
\r\r\r// 'new style' client constuctor
\r\r$c = new xmlrpc_client("http://phpxmlrpc.sourceforge.net/server.php");
\r\rprint "<h3>methods available at http://" . $c->server . $c->path . "</h3>\n";
\r\r\r$m = new xmlrpcmsg('system.listMethods');
\r\r$r = &$c->send($m);
\r\rif ($r->faultCode()) {
\r\r\r display_error($r);
\r\r\r} else {
\r\r\r $v = $r->value();
\r\r\r for ($i = 0; $i < $v->arraysize(); $i++) {
\r\r\r $mname = $v->arraymem($i);
\r\r\r print "<h4>" . $mname->scalarval() . "</h4>\n";
\r\r\r // build messages first, add params later
\r\r $m1 = new xmlrpcmsg('system.methodHelp');
\r\r\r $m2 = new xmlrpcmsg('system.methodSignature');
\r\r\r $val = new xmlrpcval($mname->scalarval(), "string");
\r\r\r $m1->addParam($val);
\r\r\r $m2->addParam($val);
\r\r\r // send multiple messages in one pass.
\r\r // If server does not support multicall, client will fall back to 2 separate calls
\r\r $ms = array($m1, $m2);
\r\r\r $rs = &$c->send($ms);
\r\r\r if ($rs[0]->faultCode()) {
\r\r\r display_error($rs[0]);
\r\r\r } else {
\r\r\r $val = $rs[0]->value();
\r\r\r $txt = $val->scalarval();
\r\r\r if ($txt != "") {
\r\r\r print "<h4>Documentation</h4><p>${txt}</p>\n";
\r\r\r } else {
\r\r\r print "<p>No documentation available.</p>\n";
\r\r\r }
\r\r\r }
\r\r\r if ($rs[1]->faultCode()) {
\r\r\r display_error($rs[1]);
\r\r\r } else {
\r\r\r print "<h4>Signature</h4><p>\n";
\r\r\r $val = $rs[1]->value();
\r\r\r if ($val->kindOf() == "array") {
\r\r\r for ($j = 0; $j < $val->arraysize(); $j++) {
\r\r\r $x = $val->arraymem($j);
\r\r\r $ret = $x->arraymem(0);
\r\r\r print "<code>" . $ret->scalarval() . " "
\r\r . $mname->scalarval() . "(";
\r\r\r if ($x->arraysize() > 1) {
\r\r\r for ($k = 1; $k < $x->arraysize(); $k++) {
\r\r\r $y = $x->arraymem($k);
\r\r\r print $y->scalarval();
\r\r\r if ($k < $x->arraysize() - 1) {
\r\r\r print ", ";
\r\r\r }
\r\r\r }
\r\r\r }
\r\r\r print ")</code><br/>\n";
\r\r\r }
\r\r\r } else {
\r\r\r print "Signature unknown\n";
\r\r\r }
\r\r\r print "</p>\n";
\r\r\r }
\r\r\r }
\r\r\r}
\r\r?>
\r\r</body>
\r\r</html>
\r