31 public function decode($xmlrpcVal, $options = array())
33 switch ($xmlrpcVal->kindOf()) {
35 if (in_array(
'extension_api', $options)) {
36 reset($xmlrpcVal->me);
37 list($typ, $val) = each($xmlrpcVal->me);
39 case 'dateTime.iso8601':
40 $xmlrpcVal->scalar = $val;
41 $xmlrpcVal->type =
'datetime';
46 $xmlrpcVal->scalar = $val;
47 $xmlrpcVal->type = $typ;
51 return $xmlrpcVal->scalarval();
54 if (in_array(
'dates_as_objects', $options) && $xmlrpcVal->scalartyp() ==
'dateTime.iso8601') {
58 $out = $xmlrpcVal->scalarval();
59 if (is_string($out)) {
60 $out = strtotime($out);
63 $result = new \Datetime();
64 $result->setTimestamp($out);
67 } elseif (is_a($out,
'Datetime')) {
72 return $xmlrpcVal->scalarval();
75 foreach($xmlrpcVal as $value) {
76 $arr[] = $this->decode($value, $options);
85 if (in_array(
'decode_php_objs', $options) && $xmlrpcVal->_php_class !=
''
86 && class_exists($xmlrpcVal->_php_class)
88 $obj = @
new $xmlrpcVal->_php_class();
89 foreach ($xmlrpcVal as $key => $value) {
90 $obj->$key = $this->decode($value, $options);
96 foreach ($xmlrpcVal as $key => $value) {
97 $arr[$key] = $this->decode($value, $options);
103 $paramCount = $xmlrpcVal->getNumParams();
105 for ($i = 0; $i < $paramCount; $i++) {
106 $arr[] = $this->decode($xmlrpcVal->getParam($i), $options);
131 public function encode($phpVal, $options = array())
133 $type = gettype($phpVal);
136 if (in_array(
'auto_dates', $options) && preg_match(
'/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $phpVal)) {
137 $xmlrpcVal =
new Value($phpVal, Value::$xmlrpcDateTime);
139 $xmlrpcVal =
new Value($phpVal, Value::$xmlrpcString);
143 $xmlrpcVal =
new Value($phpVal, Value::$xmlrpcInt);
146 $xmlrpcVal =
new Value($phpVal, Value::$xmlrpcDouble);
151 $xmlrpcVal =
new Value($phpVal, Value::$xmlrpcBoolean);
163 foreach ($phpVal as $key => $val) {
164 $arr[$key] = $this->encode($val, $options);
165 if (!$ko && $key !== $j) {
171 $xmlrpcVal =
new Value($arr, Value::$xmlrpcStruct);
173 $xmlrpcVal =
new Value($arr, Value::$xmlrpcArray);
177 if (is_a($phpVal,
'PhpXmlRpc\Value')) {
178 $xmlrpcVal = $phpVal;
179 } elseif (is_a($phpVal,
'DateTime')) {
180 $xmlrpcVal =
new Value($phpVal->format(
'Ymd\TH:i:s'), Value::$xmlrpcStruct);
184 while (list($k, $v) = each($phpVal)) {
185 $arr[$k] = $this->encode($v, $options);
187 $xmlrpcVal =
new Value($arr, Value::$xmlrpcStruct);
188 if (in_array(
'encode_php_objs', $options)) {
191 $xmlrpcVal->_php_class = get_class($phpVal);
196 if (in_array(
'extension_api', $options)) {
197 $xmlrpcVal =
new Value(
'', Value::$xmlrpcString);
198 } elseif (in_array(
'null_extension', $options)) {
199 $xmlrpcVal =
new Value(
'', Value::$xmlrpcNull);
201 $xmlrpcVal =
new Value();
205 if (in_array(
'extension_api', $options)) {
206 $xmlrpcVal =
new Value((
int)$phpVal, Value::$xmlrpcInt);
208 $xmlrpcVal =
new Value();
215 $xmlrpcVal =
new Value();
234 $valEncoding = XMLParser::guessEncoding(
'', $xmlVal);
235 if ($valEncoding !=
'') {
242 if (!in_array($valEncoding, array(
'UTF-8',
'US-ASCII')) && !XMLParser::hasEncoding($xmlVal)) {
243 if ($valEncoding ==
'ISO-8859-1') {
244 $xmlVal = utf8_encode($xmlVal);
246 if (extension_loaded(
'mbstring')) {
247 $xmlVal = mb_convert_encoding($xmlVal,
'UTF-8', $valEncoding);
249 error_log(
'XML-RPC: ' . __METHOD__ .
': invalid charset encoding of xml text: ' . $valEncoding);
255 $parser = xml_parser_create();
256 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING,
true);
259 if (!in_array(PhpXmlRpc::$xmlrpc_internalencoding, array(
'UTF-8',
'ISO-8859-1',
'US-ASCII'))) {
260 xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING,
'UTF-8');
262 xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, PhpXmlRpc::$xmlrpc_internalencoding);
266 xml_set_object($parser, $xmlRpcParser);
268 xml_set_element_handler($parser,
'xmlrpc_se_any',
'xmlrpc_ee');
269 xml_set_character_data_handler($parser,
'xmlrpc_cd');
270 xml_set_default_handler($parser,
'xmlrpc_dh');
271 if (!xml_parse($parser, $xmlVal, 1)) {
272 $errstr = sprintf(
'XML error: %s at line %d, column %d',
273 xml_error_string(xml_get_error_code($parser)),
274 xml_get_current_line_number($parser), xml_get_current_column_number($parser));
276 xml_parser_free($parser);
280 xml_parser_free($parser);
281 if ($xmlRpcParser->_xh[
'isf'] > 1) {
284 error_log($xmlRpcParser->_xh[
'isf_reason']);
288 switch ($xmlRpcParser->_xh[
'rt']) {
289 case 'methodresponse':
290 $v = &$xmlRpcParser->_xh[
'value'];
291 if ($xmlRpcParser->_xh[
'isf'] == 1) {
292 $vc = $v[
'faultCode'];
293 $vs = $v[
'faultString'];
294 $r =
new Response(0, $vc->scalarval(), $vs->scalarval());
301 $req =
new Request($xmlRpcParser->_xh[
'method']);
302 for ($i = 0; $i < count($xmlRpcParser->_xh[
'params']); $i++) {
303 $req->addParam($xmlRpcParser->_xh[
'params'][$i]);
308 return $xmlRpcParser->_xh[
'value'];