<?php

/* soapx4 high level class

usage:

// instantiate client with server info
$soapclient = new soapclient( string path [ ,boolean wsdl] );

// call method, get results
echo $soapclient->call( string methodname [ ,array parameters] );

// bye bye client
unset($soapclient);

*/

class soapclient
{
	function soapclient($endpoint,$wsdl=False,$portName=False)
	{
		$this->debug_flag = False;
		$this->endpoint = $endpoint;
		$this->portName = False;
		
		// make values
		if($wsdl)
		{
			$this->endpointType = 'wsdl';
			if($portName)
			{
				$this->portName = $portName;
			}
		}
	}

	function call($method,$params=array(),$namespace=false,$soapAction=false)
	{
		if($this->endpointType == 'wsdl')
		{
			// instantiate wsdl class
			$this->wsdl = CreateObject('phpgwapi.wsdl',$this->endpoint);
			// get portName
			if(!$this->portName)
			{
				$this->portName = $this->wsdl->getPortName($method);
			}
			// get endpoint
			if(!$this->endpoint = $this->wsdl->getEndpoint($this->portName))
			{
				die("no port of name '$this->portName' in the wsdl at that location!");
			}
			$this->debug("endpoint: $this->endpoint");
			$this->debug("portName: $this->portName");
		}
		// get soapAction
		if(!$soapAction)
		{
			if($this->endpointType != "wsdl")
			{
				die("method call requires soapAction if wsdl is not available!");
			}
			if(!$soapAction = $this->wsdl->getSoapAction($this->portName,$method))
			{
				die("no soapAction for operation: $method!");
			}
		}
		$this->debug("soapAction: $soapAction");
		// get namespace
		if(!$namespace)
		{
			if($this->endpointType != "wsdl")
			{
				die("method call requires namespace if wsdl is not available!");
			}
			if(!$namespace = $this->wsdl->getNamespace($this->portName,$method))
			{
				die("no soapAction for operation: $method!");
			}
		}
		$this->debug("namespace: $namespace");

		// make message
		$soapmsg = CreateObject('phpgwapi.soapmsg',$method,$params,$namespace);
		_debug_array($soapmsg);
		
		// instantiate client
		$dbg = "calling server at '$this->endpoint'...";
		if($soap_client = CreateObject('phpgwapi.soap_client',$this->endpoint))
		{
			//$soap_client->debug_flag = true;
			$this->debug($dbg."instantiated client successfully");
			$this->debug("client data:<br>server: $soap_client->server<br>path: $soap_client->path<br>port: $soap_client->port");
			// send
			$dbg = "sending msg w/ soapaction '$soapAction'...";
			if($return = $soap_client->send($soapmsg,$soapAction))
			{
				$this->request = $soap_client->outgoing_payload;
				$this->response = $soap_client->incoming_payload;
				$this->debug($dbg."sent message successfully and got a '$return' back");
				// check for valid response
				if(get_class($return) == "soapval")
				{
					// fault?
					if(eregi("fault",$return->name))
					{
						$this->debug("got fault");
						$faultArray = $return->decode();
						foreach($faultArray as $k => $v)
						{
							print "$k = $v<br>";
						}
						return false;
					}
					else
					{
						$returnArray = $return->decode();
						if(is_array($returnArray))
						{
							return array_shift($returnArray);
						}
						else
						{
							$this->debug("didn't get array back from decode() for $return->name");
							return false;
						}
					}
				}
				else
				{
					$this->debug("didn't get soapval object back from client");
					return false;
				}
			}
			else
			{
				$this->debug("client send/recieve error");
				return false;
			}
		}
	}

	function debug($string)
	{
		if($this->debug_flag)
		{
			print $string."<br>";
		}
	}
}
?>