]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - includes/api/ApiFormatWddx.php
MediaWiki 1.15.0
[autoinstallsdev/mediawiki.git] / includes / api / ApiFormatWddx.php
index 0ddfac73be5a3a66cef2b7f461c34eed00b898f9..a716373daab980050defc178e59df8d792a5ec13 100644 (file)
@@ -29,7 +29,7 @@ if (!defined('MEDIAWIKI')) {
 }
 
 /**
- * @addtogroup API
+ * @ingroup API
  */
 class ApiFormatWddx extends ApiFormatBase {
 
@@ -42,50 +42,79 @@ 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 $';
        }
 }
-