wp/wp-includes/IXR/class-IXR-value.php
changeset 7 cf61fcea0001
equal deleted inserted replaced
6:490d5cc509ed 7:cf61fcea0001
       
     1 <?php
       
     2 /**
       
     3  * IXR_Value
       
     4  *
       
     5  * @package IXR
       
     6  * @since 1.5.0
       
     7  */
       
     8 class IXR_Value {
       
     9     var $data;
       
    10     var $type;
       
    11 
       
    12 	/**
       
    13 	 * PHP5 constructor.
       
    14 	 */
       
    15 	function __construct( $data, $type = false )
       
    16     {
       
    17         $this->data = $data;
       
    18         if (!$type) {
       
    19             $type = $this->calculateType();
       
    20         }
       
    21         $this->type = $type;
       
    22         if ($type == 'struct') {
       
    23             // Turn all the values in the array in to new IXR_Value objects
       
    24             foreach ($this->data as $key => $value) {
       
    25                 $this->data[$key] = new IXR_Value($value);
       
    26             }
       
    27         }
       
    28         if ($type == 'array') {
       
    29             for ($i = 0, $j = count($this->data); $i < $j; $i++) {
       
    30                 $this->data[$i] = new IXR_Value($this->data[$i]);
       
    31             }
       
    32         }
       
    33     }
       
    34 
       
    35 	/**
       
    36 	 * PHP4 constructor.
       
    37 	 */
       
    38 	public function IXR_Value( $data, $type = false ) {
       
    39 		self::__construct( $data, $type );
       
    40 	}
       
    41 
       
    42     function calculateType()
       
    43     {
       
    44         if ($this->data === true || $this->data === false) {
       
    45             return 'boolean';
       
    46         }
       
    47         if (is_integer($this->data)) {
       
    48             return 'int';
       
    49         }
       
    50         if (is_double($this->data)) {
       
    51             return 'double';
       
    52         }
       
    53 
       
    54         // Deal with IXR object types base64 and date
       
    55         if (is_object($this->data) && is_a($this->data, 'IXR_Date')) {
       
    56             return 'date';
       
    57         }
       
    58         if (is_object($this->data) && is_a($this->data, 'IXR_Base64')) {
       
    59             return 'base64';
       
    60         }
       
    61 
       
    62         // If it is a normal PHP object convert it in to a struct
       
    63         if (is_object($this->data)) {
       
    64             $this->data = get_object_vars($this->data);
       
    65             return 'struct';
       
    66         }
       
    67         if (!is_array($this->data)) {
       
    68             return 'string';
       
    69         }
       
    70 
       
    71         // We have an array - is it an array or a struct?
       
    72         if ($this->isStruct($this->data)) {
       
    73             return 'struct';
       
    74         } else {
       
    75             return 'array';
       
    76         }
       
    77     }
       
    78 
       
    79     function getXml()
       
    80     {
       
    81         // Return XML for this value
       
    82         switch ($this->type) {
       
    83             case 'boolean':
       
    84                 return '<boolean>'.(($this->data) ? '1' : '0').'</boolean>';
       
    85                 break;
       
    86             case 'int':
       
    87                 return '<int>'.$this->data.'</int>';
       
    88                 break;
       
    89             case 'double':
       
    90                 return '<double>'.$this->data.'</double>';
       
    91                 break;
       
    92             case 'string':
       
    93                 return '<string>'.htmlspecialchars($this->data).'</string>';
       
    94                 break;
       
    95             case 'array':
       
    96                 $return = '<array><data>'."\n";
       
    97                 foreach ($this->data as $item) {
       
    98                     $return .= '  <value>'.$item->getXml()."</value>\n";
       
    99                 }
       
   100                 $return .= '</data></array>';
       
   101                 return $return;
       
   102                 break;
       
   103             case 'struct':
       
   104                 $return = '<struct>'."\n";
       
   105                 foreach ($this->data as $name => $value) {
       
   106 					$name = htmlspecialchars($name);
       
   107                     $return .= "  <member><name>$name</name><value>";
       
   108                     $return .= $value->getXml()."</value></member>\n";
       
   109                 }
       
   110                 $return .= '</struct>';
       
   111                 return $return;
       
   112                 break;
       
   113             case 'date':
       
   114             case 'base64':
       
   115                 return $this->data->getXml();
       
   116                 break;
       
   117         }
       
   118         return false;
       
   119     }
       
   120 
       
   121     /**
       
   122      * Checks whether or not the supplied array is a struct or not
       
   123      *
       
   124      * @param array $array
       
   125      * @return bool
       
   126      */
       
   127     function isStruct($array)
       
   128     {
       
   129         $expected = 0;
       
   130         foreach ($array as $key => $value) {
       
   131             if ((string)$key !== (string)$expected) {
       
   132                 return true;
       
   133             }
       
   134             $expected++;
       
   135         }
       
   136         return false;
       
   137     }
       
   138 }