Piotr Caban : oleaut32: Store hreftype associated with guid while saving typelib.
Alexandre Julliard
julliard at winehq.org
Wed Jul 31 15:31:34 CDT 2013
Module: wine
Branch: master
Commit: eb5c9707b5ec8859b490148cff1521534a21ec61
URL: http://source.winehq.org/git/wine.git/?a=commit;h=eb5c9707b5ec8859b490148cff1521534a21ec61
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Jul 31 18:11:11 2013 +0200
oleaut32: Store hreftype associated with guid while saving typelib.
---
dlls/oleaut32/tests/typelib.c | 8 ++++++++
dlls/oleaut32/typelib.c | 24 ++++++++++++++----------
2 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 30468c1..3bbf2d0 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -1519,6 +1519,8 @@ static void test_CreateTypeLib(void) {
static OLECHAR *propname[] = {prop1W, param1W};
static const GUID custguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x70}};
static const GUID bogusguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x71}};
+ static const GUID interfaceguid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}};
+ static const GUID interface2guid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcd}};
char filename[MAX_PATH];
WCHAR filenameW[MAX_PATH];
@@ -1666,6 +1668,9 @@ static void test_CreateTypeLib(void) {
hres = ICreateTypeInfo_LayOut(createti);
ok(hres == S_OK, "got %08x\n", hres);
+ hres = ICreateTypeInfo_SetGuid(createti, &interfaceguid);
+ ok(hres == S_OK, "got %08x\n", hres);
+
hres = ICreateTypeInfo_AddRefTypeInfo(createti, NULL, &hreftype);
ok(hres == E_INVALIDARG, "got %08x\n", hres);
@@ -2195,6 +2200,9 @@ static void test_CreateTypeLib(void) {
hres = ICreateTypeLib2_CreateTypeInfo(createtl, interface2W, TKIND_INTERFACE, &createti);
ok(hres == S_OK, "got %08x\n", hres);
+ hres = ICreateTypeInfo_SetGuid(createti, &interface2guid);
+ ok(hres == S_OK, "got %08x\n", hres);
+
hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&interface2);
ok(hres == S_OK, "got %08x\n", hres);
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 39d692a..100c539 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -959,6 +959,7 @@ HRESULT WINAPI UnRegisterTypeLibForUser(
typedef struct tagTLBGuid {
GUID guid;
+ INT hreftype;
UINT offset;
struct list entry;
} TLBGuid;
@@ -1830,7 +1831,8 @@ static TLBImplType *TLBImplType_Alloc(UINT n)
return ret;
}
-static TLBGuid *TLB_append_guid(struct list *guid_list, const GUID *new_guid)
+static TLBGuid *TLB_append_guid(struct list *guid_list,
+ const GUID *new_guid, HREFTYPE hreftype)
{
TLBGuid *guid;
@@ -1844,6 +1846,7 @@ static TLBGuid *TLB_append_guid(struct list *guid_list, const GUID *new_guid)
return NULL;
memcpy(&guid->guid, new_guid, sizeof(GUID));
+ guid->hreftype = hreftype;
list_add_tail(guid_list, &guid->entry);
@@ -1984,6 +1987,7 @@ static HRESULT MSFT_ReadAllGuids(TLBContext *pcx)
guid->offset = offs;
guid->guid = entry.guid;
+ guid->hreftype = entry.hreftype;
list_add_tail(&pcx->pLibInfo->guid_list, &guid->entry);
@@ -3628,7 +3632,7 @@ static DWORD SLTG_ReadLibBlk(LPVOID pLibBlk, ITypeLibImpl *pTypeLibImpl)
pTypeLibImpl->ver_minor = *(WORD*)ptr;
ptr += 2;
- pTypeLibImpl->guid = TLB_append_guid(&pTypeLibImpl->guid_list, (GUID*)ptr);
+ pTypeLibImpl->guid = TLB_append_guid(&pTypeLibImpl->guid_list, (GUID*)ptr, -2);
ptr += sizeof(GUID);
return ptr - (char*)pLibBlk;
@@ -3786,7 +3790,7 @@ static sltg_ref_lookup_t *SLTG_DoRefs(SLTG_RefInfo *pRef, ITypeLibImpl *pTL,
import = heap_alloc_zero(sizeof(*import));
import->offset = lib_offs;
TLB_GUIDFromString( pNameTable + lib_offs + 4, &tmpguid);
- import->guid = TLB_append_guid(&pTL->guid_list, &tmpguid);
+ import->guid = TLB_append_guid(&pTL->guid_list, &tmpguid, 2);
if(sscanf(pNameTable + lib_offs + 40, "}#%hd.%hd#%x#%s",
&import->wVersionMajor,
&import->wVersionMinor,
@@ -4427,7 +4431,7 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
(*ppTypeInfoImpl)->index = i;
(*ppTypeInfoImpl)->Name = SLTG_ReadName(pNameTable, pOtherTypeInfoBlks[i].name_offs, pTypeLibImpl);
(*ppTypeInfoImpl)->dwHelpContext = pOtherTypeInfoBlks[i].helpcontext;
- (*ppTypeInfoImpl)->guid = TLB_append_guid(&pTypeLibImpl->guid_list, &pOtherTypeInfoBlks[i].uuid);
+ (*ppTypeInfoImpl)->guid = TLB_append_guid(&pTypeLibImpl->guid_list, &pOtherTypeInfoBlks[i].uuid, 2);
(*ppTypeInfoImpl)->typekind = pTIHeader->typekind;
(*ppTypeInfoImpl)->wMajorVerNum = pTIHeader->major_version;
(*ppTypeInfoImpl)->wMinorVerNum = pTIHeader->minor_version;
@@ -8549,7 +8553,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnSetGuid(ICreateTypeLib2 *iface,
TRACE("%p %s\n", This, debugstr_guid(guid));
- This->guid = TLB_append_guid(&This->guid_list, guid);
+ This->guid = TLB_append_guid(&This->guid_list, guid, -2);
return S_OK;
}
@@ -8802,7 +8806,7 @@ static HRESULT WMSFT_compile_guids(ITypeLibImpl *This, WMSFT_TLBFile *file)
guidhashtab = file->guidhash_seg.data;
LIST_FOR_EACH_ENTRY(guid, &This->guid_list, TLBGuid, entry){
memcpy(&entry->guid, &guid->guid, sizeof(GUID));
- entry->hreftype = 0xFFFFFFFF; /* TODO */
+ entry->hreftype = guid->hreftype;
hash_key = hash_guid(&guid->guid);
entry->next_hash = guidhashtab[hash_key];
@@ -9966,7 +9970,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetGuid(ICreateTypeInfo2 *iface,
TRACE("%p %s\n", This, debugstr_guid(guid));
- This->guid = TLB_append_guid(&This->pTypeLib->guid_list, guid);
+ This->guid = TLB_append_guid(&This->pTypeLib->guid_list, guid, This->hreftype);
return S_OK;
}
@@ -10114,7 +10118,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(ICreateTypeInfo2 *iface,
}
}
- implib->guid = TLB_append_guid(&This->pTypeLib->guid_list, &libattr->guid);
+ implib->guid = TLB_append_guid(&This->pTypeLib->guid_list, &libattr->guid, 2);
implib->lcid = libattr->lcid;
implib->wVersionMajor = libattr->wMajorVerNum;
implib->wVersionMinor = libattr->wMinorVerNum;
@@ -10147,7 +10151,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(ICreateTypeInfo2 *iface,
ref_type->index = TLB_REF_USE_GUID;
- ref_type->guid = TLB_append_guid(&This->pTypeLib->guid_list, &typeattr->guid);
+ ref_type->guid = TLB_append_guid(&This->pTypeLib->guid_list, &typeattr->guid, ref_type->reference+1);
list_add_tail(&This->pTypeLib->ref_list, &ref_type->entry);
}
@@ -10772,7 +10776,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetCustData(ICreateTypeInfo2 *iface,
if (!guid || !varVal)
return E_INVALIDARG;
- tlbguid = TLB_append_guid(&This->pTypeLib->guid_list, guid);
+ tlbguid = TLB_append_guid(&This->pTypeLib->guid_list, guid, -1);
return TLB_set_custdata(This->pcustdata_list, tlbguid, varVal);
}
More information about the wine-cvs
mailing list