// xmlrpc.inc,v 1.18 2001/07/06 18:23:57 edmundd // 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 // is preserved in any distributed or derivative work. // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 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; $iaddParam($pars[$i]); } } } function xml_header() { return "\n\n"; } function xml_footer() { return "\n"; } function createPayload() { $this->payload=$this->xml_header(); $this->payload.="" . $this->methodname . "\n"; // if (sizeof($this->params)) { $this->payload.="\n"; for($i=0; $iparams); $i++) { $p=$this->params[$i]; $this->payload.="\n" . $p->serialize() . "\n"; } $this->payload.="\n"; // } $this->payload.=$this->xml_footer(); $this->payload=str_replace("\n", "\r\n", $this->payload); } function method($meth="") { if ($meth!="") { $this->methodname=$meth; } return $this->methodname; } 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 parseResponseFile($fp) { $ipd=""; while($data=fread($fp, 32768)) { $ipd.=$data; } return $this->parseResponse($ipd); } function parseResponse($data="") { global $_xh,$xmlrpcerr,$xmlrpcstr; global $xmlrpc_defencoding; $parser = xml_parser_create($xmlrpc_defencoding); $_xh[$parser] = array(); $_xh[$parser]['st'] = ''; $_xh[$parser]['cm'] = 0; $_xh[$parser]['isf'] = 0; $_xh[$parser]['ac'] = ''; $_xh[$parser]['qt'] = ''; xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee"); xml_set_character_data_handler($parser, "xmlrpc_cd"); xml_set_default_handler($parser, "xmlrpc_dh"); $xmlrpc_value = CreateObject('phpgwapi.xmlrpcval'); $hdrfnd=0; if ($this->debug) { print "
---GOT---\n" . htmlspecialchars($data) . "\n---END---\n
"; } // 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 = CreateObject('phpgwapi.xmlrpcresp',0, $xmlrpcerr['http_error'], $xmlrpcstr['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; } if (!xml_parse($parser, $data, sizeof($data))) { // thanks to Peter Kocks 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 = CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval'), $xmlrpcerr['invalid_return'],$xmlrpcstr['invalid_return']); xml_parser_free($parser); return $r; } xml_parser_free($parser); if ($this->debug) { print "
---EVALING---[" . 
					strlen($_xh[$parser]['st']) . " chars]---\n" . 
					htmlspecialchars($_xh[$parser]['st']) . ";\n---END---
"; } 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 = CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval'), $xmlrpcerr['invalid_return'],$xmlrpcstr['invalid_return']); } else { $code = '$v=' . $_xh[$parser]['st'] . '; $allOK=1;'; $code = ereg_replace(',,',",'',",$code); eval($code); if ($_xh[$parser]['isf']) { $f = $v->structmem("faultCode"); $fs = $v->structmem("faultString"); $r = CreateObject('phpgwapi.xmlrpcresp',$v, $f->scalarval(), $fs->scalarval()); } else { $r = CreateObject('phpgwapi.xmlrpcresp',$v); } } $r->hdrs=split("\r?\n", $_xh[$parser]['ha'][1]); return $r; } } ?>