diff --git a/phpgwapi/inc/class.soap_client.inc.php b/phpgwapi/inc/class.soap_client.inc.php index ceb15c9252..a510b2ce2e 100644 --- a/phpgwapi/inc/class.soap_client.inc.php +++ b/phpgwapi/inc/class.soap_client.inc.php @@ -1,5 +1,5 @@ - */ +*/ /* changelog: 2001-07-04 @@ -30,6 +30,9 @@ // $path can be a complete endpoint url, with the other parameters left blank: // $soap_client = new soap_client("http://path/to/soap/server"); + + /* $Id$ */ + class soap_client { function soap_client($path,$server=False,$port=False) @@ -40,30 +43,30 @@ $this->errno; $this->errstring; $this->debug_flag = False; - $this->debug_str = ""; - $this->username = ""; - $this->password = ""; - $this->action = ""; - $this->incoming_payload = ""; - $this->outgoing_payload = ""; - $this->response = ""; - $this->action = ""; + $this->debug_str = ''; + $this->username = ''; + $this->password = ''; + $this->action = ''; + $this->incoming_payload = ''; + $this->outgoing_payload = ''; + $this->response = ''; + $this->action = ''; // endpoint mangling if(ereg("^http://",$path)) { - $path = str_replace("http://","",$path); - $this->path = strstr($path,"/"); + $path = str_replace('http://','',$path); + $this->path = strstr($path,'/'); $this->debug("path = $this->path"); - if(ereg(":",$path)) + if(ereg(':',$path)) { - $this->server = substr($path,0,strpos($path,":")); - $this->port = substr(strstr($path,":"),1); - $this->port = substr($this->port,0,strpos($this->port,"/")); + $this->server = substr($path,0,strpos($path,':')); + $this->port = substr(strstr($path,':'),1); + $this->port = substr($this->port,0,strpos($this->port,'/')); } else { - $this->server = substr($path,0,strpos($path,"/")); + $this->server = substr($path,0,strpos($path,'/')); } } if($port) @@ -132,19 +135,21 @@ } $soap_data = $msg->serialize(); - $this->outgoing_payload = "POST ". - $this->path. - " HTTP/1.0\r\n". - "User-Agent: SOAPx4 v0.13492\r\n". - "Host: ".$this->server . "\r\n". - $credentials. - "Content-Type: text/xml\r\nContent-Length: ".strlen($soap_data)."\r\n". - "SOAPAction: \"$this->action\""."\r\n\r\n". - $soap_data; + $this->outgoing_payload = 'POST ' + . $this->path + . " HTTP/1.0\r\n" + . 'User-Agent: phpGroupware/' . $cliversion . '(PHP) ' . "\r\n" + . 'X-PHPGW-Server: ' . $this->server . "\r\n" + . 'X-PHPGW-Version: ' . $GLOBALS['phpgw_info']['server']['versions']['phpgwapi'] . "\r\n" + . 'Host: '.$this->server . "\r\n" + . $credentials + . "Content-Type: text/xml\r\nContent-Length: " . strlen($soap_data) . "\r\n" + . 'SOAPAction: "' . $this->action . '"' . "\r\n\r\n" + . $soap_data; // send if(!fputs($fp, $this->outgoing_payload, strlen($this->outgoing_payload))) { - $this->debug("Write error"); + $this->debug('Write error'); } // get reponse @@ -181,15 +186,17 @@ } $soap_data = $msg->serialize(); - $this->outgoing_payload = "POST ". - $this->path. - " HTTP/1.0\r\n". - "User-Agent: SOAPx4 v0.13492\r\n". - "Host: ".$this->server . "\r\n". - $credentials. - "Content-Type: text/xml\r\nContent-Length: ".strlen($soap_data)."\r\n". - "SOAPAction: \"$this->action\""."\r\n\r\n". - $soap_data; + $this->outgoing_payload = 'POST ' + . $this->path + . " HTTP/1.0\r\n" + . 'User-Agent: phpGroupware/' . $cliversion . '(PHP) ' . "\r\n" + . 'X-PHPGW-Server: ' . $this->server . "\r\n" + . 'X-PHPGW-Version: ' . $GLOBALS['phpgw_info']['server']['versions']['phpgwapi'] . "\r\n" + . 'Host: ' . $this->server . "\r\n" + . $credentials + . "Content-Type: text/xml\r\nContent-Length: " . strlen($soap_data) . "\r\n" + . 'SOAPAction: "' . $this->action . '"' . "\r\n\r\n" + . $soap_data; // send $ch = curl_init(); diff --git a/phpgwapi/inc/class.soap_parser.inc.php b/phpgwapi/inc/class.soap_parser.inc.php index 7f22dd35fd..0e5228719d 100644 --- a/phpgwapi/inc/class.soap_parser.inc.php +++ b/phpgwapi/inc/class.soap_parser.inc.php @@ -1,373 +1,375 @@ soapTypes = $soapTypes; - $this->xml = $xml; - $this->xml_encoding = $encoding; - $this->root_struct = ""; - // options: envelope,header,body,method - // determines where in the message we are (envelope,header,body,method) - $this->status = ""; - $this->position = 0; - $this->pos_stat = 0; - $this->depth = 0; - $this->default_namespace = ""; - $this->namespaces = array(); - $this->message = array(); - $this->fault = false; - $this->fault_code = ""; - $this->fault_str = ""; - $this->fault_detail = ""; - $this->eval_str = ""; - $this->depth_array = array(); - $this->debug_flag = True; - $this->debug_str = ""; - $this->previous_element = ""; - - $this->entities = array ( - "&" => "&", - "<" => "<", - ">" => ">", - "'" => "'", - '"' => """ - ); - - // Check whether content has been read. - if(!empty($xml)) + function soap_parser($xml='',$encoding='UTF-8') { - $this->debug("Entering soap_parser()"); - //$this->debug("DATA DUMP:\n\n$xml"); - // Create an XML parser. - $this->parser = xml_parser_create($this->xml_encoding); - // Set the options for parsing the XML data. - //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); - xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); - // Set the object for the parser. - xml_set_object($this->parser, &$this); - // Set the element handlers for the parser. - xml_set_element_handler($this->parser, "start_element","end_element"); - xml_set_character_data_handler($this->parser,"character_data"); - xml_set_default_handler($this->parser, "default_handler"); + global $soapTypes; - // Parse the XML file. - if(!xml_parse($this->parser,$xml,true)) + $this->soapTypes = $soapTypes; + $this->xml = $xml; + $this->xml_encoding = $encoding; + $this->root_struct = ""; + // options: envelope,header,body,method + // determines where in the message we are (envelope,header,body,method) + $this->status = ''; + $this->position = 0; + $this->pos_stat = 0; + $this->depth = 0; + $this->default_namespace = ''; + $this->namespaces = array(); + $this->message = array(); + $this->fault = false; + $this->fault_code = ''; + $this->fault_str = ''; + $this->fault_detail = ''; + $this->eval_str = ''; + $this->depth_array = array(); + $this->debug_flag = True; + $this->debug_str = ''; + $this->previous_element = ''; + + $this->entities = array ( + '&' => '&', + '<' => '<', + '>' => '>', + "'" => ''', + '"' => '"' + ); + + // Check whether content has been read. + if(!empty($xml)) { - // Display an error message. - $this->debug(sprintf("XML error on line %d: %s", - xml_get_current_line_number($this->parser), - xml_error_string(xml_get_error_code($this->parser)))); - $this->fault = true; + $this->debug('Entering soap_parser()'); + //$this->debug("DATA DUMP:\n\n$xml"); + // Create an XML parser. + $this->parser = xml_parser_create($this->xml_encoding); + // Set the options for parsing the XML data. + //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + // Set the object for the parser. + xml_set_object($this->parser, &$this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element','end_element'); + xml_set_character_data_handler($this->parser,'character_data'); + xml_set_default_handler($this->parser, 'default_handler'); + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)) + { + // Display an error message. + $this->debug(sprintf("XML error on line %d: %s", + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)))); + $this->fault = true; + } + else + { + // get final eval string + $this->eval_str = "\$response = ".trim($this->build_eval($this->root_struct)).";"; + } + xml_parser_free($this->parser); } else { - // get final eval string - $this->eval_str = "\$response = ".trim($this->build_eval($this->root_struct)).";"; + $this->debug("xml was empty, didn't parse!"); } - xml_parser_free($this->parser); } - else - { - $this->debug("xml was empty, didn't parse!"); - } - } - // loop through msg, building eval_str - function build_eval($pos) - { - $this->debug("inside build_eval() for $pos: ".$this->message[$pos]["name"]); - $eval_str = $this->message[$pos]["eval_str"]; - // loop through children, building... - if($this->message[$pos]["children"] != "") + // loop through msg, building eval_str + function build_eval($pos) { - $this->debug("children string = ".$this->message[$pos]["children"]); - $children = explode("|",$this->message[$pos]["children"]); - $this->debug("it has ".count($children)." children"); - @reset($children); - while(list($c,$child_pos) = @each($children)) - /* foreach($children as $c => $child_pos) */ + $this->debug("inside build_eval() for $pos: ".$this->message[$pos]["name"]); + $eval_str = $this->message[$pos]['eval_str']; + // loop through children, building... + if($this->message[$pos]['children'] != '') { - //$this->debug("child pos $child_pos: ".$this->message[$child_pos]["name"]); - if($this->message[$child_pos]["eval_str"] != "") + $this->debug('children string = '.$this->message[$pos]['children']); + $children = explode('|',$this->message[$pos]['children']); + $this->debug('it has '.count($children).' children'); + @reset($children); + while(list($c,$child_pos) = @each($children)) + /* foreach($children as $c => $child_pos) */ { - $this->debug("entering build_eval() for ".$this->message[$child_pos]["name"].", array pos $c, pos: $child_pos"); - $eval_str .= $this->build_eval($child_pos).", "; + //$this->debug("child pos $child_pos: ".$this->message[$child_pos]["name"]); + if($this->message[$child_pos]['eval_str'] != '') + { + $this->debug('entering build_eval() for '.$this->message[$child_pos]['name'].", array pos $c, pos: $child_pos"); + $eval_str .= $this->build_eval($child_pos).', '; + } } + $eval_str = substr($eval_str,0,strlen($eval_str)-2); } - $eval_str = substr($eval_str,0,strlen($eval_str)-2); + // add current node's eval_str + $eval_str .= $this->message[$pos]['end_eval_str']; + return $eval_str; } - // add current node's eval_str - $eval_str .= $this->message[$pos]["end_eval_str"]; - return $eval_str; - } - // start-element handler - function start_element($parser, $name, $attrs) - { - // position in a total number of elements, starting from 0 - // update class level pos - $pos = $this->position++; - // and set mine - $this->message[$pos]["pos"] = $pos; + // start-element handler + function start_element($parser, $name, $attrs) + { + // position in a total number of elements, starting from 0 + // update class level pos + $pos = $this->position++; + // and set mine + $this->message[$pos]['pos'] = $pos; - // parent/child/depth determinations + // parent/child/depth determinations - // depth = how many levels removed from root? - // set mine as current global depth and increment global depth value - $this->message[$pos]["depth"] = $this->depth++; + // depth = how many levels removed from root? + // set mine as current global depth and increment global depth value + $this->message[$pos]['depth'] = $this->depth++; - // else add self as child to whoever the current parent is - if($pos != 0) - { - $this->message[$this->parent]["children"] .= "|$pos"; - } - // set my parent - $this->message[$pos]["parent"] = $this->parent; - // set self as current value for this depth - $this->depth_array[$this->depth] = $pos; - // set self as current parent - $this->parent = $pos; + // else add self as child to whoever the current parent is + if($pos != 0) + { + $this->message[$this->parent]['children'] .= "|$pos"; + } + // set my parent + $this->message[$pos]['parent'] = $this->parent; + // set self as current value for this depth + $this->depth_array[$this->depth] = $pos; + // set self as current parent + $this->parent = $pos; - // set status - if(ereg(":Envelope$",$name)) - { - $this->status = "envelope"; - } - elseif(ereg(":Header$",$name)) - { - $this->status = "header"; - } - elseif(ereg(":Body$",$name)) - { - $this->status = "body"; - // set method - } - elseif($this->status == "body") - { - $this->status = "method"; + // set status + if(ereg(":Envelope$",$name)) + { + $this->status = 'envelope'; + } + elseif(ereg(":Header$",$name)) + { + $this->status = 'header'; + } + elseif(ereg(":Body$",$name)) + { + $this->status = 'body'; + // set method + } + elseif($this->status == 'body') + { + $this->status = 'method'; + if(ereg(':',$name)) + { + $this->root_struct_name = substr(strrchr($name,':'),1); + } + else + { + $this->root_struct_name = $name; + } + $this->root_struct = $pos; + $this->message[$pos]['type'] = 'struct'; + } + // set my status + $this->message[$pos]['status'] = $this->status; + + // set name + $this->message[$pos]['name'] = htmlspecialchars($name); + // set attrs + $this->message[$pos]['attrs'] = $attrs; + // get namespace if(ereg(":",$name)) { - $this->root_struct_name = substr(strrchr($name,":"),1); + $namespace = substr($name,0,strpos($name,':')); + $this->message[$pos]['namespace'] = $namespace; + $this->default_namespace = $namespace; } else { - $this->root_struct_name = $name; + $this->message[$pos]['namespace'] = $this->default_namespace; } - $this->root_struct = $pos; - $this->message[$pos]["type"] = "struct"; - } - // set my status - $this->message[$pos]["status"] = $this->status; - - // set name - $this->message[$pos]["name"] = htmlspecialchars($name); - // set attrs - $this->message[$pos]["attrs"] = $attrs; - // get namespace - if(ereg(":",$name)) - { - $namespace = substr($name,0,strpos($name,":")); - $this->message[$pos]["namespace"] = $namespace; - $this->default_namespace = $namespace; - } - else - { - $this->message[$pos]["namespace"] = $this->default_namespace; - } - // loop through atts, logging ns and type declarations - @reset($attrs); - while (list($key,$value) = @each($attrs)) - /* foreach($attrs as $key => $value) */ - { - // if ns declarations, add to class level array of valid namespaces - if(ereg("xmlns:",$key)) + // loop through atts, logging ns and type declarations + @reset($attrs); + while (list($key,$value) = @each($attrs)) + /* foreach($attrs as $key => $value) */ { - $namespaces[substr(strrchr($key,":"),1)] = $value; - if($name == $this->root_struct_name) + // if ns declarations, add to class level array of valid namespaces + if(ereg('xmlns:',$key)) { - $this->methodNamespace = $value; + $namespaces[substr(strrchr($key,':'),1)] = $value; + if($name == $this->root_struct_name) + { + $this->methodNamespace = $value; + } + } + // if it's a type declaration, set type + elseif($key == 'xsi:type') + { + // then get attname and set $type + $type = substr(strrchr($value,':'),1); } } - // if it's a type declaration, set type - elseif($key == "xsi:type") + + // set type if available + if($type) { - // then get attname and set $type - $type = substr(strrchr($value,":"),1); + $this->message[$pos]['type'] = $type; } + + // debug + //$this->debug("parsed $name start, eval = '".$this->message[$pos]["eval_str"]."'"); } - // set type if available - if($type) + // end-element handler + function end_element($parser, $name) { - $this->message[$pos]["type"] = $type; - } - - // debug - //$this->debug("parsed $name start, eval = '".$this->message[$pos]["eval_str"]."'"); - } - - // end-element handler - function end_element($parser, $name) - { - // position of current element is equal to the last value left in depth_array for my depth - $pos = $this->depth_array[$this->depth]; - // bring depth down a notch - $this->depth--; + // position of current element is equal to the last value left in depth_array for my depth + $pos = $this->depth_array[$this->depth]; + // bring depth down a notch + $this->depth--; - // get type if not set already - if($this->message[$pos]["type"] == "") - { -// if($this->message[$pos]["cdata"] == "" && $this->message[$pos]["children"] != "") - if($this->message[$pos]["children"] != "") + // get type if not set already + if($this->message[$pos]['type'] == '') { - $this->message[$pos]["type"] = "SOAPStruct"; +// if($this->message[$pos]['cdata'] == '' && $this->message[$pos]['children'] != '') + if($this->message[$pos]['children'] != '') + { + $this->message[$pos]['type'] = 'SOAPStruct'; + } + else + { + $this->message[$pos]['type'] = 'string'; + } + } + + // set eval str start if it has a valid type and is inside the method + if($pos >= $this->root_struct) + { + $this->message[$pos]['eval_str'] .= "\n CreateObject(\"phpgwapi.soapval\",\"".htmlspecialchars($name)."\", \"".$this->message[$pos]["type"]."\" "; + $this->message[$pos]['end_eval_str'] = ')'; + $this->message[$pos]['inval'] = 'true'; + /* + if($this->message[$pos]["name"] == $this->root_struct_name){ + $this->message[$pos]["end_eval_str"] .= " ,\"$this->methodNamespace\""; + } + */ + if($this->message[$pos]['children'] != '') + { + $this->message[$pos]['eval_str'] .= ', array( '; + $this->message[$pos]['end_eval_str'] .= ' )'; + } + } + + // if i have no children and have cdata...then i must be a scalar value, so add my data to the eval_str + if($this->status == 'method' && $this->message[$pos]['children'] == '') + { + // add cdata w/ no quotes if only int/float/dbl + if($this->message[$pos]['type'] == 'string') + { + $this->message[$pos]['eval_str'] .= ", \"".$this->message[$pos]['cdata']."\""; + } + elseif($this->message[$pos]['type'] == 'int' || $this->message[$pos]['type'] == 'float' || $this->message[$pos]['type'] == 'double') + { + //$this->debug("adding cdata w/o quotes"); + $this->message[$pos]['eval_str'] .= ', '.trim($this->message[$pos]['cdata']); + } + elseif(is_string($this->message[$pos]['cdata'])) + { + //$this->debug("adding cdata w/ quotes"); + $this->message[$pos]['eval_str'] .= ", \"".$this->message[$pos]['cdata']."\""; + } + } + // if in the process of making a soap_val, close the parentheses and move on... + if($this->message[$pos]['inval'] == 'true') + { + $this->message[$pos]['inval'] == 'false'; + } + // if tag we are currently closing is the method wrapper + if($pos == $this->root_struct) + { + $this->status = 'body'; + } + elseif(ereg(':Body',$name)) + { + $this->status = 'header'; + } + elseif(ereg(':Header',$name)) + { + $this->status = 'envelope'; + } + // set parent back to my parent + $this->parent = $this->message[$pos]['parent']; + $this->debug("parsed $name end, type '".$this->message[$pos]['type']."'eval_str = '".trim($this->message[$pos]['eval_str'])."' and children = ".$this->message[$pos]['children']); + } + + // element content handler + function character_data($parser, $data) + { + $pos = $this->depth_array[$this->depth]; + $this->message[$pos]['cdata'] .= $data; + //$this->debug("parsed ".$this->message[$pos]["name"]." cdata, eval = '$this->eval_str'"); + } + + // default handler + function default_handler($parser, $data) + { + //$this->debug("DEFAULT HANDLER: $data"); + } + + // function to get fault code + function fault() + { + if($this->fault) + { + return true; } else { - $this->message[$pos]["type"] = "string"; + return false; } } - // set eval str start if it has a valid type and is inside the method - if($pos >= $this->root_struct) + // have this return a soap_val object + function get_response() { - $this->message[$pos]["eval_str"] .= "\n CreateObject(\"phpgwapi.soapval\",\"".htmlspecialchars($name)."\", \"".$this->message[$pos]["type"]."\" "; - $this->message[$pos]["end_eval_str"] = ")"; - $this->message[$pos]["inval"] = "true"; - /* - if($this->message[$pos]["name"] == $this->root_struct_name){ - $this->message[$pos]["end_eval_str"] .= " ,\"$this->methodNamespace\""; - } - */ - if($this->message[$pos]["children"] != "") + $this->debug("eval()ing eval_str: $this->eval_str"); + @eval("$this->eval_str"); + if($response) { - $this->message[$pos]["eval_str"] .= ", array( "; - $this->message[$pos]["end_eval_str"] .= " )"; + $this->debug("successfully eval'd msg"); + return $response; } - } - - // if i have no children and have cdata...then i must be a scalar value, so add my data to the eval_str - if($this->status == "method" && $this->message[$pos]["children"] == "") - { - // add cdata w/ no quotes if only int/float/dbl - if($this->message[$pos]["type"] == "string") + else { - $this->message[$pos]["eval_str"] .= ", \"".$this->message[$pos]["cdata"]."\""; - } - elseif($this->message[$pos]["type"] == "int" || $this->message[$pos]["type"] == "float" || $this->message[$pos]["type"] == "double") - { - //$this->debug("adding cdata w/o quotes"); - $this->message[$pos]["eval_str"] .= ", ".trim($this->message[$pos]["cdata"]); - } - elseif(is_string($this->message[$pos]["cdata"])) - { - //$this->debug("adding cdata w/ quotes"); - $this->message[$pos]["eval_str"] .= ", \"".$this->message[$pos]["cdata"]."\""; - } - } - // if in the process of making a soap_val, close the parentheses and move on... - if($this->message[$pos]["inval"] == "true") - { - $this->message[$pos]["inval"] == "false"; - } - // if tag we are currently closing is the method wrapper - if($pos == $this->root_struct) - { - $this->status = "body"; - } - elseif(ereg(":Body",$name)) - { - $this->status = "header"; - } - elseif(ereg(":Header",$name)) - { - $this->status = "envelope"; - } - // set parent back to my parent - $this->parent = $this->message[$pos]["parent"]; - $this->debug("parsed $name end, type '".$this->message[$pos]["type"]."'eval_str = '".trim($this->message[$pos]["eval_str"])."' and children = ".$this->message[$pos]["children"]); - } - - // element content handler - function character_data($parser, $data) - { - $pos = $this->depth_array[$this->depth]; - $this->message[$pos]["cdata"] .= $data; - //$this->debug("parsed ".$this->message[$pos]["name"]." cdata, eval = '$this->eval_str'"); - } - - // default handler - function default_handler($parser, $data) - { - //$this->debug("DEFAULT HANDLER: $data"); - } - - // function to get fault code - function fault() - { - if($this->fault) - { - return true; - } - else - { - return false; - } - } - - // have this return a soap_val object - function get_response() - { - $this->debug("eval()ing eval_str: $this->eval_str"); - @eval("$this->eval_str"); - if($response) - { - $this->debug("successfully eval'd msg"); - return $response; - } - else - { - $this->debug("ERROR: did not successfully eval the msg"); - $this->fault = true; - return CreateObject('phpgwapi.soapval', - "Fault", - "struct", - array( - CreateObject('phpgwapi.soapval', - "faultcode", - "string", - "SOAP-ENV:Server" - ), - CreateObject('phpgwapi.soapval', - "faultstring", - "string", - "couldn't eval \"$this->eval_str\"" + $this->debug('ERROR: did not successfully eval the msg'); + $this->fault = true; + return CreateObject('phpgwapi.soapval', + 'Fault', + 'struct', + array( + CreateObject('phpgwapi.soapval', + 'faultcode', + 'string', + 'SOAP-ENV:Server' + ), + CreateObject('phpgwapi.soapval', + 'faultstring', + 'string', + "couldn't eval \"$this->eval_str\"" + ) ) - ) - ); + ); + } } - } - function debug($string) - { - if($this->debug_flag) + function debug($string) { - $this->debug_str .= "$string\n"; + if($this->debug_flag) + { + $this->debug_str .= "$string\n"; + } } - } - function decode_entities($text) - { - @reset($this->entities); - while(list($entity,$encoded) = @each($this->entities)) - /* foreach($this->entities as $entity => $encoded) */ + function decode_entities($text) { - $text = str_replace($encoded,$entity,$text); + @reset($this->entities); + while(list($entity,$encoded) = @each($this->entities)) + /* foreach($this->entities as $entity => $encoded) */ + { + $text = str_replace($encoded,$entity,$text); + } + return $text; } - return $text; } -} ?> diff --git a/phpgwapi/inc/class.soap_server.inc.php b/phpgwapi/inc/class.soap_server.inc.php index be00f5d009..f006bc7c46 100644 --- a/phpgwapi/inc/class.soap_server.inc.php +++ b/phpgwapi/inc/class.soap_server.inc.php @@ -1,443 +1,444 @@ dispatch_map = array(); - $this->debug_flag = True; - $this->debug_str = ''; - $this->headers = ''; - $this->request = ''; - $this->xml_encoding = 'UTF-8'; - $this->fault = false; - $this->fault_code = ''; - $this->fault_str = ''; - $this->fault_actor = ''; - // for logging interop results to db - $this->result = 'successful'; - } - - // parses request and posts response - function service($data) - { - // $response is a soap_msg object - $response = $this->parse_request($data); - $this->debug("parsed request and got an object of this class '".get_class($response)."'"); - $this->debug("server sending..."); - // pass along the debug string - if($this->debug_flag) + function soap_server() { - $response->debug($this->debug_str); - } - $payload = $response->serialize(); - // print headers - if($this->fault) - { - $header[] = "HTTP/1.0 500 Internal Server Error\r\n"; - } - else - { - $header[] = "HTTP/1.0 200 OK\r\n"; - $header[] = "Status: 200\r\n"; - } - $header[] = "Server: SOAPx4 Server v0.344359s\r\n"; - $header[] = "Connection: Close\r\n"; - $header[] = "Content-Type: text/xml; charset=$this->xml_encoding\r\n"; - $header[] = "Content-Length: ".strlen($payload)."\r\n\r\n"; - @reset($header); - while(list($null,$hdr) = @each($header)) - /* foreach($header as $hdr) */ - { - header($hdr); - } - print $payload; - } - - function parse_request($data='') - { - global $HTTP_SERVER_VARS; - - $this->debug("entering parse_request() on ".date("H:i Y-m-d")); - $request_uri = $HTTP_SERVER_VARS["REQUEST_URI"]; - $this->debug("request uri: $request_uri"); - // get headers - if(function_exists("getallheaders")) - { - $this->headers = getallheaders(); - while(list($k,$v) = @each($this->headers)) - /* foreach($this->headers as $k=>$v) */ - { - $dump .= "$k: $v\r\n"; - } - // get SOAPAction header - if($this->headers["SOAPAction"]) - { - $this->SOAPAction = str_replace('"','',$this->headers["SOAPAction"]); - $this->service = $this->SOAPAction; - } - // get character encoding - if(ereg("=",$this->headers["Content-Type"])) - { - $this->xml_encoding = str_replace("\"","",substr(strstr($this->headers["Content-Type"],"="),1)); - } - elseif(ereg("^text/xml",$this->headers["Content-Type"])) - { - $this->xml_encoding = "us-ascii"; - } - $this->debug("got encoding: $this->xml_encoding"); - } - $this->request = $dump."\r\n\r\n".$data; - // parse response, get soap parser obj - $parser = CreateObject('phpgwapi.soap_parser',$data); - // get/set methodname - $this->methodname = $parser->root_struct_name; - $this->debug("method name: $this->methodname"); - - // does method exist? - if(function_exists($this->methodname)) - { - $this->debug("method '$this->methodname' exists"); - } - else - { - /* phpgroupware customization - createobject based on methodname */ - list($app,$class,$method) = explode('.',$this->methodname); - $obj = CreateObject(sprintf('%s.%s',$app,$class)); - /* - // "method not found" fault here - $this->debug("method '$obj->method' not found!"); - $this->result = "fault: method not found"; - $this->make_fault("Server","method '$obj->method' not defined in service '$this->service'"); - return $this->fault(); - */ + // create empty dispatch map + $this->dispatch_map = array(); + $this->debug_flag = True; + $this->debug_str = ''; + $this->headers = ''; + $this->request = ''; + $this->xml_encoding = 'UTF-8'; + $this->fault = false; + $this->fault_code = ''; + $this->fault_str = ''; + $this->fault_actor = ''; + // for logging interop results to db + $this->result = 'successful'; } - // if fault occurred during message parsing - if($parser->fault()) + // parses request and posts response + function service($data) { - // parser debug - $this->debug($parser->debug_str); - $this->result = "fault: error in msg parsing or eval"; - $this->make_fault("Server","error in msg parsing or eval:\n".$parser->get_response()); - // return soapresp - return $this->fault(); - // else successfully parsed request into soapval object - } - else - { - // get eval_str - $this->debug("calling parser->get_response()"); - // evaluate it, getting back a soapval object - if(!$request_val = $parser->get_response()) + // $response is a soap_msg object + $response = $this->parse_request($data); + $this->debug("parsed request and got an object of this class '".get_class($response)."'"); + $this->debug("server sending..."); + // pass along the debug string + if($this->debug_flag) { - return $this->fault(); + $response->debug($this->debug_str); } - // parser debug - $this->debug($parser->debug_str); - if(get_class($request_val) == "soapval") + $payload = $response->serialize(); + // print headers + if($this->fault) { - if (is_object($obj)) + $header[] = "HTTP/1.0 500 Internal Server Error\r\n"; + } + else + { + $header[] = "HTTP/1.0 200 OK\r\n"; + $header[] = "Status: 200\r\n"; + } + $header[] = "Server: SOAPx4 Server v0.344359s\r\n"; + $header[] = "Connection: Close\r\n"; + $header[] = "Content-Type: text/xml; charset=$this->xml_encoding\r\n"; + $header[] = "Content-Length: ".strlen($payload)."\r\n\r\n"; + @reset($header); + while(list($null,$hdr) = @each($header)) + /* foreach($header as $hdr) */ + { + header($hdr); + } + print $payload; + } + + function parse_request($data='') + { + global $HTTP_SERVER_VARS; + + $this->debug('entering parse_request() on '.date('H:i Y-m-d')); + $request_uri = $HTTP_SERVER_VARS['REQUEST_URI']; + $this->debug("request uri: $request_uri"); + // get headers + if(function_exists('getallheaders')) + { + $this->headers = getallheaders(); + while(list($k,$v) = @each($this->headers)) + /* foreach($this->headers as $k=>$v) */ { - /* Add the function to the server map */ - $in = "array('" . implode("','",$obj->soap_functions[$method]['in']) . "')"; - $out = "array('" . implode("','",$obj->soap_functions[$method]['out']) . "')"; - $evalmap = "\$this->add_to_map(\$this->methodname,$in,$out);"; - eval($evalmap); + $dump .= "$k: $v\r\n"; } - /* verify that soapval objects in request match the methods signature */ - if($this->verify_method($request_val)) + // get SOAPAction header + if($this->headers['SOAPAction']) { - $this->debug("request data - name: $request_val->name, type: $request_val->type, value: $request_val->value"); - if($this->input_value) - { - /* decode the soapval object, and pass resulting values to the requested method */ - if(!$request_data = $request_val->decode()) - { - $this->make_fault("Server","Unable to decode response from soapval object into native php type."); - return $this->fault(); - } - $this->debug("request data: $request_data"); - } + $this->SOAPAction = str_replace('"','',$this->headers['SOAPAction']); + $this->service = $this->SOAPAction; + } + // get character encoding + if(ereg("=",$this->headers['Content-Type'])) + { + $this->xml_encoding = str_replace("\"","",substr(strstr($this->headers["Content-Type"],"="),1)); + } + elseif(ereg("^text/xml",$this->headers['Content-Type'])) + { + $this->xml_encoding = 'us-ascii'; + } + $this->debug("got encoding: $this->xml_encoding"); + } + $this->request = $dump."\r\n\r\n".$data; + // parse response, get soap parser obj + $parser = CreateObject('phpgwapi.soap_parser',$data); + // get/set methodname + $this->methodname = $parser->root_struct_name; + $this->debug("method name: $this->methodname"); + + // does method exist? + if(function_exists($this->methodname)) + { + $this->debug("method '$this->methodname' exists"); + } + else + { + /* phpgroupware customization - createobject based on methodname */ + list($app,$class,$method) = explode('.',$this->methodname); + $obj = CreateObject(sprintf('%s.%s',$app,$class)); + /* + // "method not found" fault here + $this->debug("method '$obj->method' not found!"); + $this->result = "fault: method not found"; + $this->make_fault("Server","method '$obj->method' not defined in service '$this->service'"); + return $this->fault(); + */ + } - /* if there are return values */ - if($this->return_type = $this->get_return_type()) + // if fault occurred during message parsing + if($parser->fault()) + { + // parser debug + $this->debug($parser->debug_str); + $this->result = 'fault: error in msg parsing or eval'; + $this->make_fault("Server","error in msg parsing or eval:\n".$parser->get_response()); + // return soapresp + return $this->fault(); + // else successfully parsed request into soapval object + } + else + { + // get eval_str + $this->debug('calling parser->get_response()'); + // evaluate it, getting back a soapval object + if(!$request_val = $parser->get_response()) + { + return $this->fault(); + } + // parser debug + $this->debug($parser->debug_str); + if(get_class($request_val) == 'soapval') + { + if (is_object($obj)) { - $this->debug("got return type: '$this->return_type'"); - /* if there are parameters to pass */ - if($request_data) + /* Add the function to the server map */ + $in = "array('" . implode("','",$obj->soap_functions[$method]['in']) . "')"; + $out = "array('" . implode("','",$obj->soap_functions[$method]['out']) . "')"; + $evalmap = "\$this->add_to_map(\$this->methodname,$in,$out);"; + eval($evalmap); + } + /* verify that soapval objects in request match the methods signature */ + if($this->verify_method($request_val)) + { + $this->debug("request data - name: $request_val->name, type: $request_val->type, value: $request_val->value"); + if($this->input_value) { - if (is_object($obj)) + /* decode the soapval object, and pass resulting values to the requested method */ + if(!$request_data = $request_val->decode()) { - $code = "\$method_response = call_user_method(\$method,\$obj,"; - $this->debug("about to call method '$class -> $method'"); + $this->make_fault("Server","Unable to decode response from soapval object into native php type."); + return $this->fault(); } - else - { - $code = "\$method_response = call_user_func(\$this->methodname,"; - $this->debug("about to call method '$this->methodname'"); - } - /* call method with parameters */ - $this->debug("about to call method '$class -> $method'"); - while(list($x,$y) = each($request_data)) - { - $code .= "\$request_data[$x]" . ','; - } - $code = substr($code,0,-1) .");"; - if(eval($code)) + $this->debug("request data: $request_data"); + } + + /* if there are return values */ + if($this->return_type = $this->get_return_type()) + { + $this->debug("got return type: '$this->return_type'"); + /* if there are parameters to pass */ + if($request_data) { if (is_object($obj)) { - $this->make_fault("Server","Method call failed for '$obj->method' with params: ".join(",",$request_data)); + $code = "\$method_response = call_user_method(\$method,\$obj,"; + $this->debug("about to call method '$class -> $method'"); } else { - $this->make_fault("Server","Method call failed for '$this->methodname' with params: ".join(",",$request_data)); + $code = "\$method_response = call_user_func(\$this->methodname,"; + $this->debug("about to call method '$this->methodname'"); } - return $this->fault(); - } - } - else - { - /* call method w/ no parameters */ - if (is_object($obj)) - { - $this->debug("about to call method '$obj->method'"); - if(!$method_response = call_user_method($method,$obj)) + /* call method with parameters */ + $this->debug("about to call method '$class -> $method'"); + while(list($x,$y) = each($request_data)) { - $this->make_fault("Server","Method call failed for '$obj->method' with no params"); + $code .= "\$request_data[$x]" . ','; + } + $code = substr($code,0,-1) .');'; + if(eval($code)) + { + if (is_object($obj)) + { + $this->make_fault("Server","Method call failed for '$obj->method' with params: ".join(",",$request_data)); + } + else + { + $this->make_fault("Server","Method call failed for '$this->methodname' with params: ".join(",",$request_data)); + } return $this->fault(); } } else { - $this->debug("about to call method '$this->methodname'"); - if(!$method_response = call_user_func($this->methodname)) + /* call method w/ no parameters */ + if (is_object($obj)) { - $this->make_fault("Server","Method call failed for '$this->methodname' with no params"); - return $this->fault(); + $this->debug("about to call method '$obj->method'"); + if(!$method_response = call_user_method($method,$obj)) + { + $this->make_fault("Server","Method call failed for '$obj->method' with no params"); + return $this->fault(); + } + } + else + { + $this->debug("about to call method '$this->methodname'"); + if(!$method_response = call_user_func($this->methodname)) + { + $this->make_fault("Server","Method call failed for '$this->methodname' with no params"); + return $this->fault(); + } } } + /* no return values */ } - /* no return values */ - } - else - { - if($request_data) + else { - /* call method with parameters */ - $code = "\$method_response = call_user_method(\$method,\$obj,"; - while(list($x,$y) = each($request_data)) + if($request_data) { - $code .= "\$request_data[$x]" . ','; + /* call method with parameters */ + $code = "\$method_response = call_user_method(\$method,\$obj,"; + while(list($x,$y) = each($request_data)) + { + $code .= "\$request_data[$x]" . ','; + } + $code = substr($code,0,-1) .');'; + $this->debug("about to call method '$obj->method'"); + eval($code); } - $code = substr($code,0,-1) .");"; - $this->debug("about to call method '$obj->method'"); - eval($code); + else + { + /* call method w/ no parameters */ + $this->debug("about to call method '$obj->method'"); + call_user_method($method,$obj); + } + } + /* return fault */ + if(get_class($method_response) == 'soapmsg') + { + if(eregi('fault',$method_response->value->name)) + { + $this->fault = True; + } + $return_msg = $method_response; } else { - /* call method w/ no parameters */ - $this->debug("about to call method '$obj->method'"); - call_user_method($method,$obj); + /* return soapval object */ + + if(get_class($method_response) == 'soapval') + { + $return_val = $method_response; + /* create soap_val object w/ return values from method, use method signature to determine type */ + } + else + { + $return_val = CreateObject('phpgwapi.soapval',$method,$this->return_type,$method_response); + } + $this->debug($return_val->debug_str); + /* response object is a soap_msg object */ + $return_msg = CreateObject('phpgwapi.soapmsg',$method.'Response',array($return_val),$this->service); } - } - /* return fault */ - if(get_class($method_response) == "soapmsg") - { - if(eregi("fault",$method_response->value->name)) + if($this->debug_flag) { - $this->fault = True; + $return_msg->debug_flag = true; } - $return_msg = $method_response; + $this->result = 'successful'; + return $return_msg; } else { - /* return soapval object */ - - if(get_class($method_response) == "soapval") - { - $return_val = $method_response; - /* create soap_val object w/ return values from method, use method signature to determine type */ - } - else - { - $return_val = CreateObject('phpgwapi.soapval',$method,$this->return_type,$method_response); - } - $this->debug($return_val->debug_str); - /* response object is a soap_msg object */ - $return_msg = CreateObject('phpgwapi.soapmsg',$method."Response",array($return_val),$this->service); + // debug + $this->debug("ERROR: request not verified against method signature"); + $this->result = "fault: request failed validation against method signature"; + // return soapresp + return $this->fault(); } - if($this->debug_flag) - { - $return_msg->debug_flag = true; - } - $this->result = "successful"; - return $return_msg; } else { // debug - $this->debug("ERROR: request not verified against method signature"); - $this->result = "fault: request failed validation against method signature"; - // return soapresp + $this->debug("ERROR: parser did not return soapval object: $request_val ".get_class($request_val)); + $this->result = "fault: parser did not return soapval object: $request_val"; + // return fault + $this->make_fault('Server',"parser did not return soapval object: $request_val"); return $this->fault(); } } - else - { - // debug - $this->debug("ERROR: parser did not return soapval object: $request_val ".get_class($request_val)); - $this->result = "fault: parser did not return soapval object: $request_val"; - // return fault - $this->make_fault("Server","parser did not return soapval object: $request_val"); - return $this->fault(); - } } - } - function verify_method($request) - { - //return true; - $this->debug("entered verify_method() w/ request name: ".$request->name); - $params = $request->value; - // if there are input parameters required... - if($sig = $this->dispatch_map[$this->methodname]["in"]) + function verify_method($request) { - $this->input_value = count($sig); - if(is_array($params)) + //return true; + $this->debug('entered verify_method() w/ request name: '.$request->name); + $params = $request->value; + // if there are input parameters required... + if($sig = $this->dispatch_map[$this->methodname]["in"]) { - $this->debug("entered verify_method() with ".count($params)." parameters"); - @reset($params); - while(list($null,$v) = @each($params)) - /* foreach($params as $v) */ + $this->input_value = count($sig); + if(is_array($params)) { - $this->debug("param '$v->name' of type '$v->type'"); - } - // validate the number of parameters - if(count($params) == count($sig)) - { - $this->debug("got correct number of parameters: ".count($sig)); - // make array of param types + $this->debug('entered verify_method() with '.count($params).' parameters'); @reset($params); - while(list($null,$param) = @each($params)) - /* foreach($params as $param) */ + while(list($null,$v) = @each($params)) + /* foreach($params as $v) */ { - $p[] = strtolower($param->type); + $this->debug("param '$v->name' of type '$v->type'"); } - // validate each param's type - for($i=0; $i < count($p); $i++) + // validate the number of parameters + if(count($params) == count($sig)) { - // type not match - if(strtolower($sig[$i]) != strtolower($p[$i])) + $this->debug("got correct number of parameters: ".count($sig)); + // make array of param types + @reset($params); + while(list($null,$param) = @each($params)) + /* foreach($params as $param) */ { - $this->debug("mismatched parameter types: $sig[$i] != $p[$i]"); - $this->make_fault("Client","soap request contained mismatching parameters of name $v->name had type $p[$i], which did not match signature's type: $sig[$i]"); - return false; + $p[] = strtolower($param->type); } - $this->debug("parameter type match: $sig[$i] = $p[$i]"); + // validate each param's type + for($i=0; $i < count($p); $i++) + { + // type not match + if(strtolower($sig[$i]) != strtolower($p[$i])) + { + $this->debug("mismatched parameter types: $sig[$i] != $p[$i]"); + $this->make_fault('Client',"soap request contained mismatching parameters of name $v->name had type $p[$i], which did not match signature's type: $sig[$i]"); + return false; + } + $this->debug("parameter type match: $sig[$i] = $p[$i]"); + } + return true; + // oops, wrong number of paramss } - return true; - // oops, wrong number of paramss + else + { + $this->debug('oops, wrong number of parameter!'); + $this->make_fault('Client',"soap request contained incorrect number of parameters. method '$this->methodname' required ".count($sig)." and request provided ".count($params)); + return false; + } + // oops, no params... } else { - $this->debug("oops, wrong number of parameter!"); - $this->make_fault("Client","soap request contained incorrect number of parameters. method '$this->methodname' required ".count($sig)." and request provided ".count($params)); + $this->debug("oops, no parameters sent! Method '$this->methodname' requires ".count($sig)." input parameters!"); + $this->make_fault('Client',"soap request contained incorrect number of parameters. method '$this->methodname' requires ".count($sig)." parameters, and request provided none"); return false; } - // oops, no params... + // no params + } + elseif( (count($params)==0) && (count($sig) <= 1) ) + { + $this->input_values = 0; + return true; } else { - $this->debug("oops, no parameters sent! Method '$this->methodname' requires ".count($sig)." input parameters!"); - $this->make_fault("Client","soap request contained incorrect number of parameters. method '$this->methodname' requires ".count($sig)." parameters, and request provided none"); - return false; + //$this->debug("well, request passed parameters to a method that requires none?"); + //$this->make_fault("Client","method '$this->methodname' requires no parameters. The request passed in ".count($params).": ".@implode(" param: ",$params) ); + return true; } - // no params } - elseif( (count($params)==0) && (count($sig) <= 1) ) + + // get string return type from dispatch map + function get_return_type() { - $this->input_values = 0; - return true; + if(count($this->dispatch_map[$this->methodname]['out']) >= 1) + { + $type = array_shift($this->dispatch_map[$this->methodname]['out']); + $this->debug("got return type from dispatch map: '$type'"); + return $type; + } + return false; } - else + + // dbg + function debug($string) { - //$this->debug("well, request passed parameters to a method that requires none?"); - //$this->make_fault("Client","method '$this->methodname' requires no parameters. The request passed in ".count($params).": ".@implode(" param: ",$params) ); - return true; + if($this->debug_flag) + { + $this->debug_str .= "$string\n"; + } } - } - // get string return type from dispatch map - function get_return_type() - { - if(count($this->dispatch_map[$this->methodname]["out"]) >= 1) + // add a method to the dispatch map + function add_to_map($methodname,$in,$out) { - $type = array_shift($this->dispatch_map[$this->methodname]["out"]); - $this->debug("got return type from dispatch map: '$type'"); - return $type; + $this->dispatch_map[$methodname]['in'] = $in; + $this->dispatch_map[$methodname]['out'] = $out; } - return false; - } - // dbg - function debug($string) - { - if($this->debug_flag) + // set up a fault + function fault() { - $this->debug_str .= "$string\n"; + return CreateObject('phpgwapi.soapmsg', + 'Fault', + array( + 'faultcode' => $this->fault_code, + 'faultstring' => $this->fault_str, + 'faultactor' => $this->fault_actor, + 'faultdetail' => $this->fault_detail.$this->debug_str + ), + 'http://schemas.xmlsoap.org/soap/envelope/' + ); + } + + function make_fault($fault_code,$fault_string) + { + $this->fault_code = $fault_code; + $this->fault_str = $fault_string; + $this->fault = true; } } - - // add a method to the dispatch map - function add_to_map($methodname,$in,$out) - { - $this->dispatch_map[$methodname]["in"] = $in; - $this->dispatch_map[$methodname]["out"] = $out; - } - - // set up a fault - function fault() - { - return CreateObject('phpgwapi.soapmsg', - "Fault", - array( - "faultcode" => $this->fault_code, - "faultstring" => $this->fault_str, - "faultactor" => $this->fault_actor, - "faultdetail" => $this->fault_detail.$this->debug_str - ), - "http://schemas.xmlsoap.org/soap/envelope/" - ); - } - - function make_fault($fault_code,$fault_string) - { - $this->fault_code = $fault_code; - $this->fault_str = $fault_string; - $this->fault = true; - } -} ?> diff --git a/phpgwapi/inc/class.soapclient.inc.php b/phpgwapi/inc/class.soapclient.inc.php index dfd156894a..c07fddeeb3 100644 --- a/phpgwapi/inc/class.soapclient.inc.php +++ b/phpgwapi/inc/class.soapclient.inc.php @@ -1,153 +1,153 @@ call( string methodname [ ,array parameters] ); + // call method, get results + echo $soapclient->call( string methodname [ ,array parameters] ); -// bye bye client -unset($soapclient); + // bye bye client + unset($soapclient); */ + /* $Id$ */ -class soapclient -{ - function soapclient($endpoint,$wsdl=False,$portName=False) + class soapclient { - $this->debug_flag = True; - $this->endpoint = $endpoint; - $this->portName = False; - - // make values - if($wsdl) + function soapclient($endpoint,$wsdl=False,$portName=False) { - $this->endpointType = 'wsdl'; - if($portName) - { - $this->portName = $portName; - } - } - } + $this->debug_flag = True; + $this->endpoint = $endpoint; + $this->portName = False; - function call($method,$params='',$namespace=false,$soapAction=false) - { - if($this->endpointType == 'wsdl') - { - // instantiate wsdl class - $this->wsdl = CreateObject('phpgwapi.wsdl',$this->endpoint); - // get portName - if(!$this->portName) + // make values + if($wsdl) { - $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:
server: $soap_client->server
path: $soap_client->path
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") + $this->endpointType = 'wsdl'; + if($portName) { - // fault? - if(eregi("fault",$return->name)) + $this->portName = $portName; + } + } + } + + function call($method,$params='',$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:
server: $soap_client->server
path: $soap_client->path
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') { - $this->debug("got fault"); - $faultArray = $return->decode(); - @reset($faultArray); - while(list($k,$v) = @each($faultArray)) - /* foreach($faultArray as $k => $v) */ + // fault? + if(eregi('fault',$return->name)) { - print "$k = $v
"; - } - return false; - } - else - { - $returnArray = $return->decode(); - if(is_array($returnArray)) - { - return array_shift($returnArray); + $this->debug('got fault'); + $faultArray = $return->decode(); + @reset($faultArray); + while(list($k,$v) = @each($faultArray)) + /* foreach($faultArray as $k => $v) */ + { + print "$k = $v
"; + } + return false; } else { - $this->debug("didn't get array back from decode() for $return->name"); - return false; + $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("didn't get soapval object back from client"); + $this->debug('client send/recieve error'); return false; } } - else + } + + function debug($string) + { + if($this->debug_flag) { - $this->debug("client send/recieve error"); - return false; + print $string . '
'; } } } - - function debug($string) - { - if($this->debug_flag) - { - print $string."
"; - } - } -} ?> diff --git a/phpgwapi/inc/class.soapmsg.inc.php b/phpgwapi/inc/class.soapmsg.inc.php index 52af8f1c29..570ac59099 100644 --- a/phpgwapi/inc/class.soapmsg.inc.php +++ b/phpgwapi/inc/class.soapmsg.inc.php @@ -1,149 +1,151 @@ value = CreateObject('phpgwapi.soapval',$method,"struct",$params,$method_namespace); - if(is_array($new_namespaces)) + // params is an array of soapval objects + function soapmsg($method,$params,$method_namespace='http://testuri.org',$new_namespaces=False) + { + // globalize method namespace + global $methodNamespace; + $methodNamespace = $method_namespace; + // make method struct + $this->value = CreateObject('phpgwapi.soapval',$method,"struct",$params,$method_namespace); + if(is_array($new_namespaces)) + { + global $namespaces; + $i = count($namespaces); + @reset($new_namespaces); + while(list($null,$v) = @each($new_namespaces)) + /* foreach($new_namespaces as $v) */ + { + $namespaces[$v] = 'ns' . $i++; + } + $this->namespaces = $namespaces; + } + $this->payload = ''; + $this->debug_flag = True; + $this->debug_str = "entering soapmsg() with soapval ".$this->value->name."\n"; + } + + function make_envelope($payload) { global $namespaces; - $i = count($namespaces); - @reset($new_namespaces); - while(list($null,$v) = @each($new_namespaces)) - /* foreach($new_namespaces as $v) */ + @reset($namespaces); + while(list($k,$v) = @each($namespaces)) + /* foreach($namespaces as $k => $v) */ { - $namespaces[$v] = "ns".$i++; + $ns_string .= " xmlns:$v=\"$k\""; } - $this->namespaces = $namespaces; + return "\n" + . $payload . "\n"; } - $this->payload = ''; - $this->debug_flag = True; - $this->debug_str = "entering soapmsg() with soapval ".$this->value->name."\n"; - } - function make_envelope($payload) - { - global $namespaces; - @reset($namespaces); - while(list($k,$v) = @each($namespaces)) - /* foreach($namespaces as $k => $v) */ + function make_body($payload) { - $ns_string .= " xmlns:$v=\"$k\""; + return "\n" . $payload . "\n"; } - return "\n" - . $payload . "\n"; - } - function make_body($payload) - { - return "\n" . $payload . "\n"; - } - - function createPayload() - { - $value = $this->value; - $payload = $this->make_envelope($this->make_body($value->serialize())); - $this->debug($value->debug_str); - $payload = "\n".$payload; - if($this->debug_flag) + function createPayload() { - $payload .= $this->serializeDebug(); + $value = $this->value; + $payload = $this->make_envelope($this->make_body($value->serialize())); + $this->debug($value->debug_str); + $payload = "\n".$payload; + if($this->debug_flag) + { + $payload .= $this->serializeDebug(); + } + $this->payload = str_replace("\n","\r\n", $payload); } - $this->payload = str_replace("\n","\r\n", $payload); - } - function serialize() - { - if($this->payload == '') + function serialize() { - $this->createPayload(); - return $this->payload; + if($this->payload == '') + { + $this->createPayload(); + return $this->payload; + } + else + { + return $this->payload; + } } - else + + // returns a soapval object + function parseResponse($data) { - return $this->payload; + $this->debug("Entering parseResponse()"); + //$this->debug(" w/ data $data"); + // strip headers here + //$clean_data = ereg_replace("\r\n","\n", $data); + if(ereg("^.*\r\n\r\n<",$data)) + { + $this->debug("found proper seperation of headers and document"); + $this->debug("getting rid of headers, stringlen: ".strlen($data)); + $clean_data = ereg_replace("^.*\r\n\r\n<","<", $data); + $this->debug("cleaned data, stringlen: ".strlen($clean_data)); + } + else + { + // return fault + return CreateObject('phpgwapi.soapval', + 'fault', + 'SOAPStruct', + Array( + CreateObject('phpgwapi.soapval','faultcode','string','SOAP-MSG'), + CreateObject('phpgwapi.soapval','faultstring','string','HTTP Error'), + CreateObject('phpgwapi.soapval','faultdetail','string','HTTP headers were not immediately followed by \'\r\n\r\n\'') + ) + ); + } + /* + // if response is a proper http response, and is not a 200 + if(ereg("^HTTP",$clean_data) && !ereg("200$", $clean_data)) + { + // get error data + $errstr = substr($clean_data, 0, strpos($clean_data, "\n")-1); + // return fault + return CreateObject('phpgwapi.soapval', + "fault", + "SOAPStruct", + array( + CreateObject('phpgwapi.soapval',"faultcode","string","SOAP-MSG"), + CreateObject('phpgwapi.soapval',"faultstring","string","HTTP error") + ) + ); + } + */ + $this->debug("about to create parser instance w/ data: $clean_data"); + // parse response + $response = CreateObject('phpgwapi.soap_parser',$clean_data); + // return array of parameters + $ret = $response->get_response(); + $this->debug($response->debug_str); + return $ret; + } + + // dbg + function debug($string) + { + if($this->debug_flag) + { + $this->debug_str .= "$string\n"; + } + } + + // preps debug data for encoding into soapmsg + function serializeDebug() + { + if($this->debug_flag) + { + return "\n"; + } + else + { + return ''; + } } } - - // returns a soapval object - function parseResponse($data) - { - $this->debug("Entering parseResponse()"); - //$this->debug(" w/ data $data"); - // strip headers here - //$clean_data = ereg_replace("\r\n","\n", $data); - if(ereg("^.*\r\n\r\n<",$data)) - { - $this->debug("found proper seperation of headers and document"); - $this->debug("getting rid of headers, stringlen: ".strlen($data)); - $clean_data = ereg_replace("^.*\r\n\r\n<","<", $data); - $this->debug("cleaned data, stringlen: ".strlen($clean_data)); - } - else - { - // return fault - return CreateObject('phpgwapi.soapval', - 'fault', - 'SOAPStruct', - Array( - CreateObject('phpgwapi.soapval','faultcode','string','SOAP-MSG'), - CreateObject('phpgwapi.soapval','faultstring','string','HTTP Error'), - CreateObject('phpgwapi.soapval','faultdetail','string','HTTP headers were not immediately followed by \'\r\n\r\n\'') - ) - ); - } -/* - // if response is a proper http response, and is not a 200 - if(ereg("^HTTP",$clean_data) && !ereg("200$", $clean_data)) - { - // get error data - $errstr = substr($clean_data, 0, strpos($clean_data, "\n")-1); - // return fault - return CreateObject('phpgwapi.soapval', - "fault", - "SOAPStruct", - array( - CreateObject('phpgwapi.soapval',"faultcode","string","SOAP-MSG"), - CreateObject('phpgwapi.soapval',"faultstring","string","HTTP error") - ) - ); - } -*/ - $this->debug("about to create parser instance w/ data: $clean_data"); - // parse response - $response = CreateObject('phpgwapi.soap_parser',$clean_data); - // return array of parameters - $ret = $response->get_response(); - $this->debug($response->debug_str); - return $ret; - } - - // dbg - function debug($string) - { - if($this->debug_flag) - { - $this->debug_str .= "$string\n"; - } - } - - // preps debug data for encoding into soapmsg - function serializeDebug() - { - if($this->debug_flag) - { - return "\n"; - } - else - { - return ''; - } - } -} ?> diff --git a/phpgwapi/inc/class.soapval.inc.php b/phpgwapi/inc/class.soapval.inc.php index dbf0442aec..645b8bd7c6 100644 --- a/phpgwapi/inc/class.soapval.inc.php +++ b/phpgwapi/inc/class.soapval.inc.php @@ -1,436 +1,438 @@ = 1) + global $soapTypes, $typemap, $namespaces, $methodNamespace; + + // detect type if not passed + if(!$type) { - if(ereg("[a-zA-Z0-9\-]*",key($v))) + if(is_array($value) && count($value) >= 1) { - $type = "struct"; - } - else - { - $type = "array"; - } - } - elseif(is_int($v)) - { - $type = "int"; - } - elseif(is_float($v) || $v == "NaN" || $v == "INF") - { - $type = "float"; - } - else - { - $type = gettype($value); - } - } - // php type name mangle - if($type == "integer") - { - $type = "int"; - } - - $this->soapTypes = $soapTypes; - $this->name = $name; - $this->value = ""; - $this->type = $type; - $this->type_code = 0; - $this->type_prefix = false; - $this->array_type = ""; - $this->debug_flag = True; - $this->debug_str = ""; - $this->debug("Entering soapval - name: '$name' type: '$type'"); - - if($namespace) - { - $this->namespace = $namespace; - if(!isset($namespaces[$namespace])) - { - $namespaces[$namespace] = "ns".(count($namespaces)+1); - } - $this->prefix = $namespaces[$namespace]; - } - - // get type prefix - if(ereg(":",$type)) - { - $this->type = substr(strrchr($type,":"),1,strlen(strrchr($type,":"))); - $this->type_prefix = substr($type,0,strpos($type,":")); - } - elseif($type_namespace) - { - if(!isset($namespaces[$type_namespace])) - { - $namespaces[$type_namespace] = "ns".(count($namespaces)+1); - } - $this->type_prefix = $namespaces[$type_namespace]; - } - - // if type namespace was not explicitly passed, and we're not in a method struct: - elseif(!$this->type_prefix && !isset($this->namespace)) - { - // try to get type prefix from typeMap - if(!$this->type_prefix = $this->verify_type($type)) - { - // else default to method namespace - $this->type_prefix = $namespaces[$methodNamespace]; - } - } - - // if scalar - if($this->soapTypes[$this->type] == 1) - { - $this->type_code = 1; - $this->addScalar($value,$this->type,$name); - // if array - } - elseif($this->soapTypes[$this->type] == 2) - { - $this->type_code = 2; - $this->addArray($value); - // if struct - } - elseif($this->soapTypes[$this->type] == 3) - { - $this->type_code = 3; - $this->addStruct($value); - } - else - { - //if($namespace == $methodNamespace){ - $this->type_code = 3; - $this->addStruct($value); - //} - } - } - - function addScalar($value, $type, $name="") - { - $this->debug("adding scalar '$name' of type '$type'"); - - // if boolean, change value to 1 or 0 - if ($type == "boolean") - { - if((strcasecmp($value,"true") == 0) || ($value == 1)) - { - $value = 1; - } - else - { - $value = 0; - } - } - - $this->value = $value; - return true; - } - - function addArray($vals) - { - $this->debug("adding array '$this->name' with ".count($vals)." vals"); - $this->value = array(); - if(is_array($vals) && count($vals) >= 1) - { - @reset($vals); - while(list($k,$v) = @each($vals)) - /* foreach($vals as $k => $v) */ - { - $this->debug("checking value $k : $v"); - // if soapval, add.. - if(get_class($v) == "soapval") - { - $this->value[] = $v; - $this->debug($v->debug_str); - // else make obj and serialize - } - else - { - if(is_array($v)) + if(ereg("[a-zA-Z0-9\-]*",key($v))) { - if(ereg("[a-zA-Z\-]*",key($v))) - { - $type = "struct"; - } - else - { - $type = "array"; - } - } - elseif(!ereg("^[0-9]*$",$k) && in_array($k,array_keys($this->soapTypes))) - { - $type = $k; - } - elseif(is_int($v)) - { - $type = "int"; - } - elseif(is_float($v) || $v == "NaN" || $v == "INF") - { - $type = "float"; + $type = 'struct'; } else { - $type = gettype($v); + $type = 'array'; } - $new_val = CreateObject('phpgwapi.soapval',"item",$type,$v); - $this->debug($new_val->debug_str); - $this->value[] = $new_val; } - } - } - return true; - } - - function addStruct($vals) - { - $this->debug("adding struct '$this->name' with ".count($vals)." vals"); - if(is_array($vals) && count($vals) >= 1) - { - @reset($vals); - while(list($k,$v) = @each($vals)) - /* foreach($vals as $k => $v) */ - { - // if serialize, if soapval - if(get_class($v) == "soapval") + elseif(is_int($v)) { - $this->value[] = $v; - $this->debug($v->debug_str); - // else make obj and serialize + $type = 'int'; + } + elseif(is_float($v) || $v == 'NaN' || $v == 'INF') + { + $type = 'float'; } else { - if(is_array($v)) + $type = gettype($value); + } + } + // php type name mangle + if($type == 'integer') + { + $type = 'int'; + } + + $this->soapTypes = $soapTypes; + $this->name = $name; + $this->value = ''; + $this->type = $type; + $this->type_code = 0; + $this->type_prefix = false; + $this->array_type = ''; + $this->debug_flag = True; + $this->debug_str = ''; + $this->debug("Entering soapval - name: '$name' type: '$type'"); + + if($namespace) + { + $this->namespace = $namespace; + if(!isset($namespaces[$namespace])) + { + $namespaces[$namespace] = "ns".(count($namespaces)+1); + } + $this->prefix = $namespaces[$namespace]; + } + + // get type prefix + if(ereg(":",$type)) + { + $this->type = substr(strrchr($type,':'),1,strlen(strrchr($type,':'))); + $this->type_prefix = substr($type,0,strpos($type,':')); + } + elseif($type_namespace) + { + if(!isset($namespaces[$type_namespace])) + { + $namespaces[$type_namespace] = 'ns'.(count($namespaces)+1); + } + $this->type_prefix = $namespaces[$type_namespace]; + } + + // if type namespace was not explicitly passed, and we're not in a method struct: + elseif(!$this->type_prefix && !isset($this->namespace)) + { + // try to get type prefix from typeMap + if(!$this->type_prefix = $this->verify_type($type)) + { + // else default to method namespace + $this->type_prefix = $namespaces[$methodNamespace]; + } + } + + // if scalar + if($this->soapTypes[$this->type] == 1) + { + $this->type_code = 1; + $this->addScalar($value,$this->type,$name); + // if array + } + elseif($this->soapTypes[$this->type] == 2) + { + $this->type_code = 2; + $this->addArray($value); + // if struct + } + elseif($this->soapTypes[$this->type] == 3) + { + $this->type_code = 3; + $this->addStruct($value); + } + else + { + //if($namespace == $methodNamespace){ + $this->type_code = 3; + $this->addStruct($value); + //} + } + } + + function addScalar($value, $type, $name="") + { + $this->debug("adding scalar '$name' of type '$type'"); + + // if boolean, change value to 1 or 0 + if ($type == "boolean") + { + if((strcasecmp($value,"true") == 0) || ($value == 1)) + { + $value = 1; + } + else + { + $value = 0; + } + } + + $this->value = $value; + return true; + } + + function addArray($vals) + { + $this->debug("adding array '$this->name' with ".count($vals)." vals"); + $this->value = array(); + if(is_array($vals) && count($vals) >= 1) + { + @reset($vals); + while(list($k,$v) = @each($vals)) + /* foreach($vals as $k => $v) */ + { + $this->debug("checking value $k : $v"); + // if soapval, add.. + if(get_class($v) == 'soapval') { - @reset($v); - while(list($a,$b) = @each($v)) - /* foreach($v as $a => $b) */ + $this->value[] = $v; + $this->debug($v->debug_str); + // else make obj and serialize + } + else + { + if(is_array($v)) { - if($a == "0") + if(ereg("[a-zA-Z\-]*",key($v))) { - $type = "array"; + $type = 'struct'; } else { - $type = "struct"; + $type = 'array'; } - break; } + elseif(!ereg("^[0-9]*$",$k) && in_array($k,array_keys($this->soapTypes))) + { + $type = $k; + } + elseif(is_int($v)) + { + $type = 'int'; + } + elseif(is_float($v) || $v == 'NaN' || $v == 'INF') + { + $type = 'float'; + } + else + { + $type = gettype($v); + } + $new_val = CreateObject('phpgwapi.soapval','item',$type,$v); + $this->debug($new_val->debug_str); + $this->value[] = $new_val; } -// elseif(is_array($k) && in_array($k,array_keys($this->soapTypes))) - elseif(is_array($k,in_array($k,array_keys($this->soapTypes)))) + } + } + return true; + } + + function addStruct($vals) + { + $this->debug("adding struct '$this->name' with ".count($vals).' vals'); + if(is_array($vals) && count($vals) >= 1) + { + @reset($vals); + while(list($k,$v) = @each($vals)) + /* foreach($vals as $k => $v) */ + { + // if serialize, if soapval + if(get_class($v) == 'soapval') { - $this->debug("got type '$type' for value '$v' from soapTypes array!"); - $type = $k; - } - elseif(is_int($v)) - { - $type = "int"; - } - elseif(is_float($v) || $v == "NaN" || $v == "INF") - { - $type = "float"; + $this->value[] = $v; + $this->debug($v->debug_str); + // else make obj and serialize } else { - $type = gettype($v); - $this->debug("got type '$type' for value '$v' from php gettype()!"); + if(is_array($v)) + { + @reset($v); + while(list($a,$b) = @each($v)) + /* foreach($v as $a => $b) */ + { + if($a == "0") + { + $type = 'array'; + } + else + { + $type = 'struct'; + } + break; + } + } +// elseif(is_array($k) && in_array($k,array_keys($this->soapTypes))) + elseif(is_array($k,in_array($k,array_keys($this->soapTypes)))) + { + $this->debug("got type '$type' for value '$v' from soapTypes array!"); + $type = $k; + } + elseif(is_int($v)) + { + $type = 'int'; + } + elseif(is_float($v) || $v == "NaN" || $v == "INF") + { + $type = 'float'; + } + else + { + $type = gettype($v); + $this->debug("got type '$type' for value '$v' from php gettype()!"); + } + $new_val = CreateObject('phpgwapi.soapval',$k,$type,$v); + $this->debug($new_val->debug_str); + $this->value[] = $new_val; } - $new_val = CreateObject('phpgwapi.soapval',$k,$type,$v); - $this->debug($new_val->debug_str); - $this->value[] = $new_val; } } + else + { + $this->value = array(); + } + return true; } - else - { - $this->value = array(); - } - return true; - } - // turn soapvals into xml, woohoo! - function serializeval($soapval=false) - { - if(!$soapval) + // turn soapvals into xml, woohoo! + function serializeval($soapval=false) { - $soapval = $this; + if(!$soapval) + { + $soapval = $this; + } + $this->debug("serializing '$soapval->name' of type '$soapval->type'"); + if($soapval->name == '') + { + $soapval->name = 'return'; + } + + switch($soapval->type_code) + { + case 3: + // struct + $this->debug('got a struct'); + if($soapval->prefix && $soapval->type_prefix) + { + $xml .= "<$soapval->prefix:$soapval->name xsi:type=\"$soapval->type_prefix:$soapval->type\">\n"; + } + elseif($soapval->type_prefix) + { + $xml .= "<$soapval->name xsi:type=\"$soapval->type_prefix:$soapval->type\">\n"; + } + elseif($soapval->prefix) + { + $xml .= "<$soapval->prefix:$soapval->name>\n"; + } + else + { + $xml .= "<$soapval->name>\n"; + } + if(is_array($soapval->value)) + { + @reset($soapval->value); + while(list($k,$v) = @each($soapval->value)) + /* foreach($soapval->value as $k => $v) */ + { + $xml .= $this->serializeval($v); + } + } + if($soapval->prefix) + { + $xml .= "prefix:$soapval->name>\n"; + } + else + { + $xml .= "name>\n"; + } + break; + case 2: + // array + @reset($soapval->value); + while(list($null,$array_val) = @each($soapval->value)) + /* foreach($soapval->value as $array_val) */ + { + $array_types[$array_val->type] = 1; + $xml .= $this->serializeval($array_val); + } + if(count($array_types) > 1) + { + $array_type = 'xsd:ur-type'; + } + elseif(count($array_types) >= 1) + { + $array_type = $array_val->type_prefix.":".$array_val->type; + } + + $xml = "<$soapval->name xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_type."[".sizeof($soapval->value)."]\">\n".$xml."name>\n"; + break; + case 1: + $xml .= "<$soapval->name xsi:type=\"$soapval->type_prefix:$soapval->type\">$soapval->valuename>\n"; + break; + default: + break; + } + return $xml; } - $this->debug("serializing '$soapval->name' of type '$soapval->type'"); - if($soapval->name == "") + + // serialize + function serialize() { - $soapval->name = "return"; + return $this->serializeval($this); } - - switch($soapval->type_code) + + function decode($soapval=false) { - case 3: - // struct - $this->debug("got a struct"); - if($soapval->prefix && $soapval->type_prefix) - { - $xml .= "<$soapval->prefix:$soapval->name xsi:type=\"$soapval->type_prefix:$soapval->type\">\n"; - } - elseif($soapval->type_prefix) - { - $xml .= "<$soapval->name xsi:type=\"$soapval->type_prefix:$soapval->type\">\n"; - } - elseif($soapval->prefix) - { - $xml .= "<$soapval->prefix:$soapval->name>\n"; - } - else - { - $xml .= "<$soapval->name>\n"; - } + if(!$soapval) + { + $soapval = $this; + } + // scalar decode + if($soapval->type_code == 1) + { + return $soapval->value; + // array decode + } + elseif($soapval->type_code == 2) + { if(is_array($soapval->value)) { @reset($soapval->value); - while(list($k,$v) = @each($soapval->value)) - /* foreach($soapval->value as $k => $v) */ + while(list($null,$item) = @each($soapval->value)) + /* foreach($soapval->value as $item) */ { - $xml .= $this->serializeval($v); + $return[] = $this->decode($item); } - } - if($soapval->prefix) - { - $xml .= "prefix:$soapval->name>\n"; + return $return; } else { - $xml .= "name>\n"; + return array(); } - break; - case 2: - // array - @reset($soapval->value); - while(list($null,$array_val) = @each($soapval->value)) - /* foreach($soapval->value as $array_val) */ - { - $array_types[$array_val->type] = 1; - $xml .= $this->serializeval($array_val); - } - if(count($array_types) > 1) - { - $array_type = "xsd:ur-type"; - } - elseif(count($array_types) >= 1) - { - $array_type = $array_val->type_prefix.":".$array_val->type; - } - - $xml = "<$soapval->name xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_type."[".sizeof($soapval->value)."]\">\n".$xml."name>\n"; - break; - case 1: - $xml .= "<$soapval->name xsi:type=\"$soapval->type_prefix:$soapval->type\">$soapval->valuename>\n"; - break; - default: - break; - } - return $xml; - } - - // serialize - function serialize() - { - return $this->serializeval($this); - } - - function decode($soapval=false) - { - if(!$soapval) - { - $soapval = $this; - } - // scalar decode - if($soapval->type_code == 1) - { - return $soapval->value; - // array decode - } - elseif($soapval->type_code == 2) - { - if(is_array($soapval->value)) - { - @reset($soapval->value); - while(list($null,$item) = @each($soapval->value)) - /* foreach($soapval->value as $item) */ - { - $return[] = $this->decode($item); - } - return $return; + // struct decode } - else + elseif($soapval->type_code == 3) { - return array(); - } - // struct decode - } - elseif($soapval->type_code == 3) - { - if(is_array($soapval->value)) - { - @reset($soapval->value); - while(list($null,$item) = @each($soapval->value)) - /* foreach($soapval->value as $item) */ + if(is_array($soapval->value)) { - $return[$item->name] = $this->decode($item); + @reset($soapval->value); + while(list($null,$item) = @each($soapval->value)) + /* foreach($soapval->value as $item) */ + { + $return[$item->name] = $this->decode($item); + } + return $return; } - return $return; - } - else - { - return array(); - } - } - } - - // verify type - function verify_type($type) - { - if ($type) - { -// global $namespaces,$soapTypes,$typemap; - global $namespaces,$typemap; - - @reset($typemap); - while(list($namespace,$types) = @each($typemap)) - /* foreach($typemap as $namespace => $types) */ - { - if(in_array($type,$types)) + else { - return $namespaces[$namespace]; + return array(); } } } - return false; - } - // alias for verify_type() - pass it a type, and it returns it's prefix - function get_prefix($type) - { - if($prefix = $this->verify_type($type)) + // verify type + function verify_type($type) { - return $prefix; + if ($type) + { +// global $namespaces,$soapTypes,$typemap; + global $namespaces,$typemap; + + @reset($typemap); + while(list($namespace,$types) = @each($typemap)) + /* foreach($typemap as $namespace => $types) */ + { + if(in_array($type,$types)) + { + return $namespaces[$namespace]; + } + } + } + return false; } - return false; - } - - function debug($string) - { - if($this->debug_flag) + + // alias for verify_type() - pass it a type, and it returns it's prefix + function get_prefix($type) { - $this->debug_str .= "$string\n"; + if($prefix = $this->verify_type($type)) + { + return $prefix; + } + return false; + } + + function debug($string) + { + if($this->debug_flag) + { + $this->debug_str .= "$string\n"; + } } } -} ?>