php-src/ext/soap/php_packet_soap.c
2002-07-07 23:03:43 +00:00

125 lines
3.0 KiB
C

#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;
}