wez             Mon May  3 16:10:58 2004 EDT

  Modified files:              
    /php-src/ext/com_dotnet     com_extension.c com_handlers.c com_misc.c 
                                com_saproxy.c com_variant.c 
    /php-src/ext/com_dotnet/tests       27974.phpt 
  Log:
  Enable writing to SafeArray dimensions.
  
  
http://cvs.php.net/diff.php/php-src/ext/com_dotnet/com_extension.c?r1=1.12&r2=1.13&ty=u
Index: php-src/ext/com_dotnet/com_extension.c
diff -u php-src/ext/com_dotnet/com_extension.c:1.12 
php-src/ext/com_dotnet/com_extension.c:1.13
--- php-src/ext/com_dotnet/com_extension.c:1.12 Mon May  3 11:51:41 2004
+++ php-src/ext/com_dotnet/com_extension.c      Mon May  3 16:10:57 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: com_extension.c,v 1.12 2004/05/03 15:51:41 wez Exp $ */
+/* $Id: com_extension.c,v 1.13 2004/05/03 20:10:57 wez Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -281,6 +281,7 @@
 #endif
        COM_CONST(DISP_E_DIVBYZERO);
        COM_CONST(DISP_E_OVERFLOW);
+       COM_CONST(DISP_E_BADINDEX);
 
        return SUCCESS;
 }
http://cvs.php.net/diff.php/php-src/ext/com_dotnet/com_handlers.c?r1=1.20&r2=1.21&ty=u
Index: php-src/ext/com_dotnet/com_handlers.c
diff -u php-src/ext/com_dotnet/com_handlers.c:1.20 
php-src/ext/com_dotnet/com_handlers.c:1.21
--- php-src/ext/com_dotnet/com_handlers.c:1.20  Mon May  3 14:19:07 2004
+++ php-src/ext/com_dotnet/com_handlers.c       Mon May  3 16:10:57 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: com_handlers.c,v 1.20 2004/05/03 18:19:07 wez Exp $ */
+/* $Id: com_handlers.c,v 1.21 2004/05/03 20:10:57 wez Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -158,6 +158,7 @@
        php_com_dotnet_object *obj;
        zval *args[2];
        VARIANT v;
+       HRESULT res;
 
        obj = CDNO_FETCH(object);
 
@@ -176,8 +177,42 @@
                                DISPATCH_METHOD|DISPATCH_PROPERTYPUT, &v, 2, args 
TSRMLS_CC)) {
                        VariantClear(&v);
                }
+       } else if (V_ISARRAY(&obj->v)) {
+               LONG indices = 0;
+               VARTYPE vt;
+               
+               if (SafeArrayGetDim(V_ARRAY(&obj->v)) == 1) {   
+                       if (FAILED(SafeArrayGetVartype(V_ARRAY(&obj->v), &vt)) || vt 
== VT_EMPTY) {
+                               vt = V_VT(&obj->v) & ~VT_ARRAY;
+                       }
+
+                       convert_to_long(offset);
+                       indices = Z_LVAL_P(offset);
+
+                       VariantInit(&v);
+                       php_com_variant_from_zval(&v, value, obj->code_page TSRMLS_CC);
+
+                       if (V_VT(&v) != vt) {
+                               VariantChangeType(&v, &v, 0, vt);
+                       }
+
+                       if (vt == VT_VARIANT) {
+                               res = SafeArrayPutElement(V_ARRAY(&obj->v), &indices, 
&v);
+                       } else {
+                               res = SafeArrayPutElement(V_ARRAY(&obj->v), &indices, 
&v.lVal);
+                       }
+
+                       VariantClear(&v);
+
+                       if (FAILED(res)) {
+                               php_com_throw_exception(res, NULL TSRMLS_CC);
+                       }
+
+               } else {
+                       php_com_throw_exception(DISP_E_BADINDEX, "this variant has 
multiple dimensions; you can't set a new value without specifying *all* dimensions" 
TSRMLS_CC);
+               }
+
        } else {
-               /* TODO: check for safearray */
                php_com_throw_exception(E_INVALIDARG, "this variant is not an array 
type" TSRMLS_CC);
        }
 }
