summaryrefslogtreecommitdiff
path: root/ext/soap/php_packet_soap.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/soap/php_packet_soap.c')
-rw-r--r--ext/soap/php_packet_soap.c124
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;
+}