xmlrpc.inc: Converted $GLOBALS array to internal class Xmlrpc
authorSamu Voutilainen <smar@smar.fi>
Wed, 21 May 2014 12:50:05 +0000 (15:50 +0300)
committerSamu Voutilainen <smar@smar.fi>
Thu, 22 May 2014 08:31:13 +0000 (11:31 +0300)
This way $GLOBALS array won’t be polluted with internal data of
us, and if something else does something to that array, it
won’t affect us anymore.

ChangeLog
lib/xmlrpc.inc

index a4ca76e..c4c793d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,7 @@
        * removed obsolete xml.so open; dl() is deprecated and removed from 5.3.0\r
        * removed deprecated xmlEntities\r
        * removed deprecated xmlrpc_backslash\r
+       * converted $GLOBALS to internal class. This makes testing much easier and should be more flexible regarding other projects\r
 \r
 2014-02-03 - G. Giunta (giunta.gaetano@gmail.com)\r
 \r
index b7adaee..52a1104 100644 (file)
 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
 // OF THE POSSIBILITY OF SUCH DAMAGE.\r
 \r
-       // G. Giunta 2005/01/29: declare global these variables,\r
-       // so that xmlrpc.inc will work even if included from within a function\r
-       // Milosch: 2005/08/07 - explicitly request these via $GLOBALS where used.\r
-       $GLOBALS['xmlrpcI4']='i4';\r
-       $GLOBALS['xmlrpcInt']='int';\r
-       $GLOBALS['xmlrpcBoolean']='boolean';\r
-       $GLOBALS['xmlrpcDouble']='double';\r
-       $GLOBALS['xmlrpcString']='string';\r
-       $GLOBALS['xmlrpcDateTime']='dateTime.iso8601';\r
-       $GLOBALS['xmlrpcBase64']='base64';\r
-       $GLOBALS['xmlrpcArray']='array';\r
-       $GLOBALS['xmlrpcStruct']='struct';\r
-       $GLOBALS['xmlrpcValue']='undefined';\r
-\r
-       $GLOBALS['xmlrpcTypes']=array(\r
-               $GLOBALS['xmlrpcI4']       => 1,\r
-               $GLOBALS['xmlrpcInt']      => 1,\r
-               $GLOBALS['xmlrpcBoolean']  => 1,\r
-               $GLOBALS['xmlrpcString']   => 1,\r
-               $GLOBALS['xmlrpcDouble']   => 1,\r
-               $GLOBALS['xmlrpcDateTime'] => 1,\r
-               $GLOBALS['xmlrpcBase64']   => 1,\r
-               $GLOBALS['xmlrpcArray']    => 2,\r
-               $GLOBALS['xmlrpcStruct']   => 3\r
-       );\r
-\r
-       $GLOBALS['xmlrpc_valid_parents'] = array(\r
+class Xmlrpc {\r
+\r
+       public $xmlrpcI4 = "i4";\r
+       public $xmlrpcInt = "int";\r
+       public $xmlrpcBoolean = "boolean";\r
+       public $xmlrpcDouble = "double";\r
+       public $xmlrpcString = "string";\r
+       public $xmlrpcDateTime = "dateTime.iso8601";\r
+       public $xmlrpcBase64 = "base64";\r
+       public $xmlrpcArray = "array";\r
+       public $xmlrpcStruct = "struct";\r
+       public $xmlrpcValue = "undefined";\r
+       public $xmlrpcNull = "null";\r
+\r
+       public $xmlrpcTypes;\r
+\r
+       public $xmlrpc_valid_parents = array(\r
                'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'),\r
                'BOOLEAN' => array('VALUE'),\r
                'I4' => array('VALUE'),\r
                'EX:NIL' => array('VALUE') // only used when extension activated\r
        );\r
 \r
-       // define extra types for supporting NULL (useful for json or <NIL/>)\r
-       $GLOBALS['xmlrpcNull']='null';\r
-       $GLOBALS['xmlrpcTypes']['null']=1;\r
-\r
        // tables used for transcoding different charsets into us-ascii xml\r
-\r
-       $GLOBALS['xml_iso88591_Entities']=array();\r
-       $GLOBALS['xml_iso88591_Entities']['in'] = array();\r
-       $GLOBALS['xml_iso88591_Entities']['out'] = array();\r
-       for ($i = 0; $i < 32; $i++)\r
-       {\r
-               $GLOBALS['xml_iso88591_Entities']['in'][] = chr($i);\r
-               $GLOBALS['xml_iso88591_Entities']['out'][] = '&#'.$i.';';\r
-       }\r
-       for ($i = 160; $i < 256; $i++)\r
-       {\r
-               $GLOBALS['xml_iso88591_Entities']['in'][] = chr($i);\r
-               $GLOBALS['xml_iso88591_Entities']['out'][] = '&#'.$i.';';\r
-       }\r
+       public $xml_iso88591_Entities = array("in" => array(), "out" => array());\r
 \r
        /// @todo add to iso table the characters from cp_1252 range, i.e. 128 to 159?\r
        /// These will NOT be present in true ISO-8859-1, but will save the unwary\r
        /// windows user from sending junk (though no luck when reciving them...)\r
-  /*\r
+       /*\r
        $GLOBALS['xml_cp1252_Entities']=array();\r
        for ($i = 128; $i < 160; $i++)\r
        {\r
                '&#x02DC;', '&#x2122;', '&#x0161;', '&#x203A;',\r
                '&#x0153;', '?',        '&#x017E;', '&#x0178;'\r
        );\r
-  */\r
-\r
-       $GLOBALS['xmlrpcerr'] = array(\r
-       'unknown_method'=>1,\r
-       'invalid_return'=>2,\r
-       'incorrect_params'=>3,\r
-       'introspect_unknown'=>4,\r
-       'http_error'=>5,\r
-       'no_data'=>6,\r
-       'no_ssl'=>7,\r
-       'curl_fail'=>8,\r
-       'invalid_request'=>15,\r
-       'no_curl'=>16,\r
-       'server_error'=>17,\r
-       'multicall_error'=>18,\r
-       'multicall_notstruct'=>9,\r
-       'multicall_nomethod'=>10,\r
-       'multicall_notstring'=>11,\r
-       'multicall_recursion'=>12,\r
-       'multicall_noparams'=>13,\r
-       'multicall_notarray'=>14,\r
-\r
-       'cannot_decompress'=>103,\r
-       'decompress_fail'=>104,\r
-       'dechunk_fail'=>105,\r
-       'server_cannot_decompress'=>106,\r
-       'server_decompress_fail'=>107\r
+       */\r
+\r
+       public $xmlrpcerr = array(\r
+               'unknown_method'=>1,\r
+               'invalid_return'=>2,\r
+               'incorrect_params'=>3,\r
+               'introspect_unknown'=>4,\r
+               'http_error'=>5,\r
+               'no_data'=>6,\r
+               'no_ssl'=>7,\r
+               'curl_fail'=>8,\r
+               'invalid_request'=>15,\r
+               'no_curl'=>16,\r
+               'server_error'=>17,\r
+               'multicall_error'=>18,\r
+               'multicall_notstruct'=>9,\r
+               'multicall_nomethod'=>10,\r
+               'multicall_notstring'=>11,\r
+               'multicall_recursion'=>12,\r
+               'multicall_noparams'=>13,\r
+               'multicall_notarray'=>14,\r
+\r
+               'cannot_decompress'=>103,\r
+               'decompress_fail'=>104,\r
+               'dechunk_fail'=>105,\r
+               'server_cannot_decompress'=>106,\r
+               'server_decompress_fail'=>107\r
        );\r
 \r
-       $GLOBALS['xmlrpcstr'] = array(\r
-       'unknown_method'=>'Unknown method',\r
-       'invalid_return'=>'Invalid return payload: enable debugging to examine incoming payload',\r
-       'incorrect_params'=>'Incorrect parameters passed to method',\r
-       'introspect_unknown'=>"Can't introspect: method unknown",\r
-       'http_error'=>"Didn't receive 200 OK from remote server.",\r
-       'no_data'=>'No data received from server.',\r
-       'no_ssl'=>'No SSL support compiled in.',\r
-       'curl_fail'=>'CURL error',\r
-       'invalid_request'=>'Invalid request payload',\r
-       'no_curl'=>'No CURL support compiled in.',\r
-       'server_error'=>'Internal server error',\r
-       'multicall_error'=>'Received from server invalid multicall response',\r
-       'multicall_notstruct'=>'system.multicall expected struct',\r
-       'multicall_nomethod'=>'missing methodName',\r
-       'multicall_notstring'=>'methodName is not a string',\r
-       'multicall_recursion'=>'recursive system.multicall forbidden',\r
-       'multicall_noparams'=>'missing params',\r
-       'multicall_notarray'=>'params is not an array',\r
-\r
-       'cannot_decompress'=>'Received from server compressed HTTP and cannot decompress',\r
-       'decompress_fail'=>'Received from server invalid compressed HTTP',\r
-       'dechunk_fail'=>'Received from server invalid chunked HTTP',\r
-       'server_cannot_decompress'=>'Received from client compressed HTTP request and cannot decompress',\r
-       'server_decompress_fail'=>'Received from client invalid compressed HTTP request'\r
+       public $xmlrpcstr = array(\r
+               'unknown_method'=>'Unknown method',\r
+               'invalid_return'=>'Invalid return payload: enable debugging to examine incoming payload',\r
+               'incorrect_params'=>'Incorrect parameters passed to method',\r
+               'introspect_unknown'=>"Can't introspect: method unknown",\r
+               'http_error'=>"Didn't receive 200 OK from remote server.",\r
+               'no_data'=>'No data received from server.',\r
+               'no_ssl'=>'No SSL support compiled in.',\r
+               'curl_fail'=>'CURL error',\r
+               'invalid_request'=>'Invalid request payload',\r
+               'no_curl'=>'No CURL support compiled in.',\r
+               'server_error'=>'Internal server error',\r
+               'multicall_error'=>'Received from server invalid multicall response',\r
+               'multicall_notstruct'=>'system.multicall expected struct',\r
+               'multicall_nomethod'=>'missing methodName',\r
+               'multicall_notstring'=>'methodName is not a string',\r
+               'multicall_recursion'=>'recursive system.multicall forbidden',\r
+               'multicall_noparams'=>'missing params',\r
+               'multicall_notarray'=>'params is not an array',\r
+\r
+               'cannot_decompress'=>'Received from server compressed HTTP and cannot decompress',\r
+               'decompress_fail'=>'Received from server invalid compressed HTTP',\r
+               'dechunk_fail'=>'Received from server invalid chunked HTTP',\r
+               'server_cannot_decompress'=>'Received from client compressed HTTP request and cannot decompress',\r
+               'server_decompress_fail'=>'Received from client invalid compressed HTTP request'\r
        );\r
 \r
        // The charset encoding used by the server for received messages and\r
        // by the client for received responses when received charset cannot be determined\r
        // or is not supported\r
-       $GLOBALS['xmlrpc_defencoding']='UTF-8';\r
+       public $xmlrpc_defencoding = "UTF-8";\r
 \r
        // The encoding used internally by PHP.\r
        // String values received as xml will be converted to this, and php strings will be converted to xml\r
        // as if having been coded with this\r
-       $GLOBALS['xmlrpc_internalencoding']='ISO-8859-1';\r
+       public $xmlrpc_internalencoding = "ISO-8859-1"; // TODO: maybe this would be better as UTF-8, or atleast configurable?\r
 \r
-       $GLOBALS['xmlrpcName']='XML-RPC for PHP';\r
-       $GLOBALS['xmlrpcVersion']='3.0.0.beta';\r
+       public $xmlrpcName = "XML-RPC for PHP";\r
+       public $xmlrpcVersion = "3.0.0.beta";\r
 \r
        // let user errors start at 800\r
-       $GLOBALS['xmlrpcerruser']=800;\r
+       public $xmlrpcerruser = 800;\r
        // let XML parse errors start at 100\r
-       $GLOBALS['xmlrpcerrxml']=100;\r
+       public $xmlrpcerrxml = 100;\r
 \r
        // set to TRUE to enable correct decoding of <NIL/> and <EX:NIL/> values\r
-       $GLOBALS['xmlrpc_null_extension']=false;\r
+       public $xmlrpc_null_extension = false;\r
 \r
        // set to TRUE to enable encoding of php NULL values to <EX:NIL/> instead of <NIL/>\r
-       $GLOBALS['xmlrpc_null_apache_encoding']=false;\r
-    $GLOBALS['xmlrpc_null_apache_encoding_ns']='http://ws.apache.org/xmlrpc/namespaces/extensions';\r
+       public $xmlrpc_null_apache_encoding = false;\r
+\r
+       public $xmlrpc_null_apache_encoding_ns = "http://ws.apache.org/xmlrpc/namespaces/extensions";\r
 \r
        // used to store state during parsing\r
        // quick explanation of components:\r
        //   method - used to store method name\r
        //   stack - array with genealogy of xml elements names:\r
        //           used to validate nesting of xmlrpc elements\r
-       $GLOBALS['_xh']=null;\r
+       public $_xh = null;\r
+\r
+       private static $instance = null;\r
+\r
+       private function __construct() {\r
+               $this->xmlrpcTypes = array(\r
+                       $this->xmlrpcI4 => 1,\r
+                       $this->xmlrpcInt => 1,\r
+                       $this->xmlrpcBoolean => 1,\r
+                       $this->xmlrpcDouble => 1,\r
+                       $this->xmlrpcString => 1,\r
+                       $this->xmlrpcDateTime => 1,\r
+                       $this->xmlrpcBase64 => 1,\r
+                       $this->xmlrpcArray => 2,\r
+                       $this->xmlrpcStruct => 3,\r
+                       $this->xmlrpcNull => 1\r
+               );\r
+\r
+               for($i = 0; $i < 32; $i++) {\r
+                       $this->xml_iso88591_Entities["in"][] = chr($i);\r
+                       $this->xml_iso88591_Entities["out"][] = "&#{$i};";\r
+               }\r
+\r
+               for($i = 160; $i < 256; $i++) {\r
+                       $this->xml_iso88591_Entities["in"][] = chr($i);\r
+                       $this->xml_iso88591_Entities["out"][] = "&#{$i};";\r
+               }\r
+       }\r
+\r
+       /**\r
+        * This class is singleton for performance reasons: this way the ASCII array needs to be done only once.\r
+        */\r
+       public static function instance() {\r
+               if(Xmlrpc::$instance === null) {\r
+                       Xmlrpc::$instance = new Xmlrpc();\r
+               }\r
+\r
+               return Xmlrpc::$instance;\r
+       }\r
+}\r
 \r
        /**\r
        * Convert a string to the correct XML representation in a target charset\r
        */\r
        function xmlrpc_encode_entitites($data, $src_encoding='', $dest_encoding='')\r
        {\r
+               $xmlrpc = Xmlrpc::instance();\r
                if ($src_encoding == '')\r
                {\r
                        // lame, but we know no better...\r
-                       $src_encoding = $GLOBALS['xmlrpc_internalencoding'];\r
+                       $src_encoding = $xmlrpc->xmlrpc_internalencoding;\r
                }\r
 \r
                switch(strtoupper($src_encoding.'_'.$dest_encoding))\r
                        case 'ISO-8859-1_':\r
                        case 'ISO-8859-1_US-ASCII':\r
                                $escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&amp;', '&quot;', '&apos;', '&lt;', '&gt;'), $data);\r
-                               $escaped_data = str_replace($GLOBALS['xml_iso88591_Entities']['in'], $GLOBALS['xml_iso88591_Entities']['out'], $escaped_data);\r
+                               $escaped_data = str_replace($xmlrpc->xml_iso88591_Entities['in'], $xmlrpc->xml_iso88591_Entities['out'], $escaped_data);\r
                                break;\r
                        case 'ISO-8859-1_UTF-8':\r
                                $escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&amp;', '&quot;', '&apos;', '&lt;', '&gt;'), $data);\r
        /// xml parser handler function for opening element tags\r
        function xmlrpc_se($parser, $name, $attrs, $accept_single_vals=false)\r
        {\r
+               $xmlrpc = Xmlrpc::instance();\r
                // if invalid xmlrpc already detected, skip all processing\r
-               if ($GLOBALS['_xh']['isf'] < 2)\r
+               if ($xmlrpc->_xh['isf'] < 2)\r
                {\r
                        // check for correct element nesting\r
                        // top level element can only be of 2 types\r
                        /// @todo optimization creep: save this check into a bool variable, instead of using count() every time:\r
                        ///       there is only a single top level element in xml anyway\r
-                       if (count($GLOBALS['_xh']['stack']) == 0)\r
+                       if (count($xmlrpc->_xh['stack']) == 0)\r
                        {\r
                                if ($name != 'METHODRESPONSE' && $name != 'METHODCALL' && (\r
                                        $name != 'VALUE' && !$accept_single_vals))\r
                                {\r
-                                       $GLOBALS['_xh']['isf'] = 2;\r
-                                       $GLOBALS['_xh']['isf_reason'] = 'missing top level xmlrpc element';\r
+                                       $xmlrpc->_xh['isf'] = 2;\r
+                                       $xmlrpc->_xh['isf_reason'] = 'missing top level xmlrpc element';\r
                                        return;\r
                                }\r
                                else\r
                                {\r
-                                       $GLOBALS['_xh']['rt'] = strtolower($name);\r
-                                       $GLOBALS['_xh']['rt'] = strtolower($name);\r
+                                       $xmlrpc->_xh['rt'] = strtolower($name);\r
+                                       $xmlrpc->_xh['rt'] = strtolower($name);\r
                                }\r
                        }\r
                        else\r
                        {\r
                                // not top level element: see if parent is OK\r
-                               $parent = end($GLOBALS['_xh']['stack']);\r
-                               if (!array_key_exists($name, $GLOBALS['xmlrpc_valid_parents']) || !in_array($parent, $GLOBALS['xmlrpc_valid_parents'][$name]))\r
+                               $parent = end($xmlrpc->_xh['stack']);\r
+                               if (!array_key_exists($name, $xmlrpc->xmlrpc_valid_parents) || !in_array($parent, $xmlrpc->xmlrpc_valid_parents[$name]))\r
                                {\r
-                                       $GLOBALS['_xh']['isf'] = 2;\r
-                                       $GLOBALS['_xh']['isf_reason'] = "xmlrpc element $name cannot be child of $parent";\r
+                                       $xmlrpc->_xh['isf'] = 2;\r
+                                       $xmlrpc->_xh['isf_reason'] = "xmlrpc element $name cannot be child of $parent";\r
                                        return;\r
                                }\r
                        }\r
                                // optimize for speed switch cases: most common cases first\r
                                case 'VALUE':\r
                                        /// @todo we could check for 2 VALUE elements inside a MEMBER or PARAM element\r
-                                       $GLOBALS['_xh']['vt']='value'; // indicator: no value found yet\r
-                                       $GLOBALS['_xh']['ac']='';\r
-                                       $GLOBALS['_xh']['lv']=1;\r
-                                       $GLOBALS['_xh']['php_class']=null;\r
+                                       $xmlrpc->_xh['vt']='value'; // indicator: no value found yet\r
+                                       $xmlrpc->_xh['ac']='';\r
+                                       $xmlrpc->_xh['lv']=1;\r
+                                       $xmlrpc->_xh['php_class']=null;\r
                                        break;\r
                                case 'I4':\r
                                case 'INT':\r
                                case 'DOUBLE':\r
                                case 'DATETIME.ISO8601':\r
                                case 'BASE64':\r
-                                       if ($GLOBALS['_xh']['vt']!='value')\r
+                                       if ($xmlrpc->_xh['vt']!='value')\r
                                        {\r
                                                //two data elements inside a value: an error occurred!\r
-                                               $GLOBALS['_xh']['isf'] = 2;\r
-                                               $GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";\r
+                                               $xmlrpc->_xh['isf'] = 2;\r
+                                               $xmlrpc->_xh['isf_reason'] = "$name element following a {$xmlrpc->_xh['vt']} element inside a single value";\r
                                                return;\r
                                        }\r
-                                       $GLOBALS['_xh']['ac']=''; // reset the accumulator\r
+                                       $xmlrpc->_xh['ac']=''; // reset the accumulator\r
                                        break;\r
                                case 'STRUCT':\r
                                case 'ARRAY':\r
-                                       if ($GLOBALS['_xh']['vt']!='value')\r
+                                       if ($xmlrpc->_xh['vt']!='value')\r
                                        {\r
                                                //two data elements inside a value: an error occurred!\r
-                                               $GLOBALS['_xh']['isf'] = 2;\r
-                                               $GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";\r
+                                               $xmlrpc->_xh['isf'] = 2;\r
+                                               $xmlrpc->_xh['isf_reason'] = "$name element following a {$xmlrpc->_xh['vt']} element inside a single value";\r
                                                return;\r
                                        }\r
                                        // create an empty array to hold child values, and push it onto appropriate stack\r
                                        {\r
                                                $cur_val['php_class'] = $attrs['PHP_CLASS'];\r
                                        }\r
-                                       $GLOBALS['_xh']['valuestack'][] = $cur_val;\r
-                                       $GLOBALS['_xh']['vt']='data'; // be prepared for a data element next\r
+                                       $xmlrpc->_xh['valuestack'][] = $cur_val;\r
+                                       $xmlrpc->_xh['vt']='data'; // be prepared for a data element next\r
                                        break;\r
                                case 'DATA':\r
-                                       if ($GLOBALS['_xh']['vt']!='data')\r
+                                       if ($xmlrpc->_xh['vt']!='data')\r
                                        {\r
                                                //two data elements inside a value: an error occurred!\r
-                                               $GLOBALS['_xh']['isf'] = 2;\r
-                                               $GLOBALS['_xh']['isf_reason'] = "found two data elements inside an array element";\r
+                                               $xmlrpc->_xh['isf'] = 2;\r
+                                               $xmlrpc->_xh['isf_reason'] = "found two data elements inside an array element";\r
                                                return;\r
                                        }\r
                                case 'METHODCALL':\r
                                case 'METHODNAME':\r
                                case 'NAME':\r
                                        /// @todo we could check for 2 NAME elements inside a MEMBER element\r
-                                       $GLOBALS['_xh']['ac']='';\r
+                                       $xmlrpc->_xh['ac']='';\r
                                        break;\r
                                case 'FAULT':\r
-                                       $GLOBALS['_xh']['isf']=1;\r
+                                       $xmlrpc->_xh['isf']=1;\r
                                        break;\r
                                case 'MEMBER':\r
-                                       $GLOBALS['_xh']['valuestack'][count($GLOBALS['_xh']['valuestack'])-1]['name']=''; // set member name to null, in case we do not find in the xml later on\r
-                                       //$GLOBALS['_xh']['ac']='';\r
+                                       $xmlrpc->_xh['valuestack'][count($xmlrpc->_xh['valuestack'])-1]['name']=''; // set member name to null, in case we do not find in the xml later on\r
+                                       //$xmlrpc->_xh['ac']='';\r
                                        // Drop trough intentionally\r
                                case 'PARAM':\r
                                        // clear value type, so we can check later if no value has been passed for this param/member\r
-                                       $GLOBALS['_xh']['vt']=null;\r
+                                       $xmlrpc->_xh['vt']=null;\r
                                        break;\r
                                case 'NIL':\r
                                case 'EX:NIL':\r
-                                       if ($GLOBALS['xmlrpc_null_extension'])\r
+                                       if ($xmlrpc->xmlrpc_null_extension)\r
                                        {\r
-                                               if ($GLOBALS['_xh']['vt']!='value')\r
+                                               if ($xmlrpc->_xh['vt']!='value')\r
                                                {\r
                                                        //two data elements inside a value: an error occurred!\r
-                                                       $GLOBALS['_xh']['isf'] = 2;\r
-                                                       $GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";\r
+                                                       $xmlrpc->_xh['isf'] = 2;\r
+                                                       $xmlrpc->_xh['isf_reason'] = "$name element following a {$xmlrpc->_xh['vt']} element inside a single value";\r
                                                        return;\r
                                                }\r
-                                               $GLOBALS['_xh']['ac']=''; // reset the accumulator\r
+                                               $xmlrpc->_xh['ac']=''; // reset the accumulator\r
                                                break;\r
                                        }\r
                                        // we do not support the <NIL/> extension, so\r
                                        // drop through intentionally\r
                                default:\r
                                        /// INVALID ELEMENT: RAISE ISF so that it is later recognized!!!\r
-                                       $GLOBALS['_xh']['isf'] = 2;\r
-                                       $GLOBALS['_xh']['isf_reason'] = "found not-xmlrpc xml element $name";\r
+                                       $xmlrpc->_xh['isf'] = 2;\r
+                                       $xmlrpc->_xh['isf_reason'] = "found not-xmlrpc xml element $name";\r
                                        break;\r
                        }\r
 \r
                        // Save current element name to stack, to validate nesting\r
-                       $GLOBALS['_xh']['stack'][] = $name;\r
+                       $xmlrpc->_xh['stack'][] = $name;\r
 \r
                        /// @todo optimization creep: move this inside the big switch() above\r
                        if($name!='VALUE')\r
                        {\r
-                               $GLOBALS['_xh']['lv']=0;\r
+                               $xmlrpc->_xh['lv']=0;\r
                        }\r
                }\r
        }\r
        /// xml parser handler function for close element tags\r
        function xmlrpc_ee($parser, $name, $rebuild_xmlrpcvals = true)\r
        {\r
-               if ($GLOBALS['_xh']['isf'] < 2)\r
+               $xmlrpc = Xmlrpc::instance();\r
+\r
+               if ($xmlrpc->_xh['isf'] < 2)\r
                {\r
                        // push this element name from stack\r
                        // NB: if XML validates, correct opening/closing is guaranteed and\r
                        // we do not have to check for $name == $curr_elem.\r
                        // we also checked for proper nesting at start of elements...\r
-                       $curr_elem = array_pop($GLOBALS['_xh']['stack']);\r
+                       $curr_elem = array_pop($xmlrpc->_xh['stack']);\r
 \r
                        switch($name)\r
                        {\r
                                case 'VALUE':\r
                                        // This if() detects if no scalar was inside <VALUE></VALUE>\r
-                                       if ($GLOBALS['_xh']['vt']=='value')\r
+                                       if ($xmlrpc->_xh['vt']=='value')\r
                                        {\r
-                                               $GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];\r
-                                               $GLOBALS['_xh']['vt']=$GLOBALS['xmlrpcString'];\r
+                                               $xmlrpc->_xh['value']=$xmlrpc->_xh['ac'];\r
+                                               $xmlrpc->_xh['vt']=$xmlrpc->xmlrpcString;\r
                                        }\r
 \r
                                        if ($rebuild_xmlrpcvals)\r
                                        {\r
                                                // build the xmlrpc val out of the data received, and substitute it\r
-                                               $temp = new xmlrpcval($GLOBALS['_xh']['value'], $GLOBALS['_xh']['vt']);\r
+                                               $temp = new xmlrpcval($xmlrpc->_xh['value'], $xmlrpc->_xh['vt']);\r
                                                // in case we got info about underlying php class, save it\r
                                                // in the object we're rebuilding\r
-                                               if (isset($GLOBALS['_xh']['php_class']))\r
-                                                       $temp->_php_class = $GLOBALS['_xh']['php_class'];\r
+                                               if (isset($xmlrpc->_xh['php_class']))\r
+                                                       $temp->_php_class = $xmlrpc->_xh['php_class'];\r
                                                // check if we are inside an array or struct:\r
                                                // if value just built is inside an array, let's move it into array on the stack\r
-                                               $vscount = count($GLOBALS['_xh']['valuestack']);\r
-                                               if ($vscount && $GLOBALS['_xh']['valuestack'][$vscount-1]['type']=='ARRAY')\r
+                                               $vscount = count($xmlrpc->_xh['valuestack']);\r
+                                               if ($vscount && $xmlrpc->_xh['valuestack'][$vscount-1]['type']=='ARRAY')\r
                                                {\r
-                                                       $GLOBALS['_xh']['valuestack'][$vscount-1]['values'][] = $temp;\r
+                                                       $xmlrpc->_xh['valuestack'][$vscount-1]['values'][] = $temp;\r
                                                }\r
                                                else\r
                                                {\r
-                                                       $GLOBALS['_xh']['value'] = $temp;\r
+                                                       $xmlrpc->_xh['value'] = $temp;\r
                                                }\r
                                        }\r
                                        else\r
                                                /// @todo this needs to treat correctly php-serialized objects,\r
                                                /// since std deserializing is done by php_xmlrpc_decode,\r
                                                /// which we will not be calling...\r
-                                               if (isset($GLOBALS['_xh']['php_class']))\r
+                                               if (isset($xmlrpc->_xh['php_class']))\r
                                                {\r
                                                }\r
 \r
                                                // check if we are inside an array or struct:\r
                                                // if value just built is inside an array, let's move it into array on the stack\r
-                                               $vscount = count($GLOBALS['_xh']['valuestack']);\r
-                                               if ($vscount && $GLOBALS['_xh']['valuestack'][$vscount-1]['type']=='ARRAY')\r
+                                               $vscount = count($xmlrpc->_xh['valuestack']);\r
+                                               if ($vscount && $xmlrpc->_xh['valuestack'][$vscount-1]['type']=='ARRAY')\r
                                                {\r
-                                                       $GLOBALS['_xh']['valuestack'][$vscount-1]['values'][] = $GLOBALS['_xh']['value'];\r
+                                                       $xmlrpc->_xh['valuestack'][$vscount-1]['values'][] = $xmlrpc->_xh['value'];\r
                                                }\r
                                        }\r
                                        break;\r
                                case 'DOUBLE':\r
                                case 'DATETIME.ISO8601':\r
                                case 'BASE64':\r
-                                       $GLOBALS['_xh']['vt']=strtolower($name);\r
+                                       $xmlrpc->_xh['vt']=strtolower($name);\r
                                        /// @todo: optimization creep - remove the if/elseif cycle below\r
                                        /// since the case() in which we are already did that\r
                                        if ($name=='STRING')\r
                                        {\r
-                                               $GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];\r
+                                               $xmlrpc->_xh['value']=$xmlrpc->_xh['ac'];\r
                                        }\r
                                        elseif ($name=='DATETIME.ISO8601')\r
                                        {\r
-                                               if (!preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $GLOBALS['_xh']['ac']))\r
+                                               if (!preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $xmlrpc->_xh['ac']))\r
                                                {\r
-                                                       error_log('XML-RPC: invalid value received in DATETIME: '.$GLOBALS['_xh']['ac']);\r
+                                                       error_log('XML-RPC: invalid value received in DATETIME: '.$xmlrpc->_xh['ac']);\r
                                                }\r
-                                               $GLOBALS['_xh']['vt']=$GLOBALS['xmlrpcDateTime'];\r
-                                               $GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];\r
+                                               $xmlrpc->_xh['vt']=$xmlrpc->xmlrpcDateTime;\r
+                                               $xmlrpc->_xh['value']=$xmlrpc->_xh['ac'];\r
                                        }\r
                                        elseif ($name=='BASE64')\r
                                        {\r
                                                /// @todo check for failure of base64 decoding / catch warnings\r
-                                               $GLOBALS['_xh']['value']=base64_decode($GLOBALS['_xh']['ac']);\r
+                                               $xmlrpc->_xh['value']=base64_decode($xmlrpc->_xh['ac']);\r
                                        }\r
                                        elseif ($name=='BOOLEAN')\r
                                        {\r
                                                // spec never mentions them (see eg. Blogger api docs)\r
                                                // NB: this simple checks helps a lot sanitizing input, ie no\r
                                                // security problems around here\r
-                                               if ($GLOBALS['_xh']['ac']=='1' || strcasecmp($GLOBALS['_xh']['ac'], 'true') == 0)\r
+                                               if ($xmlrpc->_xh['ac']=='1' || strcasecmp($xmlrpc->_xh['ac'], 'true') == 0)\r
                                                {\r
-                                                       $GLOBALS['_xh']['value']=true;\r
+                                                       $xmlrpc->_xh['value']=true;\r
                                                }\r
                                                else\r
                                                {\r
                                                        // log if receiveing something strange, even though we set the value to false anyway\r
-                                                       if ($GLOBALS['_xh']['ac']!='0' && strcasecmp($GLOBALS['_xh']['ac'], 'false') != 0)\r
-                                                               error_log('XML-RPC: invalid value received in BOOLEAN: '.$GLOBALS['_xh']['ac']);\r
-                                                       $GLOBALS['_xh']['value']=false;\r
+                                                       if ($xmlrpc->_xh['ac']!='0' && strcasecmp($xmlrpc->_xh['ac'], 'false') != 0)\r
+                                                               error_log('XML-RPC: invalid value received in BOOLEAN: '.$xmlrpc->_xh['ac']);\r
+                                                       $xmlrpc->_xh['value']=false;\r
                                                }\r
                                        }\r
                                        elseif ($name=='DOUBLE')\r
                                                // we have a DOUBLE\r
                                                // we must check that only 0123456789-.<space> are characters here\r
                                                // NOTE: regexp could be much stricter than this...\r
