Public Member Functions | Data Fields

ilBMFServer Class Reference

Inheritance diagram for ilBMFServer:
Collaboration diagram for ilBMFServer:

Public Member Functions

 ilBMFServer ($options=NULL)
 _getContentEncoding ($content_type)
 service ($data, $endpoint= '', $test=FALSE)
callMethod ($methodname, &$args)
 buildResult (&$method_response, &$return_type, $return_name='return', $namespace= '')
 parseRequest ($data= '', $attachments=null)
__decodeRequest ($request, $shift=false)
 verifyMethod ($request)
 getReturnType ($returndata)
 validateMethod ($methodname, $namespace=NULL)
 addObjectMap (&$obj, $namespace=null, $service_name= 'Default', $service_desc= '')
 addToMap ($methodname, $in, $out, $namespace=NULL, $alias=NULL)
 setCallHandler ($callHandler, $validation=true)
 bind ($wsdl_url)
 bindWSDL ($wsdl_url)
 addObjectWSDL (&$wsdl_obj, $targetNamespace, $service_name, $service_desc= '')

Data Fields

 $dispatch_map = array()
 $dispatch_objects = array()
 $soapobject = NULL
 $call_methodname = NULL
 $callHandler = NULL
 $callValidation = true
 $headers = ''
 $request = ''
 $xml_encoding = SOAP_DEFAULT_ENCODING
 $response_encoding = 'UTF-8'
 $result = 'successful'
 $endpoint = ''
 $service = ''
 $method_namespace = NULL
 $__options = array('use'=>'encoded','style'=>'rpc','parameters'=>0)

Detailed Description

Definition at line 56 of file class.ilBMFServer.php.


Member Function Documentation

& ilBMFServer::__decodeRequest ( request,
shift = false 
)

Definition at line 430 of file class.ilBMFServer.php.

References $request, ilBMFBase::_decode(), and ilBMFBase_Object::_raiseSoapFault().

Referenced by parseRequest().

    {
        if (!$request) return NULL;
        // check for valid response
        if (PEAR::isError($request)) {
            return $this->_raiseSoapFault($request);
        } else if (!is_a($request,'ilbmfvalue')) {
            return $this->_raiseSoapFault("Invalid data in server::__decodeRequest");
        }

        // decode to native php datatype
        $requestArray = $this->_decode($request);
        // fault?
        if (PEAR::isError($requestArray)) {
            return $this->_raiseSoapFault($requestArray);
        }
        if (is_object($requestArray)&& get_class($requestArray) == 'stdClass') {
                $requestArray = get_object_vars($requestArray);
        } else
        if ($this->__options['style']=='document') {
            $requestArray = array($requestArray);
        }
        if (is_array($requestArray)) {
            if (isset($requestArray['faultcode']) || isset($requestArray['SOAP-ENV:faultcode'])) {
                $faultcode = $faultstring = $faultdetail = $faultactor = '';
                foreach ($requestArray as $k => $v) {
                    if (stristr($k,'faultcode')) $faultcode = $v;
                    if (stristr($k,'faultstring')) $faultstring = $v;
                    if (stristr($k,'detail')) $faultdetail = $v;
                    if (stristr($k,'faultactor')) $faultactor = $v;
                }
                return $this->_raiseSoapFault($faultstring, $faultdetail, $faultactor, $faultcode);
            }
            // return array of return values
            if ($shift && count($requestArray) == 1) {
                return array_shift($requestArray);
            }
            return $requestArray;
        }
        return $requestArray;
    }

Here is the call graph for this function:

Here is the caller graph for this function:

ilBMFServer::_getContentEncoding ( content_type  ) 

Definition at line 111 of file class.ilBMFServer.php.

Referenced by ilBMFServer_Email::client(), ilBMFServer_Email::service(), and service().

    {
        // get the character encoding of the incoming request
        // treat incoming data as UTF-8 if no encoding set
        $this->xml_encoding = 'UTF-8';
        if (strpos($content_type,'=')) {
            $enc = strtoupper(str_replace('"',"",substr(strstr($content_type,'='),1)));
            if (!in_array($enc, $this->_encodings)) {
                return FALSE;
            }
            $this->xml_encoding = $enc;
        }
        return TRUE;
    }

