%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/webservice/classes/general/soap/
Upload File :
Create Path :
Current File : /home/bitrix/www/bitrix/modules/webservice/classes/general/soap/soapcodec.php

<?php

class CSOAPCodec
{
	var $outputVars = array();
	var $typensVars = array();

    function CSOAPCodec()
    {
    }

    function setTypensVars($vars)
    {
    	$this->typensVars = $vars;
    }

    function setOutputVars($functionName)
    {
    	if (!isset($this->typensVars[$functionName]["output"]))
    	{
    		ShowError("encodeValue() cant find output declaration.");
    		exit();
    	}

    	$this->outputVars = $this->typensVars[$functionName]["output"];
    }

	function _validateSimpleType($dataType, $value)
	{
		global $xsd_simple_type;
		if (!isset($xsd_simple_type[$dataType]))
			CSOAPCodec::_errorTypeValidation("[Is not a simple type.{$dataType}]", $value);

		if ($dataType != gettype( $value ))
		{
			// all numbers are same as string
			if (is_numeric($value) and (
				$dataType == "integer" or
				$dataType == "double" or
				$dataType == "float"))
				return;
			//elseif ($dataType == 'base64Binary' && preg_match('/^([A-Za-z0-9]|\+|\/|\-|\=)+$/', $value))
			elseif ($dataType == 'base64Binary' || $dataType == 'any')
				return;

			CSOAPCodec::_errorTypeValidation($dataType, $value);
		}
	}

	function _validateClassType($classType, $value)
	{
		$phpClassType = strtolower($classType);
		$phpValue = strtolower(get_class($value));
		if ($phpClassType != $phpValue)
		{
			CSOAPServer::ShowSOAPFault("_errorTypeValidation(): Type validation for func. failed: {$classType} != ".get_class($value));
    		exit();
		}
	}

	function _validateType($dataType, $value)
	{
		global $xsd_simple_type;
		if (isset($xsd_simple_type[$dataType]))
		{
			/*
			if (is_array($value))
			{
				echo $dataType;
				die();

			}
			else*/if ($dataType != gettype( $value ))
			{
				// all numbers are same as string
				if (is_numeric($value) and (
					$dataType == "integer" or
					$dataType == "double" or
					$dataType == "float"))
					return;
				//elseif ($dataType == 'base64Binary' && preg_match('/^([A-Za-z0-9]|\+|\/|\-|\=)+$/', $value))
				elseif ($dataType == 'base64Binary' || $dataType == 'any')
					return;

				CSOAPCodec::_errorTypeValidation($dataType, $value);
			}
		}
		else
		{
			if (!is_object($value) and !is_array($value))
				CSOAPCodec::_errorTypeValidation($dataType, $value);
		}
	}

	function _errorTypeValidation($dataType, $value)
	{
		CSOAPServer::ShowSOAPFault("_errorTypeValidation(): Type validation for func. failed: {$dataType} != ".gettype($value));
    	exit();
	}

