// tables used for transcoding different charsets into us-ascii xml
protected $xml_iso88591_Entities = array("in" => array(), "out" => array());
- /// @todo add to iso table the characters from cp_1252 range, i.e. 128 to 159?
- /// These will NOT be present in true ISO-8859-1, but will save the unwary windows user from sending junk
- /// (though no luck when receiving them...)
+ /// @todo should we add to the latin-1 table the characters from cp_1252 range, i.e. 128 to 159 ?
+ /// Those will NOT be present in true ISO-8859-1, but will save the unwary windows user from sending junk
+ /// (though no luck when receiving them...)
+ /// Note also that, apparently, while 'ISO/IEC 8859-1' has no characters defined for bytes 128 to 159,
+ /// IANA ISO-8859-1 does have well-defined 'C1' control codes for those - wikipedia's page on latin-1 says:
+ /// "ISO-8859-1 is the IANA preferred name for this standard when supplemented with the C0 and C1 control codes from ISO/IEC 6429."
+ /// Check what mbstring/iconv do by default with those?
/*
protected $xml_cp1252_Entities = array('in' => array(), out' => array(
'€', '?', '‚', 'ƒ',
/**
* This class is singleton for performance reasons.
+ * @todo can't we just make $xml_iso88591_Entities a static variable instead ?
*
* @return Charset
*/
return self::$instance;
}
+ /**
+ * @todo move the creation of the charset tables to be on-demand. This saves memory and time when latin-1 is not used at all
+ */
private function __construct()
{
for ($i = 0; $i < 32; $i++) {
class XMLParser
{
const RETURN_XMLRPCVALS = 'xmlrpcvals';
+ const RETURN_EPIVALS = 'epivals';
const RETURN_PHP = 'phpvals';
const ACCEPT_REQUEST = 1;
xml_set_object($parser, $this);
- if ($returnType == self::RETURN_PHP) {
- xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee_fast');
- } else {
- xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee');
+ switch($returnType) {
+ case self::RETURN_PHP:
+ xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee_fast');
+ break;
+ case self::RETURN_EPIVALS:
+ xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee_epi');
+ break;
+ default:
+ xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee');
}
xml_set_character_data_handler($parser, 'xmlrpc_cd');
* xml parser handler function for close element tags.
* @param resource $parser
* @param string $name
- * @param bool $rebuildXmlrpcvals
+ * @param int $rebuildXmlrpcvals >1 for rebuilding xmlrpcvals, 0 for rebuilding php values, -1 for xmlrpc-extension compatibility
*/
- public function xmlrpc_ee($parser, $name, $rebuildXmlrpcvals = true)
+ public function xmlrpc_ee($parser, $name, $rebuildXmlrpcvals = 1)
{
if ($this->_xh['isf'] < 2) {
// push this element name from stack
$this->_xh['vt'] = Value::$xmlrpcString;
}
- if ($rebuildXmlrpcvals) {
+ if ($rebuildXmlrpcvals > 0) {
// build the xmlrpc val out of the data received, and substitute it
$temp = new Value($this->_xh['value'], $this->_xh['vt']);
// in case we got info about underlying php class, save it
if (isset($this->_xh['php_class'])) {
$temp->_php_class = $this->_xh['php_class'];
}
- // check if we are inside an array or struct:
- // if value just built is inside an array, let's move it into array on the stack
- $vscount = count($this->_xh['valuestack']);
- if ($vscount && $this->_xh['valuestack'][$vscount - 1]['type'] == 'ARRAY') {
- $this->_xh['valuestack'][$vscount - 1]['values'][] = $temp;
- } else {
- $this->_xh['value'] = $temp;
+ $this->_xh['value'] = $temp;
+ } elseif ($rebuildXmlrpcvals < 0) {
+ if ($this->_xh['vt'] == Value::$xmlrpcDateTime) {
+ $this->_xh['value'] = (object)array(
+ 'xmlrpc_type' => 'datetime',
+ 'scalar' => $this->_xh['value'],
+ 'timestamp' => \PhpXmlRpc\Helper\Date::iso8601Decode($this->_xh['value'])
+ );
+ } elseif ($this->_xh['vt'] == Value::$xmlrpcBase64) {
+ $this->_xh['value'] = (object)array(
+ 'xmlrpc_type' => 'base64',
+ 'scalar' => $this->_xh['value']
+ );
}
} else {
- /// @todo this needs to treat correctly php-serialized objects,
+ /// @todo this should handle php-serialized objects,
/// since std deserializing is done by php_xmlrpc_decode,
/// which we will not be calling...
- if (isset($this->_xh['php_class'])) {
- }
+ //if (isset($this->_xh['php_class'])) {
+ //}
+ }
- // check if we are inside an array or struct:
- // if value just built is inside an array, let's move it into array on the stack
- $vscount = count($this->_xh['valuestack']);
- if ($vscount && $this->_xh['valuestack'][$vscount - 1]['type'] == 'ARRAY') {
- $this->_xh['valuestack'][$vscount - 1]['values'][] = $this->_xh['value'];
- }
+ // check if we are inside an array or struct:
+ // if value just built is inside an array, let's move it into array on the stack
+ $vscount = count($this->_xh['valuestack']);
+ if ($vscount && $this->_xh['valuestack'][$vscount - 1]['type'] == 'ARRAY') {
+ $this->_xh['valuestack'][$vscount - 1]['values'][] = $this->_xh['value'];
}
break;
case 'BOOLEAN':
*/
public function xmlrpc_ee_fast($parser, $name)
{
- $this->xmlrpc_ee($parser, $name, false);
+ $this->xmlrpc_ee($parser, $name, 0);
+ }
+
+ /**
+ * Used in decoding xmlrpc requests/responses while building xmlrpc-extension Values (plain php for all but base64 and datetime).
+ * @param resource $parser
+ * @param string $name
+ */
+ public function xmlrpc_ee_epi($parser, $name)
+ {
+ $this->xmlrpc_ee($parser, $name, -1);
}
/**