Here is the caller graph for this function:

ilBMFServer::addObjectMap ( &$  obj,
namespace = null,
service_name = 'Default',
service_desc = '' 
)

Definition at line 598 of file class.ilBMFServer.php.

References $obj, ilBMFBase_Object::_raiseSoapFault(), and addObjectWSDL().

    {
        if (!$namespace) {
            if (isset($obj->namespace)) {
                // XXX a bit of backwards compatibility
                $namespace = $obj->namespace;
            } else {
                $this->_raiseSoapFault('No namespace provided for class!','','','Server');
                return false;
            }
        }
        if (!isset($this->dispatch_objects[$namespace])) {
            $this->dispatch_objects[$namespace] = array();
        }
        $this->dispatch_objects[$namespace][] =& $obj;

        // Create internal WSDL structures for object
        // XXX Because some internal workings of PEAR::SOAP decide whether to
        // do certain things by the presence or absence of _wsdl, we should
        // only create a _wsdl structure if we know we can fill it; if
        // __dispatch_map or __typedef for the object is missing, we should
        // avoid creating it. Later, when we are using PHP 5 introspection,
        // we will be able to make the data for all objects without any extra
        // information from the developers, and this condition should be
        // dropped.

        // XXX Known issue: if imported WSDL (bindWSDL) or another WSDL source
        // is used to add _wsdl structure information, then addObjectWSDL is
        // used, there is a high possibility of _wsdl data corruption;
        // therefore you should avoid using __dispatch_map/__typedef definitions
        // AND other WSDL data sources in the same service. We exclude classes
        // that don't have __typedefs to allow external WSDL files to be used
        // with classes with no internal type definitions (the types are defined
        // in the WSDL file). When addObjectWSDL is refactored to not cause
        // corruption, this restriction can be relaxed.

        // In summry, if you add an object with both a dispatch map and type
        // definitions, then previous WSDL file operation and type definitions
        // will be overwritten.
        if (isset($obj->__dispatch_map) && isset($obj->__typedef)) {
            $this->addObjectWSDL($obj, $namespace, $service_name, $service_desc);
        }
        return true;
    }

Here is the call graph for this function:

ilBMFServer::addObjectWSDL ( &$  wsdl_obj,
targetNamespace,
service_name,
service_desc = '' 
)
Returns:
void

Definition at line 684 of file class.ilBMFServer.php.

References ilBMFBase_Object::_raiseSoapFault().

Referenced by addObjectMap().

                                                                                            {
        if (!isset($this->_wsdl)) {
            $this->_wsdl =& new ilBMFWSDL;
        }

        $this->_wsdl->parseObject($wsdl_obj, $targetNamespace, $service_name, $service_desc);

        if ($this->_wsdl->fault) {
            $this->_raiseSoapFault($this->_wsdl->fault);
        }
    }

Here is the call graph for this function:

Here is the caller graph for this function:

ilBMFServer::addToMap ( methodname,
in,
out,
namespace = NULL,
alias = NULL 
)

Definition at line 644 of file class.ilBMFServer.php.

References ilBMFBase_Object::_raiseSoapFault().

    {
        if (!function_exists($methodname)) {
            $this->_raiseSoapFault("error mapping function\n",'','','Server');
            return false;
        }
        $this->dispatch_map[$methodname]['in'] = $in;
        $this->dispatch_map[$methodname]['out'] = $out;
        $this->dispatch_map[$methodname]['alias'] = $alias;
        if ($namespace) $this->dispatch_map[$methodname]['namespace'] = $namespace;
        return true;
    }

Here is the call graph for this function:

ilBMFServer::bind ( wsdl_url  ) 
Deprecated:
use bindWSDL from now on

Definition at line 665 of file class.ilBMFServer.php.

References bindWSDL().

                             {
        $this->bindWSDL($wsdl_url);
    }

Here is the call graph for this function:

ilBMFServer::bindWSDL ( wsdl_url  ) 
Parameters:
string a url to a WSDL resource
Returns:
void

Definition at line 673 of file class.ilBMFServer.php.

References ilBMFBase_Object::_raiseSoapFault().

