diff options
Diffstat (limited to 'ext/soap/php_packet_soap.c')
-rw-r--r-- | ext/soap/php_packet_soap.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/ext/soap/php_packet_soap.c b/ext/soap/php_packet_soap.c new file mode 100644 index 0000000000..3414f970eb --- /dev/null +++ b/ext/soap/php_packet_soap.c @@ -0,0 +1,124 @@ +#include "php_soap.h" + +int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctionPtr fn, char *fn_name, zval ***ret, int *num_params) +{ + xmlDocPtr response; + xmlNodePtr trav, trav2, env, body, resp, cur, fault; + zval **tmp_ret; + TSRMLS_FETCH(); + + response = xmlParseMemory(buffer, buffer_size); + xmlCleanupParser(); + + trav = response->children; + FOREACHNODE(trav,"Envelope",env) + { + trav2 = env->children; + FOREACHNODE(trav2,"Body",body) + { + fault = get_node(body->children,"Fault"); + if(fault != NULL) + { + char *faultcode = NULL, *faultstring = NULL, *faultactor = NULL; + zval *details = NULL; + xmlNodePtr tmp; + + tmp = get_node(fault->children,"faultcode"); + if(tmp != NULL && tmp->children != NULL) + faultcode = tmp->children->content; + + tmp = get_node(fault->children,"faultstring"); + if(tmp != NULL && tmp->children != NULL) + faultstring = tmp->children->content; + + tmp = get_node(fault->children,"faultactor"); + if(tmp != NULL && tmp->children != NULL) + faultactor = tmp->children->content; + + tmp = get_node(fault->children,"detail"); + if(tmp != NULL) + { + encodePtr enc; + enc = get_conversion(UNKNOWN_TYPE); + details = enc->to_zval(enc->details, tmp); + } + + add_soap_fault(this_ptr, faultcode, faultstring, faultactor, details); + } + else + { + resp = body->children; + if(fn != NULL) + { + cur = get_node(resp, fn->responseName); + if(cur != NULL) + { + int num_resp = zend_hash_num_elements(fn->responseParameters); + if(num_resp <= 1) + { + sdlParamPtr *h_param, param; + xmlNodePtr val; + + zend_hash_internal_pointer_reset(fn->responseParameters); + if(zend_hash_get_current_data(fn->responseParameters, (void **)&h_param) != SUCCESS) + { + (*num_params) = 0; + } + else + { + param = (*h_param); + val = get_node(cur->children, param->paramName); + if(val != NULL) + { + encodePtr enc; + tmp_ret = emalloc(sizeof(zval **)); + if(param != NULL) + enc = param->encode; + else + enc = get_conversion(UNKNOWN_TYPE); + + tmp_ret[0] = master_to_zval(enc, val); + (*ret) = tmp_ret; + (*num_params) = 1; + } + else + php_error(E_ERROR, "Can't find response parameter \"%s\"", param->paramName); + } + } + else + { + php_error(E_ERROR,"Doesn't handle multiple return values"); + } + } + } + else + { + cur = resp; + while(cur && cur->type != XML_ELEMENT_NODE) + cur = cur->next; + if(cur != NULL) + { + xmlNodePtr val; + val = cur->children; + while(val && val->type != XML_ELEMENT_NODE) + val = val->next; + + if(val != NULL) + { + encodePtr enc; + enc = get_conversion(UNKNOWN_TYPE); + tmp_ret = emalloc(sizeof(zval **)); + tmp_ret[0] = master_to_zval(enc, val); + (*ret) = tmp_ret; + (*num_params) = 1; + } + } + } + } + } + ENDFOREACH(trav2); + } + ENDFOREACH(trav); + xmlFreeDoc(response); + return TRUE; +} |