139 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			139 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|  | <?php | ||
|  | /** | ||
|  |  * IXR_Value | ||
|  |  * | ||
|  |  * @package IXR | ||
|  |  * @since 1.5.0 | ||
|  |  */ | ||
|  | class IXR_Value { | ||
|  |     var $data; | ||
|  |     var $type; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * PHP5 constructor. | ||
|  | 	 */ | ||
|  | 	function __construct( $data, $type = false ) | ||
|  |     { | ||
|  |         $this->data = $data; | ||
|  |         if (!$type) { | ||
|  |             $type = $this->calculateType(); | ||
|  |         } | ||
|  |         $this->type = $type; | ||
|  |         if ($type == 'struct') { | ||
|  |             // Turn all the values in the array in to new IXR_Value objects
 | ||
|  |             foreach ($this->data as $key => $value) { | ||
|  |                 $this->data[$key] = new IXR_Value($value); | ||
|  |             } | ||
|  |         } | ||
|  |         if ($type == 'array') { | ||
|  |             for ($i = 0, $j = count($this->data); $i < $j; $i++) { | ||
|  |                 $this->data[$i] = new IXR_Value($this->data[$i]); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * PHP4 constructor. | ||
|  | 	 */ | ||
|  | 	public function IXR_Value( $data, $type = false ) { | ||
|  | 		self::__construct( $data, $type ); | ||
|  | 	} | ||
|  | 
 | ||
|  |     function calculateType() | ||
|  |     { | ||
|  |         if ($this->data === true || $this->data === false) { | ||
|  |             return 'boolean'; | ||
|  |         } | ||
|  |         if (is_integer($this->data)) { | ||
|  |             return 'int'; | ||
|  |         } | ||
|  |         if (is_double($this->data)) { | ||
|  |             return 'double'; | ||
|  |         } | ||
|  | 
 | ||
|  |         // Deal with IXR object types base64 and date
 | ||
|  |         if (is_object($this->data) && is_a($this->data, 'IXR_Date')) { | ||
|  |             return 'date'; | ||
|  |         } | ||
|  |         if (is_object($this->data) && is_a($this->data, 'IXR_Base64')) { | ||
|  |             return 'base64'; | ||
|  |         } | ||
|  | 
 | ||
|  |         // If it is a normal PHP object convert it in to a struct
 | ||
|  |         if (is_object($this->data)) { | ||
|  |             $this->data = get_object_vars($this->data); | ||
|  |             return 'struct'; | ||
|  |         } | ||
|  |         if (!is_array($this->data)) { | ||
|  |             return 'string'; | ||
|  |         } | ||
|  | 
 | ||
|  |         // We have an array - is it an array or a struct?
 | ||
|  |         if ($this->isStruct($this->data)) { | ||
|  |             return 'struct'; | ||
|  |         } else { | ||
|  |             return 'array'; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function getXml() | ||
|  |     { | ||
|  |         // Return XML for this value
 | ||
|  |         switch ($this->type) { | ||
|  |             case 'boolean': | ||
|  |                 return '<boolean>'.(($this->data) ? '1' : '0').'</boolean>'; | ||
|  |                 break; | ||
|  |             case 'int': | ||
|  |                 return '<int>'.$this->data.'</int>'; | ||
|  |                 break; | ||
|  |             case 'double': | ||
|  |                 return '<double>'.$this->data.'</double>'; | ||
|  |                 break; | ||
|  |             case 'string': | ||
|  |                 return '<string>'.htmlspecialchars($this->data).'</string>'; | ||
|  |                 break; | ||
|  |             case 'array': | ||
|  |                 $return = '<array><data>'."\n"; | ||
|  |                 foreach ($this->data as $item) { | ||
|  |                     $return .= '  <value>'.$item->getXml()."</value>\n"; | ||
|  |                 } | ||
|  |                 $return .= '</data></array>'; | ||
|  |                 return $return; | ||
|  |                 break; | ||
|  |             case 'struct': | ||
|  |                 $return = '<struct>'."\n"; | ||
|  |                 foreach ($this->data as $name => $value) { | ||
|  | 					$name = htmlspecialchars($name); | ||
|  |                     $return .= "  <member><name>$name</name><value>"; | ||
|  |                     $return .= $value->getXml()."</value></member>\n"; | ||
|  |                 } | ||
|  |                 $return .= '</struct>'; | ||
|  |                 return $return; | ||
|  |                 break; | ||
|  |             case 'date': | ||
|  |             case 'base64': | ||
|  |                 return $this->data->getXml(); | ||
|  |                 break; | ||
|  |         } | ||
|  |         return false; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Checks whether or not the supplied array is a struct or not | ||
|  |      * | ||
|  |      * @param array $array | ||
|  |      * @return bool | ||
|  |      */ | ||
|  |     function isStruct($array) | ||
|  |     { | ||
|  |         $expected = 0; | ||
|  |         foreach ($array as $key => $value) { | ||
|  |             if ((string)$key !== (string)$expected) { | ||
|  |                 return true; | ||
|  |             } | ||
|  |             $expected++; | ||
|  |         } | ||
|  |         return false; | ||
|  |     } | ||
|  | } |