Referenced by bind().

                                 {
        // instantiate wsdl class
        $this->_wsdl =& new ilBMFWSDL($wsdl_url);
        if ($this->_wsdl->fault) {
            $this->_raiseSoapFault($this->_wsdl->fault);
        }
    }

Here is the call graph for this function:

Here is the caller graph for this function:

ilBMFServer::buildResult ( &$  method_response,
&$  return_type,
return_name = 'return',
namespace = '' 
)

Definition at line 265 of file class.ilBMFServer.php.

References $key, and $type.

Referenced by parseRequest().

    {
        if (gettype($method_response) == 'object' && is_a($method_response,'ilbmfvalue')) {
            $return_val = array($method_response);
        } else {
            if (is_array($return_type) && is_array($method_response)) {
                $i = 0;

                foreach ($return_type as $key => $type) {
                    if (is_numeric($key)) $key = 'item';
                    if (is_a($method_response[$i],'ilbmfvalue')) {
                        $return_val[] = $method_response[$i++];
                    } else {
                        $qn =& new ilBMFQName($key, $namespace);
                        $return_val[] =& new ilBMFValue($qn->fqn(),$type,$method_response[$i++]);
                    }
                }
            } else {
                if (is_array($return_type)) {
                    $keys = array_keys($return_type);
                    if (!is_numeric($keys[0])) $return_name = $keys[0];
                    $values = array_values($return_type);
                    $return_type = $values[0];
                }
                $qn =& new ilBMFQName($return_name, $namespace);
                $return_val = array();
                $return_val[] =& new ilBMFValue($qn->fqn(),$return_type,$method_response);
            }
        }
        return $return_val;
    }

Here is the caller graph for this function:

& ilBMFServer::callMethod ( methodname,
&$  args 
)

Definition at line 233 of file class.ilBMFServer.php.

References $args, and $soap_server_fault.

Referenced by parseRequest().

                                              {
        global $soap_server_fault;
        $soap_server_fault = null;

        if ($this->callHandler) {
            return @call_user_func_array($this->callHandler,array($methodname,$args));
        }

        set_error_handler('ilBMFServerErrorHandler');

        if ($args) {
            // call method with parameters
            if (isset($this->soapobject) && is_object($this->soapobject)) {
                $ret = @call_user_func_array(array(&$this->soapobject, $methodname),$args);
            } else {
                $ret = @call_user_func_array($methodname,$args);
            }
        } else {
            // call method w/ no parameters
            if (is_object($this->soapobject)) {
                $ret = @call_user_func(array(&$this->soapobject, $methodname));
            } else {
                $ret = @call_user_func($methodname);
            }
        }

        restore_error_handler();

        return is_null($soap_server_fault) ? $ret : $soap_server_fault;
    }

Here is the caller graph for this function:

ilBMFServer::getReturnType ( returndata  ) 

Definition at line 546 of file class.ilBMFServer.php.

References $type.

Referenced by verifyMethod().

    {
        if (is_array($returndata)) {
            if (count($returndata) > 1) {
                return $returndata;
            }
            $type = array_shift($returndata);
            return $type;
        }
        return false;
    }

Here is the caller graph for this function:

ilBMFServer::ilBMFServer ( options = NULL  ) 

Definition at line 96 of file class.ilBMFServer.php.

References ilBMFBase::ilBMFBase().

Referenced by ilBMFServer_Email::ilBMFServer_Email(), ilBMFServer_Email_Gateway::ilBMFServer_Email_Gateway(), and ilBMFServer_TCP::ilBMFServer_TCP().

                                        {
        ini_set('track_errors',1);
        parent::ilBMFBase('Server');
        if (is_array($options)) {
            if (isset($options['use']))
                $this->__options['use'] = $options['use'];
            if (isset($options['style']))
                $this->__options['style'] = $options['style'];
            if (isset($options['parameters']))
                $this->__options['parameters'] = $options['parameters'];
        }
        $this->_section5 = TRUE; // assume we encode with section 5
        if ($this->__options['use']=='literal') $this->_section5 = FALSE;
    }

Here is the call graph for this function:

Here is the caller graph for this function:

ilBMFServer::parseRequest ( data = '',
attachments = null 
)

Definition at line 297 of file class.ilBMFServer.php.