-                                               if (!preg_match('/^[+-eE0123456789 \t.]+$/', $GLOBALS['_xh']['ac']))\r
+                                               if (!preg_match('/^[+-eE0123456789 \t.]+$/', $xmlrpc->_xh['ac']))\r
                                                {\r
                                                        /// @todo: find a better way of throwing an error than this!\r
-                                                       error_log('XML-RPC: non numeric value received in DOUBLE: '.$GLOBALS['_xh']['ac']);\r
-                                                       $GLOBALS['_xh']['value']='ERROR_NON_NUMERIC_FOUND';\r
+                                                       error_log('XML-RPC: non numeric value received in DOUBLE: '.$xmlrpc->_xh['ac']);\r
+                                                       $xmlrpc->_xh['value']='ERROR_NON_NUMERIC_FOUND';\r
                                                }\r
                                                else\r
                                                {\r
                                                        // it's ok, add it on\r
-                                                       $GLOBALS['_xh']['value']=(double)$GLOBALS['_xh']['ac'];\r
+                                                       $xmlrpc->_xh['value']=(double)$xmlrpc->_xh['ac'];\r
                                                }\r
                                        }\r
                                        else\r
                                        {\r
                                                // we have an I4/INT\r
                                                // we must check that only 0123456789-<space> are characters here\r
-                                               if (!preg_match('/^[+-]?[0123456789 \t]+$/', $GLOBALS['_xh']['ac']))\r
+                                               if (!preg_match('/^[+-]?[0123456789 \t]+$/', $xmlrpc->_xh['ac']))\r
                                                {\r
                                                        /// @todo find a better way of throwing an error than this!\r
-                                                       error_log('XML-RPC: non numeric value received in INT: '.$GLOBALS['_xh']['ac']);\r
-                                                       $GLOBALS['_xh']['value']='ERROR_NON_NUMERIC_FOUND';\r
+                                                       error_log('XML-RPC: non numeric value received in INT: '.$xmlrpc->_xh['ac']);\r
+                                                       $xmlrpc->_xh['value']='ERROR_NON_NUMERIC_FOUND';\r
                                                }\r
                                                else\r
                                                {\r
                                                        // it's ok, add it on\r
-                                                       $GLOBALS['_xh']['value']=(int)$GLOBALS['_xh']['ac'];\r
+                                                       $xmlrpc->_xh['value']=(int)$xmlrpc->_xh['ac'];\r
                                                }\r
                                        }\r
