Nikolay Sivov : oleaut32/typelib: Implement DeleteImplType().
Alexandre Julliard
julliard at winehq.org
Fri Dec 6 16:06:38 CST 2019
Module: wine
Branch: master
Commit: 8aaa218b4731c01856e631926daaee7eec0129d4
URL: https://source.winehq.org/git/wine.git/?a=commit;h=8aaa218b4731c01856e631926daaee7eec0129d4
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Dec 6 12:45:48 2019 +0300
oleaut32/typelib: Implement DeleteImplType().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/oleaut32/tests/typelib.c | 98 +++++++++++++++++++++++++++++++++++++++++++
dlls/oleaut32/typelib.c | 21 +++++++++-
2 files changed, 117 insertions(+), 2 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 47faad7763..053011d4be 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -6446,6 +6446,103 @@ static void test_dep(void) {
DeleteFileW(filenameW);
}
+static void test_DeleteImplType(void)
+{
+ static OLECHAR interface1W[] = L"interface1";
+ HREFTYPE hreftype, hreftype2;
+ ICreateTypeInfo2 *createti2;
+ ICreateTypeInfo *createti;
+ ICreateTypeLib2 *createtl;
+ WCHAR filenameW[MAX_PATH];
+ ITypeInfo *dispti, *ti;
+ ITypeLib *stdole, *tl;
+ TYPEATTR *typeattr;
+ HRESULT hr;
+ int flags;
+
+ hr = LoadTypeLib(L"stdole2.tlb", &stdole);
+ ok(hr == S_OK, "Failed to load stdole2, hr %#x.\n", hr);
+
+ hr = ITypeLib_GetTypeInfoOfGuid(stdole, &IID_IDispatch, &dispti);
+ ok(hr == S_OK, "Failed to get IDispatch typeinfo, hr %#x.\n", hr);
+
+ GetTempFileNameW(L".", L"tlb", 0, filenameW);
+
+ hr = CreateTypeLib2(SYS_WIN32, filenameW, &createtl);
+ ok(hr == S_OK, "Failed to create instance, hr %#x.\n", hr);
+
+ hr = ICreateTypeLib2_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
+ ok(hr == S_OK, "Failed to create instance, hr %#x.\n", hr);
+ hr = ICreateTypeInfo_QueryInterface(createti, &IID_ICreateTypeInfo2, (void **)&createti2);
+ ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr);
+ ICreateTypeInfo_Release(createti);
+
+ hr = ICreateTypeInfo2_AddRefTypeInfo(createti2, dispti, &hreftype);
+ ok(hr == S_OK, "Failed to add referenced typeinfo, hr %#x.\n", hr);
+
+ hr = ICreateTypeInfo2_QueryInterface(createti2, &IID_ITypeInfo, (void **)&ti);
+ ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr);
+
+ hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
+ ok(hr == S_OK, "Failed to get type attr, hr %#x.\n", hr);
+ ok(!(typeattr->wTypeFlags & TYPEFLAG_FDISPATCHABLE), "Unexpected type flags %#x.\n", typeattr->wTypeFlags);
+ ITypeInfo_ReleaseTypeAttr(ti, typeattr);
+
+ hr = ICreateTypeInfo2_AddImplType(createti2, 0, hreftype);
+ ok(hr == S_OK, "Failed to add impl type, hr %#x.\n", hr);
+
+ hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
+ ok(hr == S_OK, "Failed to get type attr, hr %#x.\n", hr);
+ ok(typeattr->wTypeFlags & TYPEFLAG_FDISPATCHABLE, "Unexpected type flags %#x.\n", typeattr->wTypeFlags);
+ ok(typeattr->cImplTypes == 1, "Unexpected cImplTypes value.\n");
+ ITypeInfo_ReleaseTypeAttr(ti, typeattr);
+
+ /* Delete impltype, check flags. */
+ hr = ICreateTypeInfo2_DeleteImplType(createti2, 0);
+ ok(hr == S_OK, "Failed to delete impl type, hr %#x.\n", hr);
+
+ hr = ICreateTypeInfo2_DeleteImplType(createti2, 0);
+ ok(hr == TYPE_E_ELEMENTNOTFOUND, "Unexpected hr %#x.\n", hr);
+
+ hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
+ ok(hr == S_OK, "Failed to get type attr, hr %#x.\n", hr);
+ ok(typeattr->wTypeFlags & TYPEFLAG_FDISPATCHABLE, "Unexpected type flags %#x.\n", typeattr->wTypeFlags);
+ ok(!typeattr->cImplTypes, "Unexpected cImplTypes value.\n");
+ ITypeInfo_ReleaseTypeAttr(ti, typeattr);
+
+ hr = ITypeInfo_GetImplTypeFlags(ti, 0, &flags);
+ ok(hr == TYPE_E_ELEMENTNOTFOUND, "Unexpected hr %#x.\n", hr);
+
+ hr = ITypeInfo_GetRefTypeOfImplType(ti, 0, &hreftype2);
+ ok(hr == TYPE_E_ELEMENTNOTFOUND, "Unexpected hr %#x.\n", hr);
+
+ hr = ICreateTypeLib2_SaveAllChanges(createtl);
+ ok(hr == S_OK, "Failed to save changes, hr %#x.\n", hr);
+ ICreateTypeLib2_Release(createtl);
+ ITypeInfo_Release(ti);
+ ICreateTypeInfo2_Release(createti2);
+
+ /* Load and check typeinfo. */
+ hr = LoadTypeLibEx(filenameW, REGKIND_NONE, &tl);
+ ok(hr == S_OK, "Failed to load typelib, hr %#x.\n", hr);
+
+ hr = ITypeLib_GetTypeInfo(tl, 0, &ti);
+ ok(hr == S_OK, "Failed to get typeinfo, hr %#x.\n", hr);
+ hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
+ ok(hr == S_OK, "Failed to get type attr, hr %#x.\n", hr);
+ ok(typeattr->wTypeFlags & TYPEFLAG_FDISPATCHABLE, "Unexpected type flags %#x.\n", typeattr->wTypeFlags);
+ ok(!typeattr->cImplTypes, "Unexpected cImplTypes value.\n");
+ ITypeInfo_ReleaseTypeAttr(ti, typeattr);
+ ITypeInfo_Release(ti);
+
+ ITypeLib_Release(tl);
+
+ ITypeLib_Release(stdole);
+ ITypeInfo_Release(dispti);
+
+ DeleteFileW(filenameW);
+}
+
START_TEST(typelib)
{
const char *filename;
@@ -6486,4 +6583,5 @@ START_TEST(typelib)
test_GetLibAttr();
test_stub();
test_dep();
+ test_DeleteImplType();
}
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 6d96cc5fbe..e629ed51d5 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -11356,8 +11356,25 @@ static HRESULT WINAPI ICreateTypeInfo2_fnDeleteImplType(ICreateTypeInfo2 *iface,
UINT index)
{
ITypeInfoImpl *This = info_impl_from_ICreateTypeInfo2(iface);
- FIXME("%p %u - stub\n", This, index);
- return E_NOTIMPL;
+ int i;
+
+ TRACE("%p %u\n", This, index);
+
+ if (index >= This->typeattr.cImplTypes)
+ return TYPE_E_ELEMENTNOTFOUND;
+
+ TLB_FreeCustData(&This->impltypes[index].custdata_list);
+ --This->typeattr.cImplTypes;
+
+ if (index < This->typeattr.cImplTypes)
+ {
+ memmove(This->impltypes + index, This->impltypes + index + 1, (This->typeattr.cImplTypes - index) *
+ sizeof(*This->impltypes));
+ for (i = index; i < This->typeattr.cImplTypes; ++i)
+ TLB_relink_custdata(&This->impltypes[i].custdata_list);
+ }
+
+ return S_OK;
}
static HRESULT WINAPI ICreateTypeInfo2_fnSetCustData(ICreateTypeInfo2 *iface,
More information about the wine-cvs
mailing list