summaryrefslogtreecommitdiff
path: root/ext/soap/php_encoding.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2004-01-26 15:12:34 +0000
committerDmitry Stogov <dmitry@php.net>2004-01-26 15:12:34 +0000
commitadb3562d8eba449437a61df7fc71acf857e804d1 (patch)
treecaa011f5b66d6337190e7eef769ec84c988c4db7 /ext/soap/php_encoding.c
parent9fcb1dd2c94b94a825361eb37ed89869d5adac3f (diff)
downloadphp-git-adb3562d8eba449437a61df7fc71acf857e804d1.tar.gz
XML Schema support was improved
support for unsignedLong standard type was fixed restrictions checking was disabled support for standard list types (IDREFS, IDS, NOTATIONS)
Diffstat (limited to 'ext/soap/php_encoding.c')
-rw-r--r--ext/soap/php_encoding.c60
1 files changed, 36 insertions, 24 deletions
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index 16f3b8ca81..0eaad5bbec 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -29,6 +29,9 @@ static xmlNodePtr to_xml_null(encodeTypePtr type, zval *data, int style);
static xmlNodePtr guess_array_map(encodeTypePtr type, zval *data, int style);
static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style);
+static xmlNodePtr to_xml_list(encodeTypePtr enc, zval *data, int style);
+static xmlNodePtr to_xml_list1(encodeTypePtr enc, zval *data, int style);
+
/* 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);
@@ -142,14 +145,14 @@ encode defaultEncoding[] = {
{{XSD_TOKEN, XSD_TOKEN_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_LANGUAGE, XSD_LANGUAGE_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_NMTOKEN, XSD_NMTOKEN_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
- {{XSD_NMTOKENS, XSD_NMTOKENS_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_NMTOKENS, XSD_NMTOKENS_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_list1},
{{XSD_NAME, XSD_NAME_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_NCNAME, XSD_NCNAME_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_ID, XSD_ID_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_IDREF, XSD_IDREF_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
- {{XSD_IDREFS, XSD_IDREFS_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_IDREFS, XSD_IDREFS_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_list1},
{{XSD_ENTITY, XSD_ENTITY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
- {{XSD_ENTITIES, XSD_ENTITIES_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_ENTITIES, XSD_ENTITIES_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_list1},
{{APACHE_MAP, APACHE_MAP_STRING, APACHE_NAMESPACE, NULL}, to_zval_map, to_xml_map},
@@ -532,18 +535,14 @@ static zval *to_zval_ulong(encodeTypePtr type, xmlNodePtr data)
if (data && data->children) {
if (data->children->type == XML_TEXT_NODE && data->children->next == NULL) {
- unsigned long val = 0;
- char *s;
whiteSpace_collapse(data->children->content);
- s = data->children->content;
- while (*s >= '0' && *s <= '9') {
- val = (val*10)+(*s-'0');
- s++;
- }
- if ((long)val >= 0) {
- ZVAL_LONG(ret, val);
+ errno = 0;
+ ret->value.lval = strtol(data->children->content, NULL, 0);
+ if (errno == ERANGE) { /* overflow */
+ ret->value.dval = strtod(data->children->content, NULL);
+ ret->type = IS_DOUBLE;
} else {
- ZVAL_STRING(ret, data->children->content, 1);
+ ret->type = IS_LONG;
}
} else {
php_error(E_ERROR,"Violation of encoding rules");
@@ -580,20 +579,25 @@ static xmlNodePtr to_xml_long(encodeTypePtr type, zval *data, int style)
static xmlNodePtr to_xml_ulong(encodeTypePtr type, zval *data, int style)
{
xmlNodePtr ret;
- zval tmp;
ret = xmlNewNode(NULL, "BOGUS");
FIND_ZVAL_NULL(data, ret, style);
- /* TODO: long overflow */
- tmp = *data;
- zval_copy_ctor(&tmp);
- if (Z_TYPE(tmp) != IS_LONG) {
- convert_to_long(&tmp);
+ if (Z_TYPE_P(data) == IS_DOUBLE) {
+ char s[16];
+ sprintf(s, "%0.0F",Z_DVAL_P(data));
+ xmlNodeSetContent(ret, s);
+ } else {
+ zval tmp = *data;
+
+ zval_copy_ctor(&tmp);
+ if (Z_TYPE(tmp) != IS_LONG) {
+ convert_to_long(&tmp);
+ }
+ convert_to_string(&tmp);
+ xmlNodeSetContentLen(ret, Z_STRVAL(tmp), Z_STRLEN(tmp));
+ zval_dtor(&tmp);
}
- convert_to_string(&tmp);
- xmlNodeSetContentLen(ret, Z_STRVAL(tmp), Z_STRLEN(tmp));
- zval_dtor(&tmp);
if (style == SOAP_ENCODED) {
set_ns_and_type(ret, type);
@@ -1941,8 +1945,8 @@ static xmlNodePtr to_xml_datetime_ex(encodeTypePtr type, zval *data, char *forma
if (Z_TYPE_P(data) == IS_LONG) {
timestamp = Z_LVAL_P(data);
- /*time(&timestamp);*/
ta = php_localtime_r(&timestamp, &tmbuf);
+ /*ta = php_gmtime_r(&timestamp, &tmbuf);*/
buf = (char *) emalloc(buf_len);
while ((real_len = strftime(buf, buf_len, format, ta)) == buf_len || real_len == 0) {
@@ -2077,6 +2081,11 @@ static xmlNodePtr to_xml_list(encodeTypePtr enc, zval *data, int style) {
return ret;
}
+static xmlNodePtr to_xml_list1(encodeTypePtr enc, zval *data, int style) {
+ /*FIXME: minLength=1 */
+ return to_xml_list(enc,data,style);
+}
+
static zval* to_zval_union(encodeTypePtr enc, xmlNodePtr data) {
/*FIXME*/
return to_zval_list(enc, data);
@@ -2092,7 +2101,7 @@ zval *sdl_guess_convert_zval(encodeTypePtr enc, xmlNodePtr data)
sdlTypePtr type;
type = enc->sdl_type;
-
+/*FIXME: restriction support
if (type && type->restrictions &&
data && data->children && data->children->content) {
if (type->restrictions->whiteSpace && type->restrictions->whiteSpace->value) {
@@ -2120,6 +2129,7 @@ zval *sdl_guess_convert_zval(encodeTypePtr enc, xmlNodePtr data)
php_error(E_WARNING,"Restriction: length is not equal to 'length'");
}
}
+*/
switch (type->kind) {
case XSD_TYPEKIND_SIMPLE:
if (type->encode && enc != &type->encode->details) {
@@ -2152,6 +2162,7 @@ xmlNodePtr sdl_guess_convert_xml(encodeTypePtr enc, zval *data, int style)
type = enc->sdl_type;
+/*FIXME: restriction support
if (type) {
if (type->restrictions && Z_TYPE_P(data) == IS_STRING) {
if (type->restrictions->enumeration) {
@@ -2173,6 +2184,7 @@ xmlNodePtr sdl_guess_convert_xml(encodeTypePtr enc, zval *data, int style)
}
}
}
+*/
switch(type->kind) {
case XSD_TYPEKIND_SIMPLE:
if (type->encode && enc != &type->encode->details) {