-                                       //$GLOBALS['_xh']['ac']=''; // is this necessary?\r
-                                       $GLOBALS['_xh']['lv']=3; // indicate we've found a value\r
+                                       //$xmlrpc->_xh['ac']=''; // is this necessary?\r
+                                       $xmlrpc->_xh['lv']=3; // indicate we've found a value\r
                                        break;\r
                                case 'NAME':\r
-                                       $GLOBALS['_xh']['valuestack'][count($GLOBALS['_xh']['valuestack'])-1]['name'] = $GLOBALS['_xh']['ac'];\r
+                                       $xmlrpc->_xh['valuestack'][count($xmlrpc->_xh['valuestack'])-1]['name'] = $xmlrpc->_xh['ac'];\r
                                        break;\r
                                case 'MEMBER':\r
-                                       //$GLOBALS['_xh']['ac']=''; // is this necessary?\r
+                                       //$xmlrpc->_xh['ac']=''; // is this necessary?\r
                                        // add to array in the stack the last element built,\r
                                        // unless no VALUE was found\r
-                                       if ($GLOBALS['_xh']['vt'])\r
+                                       if ($xmlrpc->_xh['vt'])\r
                                        {\r
-                                               $vscount = count($GLOBALS['_xh']['valuestack']);\r
-                                               $GLOBALS['_xh']['valuestack'][$vscount-1]['values'][$GLOBALS['_xh']['valuestack'][$vscount-1]['name']] = $GLOBALS['_xh']['value'];\r
+                                               $vscount = count($xmlrpc->_xh['valuestack']);\r
+                                               $xmlrpc->_xh['valuestack'][$vscount-1]['values'][$xmlrpc->_xh['valuestack'][$vscount-1]['name']] = $xmlrpc->_xh['value'];\r
                                        } else\r
                                                error_log('XML-RPC: missing VALUE inside STRUCT in received xml');\r
                                        break;\r
                                case 'DATA':\r