References $data, __decodeRequest(), ilBMFBase::_decode(), ilBMFBase::_makeEnvelope(), ilBMFBase_Object::_raiseSoapFault(), ilBMFBase::_setSchemaVersion(), buildResult(), callMethod(), validateMethod(), and verifyMethod().

Referenced by ilBMFServer_TCP::service(), ilBMFServer_Email::service(), and service().

    {
        // parse response, get soap parser obj
        $parser =& new ilBMFParser($data,$this->xml_encoding,$attachments);
        // if fault occurred during message parsing
        if ($parser->fault) {
            $this->fault = $parser->fault;
            return null;
        }

        //*******************************************************
        // handle message headers

        $request_headers = $parser->getHeaders();
        $header_results = array();

        if ($request_headers) {
            if (!is_a($request_headers,'ilbmfvalue')) {
                $this->_raiseSoapFault("parser did not return ilBMFValue object: $request_headers",'','','Server');
                return null;
            }
            if ($request_headers->value) {
            // handle headers now
            foreach ($request_headers->value as $header_val) {
                $f_exists = $this->validateMethod($header_val->name, $header_val->namespace);

                # XXX this does not take into account message routing yet
                $myactor = (
                    !$header_val->actor ||
                    $header_val->actor == 'http://schemas.xmlsoap.org/soap/actor/next' ||
                    $header_val->actor == $this->endpoint);

                if (!$f_exists && $header_val->mustunderstand && $myactor) {
                    $this->_raiseSoapFault("I don't understand header $header_val->name.",'','','MustUnderstand');
                    return null;
                }

                // we only handle the header if it's for us
                $isok = $f_exists && $myactor;

                if ($isok) {
                    # call our header now!
                    $header_method = $header_val->name;
                    $header_data = array($this->_decode($header_val));
                    // if there are parameters to pass
                    $hr =& $this->callMethod($header_method, $header_data);
                    # if they return a fault, then it's all over!
                    if (PEAR::isError($hr)) {
                        $this->_raiseSoapFault($hr);
                        return null;
                    }
                    $header_results[] = array_shift($this->buildResult($hr, $this->return_type, $header_method, $header_val->namespace));
                }
            }
            }
        }

        //*******************************************************
        // handle the method call

        // evaluate message, getting back a ilBMFValue object
        $this->call_methodname = $this->methodname = $parser->root_struct_name[0];

        // figure out the method_namespace
        $this->method_namespace = $parser->message[$parser->root_struct[0]]['namespace'];

        if ($this->_wsdl) {
            $this->_setSchemaVersion($this->_wsdl->xsd);
            $dataHandler = $this->_wsdl->getDataHandler($this->methodname,$this->method_namespace);
            if ($dataHandler)
                $this->call_methodname = $this->methodname = $dataHandler;

            $this->_portName = $this->_wsdl->getPortName($this->methodname);
            if (PEAR::isError($this->_portName)) {
                return $this->_raiseSoapFault($this->_portName);
            }
            $opData = $this->_wsdl->getOperationData($this->_portName, $this->methodname);
            if (PEAR::isError($opData)) {
                return $this->_raiseSoapFault($opData);
            }
            $this->__options['style'] = $opData['style'];
            $this->__options['use'] = $opData['output']['use'];
            $this->__options['parameters'] = $opData['parameters'];
        }

        // does method exist?
        if (!$this->methodname || !$this->validateMethod($this->methodname,$this->method_namespace)) {
            $this->_raiseSoapFault("method '{{$this->method_namespace}}$this->methodname' not defined in service",'','','Server');
            return NULL;
        }

        if (!$request_val = $parser->getResponse()) {
            return NULL;
        }
        if (!is_a($request_val,'ilbmfvalue')) {
            $this->_raiseSoapFault("parser did not return ilBMFValue object: $request_val",'','','Server');
            return NULL;
        }

        // verify that ilBMFValue objects in request match the methods signature
        if (!$this->verifyMethod($request_val)) {
            // verifyMethod creates the fault
            return NULL;
        }

        // need to set special error detection inside the value class
        // so as to differentiate between no params passed, and an error decoding
        $request_data = $this->__decodeRequest($request_val);
        if (PEAR::isError($request_data)) {
            return $this->_raiseSoapFault($request_data);
        }
        $method_response =& $this->callMethod($this->call_methodname, $request_data);

        if (PEAR::isError($method_response)) {
            $this->_raiseSoapFault($method_response);
            return null;
        }

        if ($this->__options['parameters'] || !$method_response || $this->__options['style']=='rpc') {
            // get the method result
            if (is_null($method_response))
                $return_val = NULL;
            else
                $return_val = $this->buildResult($method_response, $this->return_type);

            $qn =& new ilBMFQName($this->methodname.'Response',$this->method_namespace);
            $methodValue =& new ilBMFValue($qn->fqn(), 'Struct', $return_val);
        } else {
            $methodValue =& $method_response;
        }
        return $this->_makeEnvelope($methodValue, $header_results, $this->response_encoding);
    }

