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