|
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 } |