	// Encodes a PHP variable into a SOAP datatype.
    function encodeValue($name, $value, $complexDataTypeName = "")
    {
    	global $xsd_simple_type;
    	if (!is_array($this->outputVars) or !count($this->outputVars))
    	{
    		CSOAPServer::ShowSOAPFault("encodeValue() has no Output Data Type Declaration for validation.");
    		exit();
    	}

 		$dataType = "";
 		$typeDeclaration = "";
 		if (isset($this->outputVars[$name]))
 			$typeDeclaration = $this->outputVars[$name];
 		else if (isset($this->typensVars[$name]))
 			$typeDeclaration = $this->typensVars[$name];
 		else if (isset($this->typensVars[$complexDataTypeName][$name]))
 			$typeDeclaration = $this->typensVars[$complexDataTypeName][$name];

		if (isset($typeDeclaration["varType"])) // if not, name = complex data type
			$dataType = $typeDeclaration["varType"];
		else
			$dataType = $name;

		if (isset($xsd_simple_type[$dataType]))
			$dataType = $xsd_simple_type[$dataType];

		// Type validation
		$this->_validateType($dataType, $value);

        switch ($dataType)
        {
            case "string" :
            {
                $node = new CXMLCreator( $name );
                //$node->setAttribute( "type", BX_SOAP_XSD_PREFIX . ":string" );
                $node->setData($value);
                return $node;
            } break;

            case "boolean" :
            {
                $node = new CXMLCreator( $name );
                //$node->setAttribute( "type", BX_SOAP_XSD_PREFIX . ":boolean" );
                if ( $value === true )
                    $node->setData( "true" );
                else
                    $node->setData( "false" );
                return $node;
            } break;

            case "integer" :
            {
				$node = new CXMLCreator( $name );
                //$node->setAttribute( "type", BX_SOAP_XSD_PREFIX . ":int" );
                $node->setData( intval( $value ) );
                return $node;
            } break;

			case "float":
            case "double" :
            {
            	$node = new CXMLCreator( $name );
                //$node->setAttribute( "type", BX_SOAP_XSD_PREFIX . ":float" );
                $node->setData($value);
                return $node;
            } break;

            // added by Sigurd
            case "base64":
            case "base64Binary":
            	$node = new CXMLCreator($name);
                //$node->setAttribute("type", BX_SOAP_XSD_PREFIX . ":base64Binary" );
                $node->setData(base64_encode($value));
                return $node;

            break;

			case 'any':
				$node = new CXMLCreator($name);
				
				if (is_object($value))
				{
// $fp = fopen($_SERVER['DOCUMENT_ROOT'].'/ws.log', 'a');
// fwrite($fp, $value->GetTree()."\n");
// fwrite($fp, '===================================='."\r\n");
// fclose($fp);

				
					if (get_class($value) == 'CDataXML')
						$node->addChild(CXMLCreator::CreateFromDOM($value->GetTree()));
					elseif (get_class($value) == 'CDataXMLDocument')
						$node->addChild(CXMLCreator::CreateFromDOM($value));
					elseif(get_class($value) == 'CXMLCreator')
						$node->addChild($value);
				}
				else
				{
					$data = new CDataXML();
					if ($data->LoadString($value))
						$node->addChild(CXMLCreator::CreateFromDOM($data->GetTree()));
					else
						$node->setData($value);
				}
				
				return $node;
			break;
			
            default :
            {
            	$node = new CXMLCreator( $name );

            	if (isset($typeDeclaration["arrType"]))
            	{
            		if (!isset($typeDeclaration["varType"]))
            			$this->_errorTypeValidation("varType [undef]", $value);

            		$varType = $typeDeclaration["varType"];

            		// Decode array
            		$maxOccurs = 0;

            		$arrayType = $typeDeclaration["arrType"];
            		if (isset($typeDeclaration["maxOccursA"]))
            			$maxOccurs = $typeDeclaration["maxOccursA"];

            		if (isset($xsd_simple_type[$arrayType]))
            		{
            			$i = 0;
            			$arrayType = $xsd_simple_type[$arrayType];
            			$arrayTypeEl = $varType."El"; // TODO: non fixed. get El name from wsdl. or decl.
            			if (!is_array($value))
            				CSOAPCodec::_errorTypeValidation("Array", $value);

            			foreach ($value as $valnode)
            			{
            				$i++;
            				$this->_validateType($arrayType, $valnode);
            				$cndata = new CXMLCreator ( $arrayTypeEl );
            				$cndata->setData($valnode);
            				$node->addChild($cndata);

            				if (intval($maxOccurs)>0 and $i>$maxOccurs)
            					break;
            			}
            		}
            		else
            		{
            			// Complex data type arrays // $arrayType as is.
            			// TODO: non fixed. get $arrayTypeEl name from wsdl. or decl.
            			$i = 0;
            			$arrayTypeEl = $varType."El";
            			if (!is_array($value))
            				CSOAPCodec::_errorTypeValidation("Array", $value);

            			foreach ($value as $valnode)
            			{
            				$decoded = null;
            				$i++;

            				$this->_validateType($arrayType, $valnode);
            				$decoded = $this->encodeValue( $arrayType, $valnode );

            				$cndata = new CXMLCreator ( $arrayTypeEl );

            				if ($decoded)
            				{
            					$this->_validateClassType("CXMLCreator", $decoded);
            					$decoded->setName($arrayTypeEl);
            					$node->addChild($decoded);
            				}

            				if (intval($maxOccurs)>0 and $i>$maxOccurs)
            					break;
            			}
            		}
            	}
            	else
            	{
            		// Here we goes with struct, or with class
            		// First, try to find declaration

            		$objectDecl = 0;
            		$returnValue = array();
            		$params = array();

            		if (!isset($this->typensVars[$dataType])) break;
            		$objectDecl = $this->typensVars[$dataType];

            		if (!$objectDecl)
            		{
            			CSOAPServer::ShowSOAPFault("encodeValue() cant find complex type declaration for {$dataType}.");
            			exit();
            		}

            		// Type of serialization: class/assoc array
            		$objectClass = null;
            		$serialize = "assoc";
            		if (isset($objectDecl["serialize"]))
            		{
            			$serialize = $objectDecl["serialize"];
            			unset($objectDecl["serialize"]);
            		}

					// Validate hard complex data types
            		if ($serialize == "assoc")
            			$this->_validateType("array", $value);
            		if ($serialize != "assoc")
            			$this->_validateClassType($dataType, $value);

            		foreach($objectDecl as $pname => $param)
            		{
            			$decoded = null;
            			$strict = true;
            			if (isset($param["strict"])) $strict = ($param["strict"]=="strict")?true:false;

            			if ($serialize == "assoc")
            			{
							//var_dump($pname); var_dump($value[$pname]); die();
            				if (isset($value[$pname]))
            					$decoded = $this->encodeValue( $pname, $value[$pname], $dataType );
            			}
            			else
            			if ($serialize != "assoc")
            			{
            				if (isset($value->$pname))
            					$decoded = $this->encodeValue( $pname, $value->$pname, $dataType );
            			}


            			if ($decoded)
            				$this->_validateClassType("CXMLCreator", $decoded);

            			if (!$decoded and $strict)
						{
							CSOAPServer::ShowSOAPFault("Request has not enough params of strict type to be decoded. ");
			            	exit();
						}

						$node->addChild($decoded);
		            }
            	}
            	return $node;
            } break;
        }

        return false;
    }
}

?>

Zerion Mini Shell 1.0