dmitry          Fri Jul  8 03:16:58 2005 EDT

  Modified files:              
    /php-src/ext/soap   php_encoding.c 
  Log:
  Fixed support for <any> in base type of extension
  
  
http://cvs.php.net/diff.php/php-src/ext/soap/php_encoding.c?r1=1.99&r2=1.100&ty=u
Index: php-src/ext/soap/php_encoding.c
diff -u php-src/ext/soap/php_encoding.c:1.99 
php-src/ext/soap/php_encoding.c:1.100
--- php-src/ext/soap/php_encoding.c:1.99        Thu Jul  7 13:29:25 2005
+++ php-src/ext/soap/php_encoding.c     Fri Jul  8 03:16:56 2005
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: php_encoding.c,v 1.99 2005/07/07 17:29:25 dmitry Exp $ */
+/* $Id: php_encoding.c,v 1.100 2005/07/08 07:16:56 dmitry Exp $ */
 
 #include <time.h>
 
@@ -910,6 +910,66 @@
   return NULL;
 }
 
+static void unset_zval_property(zval* object, char* name TSRMLS_DC)
+{
+       if (Z_TYPE_P(object) == IS_OBJECT) {
+               zval member;
+               zend_class_entry *old_scope;
+
+               ZVAL_STRING(&member, name, 0);
+               old_scope = EG(scope);
+         EG(scope) = Z_OBJCE_P(object);
+               Z_OBJ_HT_P(object)->unset_property(object, &member TSRMLS_CC);
+               EG(scope) = old_scope;
+       } else if (Z_TYPE_P(object) == IS_ARRAY) {
+               zend_hash_del(Z_ARRVAL_P(object), name, strlen(name)+1);
+       }
+}
+
+static void model_to_zval_any(zval *ret, xmlNodePtr node TSRMLS_DC)
+{
+       zval* any = NULL;
+
+       while (node != NULL) {
+               if (get_zval_property(ret, (char*)node->name TSRMLS_CC) == 
NULL) {
+                       zval* val = master_to_zval(get_conversion(XSD_ANYXML), 
node);
+                       if (get_attribute_ex(node->properties,"type", 
XSI_NAMESPACE) == NULL &&
+                           Z_TYPE_P(val) == IS_STRING) {
+                               while (node->next != NULL &&
+                                      get_zval_property(ret, 
(char*)node->next->name TSRMLS_CC) == NULL &&
+                                      
get_attribute_ex(node->next->properties,"type", XSI_NAMESPACE) == NULL) {
+                                       zval* val2 = 
master_to_zval(get_conversion(XSD_ANYXML), node->next);
+                                       if (Z_TYPE_P(val2) != IS_STRING) {
+                                               break;
+                                       }
+                                       add_string_to_string(val, val, val2);
+                                       zval_ptr_dtor(&val2);
+                                 node = node->next;
+                               }
+                       }
+                       if (any == NULL) {
+                               any = val;
+                       } else {
+                               if (Z_TYPE_P(any) != IS_ARRAY) {
+                           /* Convert into array */
+                           zval *arr;
+
+                           MAKE_STD_ZVAL(arr);
+                           array_init(arr);
+                                 add_next_index_zval(arr, any);
+                                 any = arr;
+                         }
+                         /* Add array element */
+                         add_next_index_zval(any, val);
+                       }
+               }
+               node = node->next;
+       }
+       if (any) {
+               set_zval_property(ret, "any", any TSRMLS_CC);
+       }
+}
+
 static void model_to_zval_object(zval *ret, sdlContentModelPtr model, 
xmlNodePtr data, sdlPtr sdl TSRMLS_DC)
 {
        switch (model->kind) {
@@ -987,43 +1047,7 @@
                                zend_hash_move_forward_ex(model->u.content, 
&pos);
                        }
                        if (any) {
-                               xmlNodePtr node = data->children;
-                               zval* any = NULL;
-
-                               while (node != NULL) {
-                                       if (get_zval_property(ret, 
(char*)node->name TSRMLS_CC) == NULL) {
-                                               zval* val = 
master_to_zval(get_conversion(XSD_ANYXML), node);
-                                               while (Z_TYPE_P(val) == 
IS_STRING && node->next != NULL &&
-                                                   get_zval_property(ret, 
(char*)node->next->name TSRMLS_CC) == NULL) {
-                                                       zval* val2 = 
master_to_zval(get_conversion(XSD_ANYXML), node->next);
-                                                       if (Z_TYPE_P(val2) != 
IS_STRING) {
-                                                               break;
-                                                       }
-                                                       
add_string_to_string(val, val, val2);
-                                                       zval_ptr_dtor(&val2);
-                                                 node = node->next;
-                                               }
-                                               if (any == NULL) {
-                                                       any = val;
-                                               } else {
-                                                       if (Z_TYPE_P(any) != 
IS_ARRAY) {
-                                                   /* Convert into array */
-                                                   zval *arr;
-
-                                                   MAKE_STD_ZVAL(arr);
-                                                   array_init(arr);
-                                                         
add_next_index_zval(arr, any);
-                                                         any = arr;
-                                                 }
-                                                 /* Add array element */
-                                                 add_next_index_zval(any, val);
-                                               }
-                                       }
-                                       node = node->next;
-                               }
-                               if (any) {
-                                       set_zval_property(ret, "any", any 
TSRMLS_CC);
-                               }
+                               model_to_zval_any(ret, data->children 
TSRMLS_CC);
                        }
                        break;
                }
@@ -1043,6 +1067,7 @@
        sdlPtr sdl;
        sdlTypePtr sdlType = type->sdl_type;
        zend_class_entry *ce = ZEND_STANDARD_CLASS_DEF_PTR;
+       zend_bool redo_any = 0;
        TSRMLS_FETCH();
 
        if (SOAP_GLOBAL(class_map) && type->type_str) {
@@ -1090,6 +1115,10 @@
                            sdlType->encode->details.sdl_type->kind != 
XSD_TYPEKIND_UNION) {
                                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);
+                                       redo_any = 1;
+                         }
                        } else {
                                zval *base;
 
@@ -1106,6 +1135,9 @@
                }
                if (sdlType->model) {
                        model_to_zval_object(ret, sdlType->model, data, sdl 
TSRMLS_CC);
+                       if (redo_any && get_zval_property(ret, "any" TSRMLS_CC) 
== NULL) {
+                               model_to_zval_any(ret, data->children 
TSRMLS_CC);                               
+                 }
                }
                if (sdlType->attributes) {
                        sdlAttributePtr *attr;

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

Reply via email to