/** * Generate the payload */ function wsf_wsdl_create_response_payload($return_val, $sig_node, $mtom_on, &$attachment_map, $classmap) { require_once 'wsf_wsdl_consts.php'; require_once 'wsf_wsdl_util.php'; require_once 'wsf_wsdl_serialization.php'; $is_doc = TRUE; $is_wrapper = FALSE; // starting prefix index of the xml to be built $prefix_i = 2; $res_payload_dom = new DOMDocument('1.0', 'iso-8859-1'); foreach ($sig_node->childNodes as $signature_child_node) { if ($signature_child_node->localName == WSF_RETURNS) { $returns_node = $signature_child_node; break; } } if (!$returns_node) { error_log("Returns node not found", 0); return NULL; } if ($returns_node->hasAttributes()) { $ele_name = NULL; $ele_ns = NULL; if ($returns_node->attributes->getNamedItem(WSF_WRAPPER_ELEMENT)) { $ele_name = $returns_node->attributes->getNamedItem(WSF_WRAPPER_ELEMENT)->value; } if ($returns_node->attributes->getNamedItem(WSF_WRAPPER_ELEMENT_NS)) { $ele_ns = $returns_node->attributes->getNamedItem(WSF_WRAPPER_ELEMENT_NS)->value; } $is_wrapper = TRUE; } else { /* No wrapper element in the request */ $ele_ns = NULL; $ele_name = NULL; /* check for the only param target-namespace */ $only_param = $returns_node->firstChild; $sig_attrs = $only_param->attributes; if ($sig_attrs->getNamedItem(WSF_TARGETNAMESPACE)) { $ele_ns = $sig_attrs->getNamedItem(WSF_TARGETNAMESPACE)->value; } if ($sig_attrs->getNamedItem(WSF_NAME)) { $ele_name = $sig_attrs->getNamedItem(WSF_NAME)->value; } } $arguments = $return_val; /* no wrapper elements most probably getter functions */ if ($returns_node == NULL) { return NULL; } if ($is_doc == TRUE) { $payload_dom = new DOMDocument('1.0', 'iso-8859-1'); $element = $payload_dom->createElementNS($ele_ns, WSF_STARTING_NS_PREFIX . ":" . $ele_name); if (is_object($arguments)) { /* this is class map support */ $new_obj = $arguments; $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX); wsf_create_payload_for_class_map($payload_dom, $returns_node, $element, $element, $new_obj, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map); $payload_dom->appendChild($element); $payload_node = $payload_dom->firstChild; $clone_node = $payload_node->cloneNode(TRUE); return $payload_dom->saveXML($clone_node); } else { /* array type implementation */ $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX); wsf_create_payload_for_array($payload_dom, $returns_node, $element, $element, $arguments, $prefix_i, $namespace_map, $mtom_on, $attachment_map); $payload_dom->appendChild($element); $payload_node = $payload_dom->firstChild; $clone_node = $payload_node->cloneNode(TRUE); return $payload_dom->saveXML($clone_node); } } else { $payload_dom = new DOMDocument('1.0', 'iso-8859-1'); $element = $payload_dom->createElementNS($ele_ns, WSF_STARTING_NS_PREFIX . ":" . $ele_name); $element->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); $element->setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); if (is_object($arguments)) { $new_obj = $arguments; $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX); wsf_create_payload_for_class_map($payload_dom, $returns_node, $element, $element, $new_obj, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map); $payload_dom->appendChild($element); $payload_node = $payload_dom->firstChild; $clone_node = $payload_node->cloneNode(TRUE); return $payload_dom->saveXML($clone_node); } else { /* array type implementation */ $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX); wsf_create_payload_for_array($payload_dom, $returns_node, $element, $element, $arguments, $prefix_i, $namespace_map, $mtom_on, $attachment_map); $payload_dom->appendChild($element); $payload_node = $payload_dom->firstChild; $clone_node = $payload_node->cloneNode(TRUE); return $payload_dom->saveXML($clone_node); } } }
/** * Do serialization over complex schema types * @param $sig_param_node sig model for the param * @param $user_val the user value given to the type * @param $parant_ele just root element of the element * @param $payload_dom payload dom document * @param $classmap (array) users classmap * @param $root_node root element of the document, in order to add namespace * @param $prefix_i - next available prefix index * @param namespace_map, array, map to the namespace to prefix */ function wsf_serialize_complex_types(DomNode $sig_param_node, $user_val, $parent_node, $payload_dom, $root_node, $classmap, &$prefix_i, &$namespace_map, $mtom_on, &$attachment_map) { $target_namespace = NULL; $min_occurs = 1; $max_occurs = 1; $sig_param_attris = $sig_param_node->attributes; $param_type = NULL; $param_name = NULL; if ($sig_param_attris->getNamedItem(WSF_NAME)) { $param_name = $sig_param_attris->getNamedItem(WSF_NAME)->value; } if ($sig_param_attris->getNamedItem(WSF_TARGETNAMESPACE)) { $target_namespace = $sig_param_attris->getNamedItem(WSF_TARGETNAMESPACE)->value; } if ($sig_param_attris->getNamedItem(WSF_MIN_OCCURS)) { $min_occurs = $sig_param_attris->getNamedItem(WSF_MIN_OCCURS)->value; } if ($sig_param_attris->getNamedItem(WSF_MAX_OCCURS)) { $max_occurs = $sig_param_attris->getNamedItem(WSF_MAX_OCCURS)->value; } if ($sig_param_attris->getNamedItem(WSF_TYPE)) { $param_type = $sig_param_attris->getNamedItem(WSF_TYPE)->value; } if ($target_namespace == NULL) { $node_name = $param_name; } else { if (array_key_exists($target_namespace, $namespace_map) && $namespace_map[$target_namespace] != NULL) { $prefix = $namespace_map[$target_namespace]; } else { $prefix = "ns" . $prefix_i; $prefix_i++; $root_node->setAttribute("xmlns:" . $prefix, $target_namespace); $namespace_map[$target_namespace] = $prefix; } $node_name = $prefix . ":" . $param_name; } if ($max_occurs > 1 || $max_occurs == "unbounded") { if ($user_val === NULL) { wsf_set_nil_element(NULL, $parent_node, $root_node, $prefix_i, $namespace_map); } else { if (is_array($user_val)) { foreach ($user_val as $user_val_item) { /* type conversion is needed */ if ($user_val_item === NULL) { wsf_set_nil_element(NULL, $parent_node, $root_node, $prefix_i, $namespace_map); continue; } $param_node = $payload_dom->createElement($node_name); if (is_object($user_val_item)) { if ($sig_param_node->hasChildNodes()) { wsf_create_payload_for_class_map($payload_dom, $sig_param_node, $param_node, $root_node, $user_val_item, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map); } else { wsf_create_payload_for_unknown_class_map($payload_dom, $param_node, $user_val_item, $prefix); } } else { if ($sig_param_node->hasChildNodes()) { wsf_create_payload_for_array($payload_dom, $sig_param_node, $param_node, $root_node, $user_val_item, $prefix_i, $namespace_map, $mtom_on, $attachment_map); } else { wsf_create_payload_for_unknown_array($payload_dom, $param_node, $user_val_item, $prefix); } } $parent_node->appendChild($param_node); } } else { /* in a case this is not an array */ $param_node = $payload_dom->createElement($node_name); if (is_object($user_val)) { if ($sig_param_node->hasChildNodes()) { wsf_create_payload_for_class_map($payload_dom, $sig_param_node, $param_node, $root_node, $user_val, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map); } else { wsf_create_payload_for_unknown_class_map($payload_dom, $param_node, $user_val, $prefix); } } else { if ($sig_param_node->hasChildNodes()) { wsf_create_payload_for_array($payload_dom, $sig_param_node, $param_node, $root_node, $user_val, $prefix_i, $namespace_map, $mtom_on, $attachment_map); } else { wsf_create_payload_for_unknown_array($payload_dom, $param_node, $user_val, $prefix); } } $parent_node->appendChild($param_node); } } } else { /* in a case this is not an array */ $param_node = $payload_dom->createElement($node_name); if (is_object($user_val)) { if ($sig_param_node->hasChildNodes()) { wsf_create_payload_for_class_map($payload_dom, $sig_param_node, $param_node, $root_node, $user_val, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map); } else { wsf_create_payload_for_unknown_class_map($payload_dom, $param_node, $user_val, $prefix); } } else { if ($sig_param_node->hasChildNodes()) { wsf_create_payload_for_array($payload_dom, $sig_param_node, $param_node, $root_node, $user_val, $prefix_i, $namespace_map, $mtom_on, $attachment_map); } else { wsf_create_payload_for_unknown_array($payload_dom, $param_node, $user_val, $prefix); } } $parent_node->appendChild($param_node); } }
/** * Creates the payload to be passed to C level. * @param DomNode $sig_node the sig node of the operation * @param Bool $is_doc true if doc-lit or false if rpc style * @param string $operation_name Name of the operation to be invoked * @param int $arg_count No of arguments in the function * @param array $argument array of arguments of the function to be invoked * @param array $classmap array of class mappings for complex types * @param DomNode $schema_node schema for the given WSDL */ function wsf_create_payload(DomNode $sig_node, $is_doc, $operation_name, $arg_count, $arguments, array $classmap = NULL, $mtom_on, &$attachment_map) { require_once 'wsf_wsdl_consts.php'; require_once 'wsf_wsdl_util.php'; require_once 'wsf_wsdl_serialization.php'; // if the sig is an immediate simple type then // it is expected to have is_wrapper = TRUE $is_wrapper = FALSE; $params_node = NULL; // starting prefix index to build the xml $prefix_i = 2; if ($sig_node) { $params_node = $sig_node->firstChild; if ($params_node && $params_node->localName == WSF_PARAMS) { if ($params_node->hasAttributes()) { /* Wrapper element of the request operation */ $sig_attrs = $params_node->attributes; $ele_name = NULL; $ele_ns = NULL; if ($sig_attrs->getNamedItem(WSF_WRAPPER_ELEMENT)) { $ele_name = $sig_attrs->getNamedItem(WSF_WRAPPER_ELEMENT)->value; } if ($sig_attrs->getNamedItem(WSF_WRAPPER_ELEMENT_NS)) { $ele_ns = $sig_attrs->getNamedItem(WSF_WRAPPER_ELEMENT_NS)->value; } $is_wrapper = TRUE; } else { /* No wrapper element in the request */ $ele_ns = NULL; $ele_name = NULL; /* check for the only param target-namespace */ $only_param = $params_node->firstChild; $sig_attrs = $only_param->attributes; if ($sig_attrs->getNamedItem(WSF_TARGETNAMESPACE)) { $ele_ns = $sig_attrs->getNamedItem(WSF_TARGETNAMESPACE)->value; } if ($sig_attrs->getNamedItem(WSF_NAME)) { $ele_name = $sig_attrs->getNamedItem(WSF_NAME)->value; } } } } if ($params_node == NULL) { return NULL; } ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "element name: {$ele_name}"); // the returning payload.. $payload_str = NULL; /*if(array_key_exists(0, $arguments) && $arguments[0] === NULL) { $payload_str = NULL; }*/ if ($ele_name == NULL || $ele_name == "#any") { $payload_str = NULL; } else { if ($is_doc == TRUE) { $payload_dom = new DOMDocument('1.0', 'iso-8859-1'); $element = $payload_dom->createElementNS($ele_ns, WSF_STARTING_NS_PREFIX . ":" . $ele_name); if (!array_key_exists(0, $arguments)) { $payload_dom->appendChild($element); $payload_node = $payload_dom->firstChild; $clone_node = $payload_node->cloneNode(TRUE); $payload_str = $payload_dom->saveXML($clone_node); } else { if (is_object($arguments[0])) { /* this is class map support */ $new_obj = $arguments[0]; $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX); wsf_create_payload_for_class_map($payload_dom, $params_node, $element, $element, $new_obj, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map); $payload_dom->appendChild($element); $payload_node = $payload_dom->firstChild; $clone_node = $payload_node->cloneNode(TRUE); $payload_str = $payload_dom->saveXML($clone_node); } else { /* array type implementation */ $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX); wsf_create_payload_for_array($payload_dom, $params_node, $element, $element, $arguments[0], $prefix_i, $namespace_map, $mtom_on, $attachment_map); $payload_dom->appendChild($element); $payload_node = $payload_dom->firstChild; $clone_node = $payload_node->cloneNode(TRUE); $payload_str = $payload_dom->saveXML($clone_node); } } } else { $payload_dom = new DOMDocument('1.0', 'iso-8859-1'); $element = $payload_dom->createElementNS($ele_ns, WSF_STARTING_NS_PREFIX . ":" . $ele_name); $element->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); $element->setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); if (is_object($arguments[0])) { $new_obj = $arguments[0]; $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX); // currently we handle both rpc and doc lit sameway wsf_create_payload_for_class_map($payload_dom, $params_node, $element, $element, $new_obj, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map); $payload_dom->appendChild($element); $payload_node = $payload_dom->firstChild; $clone_node = $payload_node->cloneNode(TRUE); $payload_str = $payload_dom->saveXML($clone_node); } else { /* array type implementation */ $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX); wsf_create_payload_for_array($payload_dom, $params_node, $element, $element, $arguments[0], $prefix_i, $namespace_map, $mtom_on, $attachment_map); $payload_dom->appendChild($element); $payload_node = $payload_dom->firstChild; $clone_node = $payload_node->cloneNode(TRUE); $payload_str = $payload_dom->saveXML($clone_node); } } } ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "test: " . $payload_str); $binding_details_node = NULL; $binding_details_node = $sig_node->nextSibling; while ($binding_details_node && $binding_details_node->nodeType == XML_ELEMENT_NODE && $binding_details_node->nodeName != WSF_BINDINDG_DETAILS) { $binding_details_node = $binding_details_node->nextSibling; } $input_headers = array(); $argument_index = 1; if ($binding_details_node) { $binding_details_childs = $binding_details_node->childNodes; foreach ($binding_details_childs as $binding_details_child) { if ($binding_details_child->nodeType == XML_ELEMENT_NODE && $binding_details_child->nodeName == WSF_SOAPHEADER && $binding_details_child->attributes->getNamedItem(WSF_HEADER_FOR_ATTRIBUTE) && $binding_details_child->attributes->getNamedItem(WSF_HEADER_FOR_ATTRIBUTE)->value == WSF_WSDL_INPUT) { //so this is the next input element.. $header_name = ""; $header_ns = ""; if ($binding_details_child->attributes->getNamedItem(WSF_TYPE)) { $header_name = $binding_details_child->attributes->getNamedItem(WSF_TYPE)->value; } if ($binding_details_child->attributes->getNamedItem(WSF_TYPE_NAMESPACE)) { $header_ns = $binding_details_child->attributes->getNamedItem(WSF_TYPE_NAMESPACE)->value; } $header_dom = new DOMDocument('1.0', 'iso-8859-1'); $element = $header_dom->createElementNS($header_ns, WSF_STARTING_NS_PREFIX . ":" . $header_name); if (array_key_exists($argument_index, $arguments)) { $namespace_map = array($header_ns => WSF_STARTING_NS_PREFIX); $argument = $arguments[$argument_index]; $header_sig = $binding_details_child->firstChild; if ($argument && is_array($argument)) { wsf_create_payload_for_array($header_dom, $header_sig, $element, $element, $arguments, $prefix_i, $namespace_map, $mtom_on, $attachment_map); } else { if ($argument && is_object($argument)) { wsf_create_payload_for_class_map($header_dom, $header_sig, $element, $element, $argument, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map); } else { if ($argument) { // this can be tiny little simple type $text_node = new DOMText($argument); $element->appendChild($text_node); } } } $header_dom->appendChild($element); $header_node = $header_dom->firstChild; $clone_node = $header_node->cloneNode(TRUE); $header_str = $header_dom->saveXML($clone_node); $input_headers[] = $header_str; } else { break; } $argument_index++; } } } return array(WSF_REQUEST_PAYLOAD => $payload_str, WSF_INPUT_HEADERS => $input_headers); }