php_com_dotnet_object *obj;
zval *args[2];
VARIANT v;
+ HRESULT res;
obj = CDNO_FETCH(object);
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);
}
}
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;
}
}
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);
{
php_com_saproxy *proxy = SA_FETCH(object);
UINT dims;
- SAFEARRAY *sa;
- LONG ubound, lbound;
int i;
HRESULT res;
VARIANT v;
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);
}
{
php_com_saproxy *proxy = (php_com_saproxy *)object;
php_com_saproxy *cloneproxy;
- int i;
cloneproxy = emalloc(sizeof(*cloneproxy));
memcpy(cloneproxy, proxy, sizeof(*cloneproxy));
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);
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);
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;
123
456
789
+string(3) "123"
+string(5) "hello"
+string(3) "789"
+Got BADINDEX exception OK!
OK!