http://cvs.php.net/diff.php/php-src/ext/com_dotnet/com_misc.c?r1=1.5&r2=1.6&ty=u
Index: php-src/ext/com_dotnet/com_misc.c
diff -u php-src/ext/com_dotnet/com_misc.c:1.5 php-src/ext/com_dotnet/com_misc.c:1.6
--- php-src/ext/com_dotnet/com_misc.c:1.5       Thu Feb 12 05:43:19 2004
+++ php-src/ext/com_dotnet/com_misc.c   Mon May  3 16:10:57 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: com_misc.c,v 1.5 2004/02/12 10:43:19 zeev Exp $ */
+/* $Id: com_misc.c,v 1.6 2004/05/03 20:10:57 wez Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -118,7 +118,7 @@
        
        /* check bounds */
        if (dim1 < lbound || dim1 > ubound) {
-               php_com_throw_exception(E_INVALIDARG, "index out of bounds" TSRMLS_CC);
+               php_com_throw_exception(DISP_E_BADINDEX, "index out of bounds" 
TSRMLS_CC);
                return 0;
        }
        
http://cvs.php.net/diff.php/php-src/ext/com_dotnet/com_saproxy.c?r1=1.10&r2=1.11&ty=u
Index: php-src/ext/com_dotnet/com_saproxy.c
diff -u php-src/ext/com_dotnet/com_saproxy.c:1.10 
php-src/ext/com_dotnet/com_saproxy.c:1.11
--- php-src/ext/com_dotnet/com_saproxy.c:1.10   Mon May  3 14:19:07 2004
+++ php-src/ext/com_dotnet/com_saproxy.c        Mon May  3 16:10:57 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: com_saproxy.c,v 1.10 2004/05/03 18:19:07 wez Exp $ */
+/* $Id: com_saproxy.c,v 1.11 2004/05/03 20:10:57 wez Exp $ */
 
 /* This module implements a SafeArray proxy which is used internally
  * by the engine when resolving multi-dimensional array accesses on
@@ -156,7 +156,7 @@
        SafeArrayGetUBound(sa, proxy->dimensions, &ubound);
 
        if (Z_LVAL_P(offset) < lbound || Z_LVAL_P(offset) > ubound) {
-               php_com_throw_exception(E_INVALIDARG, "index out of bounds" TSRMLS_CC);
+               php_com_throw_exception(DISP_E_BADINDEX, "index out of bounds" 
TSRMLS_CC);
                return return_value;
        }
        
@@ -185,15 +185,19 @@
                }
 
                if (vt == VT_VARIANT) {
-                       SafeArrayGetElement(sa, indices, &v);
+                       res = SafeArrayGetElement(sa, indices, &v);
                } else {
                        V_VT(&v) = vt;
-                       SafeArrayGetElement(sa, indices, &v.lVal);
+                       res = SafeArrayGetElement(sa, indices, &v.lVal);
                }
 
                free_alloca(indices);
 
-               php_com_wrap_variant(return_value, &v, proxy->obj->code_page 
TSRMLS_CC);
+               if (SUCCEEDED(res)) {
+                       php_com_wrap_variant(return_value, &v, proxy->obj->code_page 
TSRMLS_CC);
+               } else {
+                       php_com_throw_exception(res, NULL TSRMLS_CC);
+               }
 
                VariantClear(&v);
                
@@ -209,8 +213,6 @@
 {
        php_com_saproxy *proxy = SA_FETCH(object);
        UINT dims;
-       SAFEARRAY *sa;
-       LONG ubound, lbound;
        int i;
        HRESULT res;
        VARIANT v;
@@ -238,7 +240,44 @@
                efree(args);
                
        } else if (V_ISARRAY(&proxy->obj->v)) {
-               php_com_throw_exception(E_NOTIMPL, "writing to safearray not yet 
implemented" TSRMLS_CC);
+               LONG *indices;
+               VARTYPE vt;
+
+               dims = SafeArrayGetDim(V_ARRAY(&proxy->obj->v));
+               indices = do_alloca(dims * sizeof(LONG));
+               /* copy indices from proxy */
+               for (i = 0; i < dims; i++) {
+                       convert_to_long(proxy->indices[i]);
+                       indices[i] = Z_LVAL_P(proxy->indices[i]);
+               }
+
+               /* add user-supplied index */
+               convert_to_long(offset);
+               indices[dims-1] = Z_LVAL_P(offset);
+
+               if (FAILED(SafeArrayGetVartype(V_ARRAY(&proxy->obj->v), &vt)) || vt == 
VT_EMPTY) {
+                       vt = V_VT(&proxy->obj->v) & ~VT_ARRAY;
+               }
+
+               VariantInit(&v);
+               php_com_variant_from_zval(&v, value, proxy->obj->code_page TSRMLS_CC);
+
+               if (V_VT(&v) != vt) {
+                       VariantChangeType(&v, &v, 0, vt);
+               }
+
+               if (vt == VT_VARIANT) {
+                       res = SafeArrayPutElement(V_ARRAY(&proxy->obj->v), indices, 
&v);
+               } else {
+                       res = SafeArrayPutElement(V_ARRAY(&proxy->obj->v), indices, 
&v.lVal);
+               }
+       
+               free_alloca(indices);
+               VariantClear(&v);
+
+               if (FAILED(res)) {
+                       php_com_throw_exception(res, NULL TSRMLS_CC);
+               }
        } else {
                php_com_throw_exception(E_NOTIMPL, "invalid write to com proxy object" 
TSRMLS_CC);
        }
