*/
class Encoder
{
+ protected static $logger;
+ protected static $parser;
+
+ public function getLogger()
+ {
+ if (self::$logger === null) {
+ self::$logger = Logger::instance();
+ }
+ return self::$logger;
+ }
+
+ public static function setLogger($logger)
+ {
+ self::$logger = $logger;
+ }
+
+ public function getParser()
+ {
+ if (self::$parser === null) {
+ self::$parser = new XMLParser();
+ }
+ return self::$parser;
+ }
+
+ public static function setParser($parser)
+ {
+ self::$parser = $parser;
+ }
+
/**
* Takes an xmlrpc value in object format and translates it into native PHP types.
*
'scalar' => $val
);
return (object)$xmlrpcVal;
+ case 'string':
+ if (isset($options['extension_api_encoding'])) {
+ $dval = @iconv('UTF-8', $options['extension_api_encoding'], $val);
+ if ($dval !== false) {
+ return $dval;
+ }
+ }
+ //return $val;
+ // break through voluntarily
default:
- return $xmlrpcVal->scalarval();
+ return $val;
}
}
if (in_array('dates_as_objects', $options) && $xmlrpcVal->scalartyp() == 'dateTime.iso8601') {
return $out;
}
}
-
return $xmlrpcVal->scalarval();
+
case 'array':
$arr = array();
foreach($xmlrpcVal as $value) {
$arr[] = $this->decode($value, $options);
}
-
return $arr;
+
case 'struct':
// If user said so, try to rebuild php objects for specific struct vals.
/// @todo should we raise a warning for class not found?
foreach ($xmlrpcVal as $key => $value) {
$obj->$key = $this->decode($value, $options);
}
-
return $obj;
} else {
$arr = array();
foreach ($xmlrpcVal as $key => $value) {
$arr[$key] = $this->decode($value, $options);
}
-
return $arr;
}
+
case 'msg':
$paramCount = $xmlrpcVal->getNumParams();
$arr = array();
for ($i = 0; $i < $paramCount; $i++) {
$arr[] = $this->decode($xmlrpcVal->getParam($i), $options);
}
-
return $arr;
+
+ /// @todo throw on unsupported type
}
}
* @param mixed $phpVal the value to be converted into an xmlrpc value object
* @param array $options can include 'encode_php_objs', 'auto_dates', 'null_extension' or 'extension_api'
*
- * @return \PhpXmlrpc\Value
+ * @return Value
*/
public function encode($phpVal, $options = array())
{
* Convert the xml representation of a method response, method request or single
* xmlrpc value into the appropriate object (a.k.a. deserialize).
*
- * Q: is this a good name for this method? It does something quite different from 'decode' after all
- * (returning objects vs returns plain php values)...
+ * @todo is this a good name/class for this method? It does something quite different from 'decode' after all
+ * (returning objects vs returns plain php values)... In fact it belongs rather to a Parser class
*
* @param string $xmlVal
* @param array $options
*
- * @return mixed false on error, or an instance of either Value, Request or Response
+ * @return Value|Request|Response|false false on error, or an instance of either Value, Request or Response
*/
public function decodeXml($xmlVal, $options = array())
{
if (extension_loaded('mbstring')) {
$xmlVal = mb_convert_encoding($xmlVal, 'UTF-8', $valEncoding);
} else {
- Logger::instance()->errorLog('XML-RPC: ' . __METHOD__ . ': invalid charset encoding of xml text: ' . $valEncoding);
+ $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': invalid charset encoding of xml text: ' . $valEncoding);
}
}
}
// What if internal encoding is not in one of the 3 allowed? We use the broadest one, ie. utf8!
if (!in_array(PhpXmlRpc::$xmlrpc_internalencoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) {
+ /// @todo emit a warning
$parserOptions = array(XML_OPTION_TARGET_ENCODING => 'UTF-8');
} else {
$parserOptions = array(XML_OPTION_TARGET_ENCODING => PhpXmlRpc::$xmlrpc_internalencoding);
}
- $xmlRpcParser = new XMLParser($parserOptions);
- $xmlRpcParser->parse($xmlVal, XMLParser::RETURN_XMLRPCVALS, XMLParser::ACCEPT_REQUEST | XMLParser::ACCEPT_RESPONSE | XMLParser::ACCEPT_VALUE | XMLParser::ACCEPT_FAULT);
+ $xmlRpcParser = $this->getParser();
+ $xmlRpcParser->parse(
+ $xmlVal,
+ XMLParser::RETURN_XMLRPCVALS,
+ XMLParser::ACCEPT_REQUEST | XMLParser::ACCEPT_RESPONSE | XMLParser::ACCEPT_VALUE | XMLParser::ACCEPT_FAULT,
+ $parserOptions
+ );
if ($xmlRpcParser->_xh['isf'] > 1) {
// test that $xmlrpc->_xh['value'] is an obj, too???
- Logger::instance()->errorLog($xmlRpcParser->_xh['isf_reason']);
+ $this->getLogger()->errorLog($xmlRpcParser->_xh['isf_reason']);
return false;
}
} else {
$r = new Response($v);
}
-
return $r;
+
case 'methodcall':
$req = new Request($xmlRpcParser->_xh['method']);
for ($i = 0; $i < count($xmlRpcParser->_xh['params']); $i++) {
$req->addParam($xmlRpcParser->_xh['params'][$i]);
}
-
return $req;
+
case 'value':
return $xmlRpcParser->_xh['value'];
+
case 'fault':
// EPI api emulation
$v = $xmlRpcParser->_xh['value'];