static zval *to_zval_map(encodeTypePtr type, xmlNodePtr data);
static zval *to_zval_null(encodeTypePtr type, xmlNodePtr data);
-static xmlNodePtr to_xml_long(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_ulong(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_double(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_bool(encodeTypePtr type, zval *data, int style);
+static xmlNodePtr to_xml_long(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_ulong(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_double(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_bool(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
/* String encode */
-static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_stringl(encodeTypePtr type, zval *data, int style);
+static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_stringl(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
/* Null encode */
-static xmlNodePtr to_xml_null(encodeTypePtr type, zval *data, int style);
+static xmlNodePtr to_xml_null(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
/* Array encode */
-static xmlNodePtr guess_array_map(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style);
+static xmlNodePtr guess_array_map(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
-static xmlNodePtr to_xml_list(encodeTypePtr enc, zval *data, int style);
-static xmlNodePtr to_xml_list1(encodeTypePtr enc, zval *data, int style);
+static xmlNodePtr to_xml_list(encodeTypePtr enc, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_list1(encodeTypePtr enc, zval *data, int style, xmlNodePtr parent);
/* Datetime encode/decode */
-static xmlNodePtr to_xml_datetime_ex(encodeTypePtr type, zval *data, char *format, int style);
-static xmlNodePtr to_xml_datetime(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_time(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_date(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_gyearmonth(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_gyear(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_gmonthday(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_gday(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_gmonth(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_duration(encodeTypePtr type, zval *data, int style);
+static xmlNodePtr to_xml_datetime_ex(encodeTypePtr type, zval *data, char *format, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_datetime(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_time(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_date(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_gyearmonth(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_gyear(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_gmonthday(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_gday(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_gmonth(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_duration(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data);
static zval *to_zval_array(encodeTypePtr type, xmlNodePtr data);
-static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style);
-static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style);
+static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
+static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
/* Try and guess for non-wsdl clients and servers */
static zval *guess_zval_convert(encodeTypePtr type, xmlNodePtr data);
-static xmlNodePtr guess_xml_convert(encodeTypePtr type, zval *data, int style);
+static xmlNodePtr guess_xml_convert(encodeTypePtr type, zval *data, int style, xmlNodePtr parent);
static int is_map(zval *array);
static void get_array_type(xmlNodePtr node, zval *array, smart_str *out_type TSRMLS_DC);
free_alloca(tmp);
}
-xmlNodePtr master_to_xml(encodePtr encode, zval *data, int style)
+xmlNodePtr master_to_xml(encodePtr encode, zval *data, int style, xmlNodePtr parent)
{
xmlNodePtr node = NULL;
TSRMLS_FETCH();
data = encode->to_xml_before(&encode->details, data);
}
if (encode->to_xml) {
- node = encode->to_xml(&encode->details, data, style);
+ node = encode->to_xml(&encode->details, data, style, parent);
}
if (encode->to_xml_after) {
node = encode->to_xml_after(&encode->details, node, style);
return data;
}
-xmlNodePtr to_xml_user(encodeTypePtr type, zval *data, int style)
+xmlNodePtr to_xml_user(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
zval *ret, **addr;
xmlNodePtr node;
return ret;
}
-static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
xmlNodePtr ret;
char *str;
int new_len;
TSRMLS_FETCH();
- ret = xmlNewNode(NULL, "BOGUS");
+ ret = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, ret);
FIND_ZVAL_NULL(data, ret, style);
if (Z_TYPE_P(data) == IS_STRING) {
return ret;
}
-static xmlNodePtr to_xml_stringl(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_stringl(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
xmlNodePtr ret;
- ret = xmlNewNode(NULL, "BOGUS");
+ ret = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, ret);
FIND_ZVAL_NULL(data, ret, style);
if (Z_TYPE_P(data) == IS_STRING) {
return ret;
}
-static xmlNodePtr to_xml_long(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_long(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
xmlNodePtr ret;
zval tmp;
- ret = xmlNewNode(NULL, "BOGUS");
+ ret = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, ret);
FIND_ZVAL_NULL(data, ret, style);
tmp = *data;
return ret;
}
-static xmlNodePtr to_xml_ulong(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_ulong(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
xmlNodePtr ret;
- ret = xmlNewNode(NULL, "BOGUS");
+ ret = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, ret);
FIND_ZVAL_NULL(data, ret, style);
if (Z_TYPE_P(data) == IS_DOUBLE) {
return ret;
}
-static xmlNodePtr to_xml_double(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_double(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
xmlNodePtr ret;
zval tmp;
- ret = xmlNewNode(NULL, "BOGUS");
+ ret = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, ret);
FIND_ZVAL_NULL(data, ret, style);
tmp = *data;
return ret;
}
-static xmlNodePtr to_xml_bool(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_bool(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
xmlNodePtr ret;
zval tmp;
- ret = xmlNewNode(NULL, "BOGUS");
+ ret = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, ret);
FIND_ZVAL_NULL(data, ret, style);
if (Z_TYPE_P(data) != IS_BOOL) {
return ret;
}
-static xmlNodePtr to_xml_null(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_null(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
- xmlNodePtr ret = xmlNewNode(NULL, "BOGUS");
+ xmlNodePtr ret;
+ ret = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, ret);
if (style == SOAP_ENCODED) {
xmlSetProp(ret, "xsi:nil", "1");
}
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) {
+ sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
ret = master_to_zval(sdlType->encode, data);
FIND_XML_NULL(data, ret);
} else {
zend_hash_internal_pointer_reset(ht);
while (zend_hash_get_current_data(ht,(void**)&val) == SUCCESS) {
- property = master_to_xml(enc, *val, style);
+ property = master_to_xml(enc, *val, style, node);
xmlNodeSetName(property, model->u.element->name);
- xmlAddChild(node, property);
zend_hash_move_forward(ht);
}
} else {
- property = master_to_xml(enc, *data, style);
+ property = master_to_xml(enc, *data, style, node);
xmlNodeSetName(property, model->u.element->name);
- xmlAddChild(node, property);
}
return 1;
} else if (model->min_occurs == 0) {
return 1;
}
-static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
xmlNodePtr xmlParam;
HashTable *prop;
enc = get_conversion(Z_LVAL_P(*ztype));
if (zend_hash_find(Z_OBJPROP_P(data), "enc_value", sizeof("enc_value"), (void **)&zdata) == FAILURE) {
- xmlParam = master_to_xml(enc, NULL, style);
+ xmlParam = master_to_xml(enc, NULL, style, parent);
} else {
- xmlParam = master_to_xml(enc, *zdata, style);
+ xmlParam = master_to_xml(enc, *zdata, style, parent);
}
if (zend_hash_find(Z_OBJPROP_P(data), "enc_stype", sizeof("enc_stype"), (void **)&zstype) == SUCCESS) {
xmlNodeSetName(xmlParam, Z_STRVAL_PP(zname));
}
if (zend_hash_find(Z_OBJPROP_P(data), "enc_namens", sizeof("enc_namens"), (void **)&znamens) == SUCCESS) {
- smart_str *ns;
- xmlNsPtr nsp;
-
- ns = encode_new_ns();
- nsp = xmlNewNs(xmlParam, Z_STRVAL_PP(znamens), ns->c);
+ xmlNsPtr nsp = encode_add_ns(xmlParam, Z_STRVAL_PP(znamens));
xmlSetNs(xmlParam, nsp);
- smart_str_free(ns);
- efree(ns);
}
} else if (sdlType) {
prop = NULL;
if (enc) {
zval **tmp;
if (prop && zend_hash_find(prop, "_", sizeof("_"), (void**)&tmp) == SUCCESS) {
- xmlParam = master_to_xml(enc, *tmp, style);
+ xmlParam = master_to_xml(enc, *tmp, style, parent);
} else if (prop == NULL) {
- xmlParam = master_to_xml(enc, data, style);
+ xmlParam = master_to_xml(enc, data, style, parent);
} else {
- xmlParam = xmlNewNode(NULL, "BOGUS");
+ xmlParam = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, xmlParam);
}
} else {
- xmlParam = xmlNewNode(NULL, "BOGUS");
+ xmlParam = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, xmlParam);
}
} 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) {
- xmlParam = master_to_xml(sdlType->encode, data, style);
+ sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_UNION) {
+ xmlParam = master_to_xml(sdlType->encode, data, style, parent);
} else {
zval **tmp;
if (prop && zend_hash_find(prop, "_", sizeof("_"), (void**)&tmp) == SUCCESS) {
- xmlParam = master_to_xml(sdlType->encode, *tmp, style);
+ xmlParam = master_to_xml(sdlType->encode, *tmp, style, parent);
} else if (prop == NULL) {
- xmlParam = master_to_xml(sdlType->encode, data, style);
+ xmlParam = master_to_xml(sdlType->encode, data, style, parent);
} else {
- xmlParam = xmlNewNode(NULL, "BOGUS");
+ xmlParam = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, xmlParam);
}
}
} else {
- xmlParam = xmlNewNode(NULL, "BOGUS");
+ xmlParam = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, xmlParam);
}
FIND_ZVAL_NULL(data, xmlParam, style);
if (zend_hash_find(prop, (*attr)->name, strlen((*attr)->name)+1, (void**)&data) == SUCCESS) {
xmlNodePtr dummy;
- dummy = master_to_xml((*attr)->encode, *data, SOAP_LITERAL);
+ dummy = master_to_xml((*attr)->encode, *data, SOAP_LITERAL, xmlParam);
if (dummy->children && dummy->children->content) {
if ((*attr)->fixed && strcmp((*attr)->fixed,dummy->children->content) != 0) {
php_error(E_ERROR,"Attribute '%s' has fixed value '%s' (value '%s' is not allowed)",(*attr)->name,(*attr)->fixed,dummy->children->content);
}
xmlSetProp(xmlParam, (*attr)->name, dummy->children->content);
}
+ xmlUnlinkNode(dummy);
xmlFreeNode(dummy);
}
}
set_ns_and_type(xmlParam, type);
}
} else {
- xmlParam = xmlNewNode(NULL, "BOGUS");
+ xmlParam = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, xmlParam);
FIND_ZVAL_NULL(data, xmlParam, style);
prop = NULL;
zend_hash_get_current_key(prop, &str_key, NULL, FALSE);
zend_hash_get_current_data(prop, (void **)&zprop);
- property = master_to_xml(get_conversion((*zprop)->type), (*zprop), style);
+ property = master_to_xml(get_conversion((*zprop)->type), (*zprop), style, xmlParam);
xmlNodeSetName(property, str_key);
- xmlAddChild(xmlParam, property);
zend_hash_move_forward(prop);
}
}
}
/* Array encode/decode */
-static xmlNodePtr guess_array_map(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr guess_array_map(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
encodePtr enc = NULL;
TSRMLS_FETCH();
enc = get_conversion(IS_NULL);
}
- return master_to_xml(enc, data, style);
+ return master_to_xml(enc, data, style, parent);
}
static int calc_dimension_12(const char* str)
static void add_xml_array_elements(xmlNodePtr xmlParam,
sdlTypePtr type,
encodePtr enc,
+ xmlNsPtr ns,
int dimension ,
int* dims,
zval* data,
zend_hash_internal_pointer_reset(data->value.ht);
for (j=0; j<dims[0]; j++) {
zval **zdata;
-
+
if (zend_hash_get_current_data(data->value.ht, (void **)&zdata) != SUCCESS) {
zdata = NULL;
}
if (zdata) {
if (enc == NULL) {
TSRMLS_FETCH();
- xparam = master_to_xml(get_conversion((*zdata)->type), (*zdata), style);
+ xparam = master_to_xml(get_conversion((*zdata)->type), (*zdata), style, xmlParam);
} else {
- xparam = master_to_xml(enc, (*zdata), style);
+ xparam = master_to_xml(enc, (*zdata), style, xmlParam);
}
} else {
- xparam = xmlNewNode(NULL, "BOGUS");
+ xparam = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(xmlParam, xparam);
}
if (type) {
xmlNodeSetName(xparam, type->name);
} else if (style == SOAP_LITERAL && enc && enc->details.type_str) {
xmlNodeSetName(xparam, enc->details.type_str);
+ xmlSetNs(xparam, ns);
} else {
- xmlNodeSetName(xparam, "val");
+ xmlNodeSetName(xparam, "item");
}
- xmlAddChild(xmlParam, xparam);
} else {
if (zdata) {
- add_xml_array_elements(xmlParam, type, enc, dimension-1, dims+1, *zdata, style);
+ add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, *zdata, style);
} else {
- add_xml_array_elements(xmlParam, type, enc, dimension-1, dims+1, NULL, style);
+ add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, NULL, style);
}
}
zend_hash_move_forward(data->value.ht);
if (dimension == 1) {
xmlNodePtr xparam;
- xparam = xmlNewNode(NULL, "BOGUS");
+ xparam = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(xmlParam, xparam);
if (type) {
xmlNodeSetName(xparam, type->name);
} else if (style == SOAP_LITERAL && enc && enc->details.type_str) {
xmlNodeSetName(xparam, enc->details.type_str);
+ xmlSetNs(xparam, ns);
} else {
- xmlNodeSetName(xparam, "val");
+ xmlNodeSetName(xparam, "item");
}
- xmlAddChild(xmlParam, xparam);
} else {
- add_xml_array_elements(xmlParam, type, enc, dimension-1, dims+1, NULL, style);
+ add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, NULL, style);
}
- }
+ }
}
}
return 0;
}
-static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
sdlTypePtr sdl_type = type->sdl_type;
+ sdlTypePtr element_type = NULL;
smart_str array_type = {0}, array_size = {0};
int i;
xmlNodePtr xmlParam;
soap_version = SOAP_GLOBAL(soap_version);
xmlParam = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, xmlParam);
FIND_ZVAL_NULL(data, xmlParam, style);
(void **)&arrayType) == SUCCESS &&
zend_hash_find((*arrayType)->extraAttributes, WSDL_NAMESPACE":arraySize", sizeof(WSDL_NAMESPACE":arraysize"), (void **)&arrayTypeAttr) == SUCCESS) {
attr = *arrayTypeAttr;
-
+
dimension = calc_dimension_12(attr->children->content);
dims = get_position_12(dimension, attr->children->content);
if (dims[0] == 0) {dims[0] = i;}
-
+
smart_str_append_long(&array_size, dims[0]);
for (i=1; i<dimension; i++) {
smart_str_appendc(&array_size, ',');
smart_str_appendc(&array_size, ',');
smart_str_append_long(&array_size, dims[i]);
}
-
+
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;
enc = elementType->encode;
get_type_str(xmlParam, elementType->encode->details.ns, elementType->encode->details.type_str, &array_type);
} else {
(elementType = *(sdlTypePtr*)sdl_type->elements->pListHead->pData) != NULL &&
elementType->encode && elementType->encode->details.type_str) {
+ element_type = elementType;
enc = elementType->encode;
-
get_type_str(xmlParam, elementType->encode->details.ns, elementType->encode->details.type_str, &array_type);
smart_str_append_long(&array_size, i);
smart_str_free(&array_type);
smart_str_free(&array_size);
- add_xml_array_elements(xmlParam, sdl_type, enc, dimension, dims, data, style);
+ add_xml_array_elements(xmlParam, element_type, enc, enc?encode_add_ns(xmlParam,enc->details.ns):NULL, dimension, dims, data, style);
efree(dims);
}
if (style == SOAP_ENCODED) {
}
/* Map encode/decode */
-static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
xmlNodePtr xmlParam;
int i;
TSRMLS_FETCH();
- xmlParam = xmlNewNode(NULL, "BOGUS");
+ xmlParam = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, xmlParam);
FIND_ZVAL_NULL(data, xmlParam, style);
if (Z_TYPE_P(data) == IS_ARRAY) {
zend_hash_get_current_data(data->value.ht, (void **)&temp_data);
if (Z_TYPE_PP(temp_data) != IS_NULL) {
- item = xmlNewNode(NULL, "item");
- key = xmlNewNode(NULL, "key");
+ item = xmlNewNode(NULL,"item");
+ xmlAddChild(xmlParam, item);
+ key = xmlNewNode(NULL,"key");
+ xmlAddChild(item,key);
if (zend_hash_get_current_key(data->value.ht, &key_val, (long *)&int_val, FALSE) == HASH_KEY_IS_STRING) {
if (style == SOAP_ENCODED) {
xmlSetProp(key, "xsi:type", "xsd:string");
enc = get_conversion((*temp_data)->type);
- xparam = master_to_xml(enc, (*temp_data), style);
+ xparam = master_to_xml(enc, (*temp_data), style, item);
xmlNodeSetName(xparam, "value");
- xmlAddChild(item, key);
- xmlAddChild(item, xparam);
- xmlAddChild(xmlParam, item);
}
zend_hash_move_forward(data->value.ht);
}
}
/* Unknown encode/decode */
-static xmlNodePtr guess_xml_convert(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr guess_xml_convert(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
encodePtr enc;
TSRMLS_FETCH();
} else {
enc = get_conversion(IS_NULL);
}
- return master_to_xml(enc, data, style);
+ return master_to_xml(enc, data, style, parent);
}
static zval *guess_zval_convert(encodeTypePtr type, xmlNodePtr data)
}
/* Time encode/decode */
-static xmlNodePtr to_xml_datetime_ex(encodeTypePtr type, zval *data, char *format, int style)
+static xmlNodePtr to_xml_datetime_ex(encodeTypePtr type, zval *data, char *format, int style, xmlNodePtr parent)
{
/* logic hacked from ext/standard/datetime.c */
struct tm *ta, tmbuf;
xmlNodePtr xmlParam;
- xmlParam = xmlNewNode(NULL, "BOGUS");
+ xmlParam = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, xmlParam);
FIND_ZVAL_NULL(data, xmlParam, style);
if (Z_TYPE_P(data) == IS_LONG) {
return xmlParam;
}
-static xmlNodePtr to_xml_duration(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_duration(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
/* TODO: '-'?P([0-9]+Y)?([0-9]+M)?([0-9]+D)?T([0-9]+H)?([0-9]+M)?([0-9]+S)? */
- return to_xml_string(type, data, style);
+ return to_xml_string(type, data, style, parent);
}
-static xmlNodePtr to_xml_datetime(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_datetime(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
- return to_xml_datetime_ex(type, data, "%Y-%m-%dT%H:%M:%S", style);
+ return to_xml_datetime_ex(type, data, "%Y-%m-%dT%H:%M:%S", style, parent);
}
-static xmlNodePtr to_xml_time(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_time(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
/* TODO: microsecconds */
- return to_xml_datetime_ex(type, data, "%H:%M:%S", style);
+ return to_xml_datetime_ex(type, data, "%H:%M:%S", style, parent);
}
-static xmlNodePtr to_xml_date(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_date(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
- return to_xml_datetime_ex(type, data, "%Y-%m-%d", style);
+ return to_xml_datetime_ex(type, data, "%Y-%m-%d", style, parent);
}
-static xmlNodePtr to_xml_gyearmonth(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_gyearmonth(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
- return to_xml_datetime_ex(type, data, "%Y-%m", style);
+ return to_xml_datetime_ex(type, data, "%Y-%m", style, parent);
}
-static xmlNodePtr to_xml_gyear(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_gyear(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
- return to_xml_datetime_ex(type, data, "%Y", style);
+ return to_xml_datetime_ex(type, data, "%Y", style, parent);
}
-static xmlNodePtr to_xml_gmonthday(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_gmonthday(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
- return to_xml_datetime_ex(type, data, "--%m-%d", style);
+ return to_xml_datetime_ex(type, data, "--%m-%d", style, parent);
}
-static xmlNodePtr to_xml_gday(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_gday(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
- return to_xml_datetime_ex(type, data, "---%d", style);
+ return to_xml_datetime_ex(type, data, "---%d", style, parent);
}
-static xmlNodePtr to_xml_gmonth(encodeTypePtr type, zval *data, int style)
+static xmlNodePtr to_xml_gmonth(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
{
- return to_xml_datetime_ex(type, data, "--%m--", style);
+ return to_xml_datetime_ex(type, data, "--%m--", style, parent);
}
static zval* to_zval_list(encodeTypePtr enc, xmlNodePtr data) {
return to_zval_stringc(enc, data);
}
-static xmlNodePtr to_xml_list(encodeTypePtr enc, zval *data, int style) {
+static xmlNodePtr to_xml_list(encodeTypePtr enc, zval *data, int style, xmlNodePtr parent) {
xmlNodePtr ret;
encodePtr list_enc = NULL;
}
}
- ret = xmlNewNode(NULL, "BOGUS");
+ ret = xmlNewNode(NULL,"BOGUS");
+ xmlAddChild(parent, ret);
FIND_ZVAL_NULL(data, ret, style);
if (Z_TYPE_P(data) == IS_ARRAY) {
zval **tmp;
zend_hash_internal_pointer_reset(ht);
while (zend_hash_get_current_data(ht, (void**)&tmp) == SUCCESS) {
- xmlNodePtr dummy = master_to_xml(list_enc, *tmp, style);
+ xmlNodePtr dummy = master_to_xml(list_enc, *tmp, SOAP_LITERAL, ret);
if (dummy && dummy->children && dummy->children->content) {
if (list.len != 0) {
smart_str_appendc(&list, ' ');
} else {
php_error(E_ERROR,"Violation of encoding rules");
}
+ xmlUnlinkNode(dummy);
xmlFreeNode(dummy);
zend_hash_move_forward(ht);
}
zval tmp = *data;
char *str, *start, *next;
smart_str list = {0};
-
+
if (Z_TYPE_P(data) != IS_STRING) {
zval_copy_ctor(&tmp);
convert_to_string(&tmp);
next++;
}
ZVAL_STRING(&dummy_zval, start, 0);
- dummy = master_to_xml(list_enc, &dummy_zval, style);
+ dummy = master_to_xml(list_enc, &dummy_zval, SOAP_LITERAL, ret);
if (dummy && dummy->children && dummy->children->content) {
if (list.len != 0) {
smart_str_appendc(&list, ' ');
} else {
php_error(E_ERROR,"Violation of encoding rules");
}
+ xmlUnlinkNode(dummy);
xmlFreeNode(dummy);
start = next;
return ret;
}
-static xmlNodePtr to_xml_list1(encodeTypePtr enc, zval *data, int style) {
+static xmlNodePtr to_xml_list1(encodeTypePtr enc, zval *data, int style, xmlNodePtr parent) {
/*FIXME: minLength=1 */
- return to_xml_list(enc,data,style);
+ return to_xml_list(enc,data,style, parent);
}
static zval* to_zval_union(encodeTypePtr enc, xmlNodePtr data) {
return to_zval_list(enc, data);
}
-static xmlNodePtr to_xml_union(encodeTypePtr enc, zval *data, int style) {
+static xmlNodePtr to_xml_union(encodeTypePtr enc, zval *data, int style, xmlNodePtr parent) {
/*FIXME*/
- return to_xml_list(enc,data,style);
+ return to_xml_list(enc,data,style, parent);
}
zval *sdl_guess_convert_zval(encodeTypePtr enc, xmlNodePtr data)
return guess_zval_convert(enc, data);
}
-xmlNodePtr sdl_guess_convert_xml(encodeTypePtr enc, zval *data, int style)
+xmlNodePtr sdl_guess_convert_xml(encodeTypePtr enc, zval *data, int style, xmlNodePtr parent)
{
sdlTypePtr type;
xmlNodePtr ret = NULL;
switch(type->kind) {
case XSD_TYPEKIND_SIMPLE:
if (type->encode && enc != &type->encode->details) {
- ret = master_to_xml(type->encode, data, style);
+ ret = master_to_xml(type->encode, data, style, parent);
}
break;
case XSD_TYPEKIND_LIST:
- ret = to_xml_list(enc, data, style);
+ ret = to_xml_list(enc, data, style, parent);
break;
case XSD_TYPEKIND_UNION:
- ret = to_xml_union(enc, data, style);
+ ret = to_xml_union(enc, data, style, parent);
break;
case XSD_TYPEKIND_COMPLEX:
case XSD_TYPEKIND_RESTRICTION:
if (type->encode &&
(type->encode->details.type == IS_ARRAY ||
type->encode->details.type == SOAP_ENC_ARRAY)) {
- ret = to_xml_array(enc, data, style);
+ ret = to_xml_array(enc, data, style, parent);
} else {
- ret = to_xml_object(enc, data, style);
+ ret = to_xml_object(enc, data, style, parent);
}
break;
default:
break;
}
if (ret == NULL) {
- ret = guess_xml_convert(enc, data, style);
+ ret = guess_xml_convert(enc, data, style, parent);
}
if (style == SOAP_ENCODED) {
set_ns_and_type(ret, enc);
smart_str_free(&nstype);
}
-smart_str *encode_new_ns()
+xmlNsPtr encode_add_ns(xmlNodePtr node, const char* ns)
{
- int num;
- smart_str *ns = emalloc(sizeof(smart_str));
+ xmlNsPtr xmlns;
- TSRMLS_FETCH();
+ if (ns == NULL) {
+ return NULL;
+ }
- memset(ns, 0, sizeof(smart_str));
- num = ++SOAP_GLOBAL(cur_uniq_ns);
- smart_str_appendl(ns, "ns", 2);
- smart_str_append_long(ns, num);
- smart_str_0(ns);
- return ns;
+ xmlns = xmlSearchNsByHref(node->doc,node,ns);
+ if (xmlns == NULL) {
+ char* prefix;
+ TSRMLS_FETCH();
+
+ if (zend_hash_find(SOAP_GLOBAL(defEncNs), (char*)ns, strlen(ns) + 1, (void **)&prefix) == SUCCESS) {
+ xmlns = xmlNewNs(node->doc->children,ns,prefix);
+ } else {
+ smart_str prefix = {0};
+ int num = ++SOAP_GLOBAL(cur_uniq_ns);
+
+ smart_str_appendl(&prefix, "ns", 2);
+ smart_str_append_long(&prefix, num);
+ smart_str_0(&prefix);
+ xmlns = xmlNewNs(node->doc->children,ns,prefix.c);
+ smart_str_free(&prefix);
+ }
+ }
+ return xmlns;
}
void encode_reset_ns()
static void get_type_str(xmlNodePtr node, const char* ns, const char* type, smart_str* ret)
{
- char *prefix;
TSRMLS_FETCH();
+
if (ns) {
+ xmlNsPtr xmlns;
if (SOAP_GLOBAL(soap_version) == SOAP_1_2 &&
strcmp(ns,SOAP_1_1_ENC_NAMESPACE) == 0) {
ns = SOAP_1_2_ENC_NAMESPACE;
strcmp(ns,SOAP_1_2_ENC_NAMESPACE) == 0) {
ns = SOAP_1_1_ENC_NAMESPACE;
}
- if (zend_hash_find(SOAP_GLOBAL(defEncNs), (char*)ns, strlen(ns) + 1, (void **)&prefix) == SUCCESS) {
- smart_str_appendl(ret, prefix, strlen(prefix));
- smart_str_appendc(ret, ':');
- } else if (node != NULL) {
- xmlAttrPtr attr = node->properties;
-
- while (attr != NULL) {
- if (strncmp(attr->name,"xmlns:",sizeof("xmlns:")-1) == 0 &&
- strcmp(attr->children->content,ns) == 0) {
- break;
- }
- attr = attr->next;
- }
- if (attr == NULL) {
- smart_str* prefix = encode_new_ns();
- smart_str xmlns = {0};
-
- smart_str_appendl(&xmlns, "xmlns:", 6);
- smart_str_append(&xmlns, prefix);
- smart_str_0(&xmlns);
-
- xmlSetProp(node, xmlns.c, ns);
-
- smart_str_append(ret, prefix);
- smart_str_appendc(ret, ':');
-
- smart_str_free(&xmlns);
- smart_str_free(prefix);
- efree(prefix);
- } else {
- smart_str_appends(ret, attr->name + sizeof("xmlns:")-1);
- smart_str_appendc(ret, ':');
- }
- } else {
- php_error(E_ERROR,"Unknown namespace '%s'",ns);
- }
+ xmlns = encode_add_ns(node,ns);
+ smart_str_appends(ret, xmlns->prefix);
+ smart_str_appendc(ret, ':');
}
smart_str_appendl(ret, type, strlen(type));
smart_str_0(ret);
static void deseralize_function_call(sdlPtr sdl, xmlDocPtr request, zval *function_name, int *num_params, zval **parameters[], int *version TSRMLS_DC);
static xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_name,char *uri,zval *ret, 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 TSRMLS_DC);
-static xmlNodePtr seralize_parameter(sdlParamPtr param,zval *param_val,int index,char *name, int style TSRMLS_DC);
-static xmlNodePtr seralize_zval(zval *val, sdlParamPtr param, char *paramName, int style 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 void delete_service(void *service);
static void delete_url(void *handle);
zval *thisObj, *details = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|zs",
- &fault_code, &fault_code_len,
+ &fault_code, &fault_code_len,
&fault_string, &fault_string_len,
&details, &fault_actor, &fault_actor_len) == FAILURE) {
php_error(E_ERROR, "Invalid arguments to SoapFault constructor");
/* SoapObject functions */
-/*
+/*
SoapObject($wsdl, $version=SOAP_1_1)
SoapObject($location, $uri, $style=SOAP_RPC, $use=SOAP_ENCODED, $version=SOAP_1_1)
*/
ZVAL_NULL(tmp_parameters[cur_param]);
} else {
tmp_parameters[cur_param] = master_to_zval((*param)->encode, val);
- }
+ }
cur_param++;
zend_hash_move_forward(function->requestParameters);
(*num_params) = num_of_params;
return;
}
- }
+ }
if (func->children) {
num_of_params = 0;
trav = func->children;
xmlNode *envelope = NULL, *body,*method = NULL, *param;
xmlNs *ns = NULL;
sdlParamPtr parameter = NULL;
- smart_str *gen_ns = NULL;
int param_count;
int style, use;
doc->encoding = xmlStrdup((xmlChar*)"UTF-8");
if (version == SOAP_1_1) {
- envelope = xmlNewDocNode(doc, NULL, SOAP_1_1_ENV_NS_PREFIX":Envelope", NULL);
+ envelope = xmlNewDocNode(doc, NULL, "Envelope", NULL);
ns = xmlNewNs(envelope, SOAP_1_1_ENV_NAMESPACE, SOAP_1_1_ENV_NS_PREFIX);
+ xmlSetNs(envelope,ns);
} else if (version == SOAP_1_2) {
- envelope = xmlNewDocNode(doc, NULL, SOAP_1_2_ENV_NS_PREFIX":Envelope", NULL);
+ envelope = xmlNewDocNode(doc, NULL, "Envelope", NULL);
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");
}
- doc->children = envelope;
+ xmlDocSetRootElement(doc, envelope);
body = xmlNewChild(envelope, ns, "Body", NULL);
zval **tmp;
prop = Z_OBJPROP_P(ret);
- param = xmlNewNode(NULL, SOAP_1_1_ENV_NS_PREFIX":Fault");
+ param = xmlNewChild(body, ns, "Fault", NULL);
if (zend_hash_find(prop, "faultcode", sizeof("faultcode"), (void**)&tmp) == SUCCESS) {
int new_len;
- xmlNodePtr node = xmlNewChild(param, NULL, "faultcode", NULL);
+ xmlNodePtr node = xmlNewNode(NULL, "faultcode");
char *str = php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, NULL TSRMLS_CC);
+ xmlAddChild(param, node);
xmlNodeSetContentLen(node, str, new_len);
efree(str);
}
if (zend_hash_find(prop, "faultstring", sizeof("faultstring"), (void**)&tmp) == SUCCESS) {
int new_len;
- xmlNodePtr node = xmlNewChild(param, NULL, "faultstring", NULL);
+ xmlNodePtr node = xmlNewNode(NULL, "faultstring");
char *str = php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, NULL TSRMLS_CC);
+ xmlAddChild(param, node);
xmlNodeSetContentLen(node, str, new_len);
efree(str);
}
if (zend_hash_find(prop, "faultactor", sizeof("faultactor"), (void**)&tmp) == SUCCESS) {
int new_len;
- xmlNodePtr node = xmlNewChild(param, NULL, "faultactor", NULL);
+ xmlNodePtr node = xmlNewNode(NULL, "faultactor");
char *str = php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, NULL TSRMLS_CC);
+ xmlAddChild(param, node);
xmlNodeSetContentLen(node, str, new_len);
efree(str);
}
if (zend_hash_find(prop, "detail", sizeof("detail"), (void**)&tmp) == SUCCESS &&
Z_TYPE_PP(tmp) != IS_NULL) {
- xmlNodePtr node = seralize_zval(*tmp, NULL, "detail", use TSRMLS_CC);
- xmlAddChild(param,node);
+ seralize_zval(*tmp, NULL, "detail", use, param TSRMLS_CC);
}
} else {
HashTable* prop;
zval **tmp;
prop = Z_OBJPROP_P(ret);
- param = xmlNewNode(NULL, SOAP_1_2_ENV_NS_PREFIX":Fault");
+ param = xmlNewChild(body, ns, "Fault", NULL);
if (zend_hash_find(prop, "faultcode", sizeof("faultcode"), (void**)&tmp) == SUCCESS) {
int new_len;
- xmlNodePtr node = xmlNewChild(param, NULL, SOAP_1_2_ENV_NS_PREFIX":Code", NULL);
+ xmlNodePtr node = xmlNewChild(param, ns, "Code", NULL);
char *str = php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, NULL TSRMLS_CC);
- node = xmlNewChild(node, NULL, SOAP_1_2_ENV_NS_PREFIX":Value", NULL);
+ node = xmlNewChild(node, ns, "Value", NULL);
xmlNodeSetContentLen(node, str, new_len);
efree(str);
}
if (zend_hash_find(prop, "faultstring", sizeof("faultstring"), (void**)&tmp) == SUCCESS) {
int new_len;
- xmlNodePtr node = xmlNewChild(param, NULL, SOAP_1_2_ENV_NS_PREFIX":Reason", NULL);
+ xmlNodePtr node = xmlNewChild(param, ns, "Reason", NULL);
char *str = php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, NULL TSRMLS_CC);
- node = xmlNewChild(node, NULL, SOAP_1_2_ENV_NS_PREFIX":Text", NULL);
+ node = xmlNewChild(node, ns, "Text", NULL);
xmlNodeSetContentLen(node, str, new_len);
efree(str);
}
if (zend_hash_find(prop, "detail", sizeof("detail"), (void**)&tmp) == SUCCESS &&
Z_TYPE_PP(tmp) != IS_NULL) {
- xmlNodePtr node = seralize_zval(*tmp, NULL, SOAP_1_2_ENV_NS_PREFIX":Detail", use TSRMLS_CC);
- xmlAddChild(param,node);
+ seralize_zval(*tmp, NULL, SOAP_1_2_ENV_NS_PREFIX":Detail", use, param TSRMLS_CC);
}
}
- xmlAddChild(body, param);
} else {
- gen_ns = encode_new_ns();
if (function != NULL && function->binding->bindingType == BINDING_SOAP) {
sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)function->bindingAttributes;
style = fnb->style;
use = fnb->output.use;
if (style == SOAP_RPC) {
- ns = xmlNewNs(body, fnb->output.ns, gen_ns->c);
+ ns = encode_add_ns(body, fnb->output.ns);
if (function->responseName) {
method = xmlNewChild(body, ns, function->responseName, NULL);
} else {
} else {
style = SOAP_RPC;
use = SOAP_ENCODED;
- ns = xmlNewNs(body, uri, gen_ns->c);
+ ns = encode_add_ns(body, uri);
method = xmlNewChild(body, ns, function_name, NULL);
}
if (param_count == 1) {
parameter = get_param(function, NULL, 0, TRUE);
- param = seralize_parameter(parameter, ret, 0, "return", use TSRMLS_CC);
if (style == SOAP_RPC) {
+ param = seralize_parameter(parameter, ret, 0, "return", use, method TSRMLS_CC);
if (version == SOAP_1_2) {
- xmlNs *rpc_ns = xmlNewNs(body, "http://www.w3.org/2003/05/soap-rpc", "rpc");
+ xmlNs *rpc_ns = xmlNewNs(body, RPC_SOAP12_NAMESPACE, RPC_SOAP12_NS_PREFIX);
xmlNode *rpc_result = xmlNewChild(method, rpc_ns, "result", NULL);
xmlNodeSetContent(rpc_result,param->name);
}
- xmlAddChild(method,param);
} else {
+ param = seralize_parameter(parameter, ret, 0, "return", use, body TSRMLS_CC);
if (function && function->binding->bindingType == BINDING_SOAP) {
sdlParamPtr *sparam;
if (zend_hash_index_find(function->responseParameters, 0, (void **)&sparam) == SUCCESS) {
- ns = xmlNewNs(param, (*sparam)->encode->details.ns, gen_ns->c);
+ ns = encode_add_ns(param, (*sparam)->encode->details.ns);
xmlNodeSetName(param, (*sparam)->encode->details.type_str);
xmlSetNs(param, ns);
}
}
- xmlAddChild(body, param);
}
} else if (param_count > 1 && Z_TYPE_P(ret) == IS_ARRAY) {
HashPosition pos;
zend_hash_get_current_key_ex(Z_ARRVAL_P(ret), ¶m_name, ¶m_name_len, ¶m_index, 0, &pos);
parameter = get_param(function, param_name, param_index, TRUE);
- param = seralize_parameter(parameter, *data, i, param_name, use TSRMLS_CC);
if (style == SOAP_RPC) {
- xmlAddChild(method,param);
+ param = seralize_parameter(parameter, *data, i, param_name, use, method TSRMLS_CC);
} else {
+ param = seralize_parameter(parameter, *data, i, param_name, use, body TSRMLS_CC);
if (function && function->binding->bindingType == BINDING_SOAP) {
sdlParamPtr *sparam;
if (zend_hash_index_find(function->responseParameters, i, (void **)&sparam) == SUCCESS) {
- ns = xmlNewNs(param, (*sparam)->encode->details.ns, gen_ns->c);
+ ns = encode_add_ns(param, (*sparam)->encode->details.ns);
xmlNodeSetName(param, (*sparam)->encode->details.type_str);
xmlSetNs(param, ns);
}
}
- xmlAddChild(body, param);
}
zend_hash_move_forward_ex(Z_ARRVAL_P(ret), &pos);
}
if (use == SOAP_ENCODED) {
- xmlSetProp(envelope, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
- xmlSetProp(envelope, "xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
+ xmlNewNs(envelope, XSD_NAMESPACE, XSD_NS_PREFIX);
+ xmlNewNs(envelope, XSI_NAMESPACE, XSI_NS_PREFIX);
if (version == SOAP_1_1) {
- xmlSetProp(envelope, "xmlns:"SOAP_1_1_ENC_NS_PREFIX, SOAP_1_1_ENC_NAMESPACE);
- xmlSetProp(envelope, SOAP_1_1_ENV_NS_PREFIX":encodingStyle", SOAP_1_1_ENC_NAMESPACE);
+ xmlNewNs(envelope, SOAP_1_1_ENC_NAMESPACE, SOAP_1_1_ENC_NS_PREFIX);
+ xmlSetNsProp(envelope, envelope->ns, "encodingStyle", SOAP_1_1_ENC_NAMESPACE);
} else if (version == SOAP_1_2) {
- xmlSetProp(envelope, "xmlns:"SOAP_1_2_ENC_NS_PREFIX, SOAP_1_2_ENC_NAMESPACE);
+ xmlNewNs(envelope, SOAP_1_2_ENC_NAMESPACE, SOAP_1_2_ENC_NS_PREFIX);
if (method) {
- xmlSetProp(method, SOAP_1_2_ENV_NS_PREFIX":encodingStyle", SOAP_1_2_ENC_NAMESPACE);
+ xmlSetNsProp(method, envelope->ns, "encodingStyle", SOAP_1_2_ENC_NAMESPACE);
}
}
}
- if (gen_ns) {
- smart_str_free(gen_ns);
- efree(gen_ns);
- }
-
return doc;
}
xmlNs *ns = NULL;
zval **zstyle, **zuse;
int i, style, use;
- smart_str *gen_ns;
encode_reset_ns();
doc->encoding = xmlStrdup((xmlChar*)"UTF-8");
doc->charset = XML_CHAR_ENCODING_UTF8;
if (version == SOAP_1_1) {
- envelope = xmlNewDocNode(doc, NULL, SOAP_1_1_ENV_NS_PREFIX":Envelope", NULL);
+ envelope = xmlNewDocNode(doc, NULL, "Envelope", NULL);
ns = xmlNewNs(envelope, SOAP_1_1_ENV_NAMESPACE, SOAP_1_1_ENV_NS_PREFIX);
+ xmlSetNs(envelope,ns);
} else if (version == SOAP_1_2) {
- envelope = xmlNewDocNode(doc, NULL, SOAP_1_2_ENV_NS_PREFIX":Envelope", NULL);
+ envelope = xmlNewDocNode(doc, NULL, "Envelope", NULL);
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");
}
body = xmlNewChild(envelope, ns, "Body", NULL);
- gen_ns = encode_new_ns();
-
if (function && function->binding->bindingType == BINDING_SOAP) {
sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)function->bindingAttributes;
/*style = SOAP_RPC;*/
use = fnb->input.use;
if (style == SOAP_RPC) {
- ns = xmlNewNs(body, fnb->input.ns, gen_ns->c);
+ ns = encode_add_ns(body, fnb->input.ns);
if (function->requestName) {
method = xmlNewChild(body, ns, function->requestName, NULL);
} else {
/*FIXME: how to pass method name if style is SOAP_DOCUMENT */
/*style = SOAP_RPC;*/
if (style == SOAP_RPC) {
- ns = xmlNewNs(body, uri, gen_ns->c);
+ ns = encode_add_ns(body, uri);
method = xmlNewChild(body, ns, function_name, NULL);
}
}
if (use == SOAP_ENCODED) {
- xmlSetProp(envelope, "xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
- xmlSetProp(envelope, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
+ xmlNewNs(envelope, XSD_NAMESPACE, XSD_NS_PREFIX);
+ xmlNewNs(envelope, XSI_NAMESPACE, XSI_NS_PREFIX);
if (version == SOAP_1_1) {
- xmlSetProp(envelope, "xmlns:"SOAP_1_1_ENC_NS_PREFIX, SOAP_1_1_ENC_NAMESPACE);
- xmlSetProp(envelope, SOAP_1_1_ENV_NS_PREFIX":encodingStyle", SOAP_1_1_ENC_NAMESPACE);
+ xmlNewNs(envelope, SOAP_1_1_ENC_NAMESPACE, SOAP_1_1_ENC_NS_PREFIX);
+ xmlSetNsProp(envelope, envelope->ns, "encodingStyle", SOAP_1_1_ENC_NAMESPACE);
} else if (version == SOAP_1_2) {
- xmlSetProp(envelope, "xmlns:"SOAP_1_2_ENC_NS_PREFIX, SOAP_1_2_ENC_NAMESPACE);
+ xmlNewNs(envelope, SOAP_1_2_ENC_NAMESPACE, SOAP_1_2_ENC_NS_PREFIX);
if (method) {
- xmlSetProp(method, SOAP_1_2_ENV_NS_PREFIX":encodingStyle", SOAP_1_2_ENC_NAMESPACE);
+ xmlSetNsProp(method, envelope->ns, "encodingStyle", SOAP_1_2_ENC_NAMESPACE);
}
}
}
xmlNodePtr param;
sdlParamPtr parameter = get_param(function, NULL, i, FALSE);
- param = seralize_parameter(parameter, arguments[i], i, NULL, use TSRMLS_CC);
-
if (style == SOAP_RPC) {
- xmlAddChild(method, param);
+ param = seralize_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);
if (function && function->binding->bindingType == BINDING_SOAP) {
sdlParamPtr *sparam;
- if (zend_hash_index_find(function->requestParameters, i, (void **)&sparam) == SUCCESS) {
- ns = xmlNewNs(param, (*sparam)->encode->details.ns, gen_ns->c);
- xmlNodeSetName(param, (*sparam)->encode->details.type_str);
+ if (zend_hash_index_find(function->requestParameters, i, (void **)&sparam) == SUCCESS && (*sparam)->element) {
+ ns = encode_add_ns(param, (*sparam)->element->namens);
+ xmlNodeSetName(param, (*sparam)->element->name);
xmlSetNs(param, ns);
}
}
- xmlAddChild(body, param);
}
}
- smart_str_free(gen_ns);
- efree(gen_ns);
return doc;
}
-static xmlNodePtr seralize_parameter(sdlParamPtr param, zval *param_val, int index, char *name, int style TSRMLS_DC)
+static xmlNodePtr seralize_parameter(sdlParamPtr param, zval *param_val, int index, char *name, int style, xmlNodePtr parent TSRMLS_DC)
{
char *paramName;
xmlNodePtr xmlParam;
}
}
- xmlParam = seralize_zval(param_val, param, paramName, style TSRMLS_CC);
+ xmlParam = seralize_zval(param_val, param, paramName, style, parent TSRMLS_CC);
efree(paramName);
return xmlParam;
}
-static xmlNodePtr seralize_zval(zval *val, sdlParamPtr param, char *paramName, int style TSRMLS_DC)
+static xmlNodePtr seralize_zval(zval *val, sdlParamPtr param, char *paramName, int style, xmlNodePtr parent TSRMLS_DC)
{
xmlNodePtr xmlParam;
encodePtr enc;
} else {
enc = get_conversion(val->type);
}
- xmlParam = master_to_xml(enc, val, style);
+ xmlParam = master_to_xml(enc, val, style, parent);
if (!strcmp(xmlParam->name, "BOGUS")) {
xmlNodeSetName(xmlParam, paramName);
}