dmitry          Wed Jan  9 13:49:41 2008 UTC

  Added files:                 (Branch: PHP_5_3)
    /php-src/ext/soap/tests     server031.phpt 

  Modified files:              
    /php-src    NEWS 
    /php-src/ext/soap   php_encoding.c 
  Log:
  Remplemented support for SplArray using Traversable interface.
  
  
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.64&r2=1.2027.2.547.2.965.2.65&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.965.2.64 
php-src/NEWS:1.2027.2.547.2.965.2.65
--- php-src/NEWS:1.2027.2.547.2.965.2.64        Sun Dec 30 16:46:27 2007
+++ php-src/NEWS        Wed Jan  9 13:49:40 2008
@@ -1,7 +1,7 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 20??, PHP 5.3.0
-- Added ability to use SplArrays instead of plain arrays in ext/soap.
+- Added ability to use Traversable objecta instead of plain arrays in ext/soap.
   (Joshua Reese, Dmitry)
 - Added "?:" operator. (Marcus)
 - Added stream_supports_lock() function. (Benjamin Schulz)
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/php_encoding.c?r1=1.103.2.21.2.37.2.5&r2=1.103.2.21.2.37.2.6&diff_format=u
Index: php-src/ext/soap/php_encoding.c
diff -u php-src/ext/soap/php_encoding.c:1.103.2.21.2.37.2.5 
php-src/ext/soap/php_encoding.c:1.103.2.21.2.37.2.6
--- php-src/ext/soap/php_encoding.c:1.103.2.21.2.37.2.5 Mon Dec 31 07:17:13 2007
+++ php-src/ext/soap/php_encoding.c     Wed Jan  9 13:49:40 2008
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: php_encoding.c,v 1.103.2.21.2.37.2.5 2007/12/31 07:17:13 sebastian Exp 
$ */
+/* $Id: php_encoding.c,v 1.103.2.21.2.37.2.6 2008/01/09 13:49:40 dmitry Exp $ 
*/
 
 #include <time.h>
 
@@ -26,10 +26,7 @@
 #include "ext/standard/base64.h"
 #include <libxml/parserInternals.h>
 #include "zend_strtod.h"
-
-#ifdef HAVE_SPL
-# include "ext/spl/spl_array.h"
-#endif
+#include "zend_interfaces.h"
 
 /* zval type decode */
 static zval *to_zval_double(encodeTypePtr type, xmlNodePtr data);
@@ -2242,9 +2239,7 @@
        int dimension = 1;
        int* dims;
        int soap_version;
-#ifdef HAVE_SPL
        zval *array_copy = NULL;
-#endif
        TSRMLS_FETCH();
 
        soap_version = SOAP_GLOBAL(soap_version);
@@ -2264,17 +2259,74 @@
                return xmlParam;
        }
 
-#ifdef HAVE_SPL
-       if (Z_TYPE_P(data) == IS_OBJECT && 
(instanceof_function(Z_OBJCE_P(data), spl_ce_ArrayObject TSRMLS_CC) || 
instanceof_function(Z_OBJCE_P(data), spl_ce_ArrayIterator TSRMLS_CC))) {
-               zval getArray;
-            
-               ZVAL_STRING(&getArray, "getArrayCopy", 0);
-               call_user_function_ex(NULL, &data, &getArray, &array_copy, 0, 
0, 0, NULL TSRMLS_CC);        
-               if (Z_TYPE_P(array_copy) == IS_ARRAY) {
+       if (Z_TYPE_P(data) == IS_OBJECT && instanceof_function(Z_OBJCE_P(data), 
zend_ce_traversable TSRMLS_CC)) {
+               zend_object_iterator   *iter;
+               zend_class_entry       *ce = Z_OBJCE_P(data);
+               zval                  **val;
+               char                   *str_key;
+               uint                    str_key_len;
+               ulong                   int_key;
+               int                     key_type;
+
+               ALLOC_ZVAL(array_copy);
+               INIT_PZVAL(array_copy);
+               array_init(array_copy);
+
+               iter = ce->get_iterator(ce, data, 0 TSRMLS_CC);
+
+               if (EG(exception)) {
+                       goto iterator_done;
+               }
+
+               if (iter->funcs->rewind) {
+                       iter->funcs->rewind(iter TSRMLS_CC);
+                       if (EG(exception)) {
+                               goto iterator_done;
+                       }
+               }
+
+               while (iter->funcs->valid(iter TSRMLS_CC) == SUCCESS) {
+                       if (EG(exception)) {
+                               goto iterator_done;
+                       }
+
+                       iter->funcs->get_current_data(iter, &val TSRMLS_CC);
+                       if (EG(exception)) {
+                               goto iterator_done;
+                       }
+                       if (iter->funcs->get_current_key) {
+                               key_type = iter->funcs->get_current_key(iter, 
&str_key, &str_key_len, &int_key TSRMLS_CC);
+                               if (EG(exception)) {
+                                       goto iterator_done;
+                               }
+                               switch(key_type) {
+                                       case HASH_KEY_IS_STRING:
+                                               add_assoc_zval_ex(array_copy, 
str_key, str_key_len, *val);
+                                               efree(str_key);
+                                               break;
+                                       case HASH_KEY_IS_LONG:
+                                               add_index_zval(array_copy, 
int_key, *val);
+                                               break;
+                               }
+                       } else {
+                               add_next_index_zval(array_copy, *val);
+                       }
+                       Z_ADDREF_PP(val);
+
+                       iter->funcs->move_forward(iter TSRMLS_CC);
+                       if (EG(exception)) {
+                               goto iterator_done;
+                       }
+               }
+iterator_done:
+               iter->funcs->dtor(iter TSRMLS_CC);
+               if (EG(exception)) {
+                       zval_ptr_dtor(&array_copy);
+                       array_copy = NULL;
+               } else {
                        data = array_copy;
                }
        }
-#endif
 
        if (Z_TYPE_P(data) == IS_ARRAY) {
                sdlAttributePtr *arrayType;
@@ -2454,11 +2506,9 @@
                }
        }
 
-#ifdef HAVE_SPL
        if (array_copy) {
                zval_ptr_dtor(&array_copy);
        }
-#endif
 
        return xmlParam;
 }

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

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

Reply via email to