-                                       //$GLOBALS['_xh']['ac']=''; // is this necessary?\r
-                                       $GLOBALS['_xh']['vt']=null; // reset this to check for 2 data elements in a row - even if they're empty\r
+                                       //$xmlrpc->_xh['ac']=''; // is this necessary?\r
+                                       $xmlrpc->_xh['vt']=null; // reset this to check for 2 data elements in a row - even if they're empty\r
                                        break;\r
                                case 'STRUCT':\r
                                case 'ARRAY':\r
                                        // fetch out of stack array of values, and promote it to current value\r
-                                       $curr_val = array_pop($GLOBALS['_xh']['valuestack']);\r
-                                       $GLOBALS['_xh']['value'] = $curr_val['values'];\r
-                                       $GLOBALS['_xh']['vt']=strtolower($name);\r
+                                       $curr_val = array_pop($xmlrpc->_xh['valuestack']);\r
+                                       $xmlrpc->_xh['value'] = $curr_val['values'];\r
+                                       $xmlrpc->_xh['vt']=strtolower($name);\r
                                        if (isset($curr_val['php_class']))\r
                                        {\r
-                                               $GLOBALS['_xh']['php_class'] = $curr_val['php_class'];\r
+                                               $xmlrpc->_xh['php_class'] = $curr_val['php_class'];\r
                                        }\r
                                        break;\r
                                case 'PARAM':\r
                                        // add to array of params the current value,\r
                                        // unless no VALUE was found\r
-                                       if ($GLOBALS['_xh']['vt'])\r
+                                       if ($xmlrpc->_xh['vt'])\r
                                        {\r
-                                               $GLOBALS['_xh']['params'][]=$GLOBALS['_xh']['value'];\r
-                                               $GLOBALS['_xh']['pt'][]=$GLOBALS['_xh']['vt'];\r
+                                               $xmlrpc->_xh['params'][]=$xmlrpc->_xh['value'];\r
+                                               $xmlrpc->_xh['pt'][]=$xmlrpc->_xh['vt'];\r
                                        }\r
                                        else\r
                                                error_log('XML-RPC: missing VALUE inside PARAM in received xml');\r
                                        break;\r
                                case 'METHODNAME':\r
-                                       $GLOBALS['_xh']['method']=preg_replace('/^[\n\r\t ]+/', '', $GLOBALS['_xh']['ac']);\r
+                                       $xmlrpc->_xh['method']=preg_replace('/^[\n\r\t ]+/', '', $xmlrpc->_xh['ac']);\r
                                        break;\r
                                case 'NIL':\r
                                case 'EX:NIL':\r
