ssb Sun Apr 8 00:42:12 2001 EDT Modified files: /php4/pear/XML RPC.php Log: * globals fixes
Index: php4/pear/XML/RPC.php diff -u php4/pear/XML/RPC.php:1.2 php4/pear/XML/RPC.php:1.3 --- php4/pear/XML/RPC.php:1.2 Tue Sep 26 00:33:19 2000 +++ php4/pear/XML/RPC.php Sun Apr 8 00:42:11 2001 @@ -7,7 +7,7 @@ // // by Edd Dumbill (C) 1999-2000 // <[EMAIL PROTECTED]> -// $Id: RPC.php,v 1.2 2000/09/26 07:33:19 sbergmann Exp $ +// $Id: RPC.php,v 1.3 2001/04/08 07:42:11 ssb Exp $ // License is granted to use or modify this software ("XML-RPC for PHP") // for commercial or non-commercial use provided the copyright of the author @@ -33,55 +33,55 @@ } } -$XML_RPC_I4="i4"; -$XML_RPC_Int="int"; -$XML_RPC_Boolean="boolean"; -$XML_RPC_Double="double"; -$XML_RPC_String="string"; -$XML_RPC_DateTime="dateTime.iso8601"; -$XML_RPC_Base64="base64"; -$XML_RPC_Array="array"; -$XML_RPC_Struct="struct"; - -$XML_RPC_Types=array($XML_RPC_I4 => 1, - $XML_RPC_Int => 1, - $XML_RPC_Boolean => 1, - $XML_RPC_String => 1, - $XML_RPC_Double => 1, - $XML_RPC_DateTime => 1, - $XML_RPC_Base64 => 1, - $XML_RPC_Array => 2, - $XML_RPC_Struct => 3); +$GLOBALS['XML_RPC_I4']="i4"; +$GLOBALS['XML_RPC_Int']="int"; +$GLOBALS['XML_RPC_Boolean']="boolean"; +$GLOBALS['XML_RPC_Double']="double"; +$GLOBALS['XML_RPC_String']="string"; +$GLOBALS['XML_RPC_DateTime']="dateTime.iso8601"; +$GLOBALS['XML_RPC_Base64']="base64"; +$GLOBALS['XML_RPC_Array']="array"; +$GLOBALS['XML_RPC_Struct']="struct"; + +$GLOBALS['XML_RPC_Types']=array($XML_RPC_I4 => 1, + $XML_RPC_Int => 1, + $XML_RPC_Boolean => 1, + $XML_RPC_String => 1, + $XML_RPC_Double => 1, + $XML_RPC_DateTime => 1, + $XML_RPC_Base64 => 1, + $XML_RPC_Array => 2, + $XML_RPC_Struct => 3); -$XML_RPC_Entities=array("quot" => '"', +$GLOBALS['XML_RPC_Entities']=array("quot" => '"', "amp" => "&", "lt" => "<", "gt" => ">", "apos" => "'"); -$XML_RPC_err["unknown_method"]=1; -$XML_RPC_str["unknown_method"]="Unknown method"; -$XML_RPC_err["invalid_return"]=2; -$XML_RPC_str["invalid_return"]="Invalid return payload: enabling debugging to examine incoming payload"; -$XML_RPC_err["incorrect_params"]=3; -$XML_RPC_str["incorrect_params"]="Incorrect parameters passed to method"; -$XML_RPC_err["introspect_unknown"]=4; -$XML_RPC_str["introspect_unknown"]="Can't introspect: method unknown"; -$XML_RPC_err["http_error"]=5; -$XML_RPC_str["http_error"]="Didn't receive 200 OK from remote server."; +$GLOBALS['XML_RPC_err']["unknown_method"]=1; +$GLOBALS['XML_RPC_str']["unknown_method"]="Unknown method"; +$GLOBALS['XML_RPC_err']["invalid_return"]=2; +$GLOBALS['XML_RPC_str']["invalid_return"]="Invalid return payload: enabling debugging +to examine incoming payload"; +$GLOBALS['XML_RPC_err']["incorrect_params"]=3; +$GLOBALS['XML_RPC_str']["incorrect_params"]="Incorrect parameters passed to method"; +$GLOBALS['XML_RPC_err']["introspect_unknown"]=4; +$GLOBALS['XML_RPC_str']["introspect_unknown"]="Can't introspect: method unknown"; +$GLOBALS['XML_RPC_err']["http_error"]=5; +$GLOBALS['XML_RPC_str']["http_error"]="Didn't receive 200 OK from remote server."; -$XML_RPC_defencoding="UTF-8"; +$GLOBALS['XML_RPC_defencoding']="UTF-8"; // let user errors start at 800 -$XML_RPC_erruser=800; +$GLOBALS['XML_RPC_erruser']=800; // let XML parse errors start at 100 -$XML_RPC_errxml=100; +$GLOBALS['XML_RPC_errxml']=100; // formulate backslashes for escaping regexp -$XML_RPC_backslash=chr(92).chr(92); +$GLOBALS['XML_RPC_backslash']=chr(92).chr(92); -$XML_RPC_twoslash=$XML_RPC_backslash . $XML_RPC_backslash; -$XML_RPC_twoslash="2SLS"; +$GLOBALS['XML_RPC_twoslash']=$XML_RPC_backslash . $XML_RPC_backslash; +//$GLOBALS['XML_RPC_twoslash']="2SLS"; // used to store state during parsing // quick explanation of components: // st - used to build up a string for evaluation @@ -94,7 +94,7 @@ // params - used to store parameters in method calls // method - used to store method name -$_xh=array(); +$GLOBALS['_xh']=array(); class XML_RPC_Parser extends XML_Parser { @@ -247,134 +247,145 @@ } } -function xmlrpc_entity_decode($string) { - $top=split("&", $string); - $op=""; - $i=0; - while($i<sizeof($top)) { +function xmlrpc_entity_decode($string) +{ + $top=split("&", $string); + $op=""; + $i=0; + while($i<sizeof($top)) { if (ereg("^([#a-zA-Z0-9]+);", $top[$i], $regs)) { - $op.=ereg_replace("^[#a-zA-Z0-9]+;", - xmlrpc_lookup_entity($regs[1]), - $top[$i]); + $op.=ereg_replace("^[#a-zA-Z0-9]+;", + xmlrpc_lookup_entity($regs[1]), + $top[$i]); } else { - if ($i==0) + if ($i==0) $op=$top[$i]; - else + else $op.="&" . $top[$i]; } $i++; - } - return $op; + } + return $op; } -function xmlrpc_lookup_entity($ent) { - global $XML_RPC_Entities; +function xmlrpc_lookup_entity($ent) +{ + global $XML_RPC_Entities; - if ($XML_RPC_Entities[strtolower($ent)]) + if ($XML_RPC_Entities[strtolower($ent)]) return $XML_RPC_Entities[strtolower($ent)]; - if (ereg("^#([0-9]+)$", $ent, $regs)) + if (ereg("^#([0-9]+)$", $ent, $regs)) return chr($regs[1]); - return "?"; + return "?"; } -class xmlrpc_client { - var $path; - var $server; - var $port; - var $errno; - var $errstring; - var $debug=0; - var $username=""; - var $password=""; - - function xmlrpc_client($path, $server, $port=80) { - $this->port=$port; $this->server=$server; $this->path=$path; - } - - function setDebug($in) { - if ($in) { - $this->debug=1; - } else { - $this->debug=0; - } - } +class xmlrpc_client +{ + var $path; + var $server; + var $port; + var $errno; + var $errstring; + var $debug=0; + var $username=""; + var $password=""; + + function xmlrpc_client($path, $server, $port=80) + { + $this->port=$port; $this->server=$server; $this->path=$path; + } - function setCredentials($u, $p) { - $this->username=$u; - $this->password=$p; - } - - function send($msg, $timeout=0) { - // where msg is an xmlrpcmsg - $msg->debug=$this->debug; - return $this->sendPayloadHTTP10($msg, $this->server, $this->port, - $timeout, $this->username, - $this->password); - } - - function sendPayloadHTTP10($msg, $server, $port, $timeout=0, - $username="", $password="") { - if($timeout>0) - $fp=fsockopen($server, $port, - $this->errno, $this->errstr, $timeout); - else - $fp=fsockopen($server, $port, - $this->errno, $this->errstr); - if (!$fp) { - return 0; - } - // Only create the payload if it was not created previously - if(empty($msg->payload)) $msg->createPayload(); - - // thanks to Grant Rauscher <[EMAIL PROTECTED]> - // for this - $credentials=""; - if ($username!="") { - $credentials="Authorization: Basic " . - base64_encode($username . ":" . $password) . "\r\n"; - } + function setDebug($in) + { + if ($in) { + $this->debug=1; + } else { + $this->debug=0; + } + } - $op= "POST " . $this->path. " HTTP/1.0\r\nUser-Agent: PHP XMLRPC 1.0\r\n" . - "Host: ". $this->server . "\r\n" . - $credentials . - "Content-Type: text/xml\r\nContent-Length: " . - strlen($msg->payload) . "\r\n\r\n" . - $msg->payload; - - if (!fputs($fp, $op, strlen($op))) { - $this->errstr="Write error"; - return 0; - } - $resp=$msg->parseResponseFile($fp); - fclose($fp); - return $resp; - } + function setCredentials($u, $p) + { + $this->username=$u; + $this->password=$p; + } + + function send($msg, $timeout=0) + { + // where msg is an xmlrpcmsg + $msg->debug=$this->debug; + return $this->sendPayloadHTTP10($msg, $this->server, $this->port, + $timeout, $this->username, + $this->password); + } + function sendPayloadHTTP10($msg, $server, $port, $timeout=0, + $username="", $password="") + { + if($timeout>0) + $fp=fsockopen($server, $port, + $this->errno, $this->errstr, $timeout); + else + $fp=fsockopen($server, $port, + $this->errno, $this->errstr); + if (!$fp) { + return 0; + } + // Only create the payload if it was not created previously + if(empty($msg->payload)) $msg->createPayload(); + + // thanks to Grant Rauscher <[EMAIL PROTECTED]> + // for this + $credentials=""; + if ($username!="") { + $credentials="Authorization: Basic " . + base64_encode($username . ":" . $password) . "\r\n"; + } + + $op= "POST " . $this->path. " HTTP/1.0\r\nUser-Agent: PHP XMLRPC 1.0\r\n" . + "Host: ". $this->server . "\r\n" . + $credentials . + "Content-Type: text/xml\r\nContent-Length: " . + strlen($msg->payload) . "\r\n\r\n" . + $msg->payload; + + if (!fputs($fp, $op, strlen($op))) { + $this->errstr="Write error"; + return 0; + } + $resp=$msg->parseResponseFile($fp); + fclose($fp); + return $resp; + } } // end class xmlrpc_client + -class xmlrpcresp { - var $xv; - var $fn; - var $fs; - var $hdrs; +class xmlrpcresp +{ + var $xv; + var $fn; + var $fs; + var $hdrs; - function xmlrpcresp($val, $fcode=0, $fstr="") { + function xmlrpcresp($val, $fcode=0, $fstr="") + { if ($fcode!=0) { - $this->fn=$fcode; - $this->fs=htmlspecialchars($fstr); + $this->fn=$fcode; + $this->fs=htmlspecialchars($fstr); } else { - $this->xv=$val; + $this->xv=$val; } - } - - function faultCode() { return $this->fn; } - function faultString() { return $this->fs; } - function value() { return $this->xv; } - - function serialize() { + } + + function faultCode() { return $this->fn; } + function faultString() { return $this->fs; } + function value() { return $this->xv; } + + function serialize() + { $rs="<methodResponse>\n"; if ($this->fn) { - $rs.="<fault> + $rs.="<fault> <value> <struct> <member> @@ -389,81 +400,89 @@ </value> </fault>"; } else { - $rs.="<params>\n<param>\n" . $this->xv->serialize() . + $rs.="<params>\n<param>\n" . $this->xv->serialize() . "</param>\n</params>"; } $rs.="\n</methodResponse>"; return $rs; - } + } } -class xmlrpcmsg { - var $payload; - var $methodname; - var $params=array(); - var $debug=0; - - function xmlrpcmsg($meth, $pars=0) { - $this->methodname=$meth; - if (is_array($pars) && sizeof($pars)>0) { - for($i=0; $i<sizeof($pars); $i++) - $this->addParam($pars[$i]); - } - } +class xmlrpcmsg +{ + var $payload; + var $methodname; + var $params=array(); + var $debug=0; + + function xmlrpcmsg($meth, $pars=0) + { + $this->methodname=$meth; + if (is_array($pars) && sizeof($pars)>0) { + for($i=0; $i<sizeof($pars); $i++) + $this->addParam($pars[$i]); + } + } - function xml_header() { + function xml_header() + { return "<?xml version=\"1.0\"?>\n<methodCall>\n"; - } + } - function xml_footer() { + function xml_footer() + { return "</methodCall>\n"; - } + } - function createPayload() { + function createPayload() + { $this->payload=$this->xml_header(); $this->payload.="<methodName>" . $this->methodname . "</methodName>\n"; // if (sizeof($this->params)) { - $this->payload.="<params>\n"; - for($i=0; $i<sizeof($this->params); $i++) { - $p=$this->params[$i]; - $this->payload.="<param>\n" . $p->serialize() . - "</param>\n"; - } - $this->payload.="</params>\n"; + $this->payload.="<params>\n"; + for($i=0; $i<sizeof($this->params); $i++) { + $p=$this->params[$i]; + $this->payload.="<param>\n" . $p->serialize() . + "</param>\n"; + } + $this->payload.="</params>\n"; // } $this->payload.=$this->xml_footer(); $this->payload=ereg_replace("\n", "\r\n", $this->payload); - } + } - function method($meth="") { - if ($meth!="") { - $this->methodname=$meth; + function method($meth="") + { + if ($meth!="") { + $this->methodname=$meth; } return $this->methodname; - } + } + + function serialize() + { + $this->createPayload(); + return $this->payload; + } - function serialize() { - $this->createPayload(); - return $this->payload; - } - - function addParam($par) { $this->params[]=$par; } - function getParam($i) { return $this->params[$i]; } - function getNumParams() { return sizeof($this->params); } + function addParam($par) { $this->params[]=$par; } + function getParam($i) { return $this->params[$i]; } + function getNumParams() { return sizeof($this->params); } - function parseResponseFile($fp) { + function parseResponseFile($fp) + { $ipd=""; - + while($data=fread($fp, 32768)) { - $ipd.=$data; + $ipd.=$data; } return $this->parseResponse($ipd); - } + } - function parseResponse($data="") { + function parseResponse($data="") + { global $_xh,$XML_RPC_err,$XML_RPC_str; global $XML_RPC_defencoding; - $parser = xml_parser_create($XML_RPC_defencoding); @@ -482,345 +501,345 @@ $hdrfnd=0; if ($this->debug) - print "<PRE>---GOT---\n" . htmlspecialchars($data) . + print "<PRE>---GOT---\n" . htmlspecialchars($data) . "\n---END---\n</PRE>"; // see if we got an HTTP 200 OK, else bomb // but only do this if we're using the HTTP protocol. if (ereg("^HTTP",$data) && - !ereg("^HTTP/[0-9\.]+ 200 ", $data)) { - $errstr= substr($data, 0, strpos($data, "\n")-1); - error_log("HTTP error, got response: " .$errstr); - $r=new xmlrpcresp(0, $XML_RPC_err["http_error"], - $XML_RPC_str["http_error"]. " (" . $errstr . ")"); - xml_parser_free($parser); - return $r; + !ereg("^HTTP/[0-9\.]+ 200 ", $data)) { + $errstr= substr($data, 0, strpos($data, "\n")-1); + error_log("HTTP error, got response: " .$errstr); + $r=new xmlrpcresp(0, $XML_RPC_err["http_error"], + $XML_RPC_str["http_error"]. " (" . $errstr . ")"); + xml_parser_free($parser); + return $r; } // gotta get rid of headers here if ((!$hdrfnd) && ereg("^(.*)\r\n\r\n",$data,$_xh[$parser]['ha'])) { - $data=ereg_replace("^.*\r\n\r\n", "", $data); - $hdrfnd=1; + $data=ereg_replace("^.*\r\n\r\n", "", $data); + $hdrfnd=1; } if (!xml_parse($parser, $data, sizeof($data))) { - // thanks to Peter Kocks <[EMAIL PROTECTED]> - if((xml_get_current_line_number($parser)) == 1) - $errstr = "XML error at line 1, check URL"; - else - $errstr = sprintf("XML error: %s at line %d", - xml_error_string(xml_get_error_code($parser)), - xml_get_current_line_number($parser)); - error_log($errstr); - $r=new xmlrpcresp(0, $XML_RPC_err["invalid_return"], - $XML_RPC_str["invalid_return"]); - xml_parser_free($parser); - return $r; + // thanks to Peter Kocks <[EMAIL PROTECTED]> + if((xml_get_current_line_number($parser)) == 1) + $errstr = "XML error at line 1, check URL"; + else + $errstr = sprintf("XML error: %s at line %d", + xml_error_string(xml_get_error_code($parser)), + xml_get_current_line_number($parser)); + error_log($errstr); + $r=new xmlrpcresp(0, $XML_RPC_err["invalid_return"], + $XML_RPC_str["invalid_return"]); + xml_parser_free($parser); + return $r; } xml_parser_free($parser); if ($this->debug) { - print "<PRE>---EVALING---[" . + print "<PRE>---EVALING---[" . strlen($_xh[$parser]['st']) . " chars]---\n" . htmlspecialchars($_xh[$parser]['st']) . ";\n---END---</PRE>"; } if (strlen($_xh[$parser]['st'])==0) { - // then something odd has happened - // and it's time to generate a client side error - // indicating something odd went on - $r=new xmlrpcresp(0, $XML_RPC_err["invalid_return"], - $XML_RPC_str["invalid_return"]); + // then something odd has happened + // and it's time to generate a client side error + // indicating something odd went on + $r=new xmlrpcresp(0, $XML_RPC_err["invalid_return"], + $XML_RPC_str["invalid_return"]); } else { - eval('$v=' . $_xh[$parser]['st'] . '; $allOK=1;'); - if ($_xh[$parser]['isf']) { + eval('$v=' . $_xh[$parser]['st'] . '; $allOK=1;'); + if ($_xh[$parser]['isf']) { $f=$v->structmem("faultCode"); $fs=$v->structmem("faultString"); $r=new xmlrpcresp($v, $f->scalarval(), - $fs->scalarval()); - } else { + $fs->scalarval()); + } else { $r=new xmlrpcresp($v); - } + } } $r->hdrs=split('\r?\n', $_xh[$parser]['ha'][1]); return $r; - } - + } } - -class xmlrpcval { - var $me=array(); - var $mytype=0; - - function xmlrpcval($val=-1, $type="") { - global $XML_RPC_Types; - $this->me=array(); - $this->mytype=0; - if ($val!=-1 || $type!="") { - if ($type=="") $type="string"; - if ($XML_RPC_Types[$type]==1) { - $this->addScalar($val,$type); - } - else if ($XML_RPC_Types[$type]==2) - $this->addArray($val); - else if ($XML_RPC_Types[$type]==3) - $this->addStruct($val); - } - } - - function addScalar($val, $type="string") { - global $XML_RPC_Types, $XML_RPC_Boolean; - - if ($this->mytype==1) { - echo "<B>xmlrpcval</B>: scalar can have only one value<BR>"; - return 0; - } - $typeof=$XML_RPC_Types[$type]; - if ($typeof!=1) { - echo "<B>xmlrpcval</B>: not a scalar type (${typeof})<BR>"; - return 0; - } - - if ($type==$XML_RPC_Boolean) { - if (strcasecmp($val,"true")==0 || $val==1 || $val==true) { - $val=1; - } else { - $val=0; - } - } - - if ($this->mytype==2) { - // we're adding to an array here - $ar=$this->me["array"]; - $ar[]=new xmlrpcval($val, $type); - $this->me["array"]=$ar; - } else { - // a scalar, so set the value and remember we're scalar - $this->me[$type]=$val; - $this->mytype=$typeof; - } - return 1; - } - function addArray($vals) { - global $XML_RPC_Types; - if ($this->mytype!=0) { - echo "<B>xmlrpcval</B>: already initialized as a [" . - $this->kindOf() . "]<BR>"; - return 0; - } - $this->mytype=$XML_RPC_Types["array"]; - $this->me["array"]=$vals; - return 1; - } +class xmlrpcval +{ + var $me=array(); + var $mytype=0; - function addStruct($vals) { + function xmlrpcval($val=-1, $type="") { + global $XML_RPC_Types; + $this->me=array(); + $this->mytype=0; + if ($val!=-1 || $type!="") { + if ($type=="") $type="string"; + if ($XML_RPC_Types[$type]==1) { + $this->addScalar($val,$type); + } + else if ($XML_RPC_Types[$type]==2) + $this->addArray($val); + else if ($XML_RPC_Types[$type]==3) + $this->addStruct($val); + } + } + + function addScalar($val, $type="string") { + global $XML_RPC_Types, $XML_RPC_Boolean; + + if ($this->mytype==1) { + echo "<B>xmlrpcval</B>: scalar can have only one value<BR>"; + return 0; + } + $typeof=$XML_RPC_Types[$type]; + if ($typeof!=1) { + echo "<B>xmlrpcval</B>: not a scalar type (${typeof})<BR>"; + return 0; + } + + if ($type==$XML_RPC_Boolean) { + if (strcasecmp($val,"true")==0 || $val==1 || $val==true) { + $val=1; + } else { + $val=0; + } + } + + if ($this->mytype==2) { + // we're adding to an array here + $ar=$this->me["array"]; + $ar[]=new xmlrpcval($val, $type); + $this->me["array"]=$ar; + } else { + // a scalar, so set the value and remember we're scalar + $this->me[$type]=$val; + $this->mytype=$typeof; + } + return 1; + } + + function addArray($vals) { + global $XML_RPC_Types; + if ($this->mytype!=0) { + echo "<B>xmlrpcval</B>: already initialized as a [" . + $this->kindOf() . "]<BR>"; + return 0; + } + $this->mytype=$XML_RPC_Types["array"]; + $this->me["array"]=$vals; + return 1; + } + + function addStruct($vals) { global $XML_RPC_Types; if ($this->mytype!=0) { - echo "<B>xmlrpcval</B>: already initialized as a [" . + echo "<B>xmlrpcval</B>: already initialized as a [" . $this->kindOf() . "]<BR>"; - return 0; + return 0; } $this->mytype=$XML_RPC_Types["struct"]; $this->me["struct"]=$vals; return 1; - } - - function dump($ar) { + } + + function dump($ar) { reset($ar); while ( list( $key, $val ) = each( $ar ) ) { - echo "$key => $val<br>"; - if ($key == 'array') + echo "$key => $val<br>"; + if ($key == 'array') while ( list( $key2, $val2 ) = each( $val ) ) { - echo "-- $key2 => $val2<br>"; + echo "-- $key2 => $val2<br>"; } } - } - - function kindOf() { + } + + function kindOf() { switch($this->mytype) { - case 3: - return "struct"; - break; - case 2: - return "array"; - break; - case 1: - return "scalar"; - break; - default: - return "undef"; - } - } - - function serializedata($typ, $val) { - $rs=""; - global $XML_RPC_Types, $XML_RPC_Base64, $XML_RPC_String; - switch($XML_RPC_Types[$typ]) { - case 3: - // struct - $rs.="<struct>\n"; - reset($val); - while(list($key2, $val2)=each($val)) { - $rs.="<member><name>${key2}</name>\n"; - $rs.=$this->serializeval($val2); - $rs.="</member>\n"; - } - $rs.="</struct>"; - break; - case 2: - // array - $rs.="<array>\n<data>\n"; - for($i=0; $i<sizeof($val); $i++) { - $rs.=$this->serializeval($val[$i]); - } - $rs.="</data>\n</array>"; - break; - case 1: - switch ($typ) { - case $XML_RPC_Base64: - $rs.="<${typ}>" . base64_encode($val) . "</${typ}>"; - break; - case $XML_RPC_Boolean: - $rs.="<${typ}>" . ($val ? "1" : "0") . "</${typ}>"; - break; - case $XML_RPC_String: - $rs.="<${typ}>" . htmlspecialchars($val). "</${typ}>"; - break; - default: - $rs.="<${typ}>${val}</${typ}>"; - } - break; - default: - break; - } - return $rs; - } + case 3: + return "struct"; + break; + case 2: + return "array"; + break; + case 1: + return "scalar"; + break; + default: + return "undef"; + } + } + + function serializedata($typ, $val) { + $rs=""; + global $XML_RPC_Types, $XML_RPC_Base64, $XML_RPC_String; + switch($XML_RPC_Types[$typ]) { + case 3: + // struct + $rs.="<struct>\n"; + reset($val); + while(list($key2, $val2)=each($val)) { + $rs.="<member><name>${key2}</name>\n"; + $rs.=$this->serializeval($val2); + $rs.="</member>\n"; + } + $rs.="</struct>"; + break; + case 2: + // array + $rs.="<array>\n<data>\n"; + for($i=0; $i<sizeof($val); $i++) { + $rs.=$this->serializeval($val[$i]); + } + $rs.="</data>\n</array>"; + break; + case 1: + switch ($typ) { + case $XML_RPC_Base64: + $rs.="<${typ}>" . base64_encode($val) . "</${typ}>"; + break; + case $XML_RPC_Boolean: + $rs.="<${typ}>" . ($val ? "1" : "0") . "</${typ}>"; + break; + case $XML_RPC_String: + $rs.="<${typ}>" . htmlspecialchars($val). "</${typ}>"; + break; + default: + $rs.="<${typ}>${val}</${typ}>"; + } + break; + default: + break; + } + return $rs; + } - function serialize() { + function serialize() { return $this->serializeval($this); - } + } - function serializeval($o) { - global $XML_RPC_Types; - $rs=""; - $ar=$o->me; - reset($ar); - list($typ, $val) = each($ar); - $rs.="<value>"; - $rs.=$this->serializedata($typ, $val); - $rs.="</value>\n"; - return $rs; - } - - function structmem($m) { - $nv=$this->me["struct"][$m]; - return $nv; - } + function serializeval($o) { + global $XML_RPC_Types; + $rs=""; + $ar=$o->me; + reset($ar); + list($typ, $val) = each($ar); + $rs.="<value>"; + $rs.=$this->serializedata($typ, $val); + $rs.="</value>\n"; + return $rs; + } - function structreset() { - reset($this->me["struct"]); - } + function structmem($m) { + $nv=$this->me["struct"][$m]; + return $nv; + } + + function structreset() { + reset($this->me["struct"]); + } - function structeach() { - return each($this->me["struct"]); - } + function structeach() { + return each($this->me["struct"]); + } + + function scalarval() { + global $XML_RPC_Boolean, $XML_RPC_Base64; + reset($this->me); + list($a,$b)=each($this->me); + return $b; + } + + function scalartyp() { + global $XML_RPC_I4, $XML_RPC_Int; + reset($this->me); + list($a,$b)=each($this->me); + if ($a==$XML_RPC_I4) + $a=$XML_RPC_Int; + return $a; + } - function scalarval() { - global $XML_RPC_Boolean, $XML_RPC_Base64; - reset($this->me); - list($a,$b)=each($this->me); - return $b; - } - - function scalartyp() { - global $XML_RPC_I4, $XML_RPC_Int; - reset($this->me); - list($a,$b)=each($this->me); - if ($a==$XML_RPC_I4) - $a=$XML_RPC_Int; - return $a; - } - - function arraymem($m) { - $nv=$this->me["array"][$m]; - return $nv; - } - - function arraysize() { - reset($this->me); - list($a,$b)=each($this->me); - return sizeof($b); - } + function arraymem($m) { + $nv=$this->me["array"][$m]; + return $nv; + } + + function arraysize() { + reset($this->me); + list($a,$b)=each($this->me); + return sizeof($b); + } } // date helpers function iso8601_encode($timet, $utc=0) { - // return an ISO8601 encoded string - // really, timezones ought to be supported - // but the XML-RPC spec says: - // - // "Don't assume a timezone. It should be specified by the server in its - // documentation what assumptions it makes about timezones." - // - // these routines always assume localtime unless - // $utc is set to 1, in which case UTC is assumed - // and an adjustment for locale is made when encoding - if (!$utc) { - $t=strftime("%Y%m%dT%H:%M:%S", $timet); - } else { - if (function_exists("gmstrftime")) - // gmstrftime doesn't exist in some versions - // of PHP - $t=gmstrftime("%Y%m%dT%H:%M:%S", $timet); - else { - $t=strftime("%Y%m%dT%H:%M:%S", $timet-date("Z")); - } - } - return $t; + // return an ISO8601 encoded string + // really, timezones ought to be supported + // but the XML-RPC spec says: + // + // "Don't assume a timezone. It should be specified by the server in its + // documentation what assumptions it makes about timezones." + // + // these routines always assume localtime unless + // $utc is set to 1, in which case UTC is assumed + // and an adjustment for locale is made when encoding + if (!$utc) { + $t=strftime("%Y%m%dT%H:%M:%S", $timet); + } else { + if (function_exists("gmstrftime")) + // gmstrftime doesn't exist in some versions + // of PHP + $t=gmstrftime("%Y%m%dT%H:%M:%S", $timet); + else { + $t=strftime("%Y%m%dT%H:%M:%S", $timet-date("Z")); + } + } + return $t; } function iso8601_decode($idate, $utc=0) { - // return a timet in the localtime, or UTC - $t=0; - if (ereg("([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})", - $idate, $regs)) { - if ($utc) { - $t=gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); - } else { - $t=mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); - } - } - return $t; + // return a timet in the localtime, or UTC + $t=0; + if (ereg("([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})", + $idate, $regs)) { + if ($utc) { + $t=gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); + } else { + $t=mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); + } + } + return $t; } // general helper functions --- they DON'T WORK YET function hash_to_rpcv($hash) - // contributed by Ben Margolin <[EMAIL PROTECTED]> + // contributed by Ben Margolin <[EMAIL PROTECTED]> { - reset($hash); - while (list($k,$v) = each($hash)) { - if (is_integer($v)) { - $oa[$k] = new xmlrpcval($v, 'int'); - } else if (is_array($v)) { - $oa[$k] = new xmlrpcval( hash_to_rpcv($v), 'struct' ); - } else { // if binary, do base64...? - $oa[$k] = new xmlrpcval($v); + reset($hash); + while (list($k,$v) = each($hash)) { + if (is_integer($v)) { + $oa[$k] = new xmlrpcval($v, 'int'); + } else if (is_array($v)) { + $oa[$k] = new xmlrpcval( hash_to_rpcv($v), 'struct' ); + } else { // if binary, do base64...? + $oa[$k] = new xmlrpcval($v); + } } - } - return new xmlrpcval( $oa, 'struct' ); + return new xmlrpcval( $oa, 'struct' ); } // hash_to_rpc function rpcv_to_hash($rv) { - $rv->structreset(); - while (list($k,$v) = $rv->structeach()) { - $ko = $v->kindOf(); - if ('scalar' == $ko) { - $oa[$k] = $v->scalarval(); - } else { - $oa[$k] = rpcv_to_hash( $v ); - } - } - return $oa; + $rv->structreset(); + while (list($k,$v) = $rv->structeach()) { + $ko = $v->kindOf(); + if ('scalar' == $ko) { + $oa[$k] = $v->scalarval(); + } else { + $oa[$k] = rpcv_to_hash( $v ); + } + } + return $oa; } // rpcv_to_hash
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]