}
/**
- * @addtogroup API
+ * @ingroup API
*/
class ApiFormatWddx extends ApiFormatBase {
}
public function execute() {
- if (function_exists('wddx_serialize_value')) {
+ // Some versions of PHP have a broken wddx_serialize_value, see
+ // PHP bug 45314. Test encoding an affected character (U+00A0)
+ // to avoid this.
+ $expected = "<wddxPacket version='1.0'><header/><data><string>\xc2\xa0</string></data></wddxPacket>";
+ if (function_exists('wddx_serialize_value')
+ && !$this->getIsHtml()
+ && wddx_serialize_value("\xc2\xa0") == $expected) {
$this->printText(wddx_serialize_value($this->getResultData()));
} else {
- $this->printText('<?xml version="1.0" encoding="utf-8"?>');
- $this->printText('<wddxPacket version="1.0"><header/><data>');
- $this->slowWddxPrinter($this->getResultData());
- $this->printText('</data></wddxPacket>');
+ // Don't do newlines and indentation if we weren't asked
+ // for pretty output
+ $nl = ($this->getIsHtml() ? "" : "\n");
+ $indstr = " ";
+ $this->printText("<?xml version=\"1.0\"?>$nl");
+ $this->printText("<wddxPacket version=\"1.0\">$nl");
+ $this->printText("$indstr<header/>$nl");
+ $this->printText("$indstr<data>$nl");
+ $this->slowWddxPrinter($this->getResultData(), 4);
+ $this->printText("$indstr</data>$nl");
+ $this->printText("</wddxPacket>$nl");
}
}
/**
- * Recursivelly go through the object and output its data in WDDX format.
- */
- function slowWddxPrinter($elemValue) {
+ * Recursively go through the object and output its data in WDDX format.
+ */
+ function slowWddxPrinter($elemValue, $indent = 0) {
+ $indstr = ($this->getIsHtml() ? "" : str_repeat(' ', $indent));
+ $indstr2 = ($this->getIsHtml() ? "" : str_repeat(' ', $indent + 2));
+ $nl = ($this->getIsHtml() ? "" : "\n");
switch (gettype($elemValue)) {
case 'array' :
- $this->printText('<struct>');
- foreach ($elemValue as $subElemName => $subElemValue) {
- $this->printText(wfElement('var', array (
- 'name' => $subElemName
- ), null));
- $this->slowWddxPrinter($subElemValue);
- $this->printText('</var>');
+ // Check whether we've got an associative array (<struct>)
+ // or a regular array (<array>)
+ $cnt = count($elemValue);
+ if($cnt == 0 || array_keys($elemValue) === range(0, $cnt - 1)) {
+ // Regular array
+ $this->printText($indstr . Xml::element('array', array(
+ 'length' => $cnt
+ ), null) . $nl);
+ foreach($elemValue as $subElemValue)
+ $this->slowWddxPrinter($subElemValue, $indent + 2);
+ $this->printText("$indstr</array>$nl");
+ } else {
+ // Associative array (<struct>)
+ $this->printText("$indstr<struct>$nl");
+ foreach($elemValue as $subElemName => $subElemValue) {
+ $this->printText($indstr2 . Xml::element('var', array(
+ 'name' => $subElemName
+ ), null) . $nl);
+ $this->slowWddxPrinter($subElemValue, $indent + 4);
+ $this->printText("$indstr2</var>$nl");
+ }
+ $this->printText("$indstr</struct>$nl");
}
- $this->printText('</struct>');
break;
case 'integer' :
case 'double' :
- $this->printText(wfElement('number', null, $elemValue));
+ $this->printText($indstr . Xml::element('number', null, $elemValue) . $nl);
break;
case 'string' :
- $this->printText(wfElement('string', null, $elemValue));
+ $this->printText($indstr . Xml::element('string', null, $elemValue) . $nl);
break;
default :
ApiBase :: dieDebug(__METHOD__, 'Unknown type ' . gettype($elemValue));
}
}
- protected function getDescription() {
+ public function getDescription() {
return 'Output data in WDDX format' . parent :: getDescription();
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatWddx.php 23531 2007-06-29 01:19:14Z simetrical $';
+ return __CLASS__ . ': $Id: ApiFormatWddx.php 48716 2009-03-23 20:06:16Z catrope $';
}
}
-