dmitry          Wed Feb  1 17:18:24 2006 UTC

  Added files:                 (Branch: PHP_5_1)
    /php-src/ext/soap/tests     classmap003.phpt classmap003.wsdl 

  Modified files:              
    /php-src/ext/soap   php_encoding.c 
  Log:
  Fixed encoding of inhereted objects
  
  
http://cvs.php.net/viewcvs.cgi/php-src/ext/soap/php_encoding.c?r1=1.103.2.13&r2=1.103.2.14&diff_format=u
Index: php-src/ext/soap/php_encoding.c
diff -u php-src/ext/soap/php_encoding.c:1.103.2.13 
php-src/ext/soap/php_encoding.c:1.103.2.14
--- php-src/ext/soap/php_encoding.c:1.103.2.13  Sun Jan  1 12:50:13 2006
+++ php-src/ext/soap/php_encoding.c     Wed Feb  1 17:18:24 2006
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: php_encoding.c,v 1.103.2.13 2006/01/01 12:50:13 sniper Exp $ */
+/* $Id: php_encoding.c,v 1.103.2.14 2006/02/01 17:18:24 dmitry Exp $ */
 
 #include <time.h>
 
@@ -306,6 +306,34 @@
                        xmlSetNs(node, nsp);
                }
        } else {
+               if (SOAP_GLOBAL(class_map) && data &&
+                   Z_TYPE_P(data) == IS_OBJECT &&
+                   !Z_OBJPROP_P(data)->nApplyCount) {
+                       zend_class_entry *ce = Z_OBJCE_P(data);
+                       HashPosition pos;
+                       zval **tmp;
+                       char *type_name = NULL;
+                       uint type_len;
+                       ulong idx;
+
+                       for 
(zend_hash_internal_pointer_reset_ex(SOAP_GLOBAL(class_map), &pos);
+                            
zend_hash_get_current_data_ex(SOAP_GLOBAL(class_map), (void **) &tmp, &pos) == 
SUCCESS;
+                            zend_hash_move_forward_ex(SOAP_GLOBAL(class_map), 
&pos)) {
+                               if (Z_TYPE_PP(tmp) == IS_STRING &&
+                                   ce->name_length == Z_STRLEN_PP(tmp) &&
+                                   zend_binary_strncasecmp(ce->name, 
ce->name_length, Z_STRVAL_PP(tmp), ce->name_length, ce->name_length) == 0 &&
+                                   
zend_hash_get_current_key_ex(SOAP_GLOBAL(class_map), &type_name, &type_len, 
&idx, 0, &pos) == HASH_KEY_IS_STRING) {
+
+                                   /* TODO: namespace isn't stored */
+                               encodePtr enc = get_encoder(SOAP_GLOBAL(sdl), 
SOAP_GLOBAL(sdl)->target_ns, type_name);
+                               if (enc) {
+                                       encode = &enc->details;
+                                       }                       
+                               break;
+                               }
+                       }
+               }
+
                if (encode == NULL) {
                        encode = get_conversion(UNKNOWN_TYPE);
                }
@@ -1220,9 +1248,9 @@
                                ret = master_to_zval_int(sdlType->encode, data);
                                FIND_XML_NULL(data, ret);
                                if (get_zval_property(ret, "any" TSRMLS_CC) != 
NULL) {
-                                 unset_zval_property(ret, "any" TSRMLS_CC);
+                                       unset_zval_property(ret, "any" 
TSRMLS_CC);
                                        redo_any = 1;
-                         }
+                               }
                                if (Z_TYPE_P(ret) == IS_OBJECT && ce != 
ZEND_STANDARD_CLASS_DEF_PTR) {
                                        zend_object *zobj = 
zend_objects_get_address(ret TSRMLS_CC);
                                        zobj->ce = ce;
@@ -1526,7 +1554,7 @@
 static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, 
xmlNodePtr parent)
 {
        xmlNodePtr xmlParam;
-       HashTable *prop;
+       HashTable *prop = NULL;
        int i;
        sdlTypePtr sdlType = type->sdl_type;
        TSRMLS_FETCH();
@@ -1534,19 +1562,19 @@
        if (!data || Z_TYPE_P(data) == IS_NULL) {
                xmlParam = xmlNewNode(NULL,"BOGUS");
                xmlAddChild(parent, xmlParam);
-         if (style == SOAP_ENCODED) {
+               if (style == SOAP_ENCODED) {
                        xmlSetProp(xmlParam, "xsi:nil", "true");
                }
                return xmlParam;
        }
 
+       if (Z_TYPE_P(data) == IS_OBJECT) {
+               prop = Z_OBJPROP_P(data);
+       } else if (Z_TYPE_P(data) == IS_ARRAY) {
+               prop = Z_ARRVAL_P(data);
+       }
+
        if (sdlType) {
-               prop = NULL;
-               if (Z_TYPE_P(data) == IS_OBJECT) {
-                       prop = Z_OBJPROP_P(data);
-               } else if (Z_TYPE_P(data) == IS_ARRAY) {
-                       prop = Z_ARRVAL_P(data);
-               }
                if (sdlType->kind == XSD_TYPEKIND_RESTRICTION &&
                    sdlType->encode && type != &sdlType->encode->details) {
                        encodePtr enc;
@@ -1562,7 +1590,7 @@
                                zval *tmp = get_zval_property(data, "_" 
TSRMLS_CC);
                                if (tmp) {
                                        xmlParam = master_to_xml(enc, tmp, 
style, parent);
-                               } else if (prop == NULL) {
+                               } else if (prop == NULL) {                      
                
                                        xmlParam = master_to_xml(enc, data, 
style, parent);
                                } else {
                                        xmlParam = xmlNewNode(NULL,"BOGUS");
@@ -1578,7 +1606,10 @@
                            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 (prop) prop->nApplyCount++;
                                xmlParam = master_to_xml(sdlType->encode, data, 
style, parent);
+                               if (prop) prop->nApplyCount--;
                        } else {
                                zval *tmp = get_zval_property(data, "_" 
TSRMLS_CC);
 
@@ -1595,7 +1626,6 @@
                        xmlParam = xmlNewNode(NULL,"BOGUS");
                        xmlAddChild(parent, xmlParam);
                }
-               FIND_ZVAL_NULL(data, xmlParam, style);
 
                if (prop != NULL) {
                  sdlTypePtr array_el;
@@ -1678,14 +1708,7 @@
        } else {
                xmlParam = xmlNewNode(NULL,"BOGUS");
                xmlAddChild(parent, xmlParam);
-               FIND_ZVAL_NULL(data, xmlParam, style);
 
-               prop = NULL;
-               if (Z_TYPE_P(data) == IS_OBJECT) {
-                       prop = Z_OBJPROP_P(data);
-               } else if (Z_TYPE_P(data) == IS_ARRAY) {
-                       prop = Z_ARRVAL_P(data);
-               }
                if (prop != NULL) {
                        i = zend_hash_num_elements(prop);
                        zend_hash_internal_pointer_reset(prop);

http://cvs.php.net/viewcvs.cgi/php-src/ext/soap/tests/classmap003.phpt?view=markup&rev=1.1
Index: php-src/ext/soap/tests/classmap003.phpt
+++ php-src/ext/soap/tests/classmap003.phpt

http://cvs.php.net/viewcvs.cgi/php-src/ext/soap/tests/classmap003.wsdl?view=markup&rev=1.1
Index: php-src/ext/soap/tests/classmap003.wsdl
+++ php-src/ext/soap/tests/classmap003.wsdl

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to