]> granicus.if.org Git - php/commitdiff
Support for element's form and schema's elementFormDefault attributes (qualified...
authorDmitry Stogov <dmitry@php.net>
Wed, 20 Apr 2005 08:31:10 +0000 (08:31 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 20 Apr 2005 08:31:10 +0000 (08:31 +0000)
ext/soap/php_encoding.c
ext/soap/php_schema.c
ext/soap/php_sdl.c
ext/soap/php_sdl.h
ext/soap/tests/schema/schema075.phpt [new file with mode: 0644]
ext/soap/tests/schema/schema076.phpt [new file with mode: 0644]
ext/soap/tests/schema/schema077.phpt [new file with mode: 0644]
ext/soap/tests/schema/schema078.phpt [new file with mode: 0644]
ext/soap/tests/schema/schema079.phpt [new file with mode: 0644]
ext/soap/tests/schema/schema080.phpt [new file with mode: 0644]

index c2fdef068030c16363ab6e7828b4f736fc029c1b..b9027ddd4eac3fd177d48986b37a87ea0987dc08 100644 (file)
@@ -1234,7 +1234,9 @@ static int model_to_xml_object(xmlNodePtr node, sdlContentModelPtr model, zval *
                                                }
                                        }
                                        xmlNodeSetName(property, model->u.element->name);
-                                       if (style == SOAP_LITERAL && model->u.element->namens) {
+                                       if (style == SOAP_LITERAL &&
+                                           model->u.element->namens &&
+                                           model->u.element->form == XSD_FORM_QUALIFIED) {
                                                xmlNsPtr nsp = encode_add_ns(property, model->u.element->namens);
                                                xmlSetNs(property, nsp);
                                        }
@@ -1482,8 +1484,9 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo
                                                                /* we need to handle xml: namespace specially, since it is
                                                                   an implicit schema. Otherwise, use form.
                                                                */
-                                                               if ((!strncmp((*attr)->namens, XML_NAMESPACE, sizeof(XML_NAMESPACE)) || 
-                                                                   ((*attr)->form == XSD_FORM_QUALIFIED)) && (*attr)->namens) {
+                                                               if ((*attr)->namens &&
+                                                                   (!strncmp((*attr)->namens, XML_NAMESPACE, sizeof(XML_NAMESPACE)) || 
+                                                                    (*attr)->form == XSD_FORM_QUALIFIED)) {
                                                                        xmlNsPtr nsp = encode_add_ns(xmlParam, (*attr)->namens);
 
                                                                        xmlSetNsProp(xmlParam, nsp, (*attr)->name, dummy->children->content);
index b0e537f34807bc0c082645ea0569dbfd916884f0..b292a60862d4f3413a98975db433d1508e804394 100644 (file)
@@ -1664,6 +1664,39 @@ static int schema_element(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr element, sdlTyp
                cur_type->def = estrdup(attr->children->content);
        }
 
+       /* form */
+       attr = get_attribute(attrs, "form");
+       if (attr) {
+               if (strncmp(attr->children->content,"qualified",sizeof("qualified")) == 0) {
+                 cur_type->form = XSD_FORM_QUALIFIED;
+               } else if (strncmp(attr->children->content,"unqualified",sizeof("unqualified")) == 0) {
+                 cur_type->form = XSD_FORM_UNQUALIFIED;
+               } else {
+                 cur_type->form = XSD_FORM_DEFAULT;
+               }
+       } else {
+         cur_type->form = XSD_FORM_DEFAULT;
+       }
+       if (cur_type->form == XSD_FORM_DEFAULT) {
+               xmlNodePtr parent = element->parent;
+               while (parent) {
+                       if (node_is_equal_ex(parent, "schema", SCHEMA_NAMESPACE)) {
+                               xmlAttrPtr def;
+                               def = get_attribute(parent->properties, "elementFormDefault");
+                               if(def == NULL || strncmp(def->children->content, "qualified", sizeof("qualified"))) {
+                                       cur_type->form = XSD_FORM_UNQUALIFIED;
+                               } else {
+                                       cur_type->form = XSD_FORM_QUALIFIED;
+                               }
+                               break;
+                       }
+                       parent = parent->parent;
+       }
+               if (parent == NULL) {
+                       cur_type->form = XSD_FORM_UNQUALIFIED;
+               }       
+       }
+
        /* type = QName */
        type = get_attribute(attrs, "type");
        if (type) {
@@ -1890,10 +1923,10 @@ static int schema_attribute(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrType, sdl
                }
                attr = attr->next;
        }
-       if(newAttr->form == XSD_FORM_DEFAULT) {
-               xmlNodePtr parent = attrType->parent;
-               while(parent) {
-                       if(node_is_equal_ex(parent, "schema", SCHEMA_NAMESPACE)) {
+       if (newAttr->form == XSD_FORM_DEFAULT) {
+               xmlNodePtr parent = attrType->parent;
+               while (parent) {
+                       if (node_is_equal_ex(parent, "schema", SCHEMA_NAMESPACE)) {
                                xmlAttrPtr def;
                                def = get_attribute(parent->properties, "attributeFormDefault");
                                if(def == NULL || strncmp(def->children->content, "qualified", sizeof("qualified"))) {
@@ -1904,8 +1937,8 @@ static int schema_attribute(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrType, sdl
                                break;
                        }
                        parent = parent->parent;
-               }
-               if(parent == NULL) {
+       }
+               if (parent == NULL) {
                        newAttr->form = XSD_FORM_UNQUALIFIED;
                }       
        }
@@ -2209,6 +2242,7 @@ static void schema_type_fixup(sdlCtx *ctx, sdlTypePtr type)
                                if ((*tmp)->def) {
                                  type->def = estrdup((*tmp)->def);
                                }
+                               type->form = (*tmp)->form;
                        } else if (strcmp(type->ref, SCHEMA_NAMESPACE ":schema") == 0) {
                                type->encode = get_conversion(XSD_ANYXML);
                        } else {
index 70dd4705a1857a956b29bf6983f1d204e8917600..fa736a419250bf59245db3b2301177a8ceace63b 100644 (file)
@@ -1065,7 +1065,7 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri TSRMLS_DC)
        return ctx.sdl;
 }
 
-#define WSDL_CACHE_VERSION 0x0c
+#define WSDL_CACHE_VERSION 0x0d
 
 #define WSDL_CACHE_GET(ret,type,buf)   memcpy(&ret,*buf,sizeof(type)); *buf += sizeof(type);
 #define WSDL_CACHE_GET_INT(ret,buf)    ret = ((unsigned char)(*buf)[0])|((unsigned char)(*buf)[1]<<8)|((unsigned char)(*buf)[2]<<16)|((int)(*buf)[3]<<24); *buf += 4;
@@ -1214,6 +1214,7 @@ static void sdl_deserialize_type(sdlTypePtr type, sdlTypePtr *types, encodePtr *
        type->fixed = sdl_deserialize_string(in);
        type->ref = sdl_deserialize_string(in);
        WSDL_CACHE_GET_1(type->nillable, char, in);
+       WSDL_CACHE_GET_1(type->form, sdlForm, in);
 
        WSDL_CACHE_GET_INT(i, in);
        type->encode = encoders[i];
@@ -1788,6 +1789,7 @@ static void sdl_serialize_type(sdlTypePtr type, HashTable *tmp_encoders, HashTab
        sdl_serialize_string(type->fixed, out);
        sdl_serialize_string(type->ref, out);
        WSDL_CACHE_PUT_1(type->nillable, out);
+       WSDL_CACHE_PUT_1(type->form, out);
        sdl_serialize_encoder_ref(type->encode, tmp_encoders, out);
 
        if (type->restrictions) {
index d2c9bfd033a55bd6c032544389d2c2768b2ac7d2..63f961ab717618c55aa40bdc2f829e59b76aa2a5 100644 (file)
@@ -180,6 +180,19 @@ typedef enum _sdlTypeKind {
        XSD_TYPEKIND_EXTENSION
 } sdlTypeKind;
 
+typedef enum _sdlUse {
+       XSD_USE_DEFAULT,
+       XSD_USE_OPTIONAL,
+       XSD_USE_PROHIBITED,
+       XSD_USE_REQUIRED
+} sdlUse;
+
+typedef enum _sdlForm {
+       XSD_FORM_DEFAULT,
+       XSD_FORM_QUALIFIED,
+       XSD_FORM_UNQUALIFIED
+} sdlForm;
+
 struct _sdlType {
        sdlTypeKind         kind;
        char               *name;
@@ -193,6 +206,7 @@ struct _sdlType {
        char               *def;
        char               *fixed;
        char               *ref;
+       sdlForm             form;
 };
 
 struct _sdlParam {
@@ -219,19 +233,6 @@ struct _sdlFunction {
        HashTable          *faults;             /* array of sdlFaultPtr */
 };
 
-typedef enum _sdlUse {
-       XSD_USE_DEFAULT,
-       XSD_USE_OPTIONAL,
-       XSD_USE_PROHIBITED,
-       XSD_USE_REQUIRED
-} sdlUse;
-
-typedef enum _sdlForm {
-       XSD_FORM_DEFAULT,
-       XSD_FORM_QUALIFIED,
-       XSD_FORM_UNQUALIFIED
-} sdlForm;
-
 typedef struct _sdlExtraAttribute {
        char *ns;
        char *val;
diff --git a/ext/soap/tests/schema/schema075.phpt b/ext/soap/tests/schema/schema075.phpt
new file mode 100644 (file)
index 0000000..2a84be9
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+SOAP XML Schema 75: Attributes form qualified/unqualified (attributeFormDefault="qualified")
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+include "test_schema.inc";
+$schema = <<<EOF
+       <complexType name="testType">
+               <attribute name="int1" type="int"/>
+               <attribute name="int2" type="int" form="qualified"/>
+               <attribute name="int3" type="int" form="unqualified"/>
+       </complexType>
+EOF;
+
+test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "encoded", 'attributeFormDefault="qualified"');
+echo "ok";
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:test><testParam ns1:int1="1" ns1:int2="2" int3="3" xsi:type="ns1:testType"/></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
+object(stdClass)#5 (3) {
+  ["int1"]=>
+  int(1)
+  ["int2"]=>
+  int(2)
+  ["int3"]=>
+  int(3)
+}
+ok
diff --git a/ext/soap/tests/schema/schema076.phpt b/ext/soap/tests/schema/schema076.phpt
new file mode 100644 (file)
index 0000000..dfa7791
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+SOAP XML Schema 76: Attributes form qualified/unqualified (attributeFormDefault="unqualified")
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+include "test_schema.inc";
+$schema = <<<EOF
+       <complexType name="testType">
+               <attribute name="int1" type="int"/>
+               <attribute name="int2" type="int" form="qualified"/>
+               <attribute name="int3" type="int" form="unqualified"/>
+       </complexType>
+EOF;
+
+test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "encoded", 'attributeFormDefault="unqualified"');
+echo "ok";
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:test><testParam int1="1" ns1:int2="2" int3="3" xsi:type="ns1:testType"/></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
+object(stdClass)#5 (3) {
+  ["int1"]=>
+  int(1)
+  ["int2"]=>
+  int(2)
+  ["int3"]=>
+  int(3)
+}
+ok
diff --git a/ext/soap/tests/schema/schema077.phpt b/ext/soap/tests/schema/schema077.phpt
new file mode 100644 (file)
index 0000000..baf1044
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+SOAP XML Schema 77: Attributes form qualified/unqualified (attributeFormDefault - default)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+include "test_schema.inc";
+$schema = <<<EOF
+       <complexType name="testType">
+               <attribute name="int1" type="int"/>
+               <attribute name="int2" type="int" form="qualified"/>
+               <attribute name="int3" type="int" form="unqualified"/>
+       </complexType>
+EOF;
+
+test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "encoded");
+echo "ok";
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:test><testParam int1="1" ns1:int2="2" int3="3" xsi:type="ns1:testType"/></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
+object(stdClass)#5 (3) {
+  ["int1"]=>
+  int(1)
+  ["int2"]=>
+  int(2)
+  ["int3"]=>
+  int(3)
+}
+ok
diff --git a/ext/soap/tests/schema/schema078.phpt b/ext/soap/tests/schema/schema078.phpt
new file mode 100644 (file)
index 0000000..a674270
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+SOAP XML Schema 78: Element form qualified/unqualified (elementFormDefault="qualified")
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+include "test_schema.inc";
+$schema = <<<EOF
+       <complexType name="testType">
+               <sequence>
+                       <element name="int1" type="int"/>
+                       <element name="int2" type="int" form="qualified"/>
+                       <element name="int3" type="int" form="unqualified"/>
+               </sequence>
+       </complexType>
+EOF;
+
+test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "literal", 'elementFormDefault="qualified"');
+echo "ok";
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/"><SOAP-ENV:Body><ns1:test><testParam><ns1:int1>1</ns1:int1><ns1:int2>2</ns1:int2><int3>3</int3></testParam></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
+object(stdClass)#5 (3) {
+  ["int1"]=>
+  int(1)
+  ["int2"]=>
+  int(2)
+  ["int3"]=>
+  int(3)
+}
+ok
diff --git a/ext/soap/tests/schema/schema079.phpt b/ext/soap/tests/schema/schema079.phpt
new file mode 100644 (file)
index 0000000..d7f2ab9
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+SOAP XML Schema 79: Element form qualified/unqualified (elementFormDefault="unqualified")
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+include "test_schema.inc";
+$schema = <<<EOF
+       <complexType name="testType">
+               <sequence>
+                       <element name="int1" type="int"/>
+                       <element name="int2" type="int" form="qualified"/>
+                       <element name="int3" type="int" form="unqualified"/>
+               </sequence>
+       </complexType>
+EOF;
+
+test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "literal", 'elementFormDefault="unqualified"');
+echo "ok";
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/"><SOAP-ENV:Body><ns1:test><testParam><int1>1</int1><ns1:int2>2</ns1:int2><int3>3</int3></testParam></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
+object(stdClass)#5 (3) {
+  ["int1"]=>
+  int(1)
+  ["int2"]=>
+  int(2)
+  ["int3"]=>
+  int(3)
+}
+ok
diff --git a/ext/soap/tests/schema/schema080.phpt b/ext/soap/tests/schema/schema080.phpt
new file mode 100644 (file)
index 0000000..4accf55
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+SOAP XML Schema 80: Element form qualified/unqualified (elementFormDefault - default)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+include "test_schema.inc";
+$schema = <<<EOF
+       <complexType name="testType">
+               <sequence>
+                       <element name="int1" type="int"/>
+                       <element name="int2" type="int" form="qualified"/>
+                       <element name="int3" type="int" form="unqualified"/>
+               </sequence>
+       </complexType>
+EOF;
+
+test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "literal");
+echo "ok";
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/"><SOAP-ENV:Body><ns1:test><testParam><int1>1</int1><ns1:int2>2</ns1:int2><int3>3</int3></testParam></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
+object(stdClass)#5 (3) {
+  ["int1"]=>
+  int(1)
+  ["int2"]=>
+  int(2)
+  ["int3"]=>
+  int(3)
+}
+ok