// 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='') { $parser = xml_parser_create($GLOBALS['xmlrpc_defencoding']); $GLOBALS['_xh'][$parser] = array(); $GLOBALS['_xh'][$parser]['st'] = ''; $GLOBALS['_xh'][$parser]['cm'] = 0; $GLOBALS['_xh'][$parser]['isf'] = 0; $GLOBALS['_xh'][$parser]['ac'] = ''; $GLOBALS['_xh'][$parser]['qt'] = ''; $GLOBALS['_xh'][$parser]['ha'] = ''; 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, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['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'), $GLOBALS['xmlrpcerr']['invalid_return'],$GLOBALS['xmlrpcstr']['invalid_return']); xml_parser_free($parser); return $r; } xml_parser_free($parser); if ($this->debug) { print '
---EVALING---[' . 
					strlen($GLOBALS['_xh'][$parser]['st']) . ' chars]---'."\n" . 
					htmlspecialchars($GLOBALS['_xh'][$parser]['st']) . ';'."\n".'---END---
'; } if (strlen($GLOBALS['_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'), $GLOBALS['xmlrpcerr']['invalid_return'],$GLOBALS['xmlrpcstr']['invalid_return']); } else { $code = '$v=' . $GLOBALS['_xh'][$parser]['st'] . '; $allOK=1;'; $code = ereg_replace(',,',",'',",$code); eval($code); if ($GLOBALS['_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", $GLOBALS['_xh'][$parser]['ha'][1]); return $r; } } ?>