cvs: php-src(PHP_5_2) / NEWS /ext/com_dotnet com_misc.c com_variant.c com_wrapper.c php_com_dotnet_internal.h

From: Date: Fri, 02 Feb 2007 15:27:35 +0000
Subject: cvs: php-src(PHP_5_2) / NEWS /ext/com_dotnet com_misc.c com_variant.c com_wrapper.c php_com_dotnet_internal.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-42937@lists.php.net to get a copy of this message
wharmby Fri Feb 2 15:27:35 2007 UTC Modified files: (Branch: PHP_5_2) /php-src/ext/com_dotnet php_com_dotnet_internal.h com_misc.c com_variant.c com_wrapper.c /php-src NEWS Log: Fixed bug #34564 (COM extension not returning modified "out" argument)

http://cvs.php.net/viewvc.cgi/php-src/ext/com_dotnet/php_com_dotnet_internal.h?r1=1.14.2.3.2.3&r2=1.14.2.3.2.4&diff_format=u Index: php-src/ext/com_dotnet/php_com_dotnet_internal.h diff -u php-src/ext/com_dotnet/php_com_dotnet_internal.h:1.14.2.3.2.3 php-src/ext/com_dotnet/php_com_dotnet_internal.h:1.14.2.3.2.4 --- php-src/ext/com_dotnet/php_com_dotnet_internal.h:1.14.2.3.2.3 Mon Jan 1 09:35:48 2007 +++ php-src/ext/com_dotnet/php_com_dotnet_internal.h Fri Feb 2 15:27:35 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_com_dotnet_internal.h,v 1.14.2.3.2.3 2007/01/01 09:35:48 sebastian Exp $ */ +/* $Id: php_com_dotnet_internal.h,v 1.14.2.3.2.4 2007/02/02 15:27:35 wharmby Exp $ */ #ifndef PHP_COM_DOTNET_INTERNAL_H #define PHP_COM_DOTNET_INTERNAL_H @@ -36,6 +36,7 @@ zend_object zo; VARIANT v; + int modified; ITypeInfo *typeinfo; long code_page; @@ -152,6 +153,7 @@ PHPAPI void php_com_variant_from_zval_with_type(VARIANT *v, zval *z, VARTYPE type, int codepage TSRMLS_DC); PHPAPI void php_com_variant_from_zval(VARIANT *v, zval *z, int codepage TSRMLS_DC); PHPAPI int php_com_zval_from_variant(zval *z, VARIANT *v, int codepage TSRMLS_DC); +PHPAPI int php_com_copy_variant(VARIANT *dst, VARIANT *src TSRMLS_DC); /* com_dotnet.c */ PHP_FUNCTION(com_dotnet_create_instance); http://cvs.php.net/viewvc.cgi/php-src/ext/com_dotnet/com_misc.c?r1=1.8.2.2.2.1&r2=1.8.2.2.2.2&diff_format=u Index: php-src/ext/com_dotnet/com_misc.c diff -u php-src/ext/com_dotnet/com_misc.c:1.8.2.2.2.1 php-src/ext/com_dotnet/com_misc.c:1.8.2.2.2.2 --- php-src/ext/com_dotnet/com_misc.c:1.8.2.2.2.1 Mon Jan 1 09:35:48 2007 +++ php-src/ext/com_dotnet/com_misc.c Fri Feb 2 15:27:35 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_misc.c,v 1.8.2.2.2.1 2007/01/01 09:35:48 sebastian Exp $ */ +/* $Id: com_misc.c,v 1.8.2.2.2.2 2007/02/02 15:27:35 wharmby Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -78,6 +78,7 @@ VariantInit(&obj->v); VariantCopyInd(&obj->v, v); + obj->modified = 0; if (V_VT(&obj->v) == VT_DISPATCH) { IDispatch_GetTypeInfo(V_DISPATCH(&obj->v), 0, LANG_NEUTRAL, &obj->typeinfo); http://cvs.php.net/viewvc.cgi/php-src/ext/com_dotnet/com_variant.c?r1=1.11.2.2.2.4&r2=1.11.2.2.2.5&diff_format=u Index: php-src/ext/com_dotnet/com_variant.c diff -u php-src/ext/com_dotnet/com_variant.c:1.11.2.2.2.4 php-src/ext/com_dotnet/com_variant.c:1.11.2.2.2.5 --- php-src/ext/com_dotnet/com_variant.c:1.11.2.2.2.4 Mon Jan 1 09:35:48 2007 +++ php-src/ext/com_dotnet/com_variant.c Fri Feb 2 15:27:35 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_variant.c,v 1.11.2.2.2.4 2007/01/01 09:35:48 sebastian Exp $ */ +/* $Id: com_variant.c,v 1.11.2.2.2.5 2007/02/02 15:27:35 wharmby Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -257,6 +257,140 @@ return ret; } + +PHPAPI int php_com_copy_variant(VARIANT *dstvar, VARIANT *srcvar TSRMLS_DC) +{ + int ret = SUCCESS; + + switch (V_VT(dstvar) & ~VT_BYREF) { + case VT_EMPTY: + case VT_NULL: + case VT_VOID: + /* should not be possible */ + break; + + case VT_UI1: + if (V_VT(dstvar) & VT_BYREF) { + *V_UI1REF(dstvar) = V_UI1(srcvar); + } else { + V_UI1(dstvar) = V_UI1(srcvar); + } + break; + + case VT_I1: + if (V_VT(dstvar) & VT_BYREF) { + *V_I1REF(dstvar) = V_I1(srcvar); + } else { + V_I1(dstvar) = V_I1(srcvar); + } + break; + + case VT_UI2: + if (V_VT(dstvar) & VT_BYREF) { + *V_UI2REF(dstvar) = V_UI2(srcvar); + } else { + V_UI2(dstvar) = V_UI2(srcvar); + } + break; + + case VT_I2: + if (V_VT(dstvar) & VT_BYREF) { + *V_I2REF(dstvar) = V_I2(srcvar); + } else { + V_I2(dstvar) = V_I2(srcvar); + } + break; + + case VT_UI4: + if (V_VT(dstvar) & VT_BYREF) { + *V_UI4REF(dstvar) = V_UI4(srcvar); + } else { + V_UI4(dstvar) = V_UI4(srcvar); + } + break; + + case VT_I4: + if (V_VT(dstvar) & VT_BYREF) { + *V_I4REF(dstvar) = V_I4(srcvar); + } else { + V_I4(dstvar) = V_I4(srcvar); + } + break; + + case VT_INT: + if (V_VT(dstvar) & VT_BYREF) { + *V_INTREF(dstvar) = V_INT(srcvar); + } else { + V_INT(dstvar) = V_INT(srcvar); + } + break; + + case VT_UINT: + if (V_VT(dstvar) & VT_BYREF) { + *V_UINTREF(dstvar) = V_UINT(srcvar); + } else { + V_UINT(dstvar) = V_UINT(srcvar); + } + break; + + case VT_R4: + if (V_VT(dstvar) & VT_BYREF) { + *V_R4REF(dstvar) = V_R4(srcvar); + } else { + V_R4(dstvar) = V_R4(srcvar); + } + break; + + case VT_R8: + if (V_VT(dstvar) & VT_BYREF) { + *V_R8REF(dstvar) = V_R8(srcvar); + } else { + V_R8(dstvar) = V_R8(srcvar); + } + break; + + case VT_BOOL: + if (V_VT(dstvar) & VT_BYREF) { + *V_BOOLREF(dstvar) = V_BOOL(srcvar); + } else { + V_BOOL(dstvar) = V_BOOL(srcvar); + } + break; + + case VT_BSTR: + if (V_VT(dstvar) & VT_BYREF) { + *V_BSTRREF(dstvar) = V_BSTR(srcvar); + } else { + V_BSTR(dstvar) = V_BSTR(srcvar); + } + break; + + case VT_UNKNOWN: + if (V_VT(dstvar) & VT_BYREF) { + *V_UNKNOWNREF(dstvar) = V_UNKNOWN(srcvar); + } else { + V_UNKNOWN(dstvar) = V_UNKNOWN(srcvar); + } + break; + + case VT_DISPATCH: + if (V_VT(dstvar) & VT_BYREF) { + *V_DISPATCHREF(dstvar) = V_DISPATCH(srcvar); + } else { + V_DISPATCH(dstvar) = V_DISPATCH(srcvar); + } + break; + + case VT_VARIANT: + return php_com_copy_variant(V_VARIANTREF(dstvar), srcvar TSRMLS_CC); + + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "variant->variant: failed to copy from 0x%x to 0x%x", V_VT(dstvar), V_VT(srcvar)); + ret = FAILURE; + } + return ret; +} + /* {{{ com_variant_create_instance - ctor for new VARIANT() */ PHP_FUNCTION(com_variant_create_instance) { @@ -357,6 +491,8 @@ VariantClear(&obj->v); php_com_variant_from_zval(&obj->v, zvalue, obj->code_page TSRMLS_CC); + /* remember we modified this variant */ + obj->modified = 1; } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/com_dotnet/com_wrapper.c?r1=1.9.2.1.2.2&r2=1.9.2.1.2.3&diff_format=u Index: php-src/ext/com_dotnet/com_wrapper.c diff -u php-src/ext/com_dotnet/com_wrapper.c:1.9.2.1.2.2 php-src/ext/com_dotnet/com_wrapper.c:1.9.2.1.2.3 --- php-src/ext/com_dotnet/com_wrapper.c:1.9.2.1.2.2 Mon Jan 1 09:35:48 2007 +++ php-src/ext/com_dotnet/com_wrapper.c Fri Feb 2 15:27:35 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_wrapper.c,v 1.9.2.1.2.2 2007/01/01 09:35:48 sebastian Exp $ */ +/* $Id: com_wrapper.c,v 1.9.2.1.2.3 2007/02/02 15:27:35 wharmby Exp $ */ /* This module exports a PHP object as a COM object by wrapping it * using IDispatchEx */ @@ -298,6 +298,17 @@ &retval, pdp->cArgs, params, 1, NULL TSRMLS_CC)) { ret = S_OK; trace("function called ok\n"); + + /* Copy any modified values to callers copy of variant*/ + for (i = 0; i < pdp->cArgs; i++) { + php_com_dotnet_object *obj = CDNO_FETCH(*params[i]); + VARIANT *srcvar = &obj->v; + VARIANT *dstvar = &pdp->rgvarg[ pdp->cArgs - 1 - i]; + if ((V_VT(dstvar) & VT_BYREF) && obj->modified ) { + trace("percolate modified value for arg %d VT=%08x\n", i, V_VT(dstvar)); + php_com_copy_variant(dstvar, srcvar TSRMLS_CC); + } + } } else { trace("failed to call func\n"); ret = DISP_E_EXCEPTION; http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.518&r2=1.2027.2.547.2.519&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.518 php-src/NEWS:1.2027.2.547.2.519 --- php-src/NEWS:1.2027.2.547.2.518 Thu Feb 1 00:12:39 2007 +++ php-src/NEWS Fri Feb 2 15:27:35 2007 @@ -349,6 +349,7 @@ error raised). (Carl P. Corliss, Dmitry) - Fixed bug #35106 (nested foreach fails when array variable has a reference). (Dmitry) +- Fixed bug #34564 (COM extension not returning modified "out" argument) (Andy) - Fixed bug #33734 (Something strange with COM Object). (Rob) - Fixed bug #33386 (ScriptControl only sees last function of class). (Rob) - Fixed bug #33282 (Re-assignment by reference does not clear the is_ref
« previous php.cvs (#42937) next »