144 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * ManiaPlanet dedicated server Xml-RPC client
 | 
						|
 *
 | 
						|
 * @license     http://www.gnu.org/licenses/lgpl.html LGPL License 3
 | 
						|
 */
 | 
						|
 | 
						|
namespace Maniaplanet\DedicatedServer\Xmlrpc;
 | 
						|
 | 
						|
class Value 
 | 
						|
{
 | 
						|
	public $data;
 | 
						|
	public $type;
 | 
						|
 | 
						|
	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 into new Value objects
 | 
						|
			foreach ($this->data as $key => $value) 
 | 
						|
			{
 | 
						|
				$this->data[$key] = new Value($value);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if ($type == 'array') 
 | 
						|
		{
 | 
						|
			for ($i = 0, $j = count($this->data); $i < $j; $i++) 
 | 
						|
			{
 | 
						|
				$this->data[$i] = new Value($this->data[$i]);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	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) && $this->data instanceof Date) 
 | 
						|
		{
 | 
						|
			return 'date';
 | 
						|
		}
 | 
						|
		if (is_object($this->data) && $this->data instanceof Base64) 
 | 
						|
		{
 | 
						|
			return 'base64';
 | 
						|
		}
 | 
						|
		// If it is a normal PHP object convert it into 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>' . LF;
 | 
						|
				foreach ($this->data as $item) 
 | 
						|
				{
 | 
						|
					$return .= '	<value>' . $item->getXml() . '</value>' . LF;
 | 
						|
				}
 | 
						|
				$return .= '</data></array>';
 | 
						|
				return $return;
 | 
						|
				break;
 | 
						|
			case 'struct':
 | 
						|
				$return = '<struct>' . LF;
 | 
						|
				foreach ($this->data as $name => $value) 
 | 
						|
				{
 | 
						|
					$return .= '	<member><name>' . $name . '</name><value>';
 | 
						|
					$return .= $value->getXml() . '</value></member>' . LF;
 | 
						|
				}
 | 
						|
				$return .= '</struct>';
 | 
						|
				return $return;
 | 
						|
				break;
 | 
						|
			case 'date':
 | 
						|
			case 'base64':
 | 
						|
				return $this->data->getXml();
 | 
						|
				break;
 | 
						|
		}
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	function isStruct($array) 
 | 
						|
	{
 | 
						|
		// Nasty function to check if an array is a struct or not
 | 
						|
		$expected = 0;
 | 
						|
		foreach ($array as $key => $value) 
 | 
						|
		{
 | 
						|
			if ((string)$key != (string)$expected) 
 | 
						|
			{
 | 
						|
				return true;
 | 
						|
			}
 | 
						|
			$expected++;
 | 
						|
		}
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
?>
 |