Here is the call graph for this function:

Here is the caller graph for this function:

ilBMFServer::service ( data,
endpoint = '',
test = FALSE 
)

Definition at line 128 of file class.ilBMFServer.php.

References $data, $endpoint, $headers, ilBMFBase::_decodeDIMEMessage(), ilBMFBase::_decodeMimeMessage(), _getContentEncoding(), ilBMFBase::_makeDIMEMessage(), ilBMFBase::_makeMimeMessage(), ilBMFBase_Object::_raiseSoapFault(), and parseRequest().

    {
        $response = NULL;
        $attachments = array();
        $headers = array();
        $useEncoding = 'DIME';
        // figure out our endpoint
        $this->endpoint = $endpoint;
        if (!$test && !$this->endpoint) {
            // we'll try to build our endpoint
            $this->endpoint = 'http://'.$_SERVER['SERVER_NAME'];
            if ($_SERVER['SERVER_PORT']) $this->endpoint .= ':'.$_SERVER['SERVER_PORT'];
            $this->endpoint .= $_SERVER['SCRIPT_NAME'];
        }

        // get the character encoding of the incoming request
        // treat incoming data as UTF-8 if no encoding set
        if (isset($_SERVER['CONTENT_TYPE'])) {
            if (strcasecmp($_SERVER['CONTENT_TYPE'],'application/dime')==0) {
                $this->_decodeDIMEMessage($data,$headers,$attachments);
                $useEncoding = 'DIME';
            } else if (stristr($_SERVER['CONTENT_TYPE'],'multipart/related')) {
                // this is a mime message, lets decode it.
                $data = 'Content-Type: '.stripslashes($_SERVER['CONTENT_TYPE'])."\r\n\r\n".$data;
                $this->_decodeMimeMessage($data,$headers,$attachments);
                $useEncoding = 'Mime';
            }
            if (!isset($headers['content-type'])) {
                $headers['content-type'] = stripslashes($_SERVER['CONTENT_TYPE']);
            }
            if (!$this->fault &&
                !$this->_getContentEncoding($headers['content-type'])) {
                $this->xml_encoding = SOAP_DEFAULT_ENCODING;
                // an encoding we don't understand, return a fault
                $this->_raiseSoapFault('Unsupported encoding, use one of ISO-8859-1, US-ASCII, UTF-8','','','Server');
            }
        }

        // if this is not a POST with Content-Type text/xml, try to return a WSDL file
        if (!$this->fault  && !$test && ($_SERVER['REQUEST_METHOD'] != 'POST' ||
            strncmp($headers['content-type'],'text/xml',8) != 0)) {
                // this is not possibly a valid soap request, try to return a WSDL file
                $this->_raiseSoapFault("Invalid SOAP request, must be POST with content-type: text/xml, got: ".(isset($headers['content-type'])?$headers['content-type']:'Nothing!'),'','','Server');
        }

        if (!$this->fault) {
            // $response is a soap_msg object
            $soap_msg = $this->parseRequest($data, $attachments);

            // handle Mime or DIME encoding
            // XXX DIME Encoding should move to the transport, do it here for now
            // and for ease of getting it done
            if (count($this->__attachments)) {
                if ($useEncoding == 'Mime') {
                    $soap_msg = $this->_makeMimeMessage($soap_msg);
                } else {
                    // default is dime
                    $soap_msg = $this->_makeDIMEMessage($soap_msg);
                    $header['Content-Type'] = 'application/dime';
                }
                if (PEAR::isError($soap_msg)) {
                    return $this->raiseSoapFault($soap_msg);
                }
            }

            if (is_array($soap_msg)) {
                $response = $soap_msg['body'];
                if (count($soap_msg['headers'])) {
                    $header = $soap_msg['headers'];
                }
            } else {
                $response = $soap_msg;
            }
        }

        // make distinction between the different choice of installation,
        // running php as cgi or as a module
        if(stristr(php_sapi_name(),'cgi') === 0)
            $hdrs_type = 'Status:';
        else
            $hdrs_type = 'HTTP/1.1';

        if ($this->fault) {
            $hdrs = "$hdrs_type 500 Soap Fault\r\n";
            $response = $this->fault->message();
        } else {
           $hdrs = "$hdrs_type 200 OK\r\n";
        }
        header($hdrs);

        $header['Server'] = SOAP_LIBRARY_NAME;
        if (!isset($header['Content-Type']))
            $header['Content-Type'] = "text/xml; charset=$this->response_encoding";
        $header['Content-Length'] = strlen($response);

        reset($header);
        foreach ($header as $k => $v) {
            header("$k: $v");
            $hdrs .= "$k: $v\r\n";
        }

        $this->response = $hdrs . "\r\n" . $response;
        print $response;
    }