-                                       if ($GLOBALS['xmlrpc_null_extension'])\r
+                                       if ($xmlrpc->xmlrpc_null_extension)\r
                                        {\r
-                                               $GLOBALS['_xh']['vt']='null';\r
-                                               $GLOBALS['_xh']['value']=null;\r
-                                               $GLOBALS['_xh']['lv']=3;\r
+                                               $xmlrpc->_xh['vt']='null';\r
+                                               $xmlrpc->_xh['value']=null;\r
+                                               $xmlrpc->_xh['lv']=3;\r
                                                break;\r
                                        }\r
                                        // drop through intentionally if nil extension not enabled\r
        /// xml parser handler function for character data\r
        function xmlrpc_cd($parser, $data)\r
        {\r
+               $xmlrpc = Xmlrpc::instance();\r
                // skip processing if xml fault already detected\r
-               if ($GLOBALS['_xh']['isf'] < 2)\r
+               if ($xmlrpc->_xh['isf'] < 2)\r
                {\r
                        // "lookforvalue==3" means that we've found an entire value\r
                        // and should discard any further character data\r
-                       if($GLOBALS['_xh']['lv']!=3)\r
+                       if($xmlrpc->_xh['lv']!=3)\r
                        {\r
                                // G. Giunta 2006-08-23: useless change of 'lv' from 1 to 2\r
-                               //if($GLOBALS['_xh']['lv']==1)\r
+                               //if($xmlrpc->_xh['lv']==1)\r
                                //{\r
                                        // if we've found text and we're just in a <value> then\r
                                        // say we've found a value\r
-                                       //$GLOBALS['_xh']['lv']=2;\r
+                                       //$xmlrpc->_xh['lv']=2;\r
                                //}\r
                                // we always initialize the accumulator before starting parsing, anyway...\r
-                               //if(!@isset($GLOBALS['_xh']['ac']))\r
+                               //if(!@isset($xmlrpc->_xh['ac']))\r
                                //{\r
-                               //      $GLOBALS['_xh']['ac'] = '';\r
+                               //      $xmlrpc->_xh['ac'] = '';\r
                                //}\r
-                               $GLOBALS['_xh']['ac'].=$data;\r
+                               $xmlrpc->_xh['ac'].=$data;\r
                        }\r
                }\r
        }\r
        /// element start/end tag. In fact it only gets called on unknown entities...\r
        function xmlrpc_dh($parser, $data)\r
        {\r
+               $xmlrpc = Xmlrpc::instance();\r
                // skip processing if xml fault already detected\r
-               if ($GLOBALS['_xh']['isf'] < 2)\r
+               if ($xmlrpc->_xh['isf'] < 2)\r
                {\r
                        if(substr($data, 0, 1) == '&' && substr($data, -1, 1) == ';')\r
                        {\r
                                // G. Giunta 2006-08-25: useless change of 'lv' from 1 to 2\r
-                               //if($GLOBALS['_xh']['lv']==1)\r
+                               //if($xmlrpc->_xh['lv']==1)\r
                                //{\r
-                               //      $GLOBALS['_xh']['lv']=2;\r
+                               //      $xmlrpc->_xh['lv']=2;\r
                                //}\r
-                               $GLOBALS['_xh']['ac'].=$data;\r
+                               $xmlrpc->_xh['ac'].=$data;\r
                        }\r
                }\r
                return true;\r
                */\r
                function xmlrpc_client($path, $server='', $port='', $method='')\r
                {\r
+                       $xmlrpc = Xmlrpc::instance();\r
+\r
                        // allow user to specify all params in $path\r
                        if($server == '' and $port == '' and $method == '')\r
                        {\r
                        $this->accepted_charset_encodings = array('UTF-8', 'ISO-8859-1', 'US-ASCII');\r
 \r
                        // initialize user_agent string\r
-                       $this->user_agent = $GLOBALS['xmlrpcName'] . ' ' . $GLOBALS['xmlrpcVersion'];\r
+                       $this->user_agent = $xmlrpc->xmlrpcName . ' ' . $xmlrpc->xmlrpcVersion;\r
                }\r
 \r
                /**\r
                        $username='', $password='', $authtype=1, $proxyhost='',\r
                        $proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1)\r
                {\r
+                       $xmlrpc = Xmlrpc::instance();\r
+\r
                        if($port==0)\r
                        {\r
                                $port=80;\r
                        else\r
                        {\r
                                $this->errstr='Connect error: '.$this->errstr;\r
-                               $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $this->errstr . ' (' . $this->errno . ')');\r
+                               $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['http_error'], $this->errstr . ' (' . $this->errno . ')');\r
                                return $r;\r
                        }\r
 \r
                        {\r
                                fclose($fp);\r
                                $this->errstr='Write error';\r
-                               $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $this->errstr);\r
+                               $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['http_error'], $this->errstr);\r
                                return $r;\r
                        }\r
                        else\r
                        $proxyhost='', $proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1, $method='https',\r
                        $keepalive=false, $key='', $keypass='')\r
                {\r
+                       $xmlrpc = Xmlrpc::instance();\r
+\r
                        if(!function_exists('curl_init'))\r
                        {\r
                                $this->errstr='CURL unavailable on this install';\r
-                               $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_curl'], $GLOBALS['xmlrpcstr']['no_curl']);\r
+                               $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['no_curl'], $xmlrpc->xmlrpcstr['no_curl']);\r
                                return $r;\r
                        }\r
                        if($method == 'https')\r
                                        ((is_string($info) && strpos($info, 'OpenSSL') === null) || (is_array($info) && !isset($info['ssl_version']))))\r
                                {\r
                                        $this->errstr='SSL unavailable on this install';\r
-                                       $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_ssl'], $GLOBALS['xmlrpcstr']['no_ssl']);\r
+                                       $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['no_ssl'], $xmlrpc->xmlrpcstr['no_ssl']);\r
                                        return $r;\r
                                }\r
                        }\r
                        if(!$result) /// @todo we should use a better check here - what if we get back '' or '0'?\r
                        {\r
                                $this->errstr='no response';\r
-                               $resp=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['curl_fail'], $GLOBALS['xmlrpcstr']['curl_fail']. ': '. curl_error($curl));\r
+                               $resp=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['curl_fail'], $xmlrpc->xmlrpcstr['curl_fail']. ': '. curl_error($curl));\r
                                curl_close($curl);\r
                                if($keepalive)\r
                                {\r
                                }\r
                                $resp =& $msg->parseResponse($result, true, $this->return_type);\r
                 // if we got back a 302, we can not reuse the curl handle for later calls\r
-                if($resp->faultCode() == $GLOBALS['xmlrpcerr']['http_error'] && $keepalive)\r
+                if($resp->faultCode() == $xmlrpc->xmlrpcerr['http_error'] && $keepalive)\r
                 {\r
                     curl_close($curl);\r
                     $this->xmlrpc_curl_handle = null;\r
                */\r
                function multicall($msgs, $timeout=0, $method='', $fallback=true)\r
                {\r
+                       $xmlrpc = Xmlrpc::instance();\r
+\r
                        if ($method == '')\r
                        {\r
                                $method = $this->method;\r
                                                }\r
                                                else\r
                                                {\r
-                                                       $result = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['multicall_error'], $GLOBALS['xmlrpcstr']['multicall_error']);\r
+                                                       $result = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['multicall_error'], $xmlrpc->xmlrpcstr['multicall_error']);\r
                                                }\r
                                        }\r
                                }\r
                */\r
                function serialize($charset_encoding='')\r
                {\r
+                       $xmlrpc = Xmlrpc::instance();\r
+\r
                        if ($charset_encoding != '')\r
                                $this->content_type = 'text/xml; charset=' . $charset_encoding;\r
                        else\r
                                $this->content_type = 'text/xml';\r
-                       if ($GLOBALS['xmlrpc_null_apache_encoding'])\r
+                       if ($xmlrpc->xmlrpc_null_apache_encoding)\r
                        {\r
-                               $result = "<methodResponse xmlns:ex=\"".$GLOBALS['xmlrpc_null_apache_encoding_ns']."\">\n";\r
+                               $result = "<methodResponse xmlns:ex=\"".$xmlrpc->xmlrpc_null_apache_encoding_ns."\">\n";\r
                        }\r
                        else\r
                        {\r
                                $result .= "<fault>\n" .\r
 "<value>\n<struct><member><name>faultCode</name>\n<value><int>" . $this->errno .\r
 "</int></value>\n</member>\n<member>\n<name>faultString</name>\n<value><string>" .\r
-xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding) . "</string></value>\n</member>\n" .\r
+xmlrpc_encode_entitites($this->errstr, $xmlrpc->xmlrpc_internalencoding, $charset_encoding) . "</string></value>\n</member>\n" .\r
 "</struct>\n</value>\n</fault>";\r
                        }\r
                        else\r
@@ -2249,6 +2278,7 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                */\r
                function &parseResponseHeaders(&$data, $headers_processed=false)\r
                {\r
+                               $xmlrpc = Xmlrpc::instance();\r
                                // Support "web-proxy-tunelling" connections for https through proxies\r
                                if(preg_match('/^HTTP\/1\.[0-1] 200 Connection established/', $data))\r
                                {\r
@@ -2281,7 +2311,7 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                        else\r
                                        {\r
                                                error_log('XML-RPC: '.__METHOD__.': HTTPS via proxy error, tunnel connection possibly failed');\r
-                                               $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['xmlrpcstr']['http_error']. ' (HTTPS via proxy error, tunnel connection possibly failed)');\r
+                                               $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['http_error'], $xmlrpc->xmlrpcstr['http_error']. ' (HTTPS via proxy error, tunnel connection possibly failed)');\r
                                                return $r;\r
                                        }\r
                                }\r
@@ -2302,12 +2332,12 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                {\r
                                        $errstr= substr($data, 0, strpos($data, "\n")-1);\r
                                        error_log('XML-RPC: '.__METHOD__.': HTTP error, got response: ' .$errstr);\r
-                                       $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['xmlrpcstr']['http_error']. ' (' . $errstr . ')');\r
+                                       $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['http_error'], $xmlrpc->xmlrpcstr['http_error']. ' (' . $errstr . ')');\r
                                        return $r;\r
                                }\r
 \r
-                               $GLOBALS['_xh']['headers'] = array();\r
-                               $GLOBALS['_xh']['cookies'] = array();\r
+                               $xmlrpc->_xh['headers'] = array();\r
+                               $xmlrpc->_xh['cookies'] = array();\r
 \r
                                // be tolerant to usage of \n instead of \r\n to separate headers and data\r
                                // (even though it is not valid http)\r
@@ -2341,7 +2371,7 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                                $header_name = strtolower(trim($arr[0]));\r
                                                /// @todo some other headers (the ones that allow a CSV list of values)\r
                                                /// do allow many values to be passed using multiple header lines.\r
