Current File : //opt/RZphp74/includes/XML/RPC2/Client.php |
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
// LICENSE AGREEMENT. If folded, press za here to unfold and read license {{{
/**
* +-----------------------------------------------------------------------------+
* | Copyright (c) 2004-2006 Sergio Goncalves Carvalho |
* +-----------------------------------------------------------------------------+
* | This file is part of XML_RPC2. |
* | |
* | XML_RPC2 is free software; you can redistribute it and/or modify |
* | it under the terms of the GNU Lesser General Public License as published by |
* | the Free Software Foundation; either version 2.1 of the License, or |
* | (at your option) any later version. |
* | |
* | XML_RPC2 is distributed in the hope that it will be useful, |
* | but WITHOUT ANY WARRANTY; without even the implied warranty of |
* | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
* | GNU Lesser General Public License for more details. |
* | |
* | You should have received a copy of the GNU Lesser General Public License |
* | along with XML_RPC2; if not, write to the Free Software |
* | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
* | 02111-1307 USA |
* +-----------------------------------------------------------------------------+
* | Author: Sergio Carvalho <sergio.carvalho@portugalmail.com> |
* +-----------------------------------------------------------------------------+
*
* @category XML
* @package XML_RPC2
* @author Sergio Carvalho <sergio.carvalho@portugalmail.com>
* @copyright 2004-2006 Sergio Carvalho
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id$
* @link http://pear.php.net/package/XML_RPC2
*/
// }}}
// dependencies {{{
require_once 'XML/RPC2/Exception.php';
require_once 'XML/RPC2/Backend.php';
require_once 'XML/RPC2/ClientHelper.php';
// }}}
/**
* XML_RPC client class. Use this class to access remote methods.
*
* To use this class, construct it providing the server URL and method prefix.
* Then, call remote methods on the new instance as if they were local.
*
* Example:
* <code>
* require_once 'XML_RPC2/Client.php';
*
* $client = XML_RPC2_Client('http://xmlrpc.example.com/1.0/', 'example.');
* $result = $client->hello('Sergio');
* print($result);
* </code>
*
* The above example will call the example.hello method on the xmlrpc.example.com
* server, under the /1.0/ URI.
*
* @category XML
* @package XML_RPC2
* @author Sergio Carvalho <sergio.carvalho@portugalmail.com>
* @copyright 2004-2006 Sergio Carvalho
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @link http://pear.php.net/package/XML_RPC2
*/
abstract class XML_RPC2_Client
{
// {{{ properties
/**
* uri Field (holds the uri for the XML_RPC server)
*
* @var string
*/
protected $uri = null;
/**
* proxy Field (holds the proxy server data)
*
* @var string
*/
protected $proxy = null;
/**
* Holds the prefix to prepend to method names
*
* @var string
*/
protected $prefix = null;
/**
* Holds the debug flag
*
* @var boolean
*/
protected $debug = false;
/**
* Hold the encoding of the client request
*
* @var string
*/
protected $encoding = 'utf-8';
/**
* Holds the escaping method(s) of the client request
*
* @var string
*/
protected $escaping = array('non-ascii', 'non-print', 'markup');
/**
* Holds the SSL verify flag
*
* @var boolean
*/
protected $sslverify = true;
/**
* Holds the connection timeout in milliseconds of the client request.
*
* @var integer
*/
protected $connectionTimeout = null;
/**
* ugly hack flag to avoid http://bugs.php.net/bug.php?id=21949
*
* see XML_RPC2_Backend_Xmlrpcext_Value::createFromNative() from more infos
*/
protected $uglyStructHack = true;
/**
* Preconfigured HTTP_Request2 provided by the user
*
* @var HTTP_Request2
*/
protected $httpRequest;
// }}}
// {{{ constructor
/**
* Construct a new XML_RPC2_Client.
*
* To create a new XML_RPC2_Client, a URI must be provided (e.g. http://xmlrpc.example.com/1.0/).
* Optionally, some options may be set as an associative array. Accepted keys are :
* 'prefix', 'proxy', 'debug' => see correspondant property to get more informations
* 'encoding' => The XML encoding for the requests (optional, defaults to utf-8)
* 'sslverify' => boolean, true iff SSL certificates are to be verified against local cert database (optional, default false)
* 'connectionTimeout' => Timeout, in seconds, for the XML-RPC HTTP request (optional, default is no timeout)
* 'httpRequest' => Preconfigured HTTP_Request2 instance to be used in executing the XML-RPC calls (optional)
*
* @param string URI for the XML-RPC server
* @param array (optional) Associative array of options
*/
protected function __construct($uri, $options = array())
{
if (!$uriParse = parse_url($uri)) {
throw new XML_RPC2_InvalidUriException(sprintf('Client URI \'%s\' is not valid', $uri));
}
$this->uri = $uri;
if (isset($options['prefix'])) {
if (!(XML_RPC2_ClientHelper::testMethodName($options['prefix']))) {
throw new XML_RPC2_InvalidPrefixException(sprintf('Prefix \'%s\' is not valid', $options['prefix']));
}
$this->prefix = $options['prefix'];
}
if (isset($options['proxy'])) {
if (!$proxyParse = parse_url($options['proxy'])) {
throw new XML_RPC2_InvalidProxyException(sprintf('Proxy URI \'%s\' is not valid', $options['proxy']));
}
$this->proxy = $options['proxy'];
}
if (isset($options['debug'])) {
if (!(is_bool($options['debug']))) {
throw new XML_RPC2_InvalidDebugException(sprintf('Debug \'%s\' is not valid', $options['debug']));
}
$this->debug = $options['debug'];
}
if (isset($options['encoding'])) {
// TODO : control & exception
$this->encoding = $options['encoding'];
}
if (isset($options['escaping'])) {
// TODO : control & exception
$this->escaping = $options['escaping'];
}
if (isset($options['uglyStructHack'])) {
$this->uglyStructHack = $options['uglyStructHack'];
}
if (isset($options['sslverify'])) {
if (!(is_bool($options['sslverify']))) {
throw new XML_RPC2_InvalidSslverifyException(sprintf('SSL verify \'%s\' is not valid', $options['sslverify']));
}
$this->sslverify = $options['sslverify'];
}
if (isset($options['connectionTimeout'])) {
if (!(is_int($options['connectionTimeout']))) {
throw new XML_RPC2_InvalidConnectionTimeoutException(sprintf('Connection timeout \'%s\' is not valid', $options['connectionTimeout']));
}
$this->connectionTimeout = $options['connectionTimeout'];
}
if (isset($options['httpRequest'])) {
$this->httpRequest = $options['httpRequest'];
}
}
// }}}
// {{{ create()
/**
* Factory method to select, create and return a XML_RPC2_Client backend
*
* To create a new XML_RPC2_Client, a URI must be provided (e.g. http://xmlrpc.example.com/1.0/).
*
* Optionally, some options may be set.
*
* @param string URI for the XML-RPC server
* @param array (optional) associative array of options (see constructor)
*/
public static function create($uri, $options = array())
{
if (isset($this)) { // Method called non-statically forward to remote call() as RPC
$this->__call('create', func_get_args());
}
if (isset($options['backend'])) {
XML_RPC2_Backend::setBackend($options['backend']);
}
$backend = XML_RPC2_Backend::getClientClassname();
return new $backend($uri, $options);
}
// }}}
// {{{ __call()
/**
* __call Catchall. This method catches remote method calls and provides for remote forwarding.
*
* If the parameters are native types, this method will use XML_RPC_Value::createFromNative to
* convert it into an XML-RPC type. Whenever a parameter is already an instance of XML_RPC_Value
* it will be used as provided. It follows that, in situations when XML_RPC_Value::createFromNative
* proves inacurate -- as when encoding DateTime values -- you should present an instance of
* XML_RPC_Value in lieu of the native parameter.
*
* @param string Method name
* @param array Parameters
* @return mixed The call result, already decoded into native types
*/
public abstract function __call($methodName, $parameters);
// }}}
}