Here is the call graph for this function:

ilBMFServer::setCallHandler ( callHandler,
validation = true 
)

Definition at line 657 of file class.ilBMFServer.php.

References $callHandler.

                                                            {
        $this->callHandler = $callHandler;
        $this->callValidation = $validation;
    }

ilBMFServer::validateMethod ( methodname,
namespace = NULL 
)

Definition at line 558 of file class.ilBMFServer.php.

References $obj.

Referenced by parseRequest().

    {
        unset($this->soapobject);
        if (!$this->callValidation) return TRUE;
        # no soap access to private functions
        if ($methodname[0] == '_') return FALSE;

        /* if it's in our function list, ok */
        if (array_key_exists($methodname, $this->dispatch_map) &&
            (!$namespace || !array_key_exists('namespace', $this->dispatch_map[$methodname]) ||
             $namespace == $this->dispatch_map[$methodname]['namespace'])) {
                if (array_key_exists('namespace', $this->dispatch_map[$methodname]))
                    $this->method_namespace = $this->dispatch_map[$methodname]['namespace'];
            return TRUE;
        }

        /* if it's in an object, it's ok */
        if (isset($this->dispatch_objects[$namespace])) {
            $c = count($this->dispatch_objects[$namespace]);
            for ($i=0; $i < $c; $i++) {
                $obj =& $this->dispatch_objects[$namespace][$i];
                // if we have a dispatch map, and the function is not
                // in the dispatch map, then it is not callable!
                if (method_exists($obj, '__dispatch')) {
                    if ($obj->__dispatch($methodname)) {
                        $this->method_namespace = $namespace;
                        $this->soapobject =& $obj;
                        return TRUE;
                    }
                } else
                if (method_exists($obj, $methodname)) {
                    $this->method_namespace = $namespace;
                    $this->soapobject =& $obj;
                    return TRUE;
                }
            }
        }
        return FALSE;
    }

Here is the caller graph for this function:

ilBMFServer::verifyMethod ( request  ) 

Definition at line 472 of file class.ilBMFServer.php.

References $params, $request, ilBMFBase_Object::_raiseSoapFault(), and getReturnType().