-                                               /// We should add content to $GLOBALS['_xh']['headers'][$header_name]\r
+                                               /// We should add content to $xmlrpc->_xh['headers'][$header_name]\r
                                                /// instead of replacing it for those...\r
                                                if ($header_name == 'set-cookie' || $header_name == 'set-cookie2')\r
                                                {\r
@@ -2359,10 +2389,10 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                                        {\r
                                                                // glue together all received cookies, using a comma to separate them\r
                                                                // (same as php does with getallheaders())\r
-                                                               if (isset($GLOBALS['_xh']['headers'][$header_name]))\r
-                                                                       $GLOBALS['_xh']['headers'][$header_name] .= ', ' . trim($cookie);\r
+                                                               if (isset($xmlrpc->_xh['headers'][$header_name]))\r
+                                                                       $xmlrpc->_xh['headers'][$header_name] .= ', ' . trim($cookie);\r
                                                                else\r
-                                                                       $GLOBALS['_xh']['headers'][$header_name] = trim($cookie);\r
+                                                                       $xmlrpc->_xh['headers'][$header_name] = trim($cookie);\r
                                                                // parse cookie attributes, in case user wants to correctly honour them\r
                                                                // feature creep: only allow rfc-compliant cookie attributes?\r
                                                                // @todo support for server sending multiple time cookie with same name, but using different PATHs\r
@@ -2376,14 +2406,14 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                                                        if ($pos == 0)\r
                                                                        {\r
                                                                                $cookiename = $tag;\r
-                                                                               $GLOBALS['_xh']['cookies'][$tag] = array();\r
-                                                                               $GLOBALS['_xh']['cookies'][$cookiename]['value'] = urldecode($val);\r
+                                                                               $xmlrpc->_xh['cookies'][$tag] = array();\r
+                                                                               $xmlrpc->_xh['cookies'][$cookiename]['value'] = urldecode($val);\r
                                                                        }\r
                                                                        else\r
                                                                        {\r
                                                                                if ($tag != 'value')\r
                                                                                {\r
-                                                                                 $GLOBALS['_xh']['cookies'][$cookiename][$tag] = $val;\r
+                                                                                 $xmlrpc->_xh['cookies'][$cookiename][$tag] = $val;\r
                                                                                }\r
                                                                        }\r
                                                                }\r
@@ -2391,26 +2421,26 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                                }\r
                                                else\r
                                                {\r
-                                                       $GLOBALS['_xh']['headers'][$header_name] = trim($arr[1]);\r
+                                                       $xmlrpc->_xh['headers'][$header_name] = trim($arr[1]);\r
                                                }\r
                                        }\r
                                        elseif(isset($header_name))\r
                                        {\r
                                                ///     @todo version1 cookies might span multiple lines, thus breaking the parsing above\r
-                                               $GLOBALS['_xh']['headers'][$header_name] .= ' ' . trim($line);\r
+                                               $xmlrpc->_xh['headers'][$header_name] .= ' ' . trim($line);\r
                                        }\r
                                }\r
 \r
                                $data = substr($data, $bd);\r
 \r
-                               if($this->debug && count($GLOBALS['_xh']['headers']))\r
+                               if($this->debug && count($xmlrpc->_xh['headers']))\r
                                {\r
                                        print '<PRE>';\r
-                                       foreach($GLOBALS['_xh']['headers'] as $header => $value)\r
+                                       foreach($xmlrpc->_xh['headers'] as $header => $value)\r
                                        {\r
                                                print htmlentities("HEADER: $header: $value\n");\r
                                        }\r
-                                       foreach($GLOBALS['_xh']['cookies'] as $header => $value)\r
+                                       foreach($xmlrpc->_xh['cookies'] as $header => $value)\r
                                        {\r
                                                print htmlentities("COOKIE: $header={$value['value']}\n");\r
                                        }\r
@@ -2422,33 +2452,33 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                if(!$headers_processed)\r
                                {\r
                                        // Decode chunked encoding sent by http 1.1 servers\r
-                                       if(isset($GLOBALS['_xh']['headers']['transfer-encoding']) && $GLOBALS['_xh']['headers']['transfer-encoding'] == 'chunked')\r
+                                       if(isset($xmlrpc->_xh['headers']['transfer-encoding']) && $xmlrpc->_xh['headers']['transfer-encoding'] == 'chunked')\r
                                        {\r
                                                if(!$data = decode_chunked($data))\r
                                                {\r
                                                        error_log('XML-RPC: '.__METHOD__.': errors occurred when trying to rebuild the chunked data received from server');\r
-                                                       $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['dechunk_fail'], $GLOBALS['xmlrpcstr']['dechunk_fail']);\r
+                                                       $r = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['dechunk_fail'], $xmlrpc->xmlrpcstr['dechunk_fail']);\r
                                                        return $r;\r
                                                }\r
                                        }\r
 \r
                                        // Decode gzip-compressed stuff\r
                                        // code shamelessly inspired from nusoap library by Dietrich Ayala\r
-                                       if(isset($GLOBALS['_xh']['headers']['content-encoding']))\r
+                                       if(isset($xmlrpc->_xh['headers']['content-encoding']))\r
                                        {\r
-                                               $GLOBALS['_xh']['headers']['content-encoding'] = str_replace('x-', '', $GLOBALS['_xh']['headers']['content-encoding']);\r
-                                               if($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' || $GLOBALS['_xh']['headers']['content-encoding'] == 'gzip')\r
+                                               $xmlrpc->_xh['headers']['content-encoding'] = str_replace('x-', '', $xmlrpc->_xh['headers']['content-encoding']);\r
+                                               if($xmlrpc->_xh['headers']['content-encoding'] == 'deflate' || $xmlrpc->_xh['headers']['content-encoding'] == 'gzip')\r
                                                {\r
                                                        // if decoding works, use it. else assume data wasn't gzencoded\r
                                                        if(function_exists('gzinflate'))\r
                                                        {\r
-                                                               if($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data))\r
+                                                               if($xmlrpc->_xh['headers']['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data))\r
                                                                {\r
                                                                        $data = $degzdata;\r
                                                                        if($this->debug)\r
                                                                        print "<PRE>---INFLATED RESPONSE---[".strlen($data)." chars]---\n" . htmlentities($data) . "\n---END---</PRE>";\r
                                                                }\r
-                                                               elseif($GLOBALS['_xh']['headers']['content-encoding'] == 'gzip' && $degzdata = @gzinflate(substr($data, 10)))\r
+                                                               elseif($xmlrpc->_xh['headers']['content-encoding'] == 'gzip' && $degzdata = @gzinflate(substr($data, 10)))\r
                                                                {\r
                                                                        $data = $degzdata;\r
                                                                        if($this->debug)\r
@@ -2457,14 +2487,14 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                                                else\r
                                                                {\r
                                                                        error_log('XML-RPC: '.__METHOD__.': errors occurred when trying to decode the deflated data received from server');\r
-                                                                       $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['decompress_fail'], $GLOBALS['xmlrpcstr']['decompress_fail']);\r
+                                                                       $r = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['decompress_fail'], $xmlrpc->xmlrpcstr['decompress_fail']);\r
                                                                        return $r;\r
                                                                }\r
                                                        }\r
                                                        else\r
                                                        {\r
                                                                error_log('XML-RPC: '.__METHOD__.': the server sent deflated data. Your php install must have the Zlib extension compiled in to support this.');\r
-                                                               $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['cannot_decompress'], $GLOBALS['xmlrpcstr']['cannot_decompress']);\r
+                                                               $r = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['cannot_decompress'], $xmlrpc->xmlrpcstr['cannot_decompress']);\r
                                                                return $r;\r
                                                        }\r
                                                }\r
@@ -2487,6 +2517,8 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                */\r
                function &parseResponse($data='', $headers_processed=false, $return_type='xmlrpcvals')\r
                {\r
+                       $xmlrpc = Xmlrpc::instance();\r
+\r
                        if($this->debug)\r
                        {\r
                                //by maHo, replaced htmlspecialchars with htmlentities\r
@@ -2496,11 +2528,11 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                        if($data == '')\r
                        {\r
                                error_log('XML-RPC: '.__METHOD__.': no response received from server.');\r
-                               $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_data'], $GLOBALS['xmlrpcstr']['no_data']);\r
+                               $r = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['no_data'], $xmlrpc->xmlrpcstr['no_data']);\r
                                return $r;\r
                        }\r
 \r
-                       $GLOBALS['_xh']=array();\r
+                       $xmlrpc->_xh=array();\r
 \r
                        $raw_data = $data;\r
                        // parse the HTTP headers of the response, if present, and separate them from data\r
@@ -2517,8 +2549,8 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                        }\r
                        else\r
                        {\r
-                               $GLOBALS['_xh']['headers'] = array();\r
-                               $GLOBALS['_xh']['cookies'] = array();\r
+                               $xmlrpc->_xh['headers'] = array();\r
+                               $xmlrpc->_xh['cookies'] = array();\r
                        }\r
 \r
                        if($this->debug)\r
@@ -2550,22 +2582,22 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                        if ($return_type == 'xml')\r
                        {\r
                                $r = new xmlrpcresp($data, 0, '', 'xml');\r
-                               $r->hdrs = $GLOBALS['_xh']['headers'];\r
-                               $r->_cookies = $GLOBALS['_xh']['cookies'];\r
+                               $r->hdrs = $xmlrpc->_xh['headers'];\r
+                               $r->_cookies = $xmlrpc->_xh['cookies'];\r
                                $r->raw_data = $raw_data;\r
                                return $r;\r
                        }\r
 \r
                        // try to 'guestimate' the character encoding of the received response\r
-                       $resp_encoding = guess_encoding(@$GLOBALS['_xh']['headers']['content-type'], $data);\r
+                       $resp_encoding = guess_encoding(@$xmlrpc->_xh['headers']['content-type'], $data);\r
 \r
-                       $GLOBALS['_xh']['ac']='';\r
-                       //$GLOBALS['_xh']['qt']=''; //unused...\r
-                       $GLOBALS['_xh']['stack'] = array();\r
-                       $GLOBALS['_xh']['valuestack'] = array();\r
-                       $GLOBALS['_xh']['isf']=0; // 0 = OK, 1 for xmlrpc fault responses, 2 = invalid xmlrpc\r
-                       $GLOBALS['_xh']['isf_reason']='';\r
-                       $GLOBALS['_xh']['rt']=''; // 'methodcall or 'methodresponse'\r
+                       $xmlrpc->_xh['ac']='';\r
+                       //$xmlrpc->_xh['qt']=''; //unused...\r
+                       $xmlrpc->_xh['stack'] = array();\r
+                       $xmlrpc->_xh['valuestack'] = array();\r
+                       $xmlrpc->_xh['isf']=0; // 0 = OK, 1 for xmlrpc fault responses, 2 = invalid xmlrpc\r
+                       $xmlrpc->_xh['isf_reason']='';\r
+                       $xmlrpc->_xh['rt']=''; // 'methodcall or 'methodresponse'\r
 \r
                        // if response charset encoding is not known / supported, try to use\r
                        // the default encoding and parse the xml anyway, but log a warning...\r
