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