Referenced by parseRequest().

    {
        if (!$this->callValidation) return TRUE;
        //return true;
        $params = $request->value;

        // get the dispatch map if one exists
        $map = NULL;
        if (array_key_exists($this->methodname, $this->dispatch_map)) {
            $map = $this->dispatch_map[$this->methodname];
        } else if (isset($this->soapobject)) {
            if (method_exists($this->soapobject, '__dispatch')) {
                $map = $this->soapobject->__dispatch($this->methodname);
            } else if (method_exists($this->soapobject, $this->methodname)) {
                // no map, all public functions are soap functions
                return TRUE;
            }
        }
        if (!$map) {
            $this->_raiseSoapFault("soap request specified an unhandled method '$this->methodname'",'','','Client');
            return FALSE;
        }

        // if we aliased the soap method name to a php function,
        // change the call_method so we do the right thing.
        if (array_key_exists('alias',$map) && !empty($map['alias'])) {
            $this->call_methodname = $map['alias'];
        }

        // if there are input parameters required...
        if ($sig = $map['in']) {
            $this->input_value = count($sig);
            $this->return_type = $this->getReturnType($map['out']);
            if (is_array($params)) {
                // validate the number of parameters
                if (count($params) == count($sig)) {
                    // make array of param types
                    foreach ($params as $param) {
                        $p[] = strtolower($param->type);
                    }
                    $sig_t = array_values($sig);
                    // validate each param's type
                    for($i=0; $i < count($p); $i++) {
                        // type not match
                        // if soap types do not match, we ok it if the mapped php types match
                        // this allows using plain php variables to work (ie. stuff like Decimal would fail otherwise)
                        // we only error if the types exist in our type maps, and they differ
                        if (strcasecmp($sig_t[$i],$p[$i])!=0 &&
                            (isset($this->_typemap[SOAP_XML_SCHEMA_VERSION][$sig_t[$i]]) &&
                            strcasecmp($this->_typemap[SOAP_XML_SCHEMA_VERSION][$sig_t[$i]],$this->_typemap[SOAP_XML_SCHEMA_VERSION][$p[$i]])!=0)) {

                            $param = $params[$i];
                            $this->_raiseSoapFault("soap request contained mismatching parameters of name $param->name had type [{$p[$i]}], which did not match signature's type: [{$sig_t[$i]}], matched? ".(strcasecmp($sig_t[$i],$p[$i])),'','','Client');
                            return false;
                        }
                    }
                    return true;
                // oops, wrong number of paramss
                } else {
                    $this->_raiseSoapFault("soap request contained incorrect number of parameters. method '$this->methodname' required ".count($sig).' and request provided '.count($params),'','','Client');
                    return false;
                }
            // oops, no params...
            } else {
                $this->_raiseSoapFault("soap request contained incorrect number of parameters. method '$this->methodname' requires ".count($sig).' parameters, and request provided none','','','Client');
                return false;
            }
        // no params
        }
        // we'll try it anyway
        return true;
    }

Here is the call graph for this function:

Here is the caller graph for this function:


Field Documentation

ilBMFServer::$__options = array('use'=>'encoded','style'=>'rpc','parameters'=>0)

Definition at line 94 of file class.ilBMFServer.php.

ilBMFServer::$call_methodname = NULL

Definition at line 65 of file class.ilBMFServer.php.

ilBMFServer::$callHandler = NULL

Definition at line 66 of file class.ilBMFServer.php.

Referenced by setCallHandler().

ilBMFServer::$callValidation = true

Definition at line 67 of file class.ilBMFServer.php.

ilBMFServer::$dispatch_map = array()

Definition at line 62 of file class.ilBMFServer.php.

ilBMFServer::$dispatch_objects = array()

Definition at line 63 of file class.ilBMFServer.php.

ilBMFServer::$endpoint = ''
ilBMFServer::$headers = ''

Reimplemented in ilBMFServer_Email, and ilBMFServer_TCP.

Definition at line 73 of file class.ilBMFServer.php.

Referenced by service().

ilBMFServer::$method_namespace = NULL

Definition at line 93 of file class.ilBMFServer.php.

ilBMFServer::$request = ''

Definition at line 79 of file class.ilBMFServer.php.

Referenced by __decodeRequest(), and verifyMethod().

ilBMFServer::$response_encoding = 'UTF-8'

Definition at line 86 of file class.ilBMFServer.php.

ilBMFServer::$result = 'successful'

Definition at line 88 of file class.ilBMFServer.php.

ilBMFServer::$service = ''

Definition at line 92 of file class.ilBMFServer.php.

ilBMFServer::$soapobject = NULL

Definition at line 64 of file class.ilBMFServer.php.

ilBMFServer::$xml_encoding = SOAP_DEFAULT_ENCODING

Definition at line 85 of file class.ilBMFServer.php.


The documentation for this class was generated from the following file: