]> granicus.if.org Git - php/commitdiff
XML Schema support was improved: support for <element> default, fixed and nillable
authorDmitry Stogov <dmitry@php.net>
Tue, 24 Feb 2004 09:02:33 +0000 (09:02 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 24 Feb 2004 09:02:33 +0000 (09:02 +0000)
ext/soap/TODO
ext/soap/php_encoding.c
ext/soap/php_schema.c

index a39ea359e5b4e55f3084839697e6010e0850784b..2c0de71386d2674e4a9a4f3e6af07e8f1ee6008f 100644 (file)
@@ -41,7 +41,7 @@ Encoding
          SOAP 1.2 doesn't support partially transmitted and sparse arrays
 - references to external resources
 ? support for "nillable" and "nil"
-- default values of <element>
+? default values of <element>
 ? provide schema 1999/2001 support???
 ? make internal refrences for soap encoding (use seralization logic)???
 ? provide user space overriding of serialization certin objects and types???
index 443e0c280dae0648508e7c16246e4a4845d5d099..88a447a7126da3b96e71f51436368331c91e8a56 100644 (file)
@@ -791,7 +791,24 @@ static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr
                        if (node) {
                                zval *val;
 
-                                       val = master_to_zval(model->u.element->encode, node);
+                                       if (node && node->children && node->children->content) {
+                                               if (model->u.element->fixed && strcmp(model->u.element->fixed,node->children->content) != 0) {
+                                                       php_error(E_ERROR,"SOAP-ERROR: Encoding: Element '%s' has fixed value '%s' (value '%s' is not allowed)",model->u.element->name,model->u.element->fixed,node->children->content);
+                                               }
+                                               val = master_to_zval(model->u.element->encode, node);
+                                       } else if (model->u.element->fixed) {
+                                               xmlNodePtr dummy = xmlNewNode(NULL, "BOGUS");
+                                               xmlNodeSetContent(dummy, model->u.element->fixed);
+                                               val = master_to_zval(model->u.element->encode, dummy);
+                                               xmlFreeNode(dummy);
+                                       } else if (model->u.element->def && !model->u.element->nillable) {
+                                               xmlNodePtr dummy = xmlNewNode(NULL, "BOGUS");
+                                               xmlNodeSetContent(dummy, model->u.element->def);
+                                               val = master_to_zval(model->u.element->encode, dummy);
+                                               xmlFreeNode(dummy);
+                                       } else {
+                                               val = master_to_zval(model->u.element->encode, node);
+                                       }
                                        if ((node = get_node(node->next, model->u.element->name)) != NULL) {
                                                zval *array;
 
@@ -799,7 +816,24 @@ static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr
                                                array_init(array);
                                                add_next_index_zval(array, val);
                                                do {
-                                                       val = master_to_zval(model->u.element->encode, node);
+                                                       if (node && node->children && node->children->content) {
+                                                               if (model->u.element->fixed && strcmp(model->u.element->fixed,node->children->content) != 0) {
+                                                                       php_error(E_ERROR,"SOAP-ERROR: Encoding: Element '%s' has fixed value '%s' (value '%s' is not allowed)",model->u.element->name,model->u.element->fixed,node->children->content);
+                                                               }
+                                                               val = master_to_zval(model->u.element->encode, node);
+                                                       } else if (model->u.element->fixed) {
+                                                               xmlNodePtr dummy = xmlNewNode(NULL, "BOGUS");
+                                                               xmlNodeSetContent(dummy, model->u.element->fixed);
+                                                               val = master_to_zval(model->u.element->encode, dummy);
+                                                               xmlFreeNode(dummy);
+                                                       } else if (model->u.element->def && !model->u.element->nillable) {
+                                                               xmlNodePtr dummy = xmlNewNode(NULL, "BOGUS");
+                                                               xmlNodeSetContent(dummy, model->u.element->def);
+                                                               val = master_to_zval(model->u.element->encode, dummy);
+                                                               xmlFreeNode(dummy);
+                                                       } else {
+                                                               val = master_to_zval(model->u.element->encode, node);
+                                                       }
                                                        add_next_index_zval(array, val);
                                                } while ((node = get_node(node->next, model->u.element->name)) != NULL);
                                                val = array;
@@ -912,6 +946,8 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
                                                if ((*attr)->fixed && strcmp((*attr)->fixed,str_val) != 0) {
                                                        php_error(E_ERROR,"SOAP-ERROR: Encoding: Attribute '%s' has fixed value '%s' (value '%s' is not allowed)",(*attr)->name,(*attr)->fixed,str_val);
                                                }
+                                       } else if ((*attr)->fixed) {
+                                               str_val = (*attr)->fixed;
                                        } else if ((*attr)->def) {
                                                str_val = (*attr)->def;
                                        }
@@ -983,6 +1019,10 @@ static int model_to_xml_object(xmlNodePtr node, sdlContentModelPtr model, HashTa
                                                        }
                                                } else {
                                                        property = master_to_xml(enc, *val, style, node);
+                                                       if (property->children && property->children->content &&
+                                                           model->u.element->fixed && strcmp(model->u.element->fixed,property->children->content) != 0) {
+                                                               php_error(E_ERROR,"SOAP-ERROR: Encoding: Element '%s' has fixed value '%s' (value '%s' is not allowed)",model->u.element->name,model->u.element->fixed,property->children->content);
+                                                       }
                                                }
                                                xmlNodeSetName(property, model->u.element->name);
                                                if (style == SOAP_LITERAL && model->u.element->namens) {
@@ -1003,6 +1043,10 @@ static int model_to_xml_object(xmlNodePtr node, sdlContentModelPtr model, HashTa
                                                }
                                        } else {
                                                property = master_to_xml(enc, *data, style, node);
+                                               if (property->children && property->children->content &&
+                                                   model->u.element->fixed && strcmp(model->u.element->fixed,property->children->content) != 0) {
+                                                       php_error(E_ERROR,"SOAP-ERROR: Encoding: Element '%s' has fixed value '%s' (value '%s' is not allowed)",model->u.element->name,model->u.element->fixed,property->children->content);
+                                               }
                                        }
                                        xmlNodeSetName(property, model->u.element->name);
                                        if (style == SOAP_LITERAL && model->u.element->namens) {
index 34bf786f1df241908c1ed27614837951566a21e7..f1956137e4ec2797f3e59cd23f4015ce9cdc6868 100644 (file)
@@ -2133,11 +2133,17 @@ static void schema_type_fixup(sdlCtx *ctx, sdlTypePtr type)
        if (type->ref != NULL) {
                if (ctx->sdl->elements != NULL) {
                        if (zend_hash_find(ctx->sdl->elements, type->ref, strlen(type->ref)+1, (void**)&tmp) == SUCCESS) {
+                               type->kind = (*tmp)->kind;
                                type->encode = (*tmp)->encode;
-                               /* TODO: nillable */
                                if ((*tmp)->nillable) {
                                  type->nillable = 1;
                                }
+                               if ((*tmp)->fixed) {
+                                 type->fixed = estrdup((*tmp)->fixed);
+                               }
+                               if ((*tmp)->def) {
+                                 type->def = estrdup((*tmp)->def);
+                               }
                        } else {
                                php_error(E_ERROR, "SOAP-ERROR: Parsing Schema: unresolved element 'ref' attribute");
                        }