@@ -2575,7 +2607,7 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                        //if (!is_valid_charset($resp_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))\r
                        {\r
                                error_log('XML-RPC: '.__METHOD__.': invalid charset encoding of received response: '.$resp_encoding);\r
-                               $resp_encoding = $GLOBALS['xmlrpc_defencoding'];\r
+                               $resp_encoding = $xmlrpc->xmlrpc_defencoding;\r
                        }\r
                        $parser = xml_parser_create($resp_encoding);\r
                        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);\r
@@ -2585,13 +2617,13 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                        // we use the broadest one, ie. utf8\r
                        // This allows to send data which is native in various charset,\r
                        // by extending xmlrpc_encode_entitites() and setting xmlrpc_internalencoding\r
-                       if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII')))\r
+                       if (!in_array($xmlrpc->xmlrpc_internalencoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))\r
                        {\r
                                xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');\r
                        }\r
                        else\r
                        {\r
-                               xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']);\r
+                               xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $xmlrpc->xmlrpc_internalencoding);\r
                        }\r
 \r
                        if ($return_type == 'phpvals')\r
@@ -2621,38 +2653,38 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                                xml_get_current_line_number($parser), xml_get_current_column_number($parser));\r
                                }\r
                                error_log($errstr);\r
-                               $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'], $GLOBALS['xmlrpcstr']['invalid_return'].' ('.$errstr.')');\r
+                               $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['invalid_return'], $xmlrpc->xmlrpcstr['invalid_return'].' ('.$errstr.')');\r
                                xml_parser_free($parser);\r
                                if($this->debug)\r
                                {\r
                                        print $errstr;\r
                                }\r
-                               $r->hdrs = $GLOBALS['_xh']['headers'];\r
-                               $r->_cookies = $GLOBALS['_xh']['cookies'];\r
+                               $r->hdrs = $xmlrpc->_xh['headers'];\r
+                               $r->_cookies = $xmlrpc->_xh['cookies'];\r
                                $r->raw_data = $raw_data;\r
                                return $r;\r
                        }\r
                        xml_parser_free($parser);\r
                        // second error check: xml well formed but not xml-rpc compliant\r
-                       if ($GLOBALS['_xh']['isf'] > 1)\r
+                       if ($xmlrpc->_xh['isf'] > 1)\r
                        {\r
                                if ($this->debug)\r
                                {\r
                                        /// @todo echo something for user?\r
                                }\r
 \r
-                               $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'],\r
-                               $GLOBALS['xmlrpcstr']['invalid_return'] . ' ' . $GLOBALS['_xh']['isf_reason']);\r
+                               $r = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['invalid_return'],\r
+                               $xmlrpc->xmlrpcstr['invalid_return'] . ' ' . $xmlrpc->_xh['isf_reason']);\r
                        }\r
                        // third error check: parsing of the response has somehow gone boink.\r
                        // NB: shall we omit this check, since we trust the parsing code?\r
-                       elseif ($return_type == 'xmlrpcvals' && !is_object($GLOBALS['_xh']['value']))\r
+                       elseif ($return_type == 'xmlrpcvals' && !is_object($xmlrpc->_xh['value']))\r
                        {\r
                                // something odd has happened\r
                                // and it's time to generate a client side error\r
                                // indicating something odd went on\r
-                               $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'],\r
-                                       $GLOBALS['xmlrpcstr']['invalid_return']);\r
+                               $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['invalid_return'],\r
+                                       $xmlrpc->xmlrpcstr['invalid_return']);\r
                        }\r
                        else\r
                        {\r
@@ -2660,15 +2692,15 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                {\r
                                        print "<PRE>---PARSED---\n";\r
                                        // somehow htmlentities chokes on var_export, and some full html string...\r
-                                       //print htmlentitites(var_export($GLOBALS['_xh']['value'], true));\r
-                                       print htmlspecialchars(var_export($GLOBALS['_xh']['value'], true));\r
+                                       //print htmlentitites(var_export($xmlrpc->_xh['value'], true));\r
+                                       print htmlspecialchars(var_export($xmlrpc->_xh['value'], true));\r
                                        print "\n---END---</PRE>";\r
                                }\r
 \r
-                               // note that using =& will raise an error if $GLOBALS['_xh']['st'] does not generate an object.\r
-                               $v =& $GLOBALS['_xh']['value'];\r
+                               // note that using =& will raise an error if $xmlrpc->_xh['st'] does not generate an object.\r
+                               $v =& $xmlrpc->_xh['value'];\r
 \r
-                               if($GLOBALS['_xh']['isf'])\r
+                               if($xmlrpc->_xh['isf'])\r
                                {\r
                                        /// @todo we should test here if server sent an int and a string,\r
                                        /// and/or coerce them into such...\r
@@ -2699,8 +2731,8 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                }\r
                        }\r
 \r
-                       $r->hdrs = $GLOBALS['_xh']['headers'];\r
-                       $r->_cookies = $GLOBALS['_xh']['cookies'];\r
+                       $r->hdrs = $xmlrpc->_xh['headers'];\r
+                       $r->_cookies = $xmlrpc->_xh['cookies'];\r
                        $r->raw_data = $raw_data;\r
                        return $r;\r
                }\r
