Browse Source

Source cleanup

PEAR_1_4DEV
Dmitry Stogov 23 years ago
parent
commit
b21756c1ca
  1. 7
      ext/soap/TODO
  2. 173
      ext/soap/php_encoding.c
  3. 8
      ext/soap/php_encoding.h
  4. 28
      ext/soap/php_schema.c
  5. 135
      ext/soap/php_sdl.c
  6. 3
      ext/soap/php_sdl.h
  7. 8
      ext/soap/php_xml.c
  8. 323
      ext/soap/soap.c

7
ext/soap/TODO

@ -7,11 +7,8 @@ General
SOAP
----
+ support for SOAP headers
? actor attribute
+ mustUnderstend attribute
- SOAP routing
- root attribute
- root attribute (it is defined by SOAP 1.1, but not SOAP 1.2)
- make sure soap 1.1 and 1.2 are supported fully
Encoding
@ -92,7 +89,7 @@ Transport
Interop Testing
---------------
- more introp rounds/groups
- more interop rounds/groups
UDDI
----

173
ext/soap/php_encoding.c

@ -80,6 +80,8 @@ static void get_array_type(xmlNodePtr node, zval *array, smart_str *out_type TSR
static xmlNodePtr check_and_resolve_href(xmlNodePtr data);
static encodePtr get_conversion(int encode);
static void get_type_str(xmlNodePtr node, const char* ns, const char* type, smart_str* ret);
static void set_ns_and_type_ex(xmlNodePtr node, char *ns, char *type);
@ -212,16 +214,15 @@ void whiteSpace_replace(char* str)
void whiteSpace_collapse(char* str)
{
char *orig = str;
char *tmp = do_alloca(strlen(str)+1);
char *pos;
char old;
pos = str;
whiteSpace_replace(str);
while (*str == ' ') {
str++;
}
pos = tmp; old = '\0';
old = '\0';
while (*str != '\0') {
if (*str != ' ' || old != ' ') {
*pos = *str;
@ -234,8 +235,6 @@ void whiteSpace_collapse(char* str)
--pos;
}
*pos = '\0';
memcpy(orig,tmp,(pos-tmp)+1);
free_alloca(tmp);
}
xmlNodePtr master_to_xml(encodePtr encode, zval *data, int style, xmlNodePtr parent)
@ -795,7 +794,7 @@ static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr
add_next_index_zval(array, val);
do {
typeAttr = get_attribute(node->properties,"type");
enc = NULL;
enc = NULL;
if (typeAttr != NULL && typeAttr->children && typeAttr->children->content) {
enc = get_encoder_from_prefix(sdl, node, typeAttr->children->content);
}
@ -847,16 +846,16 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
if (sdlType) {
if (sdlType->kind == XSD_TYPEKIND_RESTRICTION &&
sdlType->encode && type != &sdlType->encode->details) {
encodePtr enc;
encodePtr enc;
enc = sdlType->encode;
while (enc && enc->details.sdl_type &&
enc->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
enc->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
enc->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
enc = enc->details.sdl_type->encode;
}
if (enc) {
enc->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
enc->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
enc->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
enc = enc->details.sdl_type->encode;
}
if (enc) {
zval *base;
MAKE_STD_ZVAL(ret);
@ -875,11 +874,11 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
} else if (sdlType->kind == XSD_TYPEKIND_EXTENSION &&
sdlType->encode &&
type != &sdlType->encode->details) {
if (sdlType->encode->details.sdl_type &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
ret = master_to_zval(sdlType->encode, data);
if (sdlType->encode->details.sdl_type &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
ret = master_to_zval(sdlType->encode, data);
FIND_XML_NULL(data, ret);
} else {
zval *base;
@ -1050,16 +1049,16 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo
}
if (sdlType->kind == XSD_TYPEKIND_RESTRICTION &&
sdlType->encode && type != &sdlType->encode->details) {
encodePtr enc;
encodePtr enc;
enc = sdlType->encode;
while (enc && enc->details.sdl_type &&
enc->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
enc->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
enc->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
enc = enc->details.sdl_type->encode;
}
if (enc) {
enc->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
enc->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
enc->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
enc = enc->details.sdl_type->encode;
}
if (enc) {
zval **tmp;
if (prop && zend_hash_find(prop, "_", sizeof("_"), (void**)&tmp) == SUCCESS) {
xmlParam = master_to_xml(enc, *tmp, style, parent);
@ -1075,10 +1074,10 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo
}
} else if (sdlType->kind == XSD_TYPEKIND_EXTENSION &&
sdlType->encode && type != &sdlType->encode->details) {
if (sdlType->encode->details.sdl_type &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
if (sdlType->encode->details.sdl_type &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_SIMPLE &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_LIST &&
sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
xmlParam = master_to_xml(sdlType->encode, data, style, parent);
} else {
zval **tmp;
@ -1205,7 +1204,7 @@ static int calc_dimension_12(const char* str)
} else if (*str == '*') {
php_error(E_ERROR,"SOAP-ERROR: Encoding: '*' may only be first arraySize value in list");
} else {
flag = 0;
flag = 0;
}
str++;
}
@ -1229,11 +1228,11 @@ static int* get_position_12(int dimension, const char* str)
while (*str != '\0') {
if (*str >= '0' && *str <= '9') {
if (flag == 0) {
i++;
flag = 1;
}
pos[i] = (pos[i]*10)+(*str-'0');
} else if (*str == '*') {
i++;
flag = 1;
}
pos[i] = (pos[i]*10)+(*str-'0');
} else if (*str == '*') {
php_error(E_ERROR,"SOAP-ERROR: Encoding: '*' may only be first arraySize value in list");
} else {
flag = 0;
@ -1421,7 +1420,7 @@ static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style, xmlNod
if (Z_TYPE_PP(el) == IS_ARRAY) {
dims[i] = zend_hash_num_elements(Z_ARRVAL_PP(el));
} else {
dims[i] = 0;
dims[i] = 0;
}
}
}
@ -1484,19 +1483,19 @@ static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style, xmlNod
zend_hash_num_elements(sdl_type->elements) == 1 &&
(elementType = *(sdlTypePtr*)sdl_type->elements->pListHead->pData) != NULL &&
elementType->encode && elementType->encode->details.type_str) {
element_type = elementType;
element_type = elementType;
enc = elementType->encode;
get_type_str(xmlParam, elementType->encode->details.ns, elementType->encode->details.type_str, &array_type);
} else {
get_array_type(xmlParam, data, &array_type TSRMLS_CC);
enc = get_encoder_ex(SOAP_GLOBAL(sdl), array_type.c);
enc = get_encoder_ex(SOAP_GLOBAL(sdl), array_type.c, array_type.len);
}
} else if (sdl_type && sdl_type->elements &&
zend_hash_num_elements(sdl_type->elements) == 1 &&
(elementType = *(sdlTypePtr*)sdl_type->elements->pListHead->pData) != NULL &&
elementType->encode && elementType->encode->details.type_str) {
element_type = elementType;
element_type = elementType;
enc = elementType->encode;
get_type_str(xmlParam, elementType->encode->details.ns, elementType->encode->details.type_str, &array_type);
@ -1507,7 +1506,7 @@ static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style, xmlNod
} else {
get_array_type(xmlParam, data, &array_type TSRMLS_CC);
enc = get_encoder_ex(SOAP_GLOBAL(sdl), array_type.c);
enc = get_encoder_ex(SOAP_GLOBAL(sdl), array_type.c, array_type.len);
smart_str_append_long(&array_size, i);
dims = emalloc(sizeof(int)*dimension);
dims[0] = i;
@ -1898,10 +1897,9 @@ static zval *guess_zval_convert(encodeTypePtr type, xmlNodePtr data)
} else {
tmpattr = get_attribute(data->properties,"type");
if (tmpattr != NULL) {
if (tmpattr->children) {
enc = get_conversion_from_type(data, tmpattr->children->content);
} else {
enc = get_conversion_from_type(data, "");
enc = get_encoder_from_prefix(SOAP_GLOBAL(sdl), data, tmpattr->children->content);
if (enc != NULL && enc->details.sdl_type != NULL) {
enc = NULL;
}
}
@ -2276,8 +2274,8 @@ static xmlNodePtr check_and_resolve_href(xmlNodePtr data)
href = data->properties;
while (1) {
href = get_attribute(href, "href");
if (href == NULL || href->ns == NULL) {break;}
href = href->next;
if (href == NULL || href->ns == NULL) {break;}
href = href->next;
}
if (href) {
/* Internal href try and find node */
@ -2363,12 +2361,12 @@ void encode_reset_ns()
SOAP_GLOBAL(cur_uniq_ns) = 0;
}
encodePtr get_conversion_ex(HashTable *encoding, int encode)
static encodePtr get_conversion(int encode)
{
encodePtr *enc = NULL;
TSRMLS_FETCH();
if (zend_hash_index_find(encoding, encode, (void **)&enc) == FAILURE) {
if (zend_hash_index_find(&SOAP_GLOBAL(defEncIndex), encode, (void **)&enc) == FAILURE) {
if (SOAP_GLOBAL(overrides)) {
smart_str nscat = {0};
@ -2394,61 +2392,6 @@ encodePtr get_conversion_ex(HashTable *encoding, int encode)
}
}
encodePtr get_conversion_from_href_type_ex(HashTable *encoding, const char *type, int len)
{
encodePtr *enc = NULL;
if (encoding == NULL) {
return NULL;
}
if (zend_hash_find(encoding, (char*)type, len + 1, (void **)&enc) == FAILURE) {
return NULL;
}
return (*enc);
}
encodePtr get_conversion_from_type_ex(HashTable *encoding, xmlNodePtr node, const char *type)
{
encodePtr *enc = NULL;
xmlNsPtr nsptr;
char *ns, *cptype;
smart_str nscat = {0};
if (encoding == NULL) {
return NULL;
}
parse_namespace(type, &cptype, &ns);
nsptr = xmlSearchNs(node->doc, node, ns);
if (nsptr != NULL) {
smart_str_appends(&nscat, nsptr->href);
smart_str_appendc(&nscat, ':');
smart_str_appends(&nscat, cptype);
smart_str_0(&nscat);
if (zend_hash_find(encoding, nscat.c, nscat.len + 1, (void **)&enc) == FAILURE) {
if (zend_hash_find(encoding, (char*)type, strlen(type) + 1, (void **)&enc) == FAILURE) {
enc = NULL;
}
}
smart_str_free(&nscat);
} else {
if (zend_hash_find(encoding, (char*)type, strlen(type) + 1, (void **)&enc) == FAILURE) {
enc = NULL;
}
}
if (cptype) {efree(cptype);}
if (ns) {efree(ns);}
if (enc == NULL) {
return NULL;
} else {
return (*enc);
}
}
static int is_map(zval *array)
{
int i, count = zend_hash_num_elements(Z_ARRVAL_P(array));
@ -2492,33 +2435,33 @@ static void get_array_type(xmlNodePtr node, zval *array, smart_str *type TSRMLS_
cur_type = Z_LVAL_PP(ztype);
if (zend_hash_find(Z_OBJPROP_PP(tmp), "enc_stype", sizeof("enc_stype"), (void **)&ztype) == SUCCESS) {
cur_stype = Z_STRVAL_PP(ztype);
cur_stype = Z_STRVAL_PP(ztype);
} else {
cur_stype = NULL;
cur_stype = NULL;
}
if (zend_hash_find(Z_OBJPROP_PP(tmp), "enc_ns", sizeof("enc_ns"), (void **)&ztype) == SUCCESS) {
cur_ns = Z_STRVAL_PP(ztype);
cur_ns = Z_STRVAL_PP(ztype);
} else {
cur_ns = NULL;
cur_ns = NULL;
}
} else if (Z_TYPE_PP(tmp) == IS_ARRAY && is_map(*tmp)) {
cur_type = APACHE_MAP;
cur_stype = NULL;
cur_ns = NULL;
cur_stype = NULL;
cur_ns = NULL;
} else {
cur_type = Z_TYPE_PP(tmp);
cur_stype = NULL;
cur_ns = NULL;
cur_stype = NULL;
cur_ns = NULL;
}
if (i > 0) {
if ((cur_type != prev_type) ||
(cur_stype != NULL && prev_stype != NULL && strcmp(cur_stype,prev_stype) != 0) ||
(cur_stype == NULL && cur_stype != prev_stype) ||
(cur_ns != NULL && prev_ns != NULL && strcmp(cur_ns,prev_ns) != 0) ||
(cur_ns == NULL && cur_ns != prev_ns)) {
(cur_stype != NULL && prev_stype != NULL && strcmp(cur_stype,prev_stype) != 0) ||
(cur_stype == NULL && cur_stype != prev_stype) ||
(cur_ns != NULL && prev_ns != NULL && strcmp(cur_ns,prev_ns) != 0) ||
(cur_ns == NULL && cur_ns != prev_ns)) {
different = TRUE;
break;
}

8
ext/soap/php_encoding.h

@ -203,17 +203,9 @@ void whiteSpace_collapse(char* str);
xmlNodePtr sdl_guess_convert_xml(encodeTypePtr enc, zval* data, int style, xmlNodePtr parent);
zval *sdl_guess_convert_zval(encodeTypePtr enc, xmlNodePtr data);
#define get_conversion(e) get_conversion_ex(&SOAP_GLOBAL(defEncIndex), e)
#define get_conversion_from_type(n, t) get_conversion_from_type_ex(&SOAP_GLOBAL(defEnc), n, t)
#define get_conversion_from_href_type(t) get_conversion_from_href_type_ex(&SOAP_GLOBAL(defEnc), t, strlen(t))
void encode_reset_ns();
xmlNsPtr encode_add_ns(xmlNodePtr node, const char* ns);
encodePtr get_conversion_ex(HashTable *encoding, int encode);
encodePtr get_conversion_from_type_ex(HashTable *encoding, xmlNodePtr node, const char *type);
encodePtr get_conversion_from_href_type_ex(HashTable *encoding, const char *type, int len);
void delete_encoder(void *handle);
extern encode defaultEncoding[];

28
ext/soap/php_schema.c

@ -90,17 +90,13 @@ static encodePtr get_create_encoder(sdlPtr sdl, sdlTypePtr cur_type, const char
{
encodePtr enc = NULL;
smart_str nscat = {0};
TSRMLS_FETCH();
smart_str_appends(&nscat, ns);
smart_str_appendc(&nscat, ':');
smart_str_appends(&nscat, type);
smart_str_0(&nscat);
enc = get_conversion_from_href_type(nscat.c);
if (enc == NULL) {
enc = get_conversion_from_href_type_ex(sdl->encoders, nscat.c, nscat.len);
}
enc = get_encoder_ex(sdl, nscat.c, nscat.len);
if (enc == NULL) {
enc = create_encoder(sdl, cur_type, ns, type);
}
@ -201,7 +197,7 @@ int load_schema(sdlCtx *ctx,xmlNodePtr schema)
if (location == NULL) {
php_error(E_ERROR, "SOAP-ERROR: Parsing Schema: include has no 'schemaLocation' attribute");
} else {
xmlChar *uri;
xmlChar *uri;
xmlChar *base = xmlNodeGetBase(trav->doc, trav);
if (base == NULL) {
@ -211,7 +207,7 @@ int load_schema(sdlCtx *ctx,xmlNodePtr schema)
xmlFree(base);
}
schema_load_file(ctx,NULL,uri,tns,0);
xmlFree(uri);
xmlFree(uri);
}
} else if (node_is_equal(trav,"redefine")) {
@ -231,13 +227,13 @@ int load_schema(sdlCtx *ctx,xmlNodePtr schema)
xmlFree(base);
}
schema_load_file(ctx,NULL,uri,tns,0);
xmlFree(uri);
xmlFree(uri);
/* TODO: <redefine> support */
}
} else if (node_is_equal(trav,"import")) {
xmlAttrPtr ns, location;
xmlChar *uri = NULL;
xmlChar *uri = NULL;
ns = get_attribute(trav->properties, "namespace");
location = get_attribute(trav->properties, "schemaLocation");
@ -256,7 +252,7 @@ int load_schema(sdlCtx *ctx,xmlNodePtr schema)
}
}
schema_load_file(ctx,ns,uri,tns,1);
if (uri != NULL) {xmlFree(uri);}
if (uri != NULL) {xmlFree(uri);}
} else if (node_is_equal(trav,"annotation")) {
/* TODO: <annotation> support */
/* annotation cleanup
@ -267,7 +263,7 @@ int load_schema(sdlCtx *ctx,xmlNodePtr schema)
continue;
*/
} else {
break;
break;
}
trav = trav->next;
}
@ -470,7 +466,7 @@ static int schema_list(sdlPtr sdl, xmlAttrPtr tsn, xmlNodePtr listType, sdlTypeP
zend_hash_next_index_insert(cur_type->elements, &newType, sizeof(sdlTypePtr), (void **)&tmp);
schema_simpleType(sdl, tsn, trav, newType);
trav = trav->next;
trav = trav->next;
}
if (trav != NULL) {
php_error(E_ERROR, "SOAP-ERROR: Parsing Schema: unexpected <%s> in list",trav->name);
@ -503,10 +499,10 @@ static int schema_union(sdlPtr sdl, xmlAttrPtr tsn, xmlNodePtr unionType, sdlTyp
while (start != NULL && *start != '\0') {
end = strchr(start,' ');
if (end == NULL) {
next = NULL;
next = NULL;
} else {
*end = '\0';
next = end+1;
*end = '\0';
next = end+1;
}
parse_namespace(start, &type, &ns);
@ -696,7 +692,7 @@ static int schema_restriction_simpleContent(sdlPtr sdl, xmlAttrPtr tsn, xmlNodeP
} else {
break;
}
trav = trav->next;
trav = trav->next;
}
if (!simpleType) {
while (trav != NULL) {

135
ext/soap/php_sdl.c

@ -39,15 +39,35 @@ static void delete_parameter(void *paramater);
static void delete_header(void *header);
static void delete_document(void *doc_ptr);
encodePtr get_encoder_from_prefix(sdlPtr sdl, xmlNodePtr data, const char *type)
encodePtr get_encoder_from_prefix(sdlPtr sdl, xmlNodePtr node, const char *type)
{
encodePtr enc = NULL;
TSRMLS_FETCH();
enc = get_conversion_from_type(data, type);
if (enc == NULL && sdl) {
enc = get_conversion_from_type_ex(sdl->encoders, data, type);
xmlNsPtr nsptr;
char *ns, *cptype;
parse_namespace(type, &cptype, &ns);
nsptr = xmlSearchNs(node->doc, node, ns);
if (nsptr != NULL) {
int ns_len = strlen(nsptr->href);
int type_len = strlen(cptype);
int len = ns_len + type_len + 1;
char *nscat = do_alloca(len + 1);
memcpy(nscat, nsptr->href, ns_len);
nscat[ns_len] = ':';
memcpy(nscat+ns_len+1, cptype, type_len);
nscat[len] = '\0';
enc = get_encoder_ex(sdl, nscat, len);
if (enc == NULL) {
enc = get_encoder_ex(sdl, type, type_len);
}
free_alloca(nscat);
} else {
enc = get_encoder_ex(sdl, type, strlen(type));
}
efree(cptype);
if (ns) {efree(ns);}
return enc;
}
@ -64,19 +84,22 @@ static sdlTypePtr get_element(sdlPtr sdl, xmlNodePtr node, const char *type)
parse_namespace(type, &cptype, &ns);
nsptr = xmlSearchNs(node->doc, node, ns);
if (nsptr != NULL) {
smart_str nscat = {0};
int ns_len = strlen(nsptr->href);
int type_len = strlen(cptype);
int len = ns_len + type_len + 1;
char *nscat = do_alloca(len + 1);
smart_str_appends(&nscat, nsptr->href);
smart_str_appendc(&nscat, ':');
smart_str_appends(&nscat, cptype);
smart_str_0(&nscat);
memcpy(nscat, nsptr->href, ns_len);
nscat[ns_len] = ':';
memcpy(nscat+ns_len+1, cptype, type_len);
nscat[len] = '\0';
if (zend_hash_find(sdl->elements, nscat.c, nscat.len + 1, (void **)&sdl_type) == SUCCESS) {
if (zend_hash_find(sdl->elements, nscat, len + 1, (void **)&sdl_type) == SUCCESS) {
ret = *sdl_type;
} else if (zend_hash_find(sdl->elements, (char*)type, strlen(type) + 1, (void **)&sdl_type) == SUCCESS) {
} else if (zend_hash_find(sdl->elements, (char*)type, type_len + 1, (void **)&sdl_type) == SUCCESS) {
ret = *sdl_type;
}
smart_str_free(&nscat);
free_alloca(nscat);
} else {
if (zend_hash_find(sdl->elements, (char*)type, strlen(type) + 1, (void **)&sdl_type) == SUCCESS) {
ret = *sdl_type;
@ -93,26 +116,33 @@ encodePtr get_encoder(sdlPtr sdl, const char *ns, const char *type)
{
encodePtr enc = NULL;
char *nscat;
int ns_len = strlen(ns);
int type_len = strlen(type);
int len = ns_len + type_len + 1;
nscat = emalloc(strlen(ns) + strlen(type) + 2);
sprintf(nscat, "%s:%s", ns, type);
nscat = do_alloca(len + 1);
memcpy(nscat, ns, ns_len);
nscat[ns_len] = ':';
memcpy(nscat+ns_len+1, type, type_len);
nscat[len] = '\0';
enc = get_encoder_ex(sdl, nscat);
enc = get_encoder_ex(sdl, nscat, len);
efree(nscat);
free_alloca(nscat);
return enc;
}
encodePtr get_encoder_ex(sdlPtr sdl, const char *nscat)
encodePtr get_encoder_ex(sdlPtr sdl, const char *nscat, int len)
{
encodePtr enc = NULL;
encodePtr *enc;
TSRMLS_FETCH();
enc = get_conversion_from_href_type(nscat);
if (enc == NULL && sdl) {
enc = get_conversion_from_href_type_ex(sdl->encoders, nscat, strlen(nscat));
if (zend_hash_find(&SOAP_GLOBAL(defEnc), (char*)nscat, len + 1, (void **)&enc) == SUCCESS) {
return (*enc);
} else if (sdl && sdl->encoders && zend_hash_find(sdl->encoders, (char*)nscat, len + 1, (void **)&enc) == SUCCESS) {
return (*enc);
}
return enc;
return NULL;
}
sdlBindingPtr get_binding_from_type(sdlPtr sdl, int type)
@ -172,7 +202,7 @@ static void load_wsdl_ex(char *struri, sdlCtx *ctx, int include)
xmlAttrPtr targetNamespace;
if (zend_hash_exists(&ctx->docs, struri, strlen(struri)+1)) {
return;
return;
}
wsdl = soap_xmlParseFile(struri);
@ -225,17 +255,17 @@ static void load_wsdl_ex(char *struri, sdlCtx *ctx, int include)
/* TODO: namespace ??? */
xmlAttrPtr tmp = get_attribute(trav->properties, "location");
if (tmp) {
xmlChar *uri;
xmlChar *uri;
xmlChar *base = xmlNodeGetBase(trav->doc, trav);
if (base == NULL) {
uri = xmlBuildURI(tmp->children->content, trav->doc->URL);
uri = xmlBuildURI(tmp->children->content, trav->doc->URL);
} else {
uri = xmlBuildURI(tmp->children->content, base);
xmlFree(base);
uri = xmlBuildURI(tmp->children->content, base);
xmlFree(base);
}
load_wsdl_ex(uri, ctx, 1);
xmlFree(uri);
xmlFree(uri);
}
} else if (node_is_equal(trav,"message")) {
@ -341,7 +371,7 @@ static void wsdl_soap_binding_body(sdlCtx* ctx, xmlNodePtr node, char* wsdl_soap
if (ctype == NULL) {
ctype = tmp->children->content;
} else {
++ctype;
++ctype;
}
if (zend_hash_find(&ctx->messages, ctype, strlen(ctype)+1, (void**)&message) != SUCCESS) {
php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing <message> with name '%s'", tmp->children->content);
@ -430,7 +460,7 @@ static HashTable* wsdl_message(sdlCtx *ctx, char* message_name)
if (ctype == NULL) {
ctype = message_name;
} else {
++ctype;
++ctype;
}
if (zend_hash_find(&ctx->messages, ctype, strlen(ctype)+1, (void**)&tmp) != SUCCESS) {
php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing <message> with name '%s'", message->children->content);
@ -589,7 +619,7 @@ static sdlPtr load_wsdl(char *struri)
if (ctype == NULL) {
ctype = bindingAttr->children->content;
} else {
++ctype;
++ctype;
}
if (zend_hash_find(&ctx.bindings, ctype, strlen(ctype)+1, (void*)&tmp) != SUCCESS) {
php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: No <binding> element with name '%s'", ctype);
@ -638,7 +668,7 @@ static sdlPtr load_wsdl(char *struri)
if (ctype == NULL) {
ctype = type->children->content;
} else {
++ctype;
++ctype;
}
if (zend_hash_find(&ctx.portTypes, ctype, strlen(ctype)+1, (void**)&tmp) != SUCCESS) {
php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing <portType> with name '%s'", name->children->content);
@ -1907,28 +1937,28 @@ sdlPtr get_sdl(char *uri TSRMLS_DC)
if (SOAP_GLOBAL(cache_enabled)) {
char fn[MAXPATHLEN];
if (strchr(uri,':') != NULL || IS_ABSOLUTE_PATH(uri,strlen(uri))) {
strcpy(fn, uri);
if (strchr(uri,':') != NULL || IS_ABSOLUTE_PATH(uri,strlen(uri))) {
strcpy(fn, uri);
} else if (VCWD_REALPATH(uri, fn) == NULL) {
sdl = load_wsdl(uri);
}
if (sdl == NULL) {
char* key;
time_t t = time(0);
char md5str[33];
PHP_MD5_CTX context;
unsigned char digest[16];
int len = strlen(SOAP_GLOBAL(cache_dir));
md5str[0] = '\0';
PHP_MD5Init(&context);
PHP_MD5Update(&context, fn, strlen(fn));
PHP_MD5Final(digest, &context);
make_digest(md5str, digest);
key = do_alloca(len+sizeof("/wsdl-")-1+sizeof(md5str));
memcpy(key,SOAP_GLOBAL(cache_dir),len);
memcpy(key+len,"/wsdl-",sizeof("/wsdl-")-1);
memcpy(key+len+sizeof("/wsdl-")-1,md5str,sizeof(md5str));
char md5str[33];
PHP_MD5_CTX context;
unsigned char digest[16];
int len = strlen(SOAP_GLOBAL(cache_dir));
md5str[0] = '\0';
PHP_MD5Init(&context);
PHP_MD5Update(&context, fn, strlen(fn));
PHP_MD5Final(digest, &context);
make_digest(md5str, digest);
key = do_alloca(len+sizeof("/wsdl-")-1+sizeof(md5str));
memcpy(key,SOAP_GLOBAL(cache_dir),len);
memcpy(key+len,"/wsdl-",sizeof("/wsdl-")-1);
memcpy(key+len+sizeof("/wsdl-")-1,md5str,sizeof(md5str));
if ((sdl = get_sdl_from_cache(key, fn, t-SOAP_GLOBAL(cache_ttl))) == NULL) {
sdl = load_wsdl(fn);
@ -1984,11 +2014,6 @@ void delete_sdl(void *handle)
efree(tmp);
}
void delete_sdl_ptr(void *handle)
{
delete_sdl((sdlPtr*)handle);
}
static void delete_binding(void *data)
{
sdlBindingPtr binding = *((sdlBindingPtr*)data);

3
ext/soap/php_sdl.h

@ -228,12 +228,11 @@ sdlPtr get_sdl(char *uri TSRMLS_DC);
encodePtr get_encoder_from_prefix(sdlPtr sdl, xmlNodePtr data, const char *type);
encodePtr get_encoder(sdlPtr sdl, const char *ns, const char *type);
encodePtr get_encoder_ex(sdlPtr sdl, const char *nscat);
encodePtr get_encoder_ex(sdlPtr sdl, const char *nscat, int len);
sdlBindingPtr get_binding_from_type(sdlPtr sdl, int type);
sdlBindingPtr get_binding_from_name(sdlPtr sdl, char *name, char *ns);
void delete_sdl(void *handle);
void delete_sdl_ptr(void *handle);
#endif

8
ext/soap/php_xml.c

@ -78,7 +78,7 @@ static void soap_Comment(void *ctx, const xmlChar *value)
xmlDocPtr soap_xmlParseFile(const char *filename)
{
xmlParserCtxtPtr ctxt = NULL;
xmlParserCtxtPtr ctxt = NULL;
xmlDocPtr ret;
/*
@ -105,7 +105,7 @@ xmlDocPtr soap_xmlParseFile(const char *filename)
}
xmlFreeParserCtxt(ctxt);
} else {
ret = NULL;
ret = NULL;
}
/*
@ -120,7 +120,7 @@ xmlDocPtr soap_xmlParseFile(const char *filename)
xmlDocPtr soap_xmlParseMemory(const void *buf, size_t buf_size)
{
xmlParserCtxtPtr ctxt = NULL;
xmlParserCtxtPtr ctxt = NULL;
xmlDocPtr ret;
/*
@ -146,7 +146,7 @@ xmlDocPtr soap_xmlParseMemory(const void *buf, size_t buf_size)
}
xmlFreeParserCtxt(ctxt);
} else {
ret = NULL;
ret = NULL;
}
/*

323
ext/soap/soap.c

@ -56,11 +56,11 @@ static sdlParamPtr get_param(sdlFunctionPtr function, char *param_name, int inde
static sdlFunctionPtr get_function(sdlPtr sdl, const char *function_name);
static sdlFunctionPtr get_doc_function(sdlPtr sdl, xmlNodePtr node);
static sdlFunctionPtr deseralize_function_call(sdlPtr sdl, xmlDocPtr request, char* actor, zval *function_name, int *num_params, zval **parameters[], int *version, soapHeader **headers TSRMLS_DC);
static xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_name,char *uri,zval *ret, soapHeader *headers, int version TSRMLS_DC);
static xmlDocPtr seralize_function_call(zval *this_ptr, sdlFunctionPtr function, char *function_name, char *uri, zval **arguments, int arg_count, int version, HashTable *soap_headers TSRMLS_DC);
static xmlNodePtr seralize_parameter(sdlParamPtr param,zval *param_val,int index,char *name, int style, xmlNodePtr parent TSRMLS_DC);
static xmlNodePtr seralize_zval(zval *val, sdlParamPtr param, char *paramName, int style, xmlNodePtr parent TSRMLS_DC);
static sdlFunctionPtr deserialize_function_call(sdlPtr sdl, xmlDocPtr request, char* actor, zval *function_name, int *num_params, zval **parameters[], int *version, soapHeader **headers TSRMLS_DC);
static xmlDocPtr serialize_response_call(sdlFunctionPtr function, char *function_name,char *uri,zval *ret, soapHeader *headers, int version TSRMLS_DC);
static xmlDocPtr serialize_function_call(zval *this_ptr, sdlFunctionPtr function, char *function_name, char *uri, zval **arguments, int arg_count, int version, HashTable *soap_headers TSRMLS_DC);
static xmlNodePtr serialize_parameter(sdlParamPtr param,zval *param_val,int index,char *name, int style, xmlNodePtr parent TSRMLS_DC);
static xmlNodePtr serialize_zval(zval *val, sdlParamPtr param, char *paramName, int style, xmlNodePtr parent TSRMLS_DC);
static void delete_service(void *service);
static void delete_url(void *handle);
@ -482,7 +482,7 @@ PHP_MINIT_FUNCTION(soap)
INIT_CLASS_ENTRY(ce, PHP_SOAP_HEADER_CLASSNAME, soap_header_functions);
soap_header_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
le_sdl = register_list_destructors(delete_sdl, NULL);
le_url = register_list_destructors(delete_url, NULL);
le_service = register_list_destructors(delete_service, NULL);
@ -588,7 +588,7 @@ PHP_FUNCTION(soap_encode_to_xml)
}
enc = get_conversion(Z_TYPE_P(pzval));
ret = php_domobject_new(seralize_zval(pzval, NULL, name, SOAP_ENCODED), &found, NULL TSRMLS_CC);
ret = php_domobject_new(serialize_zval(pzval, NULL, name, SOAP_ENCODED), &found, NULL TSRMLS_CC);
*return_value = *ret;
zval_copy_ctor(return_value);
zval_ptr_dtor(&ret);
@ -1277,7 +1277,7 @@ PHP_METHOD(soapserver, handle)
old_sdl = SOAP_GLOBAL(sdl);
SOAP_GLOBAL(sdl) = service->sdl;
old_soap_version = SOAP_GLOBAL(soap_version);
function = deseralize_function_call(service->sdl, doc_request, service->actor, &function_name, &num_params, &params, &soap_version, &soap_headers TSRMLS_CC);
function = deserialize_function_call(service->sdl, doc_request, service->actor, &function_name, &num_params, &params, &soap_version, &soap_headers TSRMLS_CC);
xmlFreeDoc(doc_request);
if (service->type == SOAP_CLASS) {
@ -1425,7 +1425,7 @@ PHP_METHOD(soapserver, handle)
memcpy(response_name+Z_STRLEN(function_name),"Response",sizeof("Response"));
}
SOAP_GLOBAL(overrides) = service->mapping;
doc_return = seralize_response_call(function, response_name, service->uri, &retval, soap_headers, soap_version TSRMLS_CC);
doc_return = serialize_response_call(function, response_name, service->uri, &retval, soap_headers, soap_version TSRMLS_CC);
SOAP_GLOBAL(overrides) = NULL;
efree(response_name);
} else {
@ -1513,7 +1513,7 @@ static void soap_server_fault_ex(zval* fault TSRMLS_DC)
soap_version = SOAP_GLOBAL(soap_version);
doc_return = seralize_response_call(NULL, NULL, NULL, fault, NULL, soap_version TSRMLS_CC);
doc_return = serialize_response_call(NULL, NULL, NULL, fault, NULL, soap_version TSRMLS_CC);
xmlDocDumpMemory(doc_return, &buf, &size);
@ -1818,10 +1818,10 @@ static void do_soap_call(zval* this_ptr,
sdlBindingPtr binding = fn->binding;
if (binding->bindingType == BINDING_SOAP) {
sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)fn->bindingAttributes;
request = seralize_function_call(this_ptr, fn, NULL, fnb->input.ns, real_args, arg_count, soap_version, soap_headers TSRMLS_CC);
request = serialize_function_call(this_ptr, fn, NULL, fnb->input.ns, real_args, arg_count, soap_version, soap_headers TSRMLS_CC);
ret = send_http_soap_request(this_ptr, request, binding->location, fnb->soapAction, soap_version TSRMLS_CC);
} else {
request = seralize_function_call(this_ptr, fn, NULL, sdl->target_ns, real_args, arg_count, soap_version, soap_headers TSRMLS_CC);
request = serialize_function_call(this_ptr, fn, NULL, sdl->target_ns, real_args, arg_count, soap_version, soap_headers TSRMLS_CC);
ret = send_http_soap_request(this_ptr, request, binding->location, NULL, soap_version TSRMLS_CC);
}
@ -1855,7 +1855,7 @@ static void do_soap_call(zval* this_ptr,
if (call_uri == NULL) {
call_uri = Z_STRVAL_PP(uri);
}
request = seralize_function_call(this_ptr, NULL, function, call_uri, real_args, arg_count, soap_version, soap_headers TSRMLS_CC);
request = serialize_function_call(this_ptr, NULL, function, call_uri, real_args, arg_count, soap_version, soap_headers TSRMLS_CC);
if (soap_action == NULL) {
smart_str_appends(&action, call_uri);
@ -2160,7 +2160,7 @@ static void set_soap_fault(zval *obj, char *fault_code, char *fault_string, char
}
}
static void deseralize_parameters(xmlNodePtr params, sdlFunctionPtr function, int *num_params, zval ***parameters)
static void deserialize_parameters(xmlNodePtr params, sdlFunctionPtr function, int *num_params, zval ***parameters)
{
int cur_param = 0,num_of_params = 0;
zval **tmp_parameters = NULL;
@ -2263,14 +2263,14 @@ static sdlFunctionPtr find_function(sdlPtr sdl, xmlNodePtr func, zval* function_
INIT_ZVAL(*function_name);
if (function != NULL) {
ZVAL_STRING(function_name, (char *)function->functionName, 1);
} else{
} else {
ZVAL_STRING(function_name, (char *)func->name, 1);
}
return function;
}
static sdlFunctionPtr deseralize_function_call(sdlPtr sdl, xmlDocPtr request, char* actor, zval *function_name, int *num_params, zval ***parameters, int *version, soapHeader **headers TSRMLS_DC)
static sdlFunctionPtr deserialize_function_call(sdlPtr sdl, xmlDocPtr request, char* actor, zval *function_name, int *num_params, zval ***parameters, int *version, soapHeader **headers TSRMLS_DC)
{
char* envelope_ns = NULL;
xmlNodePtr trav,env,head,body,func;
@ -2474,20 +2474,20 @@ static sdlFunctionPtr deseralize_function_call(sdlPtr sdl, xmlDocPtr request, ch
if (!h->function && sdl && function && function->binding && function->binding->bindingType == BINDING_SOAP) {
sdlSoapBindingFunctionHeaderPtr *hdr;
sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)function->bindingAttributes;
if (fnb->input.headers) {
smart_str key = {0};
if (hdr_func->ns) {
smart_str_appends(&key, hdr_func->ns->href);
smart_str_appendc(&key, ':');
}
smart_str_appendl(&key, Z_STRVAL(h->function_name), Z_STRLEN(h->function_name));
smart_str_0(&key);
if (zend_hash_find(fnb->input.headers, key.c, key.len+1, (void**)&hdr) == SUCCESS) {
h->hdr = *hdr;
}
smart_str_free(&key);
}
if (fnb->input.headers) {
smart_str key = {0};
if (hdr_func->ns) {
smart_str_appends(&key, hdr_func->ns->href);
smart_str_appendc(&key, ':');
}
smart_str_appendl(&key, Z_STRVAL(h->function_name), Z_STRLEN(h->function_name));
smart_str_0(&key);
if (zend_hash_find(fnb->input.headers, key.c, key.len+1, (void**)&hdr) == SUCCESS) {
h->hdr = *hdr;
}
smart_str_free(&key);
}
}
if (h->hdr) {
h->num_params = 1;
@ -2500,7 +2500,7 @@ static sdlFunctionPtr deseralize_function_call(sdlPtr sdl, xmlDocPtr request, ch
hdr_func = hdr_func->children;
}
}
deseralize_parameters(hdr_func, h->function, &h->num_params, &h->parameters);
deserialize_parameters(hdr_func, h->function, &h->num_params, &h->parameters);
}
INIT_ZVAL(h->retval);
if (last == NULL) {
@ -2523,11 +2523,11 @@ ignore_header:
} else {
func = func->children;
}
deseralize_parameters(func, function, num_params, parameters);
deserialize_parameters(func, function, num_params, parameters);
return function;
}
static int seralize_response_call2(xmlNodePtr body, sdlFunctionPtr function, char *function_name, char *uri, zval *ret, int version, int main TSRMLS_DC)
static int serialize_response_call2(xmlNodePtr body, sdlFunctionPtr function, char *function_name, char *uri, zval *ret, int version, int main TSRMLS_DC)
{
xmlNodePtr method = NULL, param;
sdlParamPtr parameter = NULL;
@ -2575,13 +2575,13 @@ static int seralize_response_call2(xmlNodePtr body, sdlFunctionPtr function, cha
if (main && version == SOAP_1_2) {
xmlNs *rpc_ns = xmlNewNs(body, RPC_SOAP12_NAMESPACE, RPC_SOAP12_NS_PREFIX);
rpc_result = xmlNewChild(method, rpc_ns, "result", NULL);
param = seralize_parameter(parameter, ret, 0, "return", use, method TSRMLS_CC);
param = serialize_parameter(parameter, ret, 0, "return", use, method TSRMLS_CC);
xmlNodeSetContent(rpc_result,param->name);
} else {
param = seralize_parameter(parameter, ret, 0, "return", use, method TSRMLS_CC);
param = serialize_parameter(parameter, ret, 0, "return", use, method TSRMLS_CC);
}
} else {
param = seralize_parameter(parameter, ret, 0, "return", use, body TSRMLS_CC);
param = serialize_parameter(parameter, ret, 0, "return", use, body TSRMLS_CC);
if (function && function->binding->bindingType == BINDING_SOAP) {
sdlParamPtr *sparam;
@ -2611,9 +2611,9 @@ static int seralize_response_call2(xmlNodePtr body, sdlFunctionPtr function, cha
parameter = get_param(function, param_name, param_index, TRUE);
if (style == SOAP_RPC) {
param = seralize_parameter(parameter, *data, i, param_name, use, method TSRMLS_CC);
param = serialize_parameter(parameter, *data, i, param_name, use, method TSRMLS_CC);
} else {
param = seralize_parameter(parameter, *data, i, param_name, use, body TSRMLS_CC);
param = serialize_parameter(parameter, *data, i, param_name, use, body TSRMLS_CC);
if (function && function->binding->bindingType == BINDING_SOAP) {
sdlParamPtr *sparam;
@ -2635,7 +2635,7 @@ static int seralize_response_call2(xmlNodePtr body, sdlFunctionPtr function, cha
return use;
}
static xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_name, char *uri, zval *ret, soapHeader* headers, int version TSRMLS_DC)
static xmlDocPtr serialize_response_call(sdlFunctionPtr function, char *function_name, char *uri, zval *ret, soapHeader* headers, int version TSRMLS_DC)
{
xmlDocPtr doc;
xmlNodePtr envelope = NULL, body, param;
@ -2657,7 +2657,7 @@ static xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_
ns = xmlNewNs(envelope, SOAP_1_2_ENV_NAMESPACE, SOAP_1_2_ENV_NS_PREFIX);
xmlSetNs(envelope,ns);
} else {
php_error(E_ERROR, "Unknown SOAP version");
php_error(E_ERROR, "Unknown SOAP version");
}
xmlDocSetRootElement(doc, envelope);
@ -2697,8 +2697,8 @@ static xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_
}
if (zend_hash_find(prop, "detail", sizeof("detail"), (void**)&tmp) == SUCCESS &&
Z_TYPE_PP(tmp) != IS_NULL) {
/*FIXME: use = SOAP_ENCODED;*/
seralize_zval(*tmp, NULL, "detail", use, param TSRMLS_CC);
/*FIXME: use = SOAP_ENCODED;*/
serialize_zval(*tmp, NULL, "detail", use, param TSRMLS_CC);
}
} else {
HashTable* prop;
@ -2724,7 +2724,7 @@ static xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_
}
if (zend_hash_find(prop, "detail", sizeof("detail"), (void**)&tmp) == SUCCESS &&
Z_TYPE_PP(tmp) != IS_NULL) {
seralize_zval(*tmp, NULL, SOAP_1_2_ENV_NS_PREFIX":Detail", use, param TSRMLS_CC);
serialize_zval(*tmp, NULL, SOAP_1_2_ENV_NS_PREFIX":Detail", use, param TSRMLS_CC);
}
}
} else {
@ -2783,7 +2783,7 @@ static xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_
}
if (h->function) {
if (seralize_response_call2(head, h->function, Z_STRVAL(h->function_name), uri, hdr_ret, version, 0 TSRMLS_CC) == SOAP_ENCODED) {
if (serialize_response_call2(head, h->function, Z_STRVAL(h->function_name), uri, hdr_ret, version, 0 TSRMLS_CC) == SOAP_ENCODED) {
use = SOAP_ENCODED;
}
} else {
@ -2808,7 +2808,7 @@ static xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_
body = xmlNewChild(envelope, ns, "Body", NULL);
if (seralize_response_call2(body, function, function_name, uri, ret, version, 1 TSRMLS_CC) == SOAP_ENCODED) {
if (serialize_response_call2(body, function, function_name, uri, ret, version, 1 TSRMLS_CC) == SOAP_ENCODED) {
use = SOAP_ENCODED;
}
@ -2828,7 +2828,7 @@ static xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_
return doc;
}
static xmlDocPtr seralize_function_call(zval *this_ptr, sdlFunctionPtr function, char *function_name, char *uri, zval **arguments, int arg_count, int version, HashTable *soap_headers TSRMLS_DC)
static xmlDocPtr serialize_function_call(zval *this_ptr, sdlFunctionPtr function, char *function_name, char *uri, zval **arguments, int arg_count, int version, HashTable *soap_headers TSRMLS_DC)
{
xmlDoc *doc;
xmlNodePtr envelope = NULL, body, method = NULL, head = NULL;
@ -2903,9 +2903,9 @@ static xmlDocPtr seralize_function_call(zval *this_ptr, sdlFunctionPtr function,
sdlParamPtr parameter = get_param(function, NULL, i, FALSE);
if (style == SOAP_RPC) {
param = seralize_parameter(parameter, arguments[i], i, NULL, use, method TSRMLS_CC);
param = serialize_parameter(parameter, arguments[i], i, NULL, use, method TSRMLS_CC);
} else if (style == SOAP_DOCUMENT) {
param = seralize_parameter(parameter, arguments[i], i, NULL, use, body TSRMLS_CC);
param = serialize_parameter(parameter, arguments[i], i, NULL, use, body TSRMLS_CC);
if (function && function->binding->bindingType == BINDING_SOAP) {
sdlParamPtr *sparam;
@ -2923,78 +2923,78 @@ static xmlDocPtr seralize_function_call(zval *this_ptr, sdlFunctionPtr function,
zend_hash_internal_pointer_reset(soap_headers);
while (zend_hash_get_current_data(soap_headers,(void**)&header) == SUCCESS) {
HashTable *ht = Z_OBJPROP_PP(header);
zval **name, **ns, **tmp;
if (zend_hash_find(ht, "name", sizeof("name"), (void**)&name) == SUCCESS &&
Z_TYPE_PP(name) == IS_STRING &&
zend_hash_find(ht, "namespace", sizeof("namespace"), (void**)&ns) == SUCCESS &&
Z_TYPE_PP(ns) == IS_STRING) {
xmlNodePtr h;
xmlNsPtr nsptr;
int hdr_use = SOAP_LITERAL;
encodePtr enc = NULL;
if (hdrs) {
smart_str key = {0};
sdlSoapBindingFunctionHeaderPtr *hdr;
smart_str_appendl(&key, Z_STRVAL_PP(ns), Z_STRLEN_PP(ns));
smart_str_appendc(&key, ':');
smart_str_appendl(&key, Z_STRVAL_PP(name), Z_STRLEN_PP(name));
smart_str_0(&key);
if (zend_hash_find(hdrs, key.c, key.len+1,(void**)&hdr) == SUCCESS) {
hdr_use = (*hdr)->use;
enc = (*hdr)->encode;
if (hdr_use == SOAP_ENCODED) {
use = SOAP_ENCODED;
}
}
smart_str_free(&key);
}
if (zend_hash_find(ht, "data", sizeof("data"), (void**)&tmp) == SUCCESS) {
h = master_to_xml(enc, *tmp, hdr_use, head);
xmlNodeSetName(h, Z_STRVAL_PP(name));
} else {
h = xmlNewNode(NULL, Z_STRVAL_PP(name));
xmlAddChild(head,h);
}
nsptr = encode_add_ns(h,Z_STRVAL_PP(ns));
HashTable *ht = Z_OBJPROP_PP(header);
zval **name, **ns, **tmp;
if (zend_hash_find(ht, "name", sizeof("name"), (void**)&name) == SUCCESS &&
Z_TYPE_PP(name) == IS_STRING &&
zend_hash_find(ht, "namespace", sizeof("namespace"), (void**)&ns) == SUCCESS &&
Z_TYPE_PP(ns) == IS_STRING) {
xmlNodePtr h;
xmlNsPtr nsptr;
int hdr_use = SOAP_LITERAL;
encodePtr enc = NULL;
if (hdrs) {
smart_str key = {0};
sdlSoapBindingFunctionHeaderPtr *hdr;
smart_str_appendl(&key, Z_STRVAL_PP(ns), Z_STRLEN_PP(ns));
smart_str_appendc(&key, ':');
smart_str_appendl(&key, Z_STRVAL_PP(name), Z_STRLEN_PP(name));
smart_str_0(&key);
if (zend_hash_find(hdrs, key.c, key.len+1,(void**)&hdr) == SUCCESS) {
hdr_use = (*hdr)->use;
enc = (*hdr)->encode;
if (hdr_use == SOAP_ENCODED) {
use = SOAP_ENCODED;
}
}
smart_str_free(&key);
}
if (zend_hash_find(ht, "data", sizeof("data"), (void**)&tmp) == SUCCESS) {
h = master_to_xml(enc, *tmp, hdr_use, head);
xmlNodeSetName(h, Z_STRVAL_PP(name));
} else {
h = xmlNewNode(NULL, Z_STRVAL_PP(name));
xmlAddChild(head,h);
}
nsptr = encode_add_ns(h,Z_STRVAL_PP(ns));
xmlSetNs(h, nsptr);
if (zend_hash_find(ht, "mustUnderstand", sizeof("mustUnderstand"), (void**)&tmp) == SUCCESS &&
Z_TYPE_PP(tmp) == IS_BOOL && Z_LVAL_PP(tmp)) {
if (version == SOAP_1_1) {
xmlSetProp(h, SOAP_1_1_ENV_NS_PREFIX":mustUnderstand","1");
} else {
xmlSetProp(h, SOAP_1_2_ENV_NS_PREFIX":mustUnderstand","true");
}
}
if (zend_hash_find(ht, "actor", sizeof("actor"), (void**)&tmp) == SUCCESS) {
if (Z_TYPE_PP(tmp) == IS_STRING) {
if (version == SOAP_1_1) {
xmlSetProp(h, SOAP_1_1_ENV_NS_PREFIX":actor",Z_STRVAL_PP(tmp));
} else {
xmlSetProp(h, SOAP_1_2_ENV_NS_PREFIX":role",Z_STRVAL_PP(tmp));
}
} else if (Z_TYPE_PP(tmp) == IS_LONG) {
if (version == SOAP_1_1) {
if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NEXT) {
xmlSetProp(h, SOAP_1_1_ENV_NS_PREFIX":actor",SOAP_1_1_ACTOR_NEXT);
}
} else {
if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NEXT) {
xmlSetProp(h, SOAP_1_2_ENV_NS_PREFIX":role",SOAP_1_2_ACTOR_NEXT);
} else if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NONE) {
xmlSetProp(h, SOAP_1_2_ENV_NS_PREFIX":role",SOAP_1_2_ACTOR_NONE);
} else if (Z_LVAL_PP(tmp) == SOAP_ACTOR_UNLIMATERECEIVER) {
xmlSetProp(h, SOAP_1_2_ENV_NS_PREFIX":role",SOAP_1_2_ACTOR_UNLIMATERECEIVER);
}
}
}
}
}
if (zend_hash_find(ht, "mustUnderstand", sizeof("mustUnderstand"), (void**)&tmp) == SUCCESS &&
Z_TYPE_PP(tmp) == IS_BOOL && Z_LVAL_PP(tmp)) {
if (version == SOAP_1_1) {
xmlSetProp(h, SOAP_1_1_ENV_NS_PREFIX":mustUnderstand","1");
} else {
xmlSetProp(h, SOAP_1_2_ENV_NS_PREFIX":mustUnderstand","true");
}
}
if (zend_hash_find(ht, "actor", sizeof("actor"), (void**)&tmp) == SUCCESS) {
if (Z_TYPE_PP(tmp) == IS_STRING) {
if (version == SOAP_1_1) {
xmlSetProp(h, SOAP_1_1_ENV_NS_PREFIX":actor",Z_STRVAL_PP(tmp));
} else {
xmlSetProp(h, SOAP_1_2_ENV_NS_PREFIX":role",Z_STRVAL_PP(tmp));
}
} else if (Z_TYPE_PP(tmp) == IS_LONG) {
if (version == SOAP_1_1) {
if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NEXT) {
xmlSetProp(h, SOAP_1_1_ENV_NS_PREFIX":actor",SOAP_1_1_ACTOR_NEXT);
}
} else {
if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NEXT) {
xmlSetProp(h, SOAP_1_2_ENV_NS_PREFIX":role",SOAP_1_2_ACTOR_NEXT);
} else if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NONE) {
xmlSetProp(h, SOAP_1_2_ENV_NS_PREFIX":role",SOAP_1_2_ACTOR_NONE);
} else if (Z_LVAL_PP(tmp) == SOAP_ACTOR_UNLIMATERECEIVER) {
xmlSetProp(h, SOAP_1_2_ENV_NS_PREFIX":role",SOAP_1_2_ACTOR_UNLIMATERECEIVER);
}
}
}
}
}
zend_hash_move_forward(soap_headers);
}
}
@ -3016,7 +3016,7 @@ static xmlDocPtr seralize_function_call(zval *this_ptr, sdlFunctionPtr function,
return doc;
}
static xmlNodePtr seralize_parameter(sdlParamPtr param, zval *param_val, int index, char *name, int style, xmlNodePtr parent TSRMLS_DC)
static xmlNodePtr serialize_parameter(sdlParamPtr param, zval *param_val, int index, char *name, int style, xmlNodePtr parent TSRMLS_DC)
{
char *paramName;
xmlNodePtr xmlParam;
@ -3028,9 +3028,9 @@ static xmlNodePtr seralize_parameter(sdlParamPtr param, zval *param_val, int ind
zval **param_data;
if (zend_hash_find(Z_OBJPROP_P(param_val), "param_name", sizeof("param_name"), (void **)&param_name) == SUCCESS &&
zend_hash_find(Z_OBJPROP_P(param_val), "param_data", sizeof("param_data"), (void **)&param_data) == SUCCESS) {
param_val = *param_data;
name = Z_STRVAL_PP(param_name);
zend_hash_find(Z_OBJPROP_P(param_val), "param_data", sizeof("param_data"), (void **)&param_data) == SUCCESS) {
param_val = *param_data;
name = Z_STRVAL_PP(param_name);
}
}
@ -3045,12 +3045,12 @@ static xmlNodePtr seralize_parameter(sdlParamPtr param, zval *param_val, int ind
}
}
xmlParam = seralize_zval(param_val, param, paramName, style, parent TSRMLS_CC);
xmlParam = serialize_zval(param_val, param, paramName, style, parent TSRMLS_CC);
return xmlParam;
}
static xmlNodePtr seralize_zval(zval *val, sdlParamPtr param, char *paramName, int style, xmlNodePtr parent TSRMLS_DC)
static xmlNodePtr serialize_zval(zval *val, sdlParamPtr param, char *paramName, int style, xmlNodePtr parent TSRMLS_DC)
{
xmlNodePtr xmlParam;
encodePtr enc;
@ -3137,30 +3137,25 @@ static sdlFunctionPtr get_doc_function(sdlPtr sdl, xmlNodePtr params)
zend_hash_internal_pointer_reset((*tmp)->requestParameters);
while (zend_hash_get_current_data((*tmp)->requestParameters, (void**)&param) == SUCCESS) {
if ((*param)->element) {
if (strcmp((*param)->element->name,node->name) != 0) {
ok = 0;
break;
}
if ((*param)->element->namens != NULL && node->ns != NULL) {
if (strcmp((*param)->element->namens,node->ns->href) != 0) {
ok = 0;
break;
}
} else if ((void*)(*param)->element->namens != (void*)node->ns) {
ok = 0;
break;
}
} else if (strcmp((*param)->paramName,node->name) != 0) {
ok = 0;
break;
}
if ((*param)->element) {
if (strcmp((*param)->element->name,node->name) != 0) {
ok = 0;
break;
}
if ((*param)->element->namens != NULL && node->ns != NULL) {
if (strcmp((*param)->element->namens,node->ns->href) != 0) {
ok = 0;
break;
}
} else if ((void*)(*param)->element->namens != (void*)node->ns) {
ok = 0;
break;
}
} else if (strcmp((*param)->paramName,node->name) != 0) {
ok = 0;
break;
}
zend_hash_move_forward((*tmp)->requestParameters);
/*
do {
node = node->next;
} while (node != NULL && node->type != XML_ELEMENT_NODE);
*/
}
if (ok /*&& node == NULL*/) {
return (*tmp);
@ -3180,7 +3175,7 @@ static void function_to_string(sdlFunctionPtr function, smart_str *buf)
HashPosition pos;
sdlParamPtr *param;
if (function->responseParameters &&
if (function->responseParameters &&
zend_hash_num_elements(function->responseParameters) > 0) {
if (zend_hash_num_elements(function->responseParameters) == 1) {
param = function->responseParameters->pListHead->pData;
@ -3244,7 +3239,7 @@ static void model_to_string(sdlContentModelPtr model, smart_str *buf, int level)
switch (model->kind) {
case XSD_CONTENT_ELEMENT:
type_to_string(model->u.element, buf, level);
smart_str_appendl(buf, ";\n", 2);
smart_str_appendl(buf, ";\n", 2);
break;
case XSD_CONTENT_SEQUENCE:
case XSD_CONTENT_ALL:
@ -3298,23 +3293,23 @@ static void type_to_string(sdlTypePtr type, smart_str *buf, int level)
sizeof(SOAP_1_1_ENC_NAMESPACE":arrayType"),
(void **)&attr) == SUCCESS &&
zend_hash_find((*attr)->extraAttributes, WSDL_NAMESPACE":arrayType", sizeof(WSDL_NAMESPACE":arrayType"), (void **)&ext) == SUCCESS) {
char *end = strchr((*ext)->val, '[');
int len;
if (end == NULL) {
len = strlen((*ext)->val);
} else {
len = end-(*ext)->val;
}
if (len == 0) {
char *end = strchr((*ext)->val, '[');
int len;
if (end == NULL) {
len = strlen((*ext)->val);
} else {
len = end-(*ext)->val;
}
if (len == 0) {
smart_str_appendl(buf, "anyType", 7);
} else {
smart_str_appendl(buf, (*ext)->val, len);
}
smart_str_appendc(buf, ' ');
smart_str_appendl(buf, type->name, strlen(type->name));
if (end != NULL) {
if (end != NULL) {
smart_str_appends(buf, end);
}
}
} else {
sdlTypePtr elementType;
if (type->attributes &&
@ -3360,15 +3355,15 @@ static void type_to_string(sdlTypePtr type, smart_str *buf, int level)
enc->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
enc = enc->details.sdl_type->encode;
}
if (enc) {
if (enc) {
smart_str_appendl(buf, spaces.c, spaces.len);
smart_str_appendc(buf, ' ');
smart_str_appendl(buf, type->encode->details.type_str, strlen(type->encode->details.type_str));
smart_str_appendl(buf, " _;\n", 4);
smart_str_appendl(buf, " _;\n", 4);
}
}
if (type->model) {
model_to_string(type->model, buf, level+1);
model_to_string(type->model, buf, level+1);
}
if (type->attributes) {
sdlAttributePtr *attr;
@ -3383,8 +3378,8 @@ static void type_to_string(sdlTypePtr type, smart_str *buf, int level)
} else {
smart_str_appendl(buf, "UNKNOWN ", 8);
}
smart_str_appends(buf, (*attr)->name);
smart_str_appendl(buf, ";\n", 2);
smart_str_appends(buf, (*attr)->name);
smart_str_appendl(buf, ";\n", 2);
zend_hash_move_forward_ex(type->attributes, &pos);
}
}

Loading…
Cancel
Save