@@ -366,7 +405,6 @@
 {
        php_com_saproxy *proxy = (php_com_saproxy *)object;
        php_com_saproxy *cloneproxy;
-       int i;
 
        cloneproxy = emalloc(sizeof(*cloneproxy));
        memcpy(cloneproxy, proxy, sizeof(*cloneproxy));
http://cvs.php.net/diff.php/php-src/ext/com_dotnet/com_variant.c?r1=1.7&r2=1.8&ty=u
Index: php-src/ext/com_dotnet/com_variant.c
diff -u php-src/ext/com_dotnet/com_variant.c:1.7 
php-src/ext/com_dotnet/com_variant.c:1.8
--- php-src/ext/com_dotnet/com_variant.c:1.7    Mon May  3 11:51:41 2004
+++ php-src/ext/com_dotnet/com_variant.c        Mon May  3 16:10:57 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: com_variant.c,v 1.7 2004/05/03 15:51:41 wez Exp $ */
+/* $Id: com_variant.c,v 1.8 2004/05/03 20:10:57 wez Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -444,10 +444,7 @@
        if (SUCCEEDED(result)) {
                php_com_wrap_variant(return_value, &vres, codepage TSRMLS_CC);
        } else {
-               char *werr;
-               werr = php_win_err(result);
-               php_com_throw_exception(result, werr TSRMLS_CC);
-               LocalFree(werr);
+               php_com_throw_exception(result, NULL TSRMLS_CC);
        }
 
        VariantClear(&vres);
@@ -606,10 +603,7 @@
        if (SUCCEEDED(result)) {
                php_com_wrap_variant(return_value, &vres, codepage TSRMLS_CC);
        } else {
-               char *werr;
-               werr = php_win_err(result);
-               php_com_throw_exception(result, werr TSRMLS_CC);
-               LocalFree(werr);
+               php_com_throw_exception(result, NULL TSRMLS_CC);
        }
 
        VariantClear(&vres);
http://cvs.php.net/diff.php/php-src/ext/com_dotnet/tests/27974.phpt?r1=1.1&r2=1.2&ty=u
Index: php-src/ext/com_dotnet/tests/27974.phpt
diff -u php-src/ext/com_dotnet/tests/27974.phpt:1.1 
php-src/ext/com_dotnet/tests/27974.phpt:1.2
--- php-src/ext/com_dotnet/tests/27974.phpt:1.1 Thu Apr 22 10:29:33 2004
+++ php-src/ext/com_dotnet/tests/27974.phpt     Mon May  3 16:10:58 2004
@@ -4,15 +4,27 @@
 <?php # vim:ft=php
 if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present"; ?>
 --FILE--
-<?php // $Id: 27974.phpt,v 1.1 2004/04/22 14:29:33 wez Exp $
+<?php // $Id: 27974.phpt,v 1.2 2004/05/03 20:10:58 wez Exp $
 error_reporting(E_ALL);
 
 try {
-$v = new VARIANT(array("123", "456", "789"));
+       $v = new VARIANT(array("123", "456", "789"));
        var_dump($v);
        print $v[0] . "\n";
        print $v[1] . "\n";
        print $v[2] . "\n";
+       $v[1] = "hello";
+       foreach ($v as $item) {
+               var_dump($item);
+       }
+       try {
+               $v[3] = "shouldn't work";
+       } catch (com_exception $e) {
+               if ($e->getCode() != DISP_E_BADINDEX) {
+                       throw $e;
+               }
+               echo "Got BADINDEX exception OK!\n";
+       }
        echo "OK!";
 } catch (Exception $e) {
        print $e;
@@ -24,4 +36,8 @@
 123
 456
 789
+string(3) "123"
+string(5) "hello"
+string(3) "789"
+Got BADINDEX exception OK!
 OK!

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

Reply via email to