@@ -2778,7 +2810,13 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                */\r
                function addScalar($val, $type='string')\r
                {\r
-                       $typeof=@$GLOBALS['xmlrpcTypes'][$type];\r
+                       $xmlrpc = Xmlrpc::instance();\r
+\r
+                       $typeof = null;\r
+                       if(isset($xmlrpc->xmlrpcTypes[$type])) {\r
+                               $typeof = $xmlrpc->xmlrpcTypes[$type];\r
+                       }\r
+\r
                        if($typeof!=1)\r
                        {\r
                                error_log("XML-RPC: ".__METHOD__.": not a scalar type ($type)");\r
@@ -2788,7 +2826,7 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                        // coerce booleans into correct values\r
                        // NB: we should either do it for datetimes, integers and doubles, too,\r
                        // or just plain remove this check, implemented on booleans only...\r
-                       if($type==$GLOBALS['xmlrpcBoolean'])\r
+                       if($type==$xmlrpc->xmlrpcBoolean)\r
                        {\r
                                if(strcasecmp($val,'true')==0 || $val==1 || ($val==true && strcasecmp($val,'false')))\r
                                {\r
@@ -2834,9 +2872,10 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                */\r
                function addArray($vals)\r
                {\r
+                       $xmlrpc = Xmlrpc::instance();\r
                        if($this->mytype==0)\r
                        {\r
-                               $this->mytype=$GLOBALS['xmlrpcTypes']['array'];\r
+                               $this->mytype=$xmlrpc->xmlrpcTypes['array'];\r
                                $this->me['array']=$vals;\r
                                return 1;\r
                        }\r
@@ -2863,9 +2902,11 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                */\r
                function addStruct($vals)\r
                {\r
+                       $xmlrpc = Xmlrpc::instance();\r
+\r
                        if($this->mytype==0)\r
                        {\r
-                               $this->mytype=$GLOBALS['xmlrpcTypes']['struct'];\r
+                               $this->mytype=$xmlrpc->xmlrpcTypes['struct'];\r
                                $this->me['struct']=$vals;\r
                                return 1;\r
                        }\r
@@ -2927,28 +2968,34 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                */\r
                function serializedata($typ, $val, $charset_encoding='')\r
                {\r
+                       $xmlrpc = Xmlrpc::instance();\r
                        $rs='';\r
-                       switch(@$GLOBALS['xmlrpcTypes'][$typ])\r
+\r
+                       if(!isset($xmlrpc->xmlrpcTypes[$typ])) {\r
+                               return $rs;\r
+                       }\r
+\r
+                       switch($xmlrpc->xmlrpcTypes[$typ])\r
                        {\r
                                case 1:\r
                                        switch($typ)\r
                                        {\r
-                                               case $GLOBALS['xmlrpcBase64']:\r
+                                               case $xmlrpc->xmlrpcBase64:\r
                                                        $rs.="<${typ}>" . base64_encode($val) . "</${typ}>";\r
                                                        break;\r
-                                               case $GLOBALS['xmlrpcBoolean']:\r
+                                               case $xmlrpc->xmlrpcBoolean:\r
                                                        $rs.="<${typ}>" . ($val ? '1' : '0') . "</${typ}>";\r
                                                        break;\r
-                                               case $GLOBALS['xmlrpcString']:\r
+                                               case $xmlrpc->xmlrpcString:\r
                                                        // G. Giunta 2005/2/13: do NOT use htmlentities, since\r
                                                        // it will produce named html entities, which are invalid xml\r
-                                                       $rs.="<${typ}>" . xmlrpc_encode_entitites($val, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding). "</${typ}>";\r
+                                                       $rs.="<${typ}>" . xmlrpc_encode_entitites($val, $xmlrpc->xmlrpc_internalencoding, $charset_encoding). "</${typ}>";\r
                                                        break;\r
-                                               case $GLOBALS['xmlrpcInt']:\r
-                                               case $GLOBALS['xmlrpcI4']:\r
+                                               case $xmlrpc->xmlrpcInt:\r
+                                               case $xmlrpc->xmlrpcI4:\r
                                                        $rs.="<${typ}>".(int)$val."</${typ}>";\r
                                                        break;\r
-                                               case $GLOBALS['xmlrpcDouble']:\r
+                                               case $xmlrpc->xmlrpcDouble:\r
                                                        // avoid using standard conversion of float to string because it is locale-dependent,\r
                                                        // and also because the xmlrpc spec forbids exponential notation.\r
                                                        // sprintf('%F') could be most likely ok but it fails eg. on 2e-14.\r
@@ -2956,7 +3003,7 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                                        // but there is of course no limit in the number of decimal places to be used...\r
                                                        $rs.="<${typ}>".preg_replace('/\\.?0+$/','',number_format((double)$val, 128, '.', ''))."</${typ}>";\r
                                                        break;\r
-                                               case $GLOBALS['xmlrpcDateTime']:\r
+                                               case $xmlrpc->xmlrpcDateTime:\r
                                                        if (is_string($val))\r
                                                        {\r
                                                                $rs.="<${typ}>${val}</${typ}>";\r
@@ -2975,8 +3022,8 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                                                $rs.="<${typ}>${val}</${typ}>";\r
                                                        }\r
                                                        break;\r
-                                               case $GLOBALS['xmlrpcNull']:\r
-                                                       if ($GLOBALS['xmlrpc_null_apache_encoding'])\r
+                                               case $xmlrpc->xmlrpcNull:\r
+                                                       if ($xmlrpc->xmlrpc_null_apache_encoding)\r
                                                        {\r
                                                                $rs.="<ex:nil/>";\r
                                                        }\r
@@ -3003,7 +3050,7 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                        }\r
                                        foreach($val as $key2 => $val2)\r
                                        {\r
-                                               $rs.='<member><name>'.xmlrpc_encode_entitites($key2, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding)."</name>\n";\r
+                                               $rs.='<member><name>'.xmlrpc_encode_entitites($key2, $xmlrpc->xmlrpc_internalencoding, $charset_encoding)."</name>\n";\r
                                                //$rs.=$this->serializeval($val2);\r
                                                $rs.=$val2->serialize($charset_encoding);\r
                                                $rs.="</member>\n";\r
@@ -3159,11 +3206,13 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                */\r
                function scalartyp()\r
                {\r
+                       $xmlrpc = Xmlrpc::instance();\r
+\r
                        reset($this->me);\r
                        list($a,)=each($this->me);\r
-                       if($a==$GLOBALS['xmlrpcI4'])\r
+                       if($a==$xmlrpc->xmlrpcI4)\r
                        {\r
-                               $a=$GLOBALS['xmlrpcInt'];\r
+                               $a=$xmlrpc->xmlrpcInt;\r
                        }\r
                        return $a;\r
                }\r
@@ -3407,25 +3456,26 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
        */\r
        function php_xmlrpc_encode($php_val, $options=array())\r
        {\r
+               $xmlrpc = Xmlrpc::instance();\r
                $type = gettype($php_val);\r
                switch($type)\r
                {\r
                        case 'string':\r
                                if (in_array('auto_dates', $options) && preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $php_val))\r
-                                       $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcDateTime']);\r
+                                       $xmlrpc_val = new xmlrpcval($php_val, $xmlrpc->xmlrpcDateTime);\r
                                else\r
-                                       $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcString']);\r
+                                       $xmlrpc_val = new xmlrpcval($php_val, $xmlrpc->xmlrpcString);\r
                                break;\r
                        case 'integer':\r
-                               $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcInt']);\r
+                               $xmlrpc_val = new xmlrpcval($php_val, $xmlrpc->xmlrpcInt);\r
                                break;\r
                        case 'double':\r
-                               $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcDouble']);\r
+                               $xmlrpc_val = new xmlrpcval($php_val, $xmlrpc->xmlrpcDouble);\r
                                break;\r
                                // <G_Giunta_2001-02-29>\r
                                // Add support for encoding/decoding of booleans, since they are supported in PHP\r
                        case 'boolean':\r
-                               $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcBoolean']);\r
+                               $xmlrpc_val = new xmlrpcval($php_val, $xmlrpc->xmlrpcBoolean);\r
                                break;\r
                                // </G_Giunta_2001-02-29>\r
                        case 'array':\r
@@ -3448,11 +3498,11 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                }\r
                                if($ko)\r
                                {\r
-                                       $xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcStruct']);\r
+                                       $xmlrpc_val = new xmlrpcval($arr, $xmlrpc->xmlrpcStruct);\r
                                }\r
                                else\r
                                {\r
-                                       $xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcArray']);\r
+                                       $xmlrpc_val = new xmlrpcval($arr, $xmlrpc->xmlrpcArray);\r
                                }\r
                                break;\r
                        case 'object':\r
@@ -3462,7 +3512,7 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                }\r
                                else if(is_a($php_val, 'DateTime'))\r
                                {\r
-                                       $xmlrpc_val = new xmlrpcval($php_val->format('Ymd\TH:i:s'), $GLOBALS['xmlrpcStruct']);\r
+                                       $xmlrpc_val = new xmlrpcval($php_val->format('Ymd\TH:i:s'), $xmlrpc->xmlrpcStruct);\r
                                }\r
                                else\r
                                {\r
@@ -3472,7 +3522,7 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                        {\r
                                                $arr[$k] = php_xmlrpc_encode($v, $options);\r
                                        }\r
-                                       $xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcStruct']);\r
+                                       $xmlrpc_val = new xmlrpcval($arr, $xmlrpc->xmlrpcStruct);\r
                                        if (in_array('encode_php_objs', $options))\r
                                        {\r
                                                // let's save original class name into xmlrpcval:\r
@@ -3484,11 +3534,11 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                        case 'NULL':\r
                                if (in_array('extension_api', $options))\r
                                {\r
-                                       $xmlrpc_val = new xmlrpcval('', $GLOBALS['xmlrpcString']);\r
+                                       $xmlrpc_val = new xmlrpcval('', $xmlrpc->xmlrpcString);\r
                                }\r
                                else if (in_array('null_extension', $options))\r
                                {\r
-                                       $xmlrpc_val = new xmlrpcval('', $GLOBALS['xmlrpcNull']);\r
+                                       $xmlrpc_val = new xmlrpcval('', $xmlrpc->xmlrpcNull);\r
                                }\r
                                else\r
                                {\r
@@ -3498,7 +3548,7 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                        case 'resource':\r
                                if (in_array('extension_api', $options))\r
                                {\r
-                                       $xmlrpc_val = new xmlrpcval((int)$php_val, $GLOBALS['xmlrpcInt']);\r
+                                       $xmlrpc_val = new xmlrpcval((int)$php_val, $xmlrpc->xmlrpcInt);\r
                                }\r
                                else\r
                                {\r
@@ -3524,28 +3574,30 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
        */\r
        function php_xmlrpc_decode_xml($xml_val, $options=array())\r
        {\r
-               $GLOBALS['_xh'] = array();\r
-               $GLOBALS['_xh']['ac'] = '';\r
-               $GLOBALS['_xh']['stack'] = array();\r
-               $GLOBALS['_xh']['valuestack'] = array();\r
-               $GLOBALS['_xh']['params'] = array();\r
-               $GLOBALS['_xh']['pt'] = array();\r
-               $GLOBALS['_xh']['isf'] = 0;\r
-               $GLOBALS['_xh']['isf_reason'] = '';\r
-               $GLOBALS['_xh']['method'] = false;\r
-               $GLOBALS['_xh']['rt'] = '';\r
+               $xmlrpc = Xmlrpc::instance();\r
+\r
+               $xmlrpc->_xh = array();\r
+               $xmlrpc->_xh['ac'] = '';\r
+               $xmlrpc->_xh['stack'] = array();\r
+               $xmlrpc->_xh['valuestack'] = array();\r
+               $xmlrpc->_xh['params'] = array();\r
+               $xmlrpc->_xh['pt'] = array();\r
+               $xmlrpc->_xh['isf'] = 0;\r
+               $xmlrpc->_xh['isf_reason'] = '';\r
+               $xmlrpc->_xh['method'] = false;\r
+               $xmlrpc->_xh['rt'] = '';\r
                /// @todo 'guestimate' encoding\r
                $parser = xml_parser_create();\r
                xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);\r
                // What if internal encoding is not in one of the 3 allowed?\r
                // we use the broadest one, ie. utf8!\r
-               if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII')))\r
+               if (!in_array($xmlrpc->xmlrpc_internalencoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))\r
                {\r
                        xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');\r
                }\r
                else\r
                {\r
-                       xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']);\r
+                       xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $xmlrpc->xmlrpc_internalencoding);\r
                }\r
                xml_set_element_handler($parser, 'xmlrpc_se_any', 'xmlrpc_ee');\r
                xml_set_character_data_handler($parser, 'xmlrpc_cd');\r
@@ -3560,16 +3612,16 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                        return false;\r
                }\r
                xml_parser_free($parser);\r
-               if ($GLOBALS['_xh']['isf'] > 1) // test that $GLOBALS['_xh']['value'] is an obj, too???\r
+               if ($xmlrpc->_xh['isf'] > 1) // test that $xmlrpc->_xh['value'] is an obj, too???\r
                {\r
-                       error_log($GLOBALS['_xh']['isf_reason']);\r
+                       error_log($xmlrpc->_xh['isf_reason']);\r
                        return false;\r
                }\r
-               switch ($GLOBALS['_xh']['rt'])\r
+               switch ($xmlrpc->_xh['rt'])\r
                {\r
                        case 'methodresponse':\r
-                               $v =& $GLOBALS['_xh']['value'];\r
-                               if ($GLOBALS['_xh']['isf'] == 1)\r
+                               $v =& $xmlrpc->_xh['value'];\r
+                               if ($xmlrpc->_xh['isf'] == 1)\r
                                {\r
                                        $vc = $v->structmem('faultCode');\r
                                        $vs = $v->structmem('faultString');\r
@@ -3581,14 +3633,14 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                                }\r
                                return $r;\r
                        case 'methodcall':\r
-                               $m = new xmlrpcmsg($GLOBALS['_xh']['method']);\r
-                               for($i=0; $i < count($GLOBALS['_xh']['params']); $i++)\r
+                               $m = new xmlrpcmsg($xmlrpc->_xh['method']);\r
+                               for($i=0; $i < count($xmlrpc->_xh['params']); $i++)\r
                                {\r
-                                       $m->addParam($GLOBALS['_xh']['params'][$i]);\r
+                                       $m->addParam($xmlrpc->_xh['params'][$i]);\r
                                }\r
                                return $m;\r
                        case 'value':\r
-                               return $GLOBALS['_xh']['value'];\r
+                               return $xmlrpc->_xh['value'];\r
                        default:\r
                                return false;\r
                }\r
@@ -3665,6 +3717,8 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
        */\r
        function guess_encoding($httpheader='', $xmlchunk='', $encoding_prefs=null)\r
        {\r
+               $xmlrpc = Xmlrpc::instance();\r
+\r
                // discussion: see http://www.yale.edu/pclt/encoding/\r
                // 1 - test if encoding is specified in HTTP HEADERS\r
 \r
@@ -3743,7 +3797,7 @@ xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $cha
                        // Both RFC 2616 (HTTP 1.1) and 1945 (HTTP 1.0) clearly state that for text/xxx content types\r
                        // this should be the standard. And we should be getting text/xml as request and response.\r
                        // BUT we have to be backward compatible with the lib, which always used UTF-8 as default...\r
-                       return $GLOBALS['xmlrpc_defencoding'];\r
+                       return $xmlrpc->xmlrpc_defencoding;\r
                }\r
        }\r
 \r