Piotr Caban : oleaut32: Improve TypeInfos with changed TypeKind handling.
Alexandre Julliard
julliard at winehq.org
Tue Mar 16 11:49:16 CDT 2010
Module: wine
Branch: master
Commit: d9fd33e3a9533b0d3afb11e0d67dc8ffea41193f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d9fd33e3a9533b0d3afb11e0d67dc8ffea41193f
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon Mar 15 23:38:24 2010 +0100
oleaut32: Improve TypeInfos with changed TypeKind handling.
---
dlls/oleaut32/tests/typelib.c | 25 ++++++++++++++++++++++---
dlls/oleaut32/typelib2.c | 31 ++++++++++++++++++++++++-------
2 files changed, 46 insertions(+), 10 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 452ab7d..02a7027 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -1087,6 +1087,9 @@ static void test_CreateTypeLib(void) {
ok(hres == S_OK, "got %08x\n", hres);
ok(hreftype == 3, "hreftype = %d\n", hreftype);
+ hres = ITypeInfo_GetRefTypeOfImplType(interface1, -1, &hreftype);
+ ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
+
memset(&funcdesc, 0, sizeof(FUNCDESC));
funcdesc.funckind = FUNC_PUREVIRTUAL;
funcdesc.invkind = INVOKE_PROPERTYGET;
@@ -1237,6 +1240,9 @@ static void test_CreateTypeLib(void) {
ok(hres == S_OK, "got %08x\n", hres);
ok(hreftype == 2, "hreftype = %d\n", hreftype);
+ hres = ITypeInfo_GetRefTypeOfImplType(interface2, -1, &hreftype);
+ ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
+
hres = ICreateTypeInfo_SetImplTypeFlags(createti, 0, IMPLTYPEFLAG_FDEFAULT);
ok(hres == TYPE_E_BADMODULEKIND, "got %08x\n", hres);
@@ -1309,6 +1315,9 @@ static void test_CreateTypeLib(void) {
ok(hres == S_OK, "got %08x\n", hres);
ok(hreftype == 1, "hreftype = %d\n", hreftype);
+ hres = ITypeInfo_GetRefTypeOfImplType(ti, -1, &hreftype);
+ ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
+
ITypeInfo_Release(ti);
ICreateTypeInfo_Release(createti);
@@ -1316,6 +1325,12 @@ static void test_CreateTypeLib(void) {
hres = ICreateTypeLib_CreateTypeInfo(createtl, dualW, TKIND_INTERFACE, &createti);
ok(hres == S_OK, "got %08x\n", hres);
+ hres = ICreateTypeInfo_SetTypeFlags(createti, TYPEFLAG_FDUAL);
+ ok(hres == S_OK, "got %08x\n", hres);
+
+ hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
+ ok(hres == S_OK, "got %08x\n", hres);
+
hres = ICreateTypeInfo_AddRefTypeInfo(createti, dispatch, &hreftype);
ok(hres == S_OK, "got %08x\n", hres);
@@ -1329,15 +1344,19 @@ static void test_CreateTypeLib(void) {
ok(hres == S_OK, "got %08x\n", hres);
ok(typeattr->cbSizeInstance == 4, "cbSizeInstance = %d\n", typeattr->cbSizeInstance);
ok(typeattr->typekind == 3, "typekind = %d\n", typeattr->typekind);
- ok(typeattr->cFuncs == 0, "cFuncs = %d\n", typeattr->cFuncs);
+ ok(typeattr->cFuncs == 1, "cFuncs = %d\n", typeattr->cFuncs);
ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
- ok(typeattr->cbSizeVft == 28, "cbSizeVft = %d\n", typeattr->cbSizeVft);
+ ok(typeattr->cbSizeVft == 32, "cbSizeVft = %d\n", typeattr->cbSizeVft);
ok(typeattr->cbAlignment == 4, "cbAlignment = %d\n", typeattr->cbAlignment);
- ok(typeattr->wTypeFlags == TYPEFLAG_FDISPATCHABLE, "wTypeFlags = %d\n", typeattr->wTypeFlags);
+ ok(typeattr->wTypeFlags == (TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL), "wTypeFlags = %d\n", typeattr->wTypeFlags);
ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
+ hres = ITypeInfo_GetRefTypeOfImplType(ti, -1, &hreftype);
+ ok(hres == S_OK, "got %08x\n", hres);
+ ok(hreftype == -2, "got %08x\n", hreftype);
+
ITypeInfo_ReleaseTypeAttr(ti, typeattr);
ITypeInfo_Release(ti);
diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c
index dd42ab4..99fc07f 100644
--- a/dlls/oleaut32/typelib2.c
+++ b/dlls/oleaut32/typelib2.c
@@ -1640,6 +1640,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(
int *typedata;
int i, num_defaults = 0;
int decoded_size;
+ TYPEKIND tkind;
HRESULT hres;
TRACE("(%p,%d,%p)\n", iface, index, pFuncDesc);
@@ -1653,7 +1654,9 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(
pFuncDesc->cParamsOpt, pFuncDesc->oVft, pFuncDesc->cScodes,
pFuncDesc->elemdescFunc.tdesc.vt, pFuncDesc->wFuncFlags);
- switch(This->typeinfo->typekind&0xf) {
+ tkind = This->typeinfo->typekind&0x10?TKIND_INTERFACE:This->typeinfo->typekind&0xf;
+
+ switch(tkind) {
case TKIND_MODULE:
if(pFuncDesc->funckind != FUNC_STATIC)
return TYPE_E_BADMODULEKIND;
@@ -1814,15 +1817,16 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddImplType(
ref->flags = 0;
ref->oCustData = -1;
ref->onext = -1;
- } else if ((This->typeinfo->typekind & 15) == TKIND_DISPATCH) {
- FIXME("dispatch case unhandled.\n");
- } else if ((This->typeinfo->typekind & 15) == TKIND_INTERFACE) {
+ } else if ((This->typeinfo->typekind & 15) == TKIND_INTERFACE ||
+ (This->typeinfo->typekind&0x10)) {
if (This->typeinfo->cImplTypes && index==1)
return TYPE_E_BADMODULEKIND;
if( index != 0) return TYPE_E_ELEMENTNOTFOUND;
This->typeinfo->datatype1 = hRefType;
+ } else if ((This->typeinfo->typekind & 15) == TKIND_DISPATCH) {
+ FIXME("dispatch case unhandled.\n");
} else {
FIXME("AddImplType unsupported on typekind %d\n", This->typeinfo->typekind & 15);
return E_OUTOFMEMORY;
@@ -2779,7 +2783,10 @@ static HRESULT WINAPI ITypeInfo2_fnGetTypeAttr(
(*ppTypeAttr)->lcid = This->typelib->typelib_header.lcid;
(*ppTypeAttr)->cbSizeInstance = This->typeinfo->size;
- (*ppTypeAttr)->typekind = This->typeinfo->typekind&0xf;
+ if(This->typeinfo->typekind & 0x10)
+ (*ppTypeAttr)->typekind = TKIND_INTERFACE;
+ else
+ (*ppTypeAttr)->typekind = This->typeinfo->typekind&0xf;
(*ppTypeAttr)->cFuncs = This->typeinfo->cElement&0xffff;
(*ppTypeAttr)->cVars = This->typeinfo->cElement>>16;
(*ppTypeAttr)->cImplTypes = This->typeinfo->cImplTypes;
@@ -2872,8 +2879,13 @@ static HRESULT WINAPI ITypeInfo2_fnGetRefTypeOfImplType(
return E_INVALIDARG;
if(index == -1) {
- FIXME("Dual interfaces not handled yet\n");
- return E_NOTIMPL;
+ if((This->typeinfo->typekind&0xf)==TKIND_DISPATCH
+ && (This->typeinfo->flags&TYPEFLAG_FDUAL)) {
+ *pRefType = -2; /* FIXME: is it correct? */
+ return S_OK;
+ }
+
+ return TYPE_E_ELEMENTNOTFOUND;
}
if(index >= This->typeinfo->cImplTypes)
@@ -3014,6 +3026,11 @@ static HRESULT WINAPI ITypeInfo2_fnGetRefTypeInfo(
if(!ppTInfo)
return E_INVALIDARG;
+ if(hRefType == -2) {
+ FIXME("Negative hreftype not handled yet\n");
+ return E_NOTIMPL;
+ }
+
if(hRefType&1) {
ITypeLib *tl;
MSFT_ImpInfo *impinfo;
More information about the wine-cvs
mailing list