summaryrefslogtreecommitdiff
path: root/ext/soap/php_packet_soap.c
diff options
context:
space:
mode:
authorPierre Joye <pierre.php@gmail.com>2014-05-15 08:24:07 +0200
committerPierre Joye <pierre.php@gmail.com>2014-05-15 08:24:07 +0200
commit89a6d2bc53fb83e59a2fe8ac0b5ece641980a7ea (patch)
treef77308734e3f0ae024c5900a852e10b2138e72d0 /ext/soap/php_packet_soap.c
parent3ae86b9cce0df92069d971feef2af526cdabf7f5 (diff)
parentc446e575880d503921a795ee7cc4126b8b84457b (diff)
downloadphp-git-89a6d2bc53fb83e59a2fe8ac0b5ece641980a7ea.tar.gz
Merge branch 'phpng' of git.php.net:php-src into phpng
# By Dmitry Stogov # Via Dmitry Stogov * 'phpng' of git.php.net:php-src: ext/soap support for phpng (incomplete - just compilable)
Diffstat (limited to 'ext/soap/php_packet_soap.c')
-rw-r--r--ext/soap/php_packet_soap.c104
1 files changed, 49 insertions, 55 deletions
diff --git a/ext/soap/php_packet_soap.c b/ext/soap/php_packet_soap.c
index 3f4553b16a..ce505b4333 100644
--- a/ext/soap/php_packet_soap.c
+++ b/ext/soap/php_packet_soap.c
@@ -179,10 +179,12 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
/* Check if <Body> contains <Fault> element */
fault = get_node_ex(body->children,"Fault",envelope_ns);
if (fault != NULL) {
- char *faultcode = NULL, *faultstring = NULL, *faultactor = NULL;
- zval *details = NULL;
+ char *faultcode = NULL;
+ zend_string *faultstring = NULL, *faultactor = NULL;
+ zval details;
xmlNodePtr tmp;
+ ZVAL_UNDEF(&details);
if (soap_version == SOAP_1_1) {
tmp = get_node(fault->children, "faultcode");
if (tmp != NULL && tmp->children != NULL) {
@@ -191,21 +193,21 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
tmp = get_node(fault->children, "faultstring");
if (tmp != NULL && tmp->children != NULL) {
- zval *zv = master_to_zval(get_conversion(IS_STRING), tmp TSRMLS_CC);
- faultstring = Z_STRVAL_P(zv);
- FREE_ZVAL(zv);
+ zval zv;
+ master_to_zval(&zv, get_conversion(IS_STRING), tmp TSRMLS_CC);
+ faultstring = Z_STR(zv);
}
tmp = get_node(fault->children, "faultactor");
if (tmp != NULL && tmp->children != NULL) {
- zval *zv = master_to_zval(get_conversion(IS_STRING), tmp TSRMLS_CC);
- faultactor = Z_STRVAL_P(zv);
- FREE_ZVAL(zv);
+ zval zv;
+ master_to_zval(&zv, get_conversion(IS_STRING), tmp TSRMLS_CC);
+ faultactor = Z_STR(zv);
}
tmp = get_node(fault->children, "detail");
if (tmp != NULL) {
- details = master_to_zval(NULL, tmp TSRMLS_CC);
+ master_to_zval(&details, NULL, tmp TSRMLS_CC);
}
} else {
tmp = get_node(fault->children, "Code");
@@ -221,26 +223,26 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
/* TODO: lang attribute */
tmp = get_node(tmp->children,"Text");
if (tmp != NULL && tmp->children != NULL) {
- zval *zv = master_to_zval(get_conversion(IS_STRING), tmp TSRMLS_CC);
- faultstring = Z_STRVAL_P(zv);
- FREE_ZVAL(zv);
+ zval zv;
+ master_to_zval(&zv, get_conversion(IS_STRING), tmp TSRMLS_CC);
+ faultstring = Z_STR(zv);
}
}
tmp = get_node(fault->children,"Detail");
if (tmp != NULL) {
- details = master_to_zval(NULL, tmp TSRMLS_CC);
+ master_to_zval(&details, NULL, tmp TSRMLS_CC);
}
}
- add_soap_fault(this_ptr, faultcode, faultstring, faultactor, details TSRMLS_CC);
+ add_soap_fault(this_ptr, faultcode, faultstring->val, faultactor->val, &details TSRMLS_CC);
if (faultstring) {
- efree(faultstring);
+ STR_RELEASE(faultstring);
}
if (faultactor) {
- efree(faultactor);
+ STR_RELEASE(faultactor);
}
- if (details) {
- Z_DELREF_P(details);
+ if (Z_REFCOUNTED(details)) {
+ Z_DELREF(details);
}
xmlFreeDoc(response);
return FALSE;
@@ -255,20 +257,18 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
if (resp != NULL) {
if (fn != NULL && fn->binding && fn->binding->bindingType == BINDING_SOAP) {
/* Function has WSDL description */
- sdlParamPtr *h_param, param = NULL;
+ sdlParamPtr param = NULL;
xmlNodePtr val = NULL;
char *name, *ns = NULL;
- zval* tmp;
+ zval tmp;
sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)fn->bindingAttributes;
int res_count;
hdrs = fnb->output.headers;
if (fn->responseParameters) {
- res_count = zend_hash_num_elements(fn->responseParameters);
- zend_hash_internal_pointer_reset(fn->responseParameters);
- while (zend_hash_get_current_data(fn->responseParameters, (void **)&h_param) == SUCCESS) {
- param = (*h_param);
+ res_count = zend_hash_num_elements(fn->responseParameters);
+ ZEND_HASH_FOREACH_PTR(fn->responseParameters, param) {
if (fnb->style == SOAP_DOCUMENT) {
if (param->element) {
name = param->element->name;
@@ -315,8 +315,7 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
if (!val) {
/* TODO: may be "nil" is not OK? */
- MAKE_STD_ZVAL(tmp);
- ZVAL_NULL(tmp);
+ ZVAL_NULL(&tmp);
/*
add_soap_fault(this_ptr, "Client", "Can't find response data", NULL, NULL TSRMLS_CC);
xmlFreeDoc(response);
@@ -325,17 +324,15 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
} else {
/* Decoding value of parameter */
if (param != NULL) {
- tmp = master_to_zval(param->encode, val TSRMLS_CC);
+ master_to_zval(&tmp, param->encode, val TSRMLS_CC);
} else {
- tmp = master_to_zval(NULL, val TSRMLS_CC);
+ master_to_zval(&tmp, NULL, val TSRMLS_CC);
}
}
- add_assoc_zval(return_value, param->paramName, tmp);
+ add_assoc_zval(return_value, param->paramName, &tmp);
param_count++;
-
- zend_hash_move_forward(fn->responseParameters);
- }
+ } ZEND_HASH_FOREACH_END();
}
} else {
/* Function has no WSDL description */
@@ -347,25 +344,24 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
}
if (val != NULL) {
if (!node_is_equal_ex(val,"result",RPC_SOAP12_NAMESPACE)) {
- zval *tmp;
- zval **arr;
+ zval tmp;
+ zval *arr;
- tmp = master_to_zval(NULL, val TSRMLS_CC);
+ master_to_zval(&tmp, NULL, val TSRMLS_CC);
if (val->name) {
- if (zend_hash_find(Z_ARRVAL_P(return_value), (char*)val->name, strlen((char*)val->name)+1, (void**)&arr) == SUCCESS) {
- add_next_index_zval(*arr, tmp);
+ if ((arr = zend_hash_str_find(Z_ARRVAL_P(return_value), (char*)val->name, strlen((char*)val->name))) != NULL) {
+ add_next_index_zval(arr, &tmp);
} else if (val->next && get_node(val->next, (char*)val->name)) {
- zval *arr;
+ zval arr;
- MAKE_STD_ZVAL(arr);
- array_init(arr);
- add_next_index_zval(arr, tmp);
- add_assoc_zval(return_value, (char*)val->name, arr);
+ array_init(&arr);
+ add_next_index_zval(&arr, &tmp);
+ add_assoc_zval(return_value, (char*)val->name, &arr);
} else {
- add_assoc_zval(return_value, (char*)val->name, tmp);
+ add_assoc_zval(return_value, (char*)val->name, &tmp);
}
} else {
- add_next_index_zval(return_value, tmp);
+ add_next_index_zval(return_value, &tmp);
}
++param_count;
}
@@ -383,12 +379,10 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
zval *tmp;
zend_hash_internal_pointer_reset(Z_ARRVAL_P(return_value));
- zend_hash_get_current_data(Z_ARRVAL_P(return_value), (void**)&tmp);
- tmp = *(zval**)tmp;
- Z_ADDREF_P(tmp);
+ tmp = zend_hash_get_current_data(Z_ARRVAL_P(return_value));
+ if (Z_REFCOUNTED_P(tmp)) Z_ADDREF_P(tmp);
zval_dtor(return_value);
- *return_value = *tmp;
- FREE_ZVAL(tmp);
+ ZVAL_COPY_VALUE(return_value, tmp);
}
}
@@ -397,11 +391,11 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
while (trav != NULL) {
if (trav->type == XML_ELEMENT_NODE) {
encodePtr enc = NULL;
- zval* val;
+ zval val;
if (hdrs) {
smart_str key = {0};
- sdlSoapBindingFunctionHeaderPtr *hdr;
+ sdlSoapBindingFunctionHeaderPtr hdr;
if (trav->ns) {
smart_str_appends(&key, (char*)trav->ns->href);
@@ -409,13 +403,13 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
}
smart_str_appends(&key, (char*)trav->name);
smart_str_0(&key);
- if (zend_hash_find(hdrs, key.c, key.len+1, (void**)&hdr) == SUCCESS) {
- enc = (*hdr)->encode;
+ if ((hdr = zend_hash_find_ptr(hdrs, key.s)) != NULL) {
+ enc = hdr->encode;
}
smart_str_free(&key);
}
- val = master_to_zval(enc, trav TSRMLS_CC);
- add_assoc_zval(soap_headers, (char*)trav->name, val);
+ master_to_zval(&val, enc, trav TSRMLS_CC);
+ add_assoc_zval(soap_headers, (char*)trav->name, &val);
}
trav = trav->next;
}