Alex Villacís Lasso : oleaut32: Support for VT_DISPATCH in VarOr.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jan 3 05:37:37 CST 2007
Module: wine
Branch: master
Commit: e98a49dee469cf1257c13c77147c4424a1f928f0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e98a49dee469cf1257c13c77147c4424a1f928f0
Author: Alex Villacís Lasso <a_villacis at palosanto.com>
Date: Tue Jan 2 18:52:52 2007 -0500
oleaut32: Support for VT_DISPATCH in VarOr.
---
dlls/oleaut32/variant.c | 90 ++++++++++++++++++++++++++++++++++++----------
1 files changed, 70 insertions(+), 20 deletions(-)
diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c
index 7a7909e..318ebfc 100644
--- a/dlls/oleaut32/variant.c
+++ b/dlls/oleaut32/variant.c
@@ -3960,16 +3960,40 @@ HRESULT WINAPI VarOr(LPVARIANT pVarLeft,
VARTYPE vt = VT_I4;
VARIANT varLeft, varRight, varStr;
HRESULT hRet;
+ VARIANT tempLeft, tempRight;
+
+ VariantInit(&tempLeft);
+ VariantInit(&tempRight);
+ VariantInit(&varLeft);
+ VariantInit(&varRight);
+ VariantInit(&varStr);
TRACE("(%p->(%s%s),%p->(%s%s),%p)\n", pVarLeft, debugstr_VT(pVarLeft),
debugstr_VF(pVarLeft), pVarRight, debugstr_VT(pVarRight),
debugstr_VF(pVarRight), pVarOut);
+ /* Handle VT_DISPATCH by storing and taking address of returned value */
+ if ((V_VT(pVarLeft) & VT_TYPEMASK) == VT_DISPATCH)
+ {
+ hRet = VARIANT_FetchDispatchValue(pVarLeft, &tempLeft);
+ if (FAILED(hRet)) goto VarOr_Exit;
+ pVarLeft = &tempLeft;
+ }
+ if ((V_VT(pVarRight) & VT_TYPEMASK) == VT_DISPATCH)
+ {
+ hRet = VARIANT_FetchDispatchValue(pVarRight, &tempRight);
+ if (FAILED(hRet)) goto VarOr_Exit;
+ pVarRight = &tempRight;
+ }
+
if (V_EXTRA_TYPE(pVarLeft) || V_EXTRA_TYPE(pVarRight) ||
V_VT(pVarLeft) == VT_UNKNOWN || V_VT(pVarRight) == VT_UNKNOWN ||
V_VT(pVarLeft) == VT_DISPATCH || V_VT(pVarRight) == VT_DISPATCH ||
V_VT(pVarLeft) == VT_RECORD || V_VT(pVarRight) == VT_RECORD)
- return DISP_E_BADVARTYPE;
+ {
+ hRet = DISP_E_BADVARTYPE;
+ goto VarOr_Exit;
+ }
V_VT(&varLeft) = V_VT(&varRight) = V_VT(&varStr) = VT_EMPTY;
@@ -3987,49 +4011,62 @@ HRESULT WINAPI VarOr(LPVARIANT pVarLeft,
case VT_DATE: case VT_R8:
if (V_R8(pVarLeft))
goto VarOr_AsEmpty;
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
case VT_BOOL:
if (V_BOOL(pVarLeft))
*pVarOut = *pVarLeft;
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
case VT_I2: case VT_UI2:
if (V_I2(pVarLeft))
goto VarOr_AsEmpty;
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
case VT_I1:
if (V_I1(pVarLeft))
goto VarOr_AsEmpty;
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
case VT_UI1:
if (V_UI1(pVarLeft))
*pVarOut = *pVarLeft;
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
case VT_R4:
if (V_R4(pVarLeft))
goto VarOr_AsEmpty;
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
case VT_I4: case VT_UI4: case VT_INT: case VT_UINT:
if (V_I4(pVarLeft))
goto VarOr_AsEmpty;
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
case VT_CY:
if (V_CY(pVarLeft).int64)
goto VarOr_AsEmpty;
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
case VT_I8: case VT_UI8:
if (V_I8(pVarLeft))
goto VarOr_AsEmpty;
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
case VT_DECIMAL:
if (DEC_HI32(&V_DECIMAL(pVarLeft)) || DEC_LO64(&V_DECIMAL(pVarLeft)))
goto VarOr_AsEmpty;
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
case VT_BSTR:
{
VARIANT_BOOL b;
if (!V_BSTR(pVarLeft))
- return DISP_E_BADVARTYPE;
+ {
+ hRet = DISP_E_BADVARTYPE;
+ goto VarOr_Exit;
+ }
hRet = VarBoolFromStr(V_BSTR(pVarLeft), LOCALE_USER_DEFAULT, VAR_LOCALBOOL, &b);
if (SUCCEEDED(hRet) && b)
@@ -4037,13 +4074,15 @@ HRESULT WINAPI VarOr(LPVARIANT pVarLeft,
V_VT(pVarOut) = VT_BOOL;
V_BOOL(pVarOut) = b;
}
- return hRet;
+ goto VarOr_Exit;
}
case VT_NULL: case VT_EMPTY:
V_VT(pVarOut) = VT_NULL;
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
default:
- return DISP_E_BADVARTYPE;
+ hRet = DISP_E_BADVARTYPE;
+ goto VarOr_Exit;
}
}
@@ -4061,7 +4100,10 @@ VarOr_AsEmpty:
{
case VT_BSTR:
if (!V_BSTR(pVarLeft))
- return DISP_E_BADVARTYPE;
+ {
+ hRet = DISP_E_BADVARTYPE;
+ goto VarOr_Exit;
+ }
hRet = VariantCopy(&varStr, pVarLeft);
if (FAILED(hRet))
@@ -4083,7 +4125,8 @@ VarOr_AsEmpty:
V_VT(pVarOut) = VT_I8;
break;
default:
- return DISP_E_BADVARTYPE;
+ hRet = DISP_E_BADVARTYPE;
+ goto VarOr_Exit;
}
hRet = VariantCopy(&varLeft, pVarLeft);
if (FAILED(hRet))
@@ -4097,14 +4140,16 @@ VarOr_AsEmpty:
{
V_VT(pVarOut) = VT_BOOL;
V_BOOL(pVarOut) = V_BOOL(pVarLeft) | V_BOOL(pVarRight);
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
}
if (V_VT(pVarLeft) == VT_UI1 && V_VT(pVarRight) == VT_UI1)
{
V_VT(pVarOut) = VT_UI1;
V_UI1(pVarOut) = V_UI1(pVarLeft) | V_UI1(pVarRight);
- return S_OK;
+ hRet = S_OK;
+ goto VarOr_Exit;
}
if (V_VT(pVarLeft) == VT_BSTR)
@@ -4133,7 +4178,10 @@ VarOr_AsEmpty:
else if (V_VT(pVarLeft) == VT_I8 || V_VT(pVarRight) == VT_I8)
{
if (V_VT(pVarLeft) == VT_INT || V_VT(pVarRight) == VT_INT)
- return DISP_E_TYPEMISMATCH;
+ {
+ hRet = DISP_E_TYPEMISMATCH;
+ goto VarOr_Exit;
+ }
vt = VT_I8;
}
@@ -4193,6 +4241,8 @@ VarOr_Exit:
VariantClear(&varStr);
VariantClear(&varLeft);
VariantClear(&varRight);
+ VariantClear(&tempLeft);
+ VariantClear(&tempRight);
return hRet;
}
More information about the wine-cvs
mailing list