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