public function parseRequest($data = '')
{
//-------------------------------------
// Get Data
//-------------------------------------
if ($data === '') {
$CI =& get_instance();
if ($CI->input->method() === 'post') {
$data = $CI->input->raw_input_stream;
}
}
//-------------------------------------
// Set up XML Parser
//-------------------------------------
$parser = xml_parser_create($this->xmlrpc_defencoding);
$parser_object = new XML_RPC_Message('filler');
$pname = (string) $parser;
$parser_object->xh[$pname] = array('isf' => 0, 'isf_reason' => '', 'params' => array(), 'stack' => array(), 'valuestack' => array(), 'method' => '');
xml_set_object($parser, $parser_object);
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, TRUE);
xml_set_element_handler($parser, 'open_tag', 'closing_tag');
xml_set_character_data_handler($parser, 'character_data');
//xml_set_default_handler($parser, 'default_handler');
//-------------------------------------
// PARSE + PROCESS XML DATA
//-------------------------------------
if (!xml_parse($parser, $data, 1)) {
// Return XML error as a faultCode
$r = new XML_RPC_Response(0, $this->xmlrpcerrxml + xml_get_error_code($parser), sprintf('XML error: %s at line %d', xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser)));
xml_parser_free($parser);
} elseif ($parser_object->xh[$pname]['isf']) {
return new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return']);
} else {
xml_parser_free($parser);
$m = new XML_RPC_Message($parser_object->xh[$pname]['method']);
$plist = '';
for ($i = 0, $c = count($parser_object->xh[$pname]['params']); $i < $c; $i++) {
if ($this->debug === TRUE) {
$plist .= $i . ' - ' . print_r(get_object_vars($parser_object->xh[$pname]['params'][$i]), TRUE) . ";\n";
}
$m->addParam($parser_object->xh[$pname]['params'][$i]);
}
if ($this->debug === TRUE) {
echo "<pre>---PLIST---\n" . $plist . "\n---PLIST END---\n\n</pre>";
}
$r = $this->_execute($m);
}
//-------------------------------------
// SET DEBUGGING MESSAGE
//-------------------------------------
if ($this->debug === TRUE) {
$this->debug_msg = "<!-- DEBUG INFO:\n\n" . $plist . "\n END DEBUG-->\n";
}
return $r;
}