oleaut32: Convert TLBImpLib to use standard linked list.

This commit is contained in:
Andrew Eikum 2011-03-15 15:52:46 -05:00 committed by Alexandre Julliard
parent 5e9884a488
commit 3d03a5e239
1 changed files with 37 additions and 35 deletions

View File

@ -977,7 +977,7 @@ typedef struct tagTLBImpLib
struct tagITypeLibImpl *pImpTypeLib; /* pointer to loaded typelib, or struct tagITypeLibImpl *pImpTypeLib; /* pointer to loaded typelib, or
NULL if not yet loaded */ NULL if not yet loaded */
struct tagTLBImpLib * next; struct list entry;
} TLBImpLib; } TLBImpLib;
/* internal ITypeLib data */ /* internal ITypeLib data */
@ -1000,7 +1000,7 @@ typedef struct tagITypeLibImpl
int TypeInfoCount; /* nr of typeinfo's in librarry */ int TypeInfoCount; /* nr of typeinfo's in librarry */
struct tagITypeInfoImpl **typeinfos; struct tagITypeInfoImpl **typeinfos;
struct list custdata_list; struct list custdata_list;
TLBImpLib * pImpLibs; /* linked list to all imported typelibs */ struct list implib_list;
int ctTypeDesc; /* number of items in type desc array */ int ctTypeDesc; /* number of items in type desc array */
TYPEDESC * pTypeDesc; /* array of TypeDescriptions found in the TYPEDESC * pTypeDesc; /* array of TypeDescriptions found in the
library. Only used while reading MSFT library. Only used while reading MSFT
@ -2275,17 +2275,18 @@ static void MSFT_DoRefType(TLBContext *pcx, ITypeLibImpl *pTL,
if(!MSFT_HREFTYPE_INTHISFILE( offset)) { if(!MSFT_HREFTYPE_INTHISFILE( offset)) {
/* external typelib */ /* external typelib */
MSFT_ImpInfo impinfo; MSFT_ImpInfo impinfo;
TLBImpLib *pImpLib=(pcx->pLibInfo->pImpLibs); TLBImpLib *pImpLib;
TRACE_(typelib)("offset %x, masked offset %x\n", offset, offset + (offset & 0xfffffffc)); TRACE_(typelib)("offset %x, masked offset %x\n", offset, offset + (offset & 0xfffffffc));
MSFT_ReadLEDWords(&impinfo, sizeof(impinfo), pcx, MSFT_ReadLEDWords(&impinfo, sizeof(impinfo), pcx,
pcx->pTblDir->pImpInfo.offset + (offset & 0xfffffffc)); pcx->pTblDir->pImpInfo.offset + (offset & 0xfffffffc));
while (pImpLib){ /* search the known offsets of all import libraries */
if(pImpLib->offset==impinfo.oImpFile) break; LIST_FOR_EACH_ENTRY(pImpLib, &pcx->pLibInfo->implib_list, TLBImpLib, entry)
pImpLib=pImpLib->next; if(pImpLib->offset==impinfo.oImpFile)
} break;
if(pImpLib){
if(&pImpLib->entry != &pcx->pLibInfo->implib_list){
ref->reference = offset; ref->reference = offset;
ref->pImpTLInfo = pImpLib; ref->pImpTLInfo = pImpLib;
if(impinfo.flags & MSFT_IMPINFO_OFFSET_IS_GUID) { if(impinfo.flags & MSFT_IMPINFO_OFFSET_IS_GUID) {
@ -2979,6 +2980,7 @@ static ITypeLibImpl* TypeLibImpl_Constructor(void)
pTypeLibImpl->lpVtblTypeComp = &tlbtcvt; pTypeLibImpl->lpVtblTypeComp = &tlbtcvt;
pTypeLibImpl->ref = 1; pTypeLibImpl->ref = 1;
list_init(&pTypeLibImpl->implib_list);
list_init(&pTypeLibImpl->custdata_list); list_init(&pTypeLibImpl->custdata_list);
list_init(&pTypeLibImpl->ref_list); list_init(&pTypeLibImpl->ref_list);
pTypeLibImpl->dispatch_href = -1; pTypeLibImpl->dispatch_href = -1;
@ -3140,7 +3142,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength)
/* imported type libs */ /* imported type libs */
if(tlbSegDir.pImpFiles.offset>0) if(tlbSegDir.pImpFiles.offset>0)
{ {
TLBImpLib **ppImpLib = &(pTypeLibImpl->pImpLibs); TLBImpLib *pImpLib;
int oGuid, offset = tlbSegDir.pImpFiles.offset; int oGuid, offset = tlbSegDir.pImpFiles.offset;
UINT16 size; UINT16 size;
@ -3148,25 +3150,25 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength)
{ {
char *name; char *name;
*ppImpLib = heap_alloc_zero(sizeof(TLBImpLib)); pImpLib = heap_alloc_zero(sizeof(TLBImpLib));
(*ppImpLib)->offset = offset - tlbSegDir.pImpFiles.offset; pImpLib->offset = offset - tlbSegDir.pImpFiles.offset;
MSFT_ReadLEDWords(&oGuid, sizeof(INT), &cx, offset); MSFT_ReadLEDWords(&oGuid, sizeof(INT), &cx, offset);
MSFT_ReadLEDWords(&(*ppImpLib)->lcid, sizeof(LCID), &cx, DO_NOT_SEEK); MSFT_ReadLEDWords(&pImpLib->lcid, sizeof(LCID), &cx, DO_NOT_SEEK);
MSFT_ReadLEWords(&(*ppImpLib)->wVersionMajor, sizeof(WORD), &cx, DO_NOT_SEEK); MSFT_ReadLEWords(&pImpLib->wVersionMajor, sizeof(WORD), &cx, DO_NOT_SEEK);
MSFT_ReadLEWords(&(*ppImpLib)->wVersionMinor, sizeof(WORD), &cx, DO_NOT_SEEK); MSFT_ReadLEWords(&pImpLib->wVersionMinor, sizeof(WORD), &cx, DO_NOT_SEEK);
MSFT_ReadLEWords(& size, sizeof(UINT16), &cx, DO_NOT_SEEK); MSFT_ReadLEWords(& size, sizeof(UINT16), &cx, DO_NOT_SEEK);
size >>= 2; size >>= 2;
name = heap_alloc_zero(size+1); name = heap_alloc_zero(size+1);
MSFT_Read(name, size, &cx, DO_NOT_SEEK); MSFT_Read(name, size, &cx, DO_NOT_SEEK);
(*ppImpLib)->name = TLB_MultiByteToBSTR(name); pImpLib->name = TLB_MultiByteToBSTR(name);
heap_free(name); heap_free(name);
MSFT_ReadGuid(&(*ppImpLib)->guid, oGuid, &cx); MSFT_ReadGuid(&pImpLib->guid, oGuid, &cx);
offset = (offset + sizeof(INT) + sizeof(DWORD) + sizeof(LCID) + sizeof(UINT16) + size + 3) & ~3; offset = (offset + sizeof(INT) + sizeof(DWORD) + sizeof(LCID) + sizeof(UINT16) + size + 3) & ~3;
ppImpLib = &(*ppImpLib)->next; list_add_tail(&pTypeLibImpl->implib_list, &pImpLib->entry);
} }
} }
@ -3434,25 +3436,24 @@ static sltg_ref_lookup_t *SLTG_DoRefs(SLTG_RefInfo *pRef, ITypeLibImpl *pTL,
if(sscanf(refname, "*\\R%x*#%x", &lib_offs, &type_num) != 2) if(sscanf(refname, "*\\R%x*#%x", &lib_offs, &type_num) != 2)
FIXME_(typelib)("Can't sscanf ref\n"); FIXME_(typelib)("Can't sscanf ref\n");
if(lib_offs != 0xffff) { if(lib_offs != 0xffff) {
TLBImpLib **import = &pTL->pImpLibs; TLBImpLib *import;
while(*import) { LIST_FOR_EACH_ENTRY(import, &pTL->implib_list, TLBImpLib, entry)
if((*import)->offset == lib_offs) if(import->offset == lib_offs)
break; break;
import = &(*import)->next;
} if(&import->entry == &pTL->implib_list) {
if(!*import) {
char fname[MAX_PATH+1]; char fname[MAX_PATH+1];
int len; int len;
*import = heap_alloc_zero(sizeof(**import)); import = heap_alloc_zero(sizeof(*import));
(*import)->offset = lib_offs; import->offset = lib_offs;
TLB_GUIDFromString( pNameTable + lib_offs + 4, TLB_GUIDFromString( pNameTable + lib_offs + 4,
&(*import)->guid); &import->guid);
if(sscanf(pNameTable + lib_offs + 40, "}#%hd.%hd#%x#%s", if(sscanf(pNameTable + lib_offs + 40, "}#%hd.%hd#%x#%s",
&(*import)->wVersionMajor, &import->wVersionMajor,
&(*import)->wVersionMinor, &import->wVersionMinor,
&(*import)->lcid, fname) != 4) { &import->lcid, fname) != 4) {
FIXME_(typelib)("can't sscanf ref %s\n", FIXME_(typelib)("can't sscanf ref %s\n",
pNameTable + lib_offs + 40); pNameTable + lib_offs + 40);
} }
@ -3460,12 +3461,13 @@ static sltg_ref_lookup_t *SLTG_DoRefs(SLTG_RefInfo *pRef, ITypeLibImpl *pTL,
if(fname[len-1] != '#') if(fname[len-1] != '#')
FIXME("fname = %s\n", fname); FIXME("fname = %s\n", fname);
fname[len-1] = '\0'; fname[len-1] = '\0';
(*import)->name = TLB_MultiByteToBSTR(fname); import->name = TLB_MultiByteToBSTR(fname);
list_add_tail(&pTL->implib_list, &import->entry);
} }
ref_type->pImpTLInfo = *import; ref_type->pImpTLInfo = import;
/* Store a reference to IDispatch */ /* Store a reference to IDispatch */
if(pTL->dispatch_href == -1 && IsEqualGUID(&(*import)->guid, &IID_StdOle) && type_num == 4) if(pTL->dispatch_href == -1 && IsEqualGUID(&import->guid, &IID_StdOle) && type_num == 4)
pTL->dispatch_href = typelib_ref; pTL->dispatch_href = typelib_ref;
} else { /* internal ref */ } else { /* internal ref */
@ -4281,13 +4283,13 @@ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface)
heap_free(This->pTypeDesc); heap_free(This->pTypeDesc);
for (pImpLib = This->pImpLibs; pImpLib; pImpLib = pImpLibNext) LIST_FOR_EACH_ENTRY_SAFE(pImpLib, pImpLibNext, &This->implib_list, TLBImpLib, entry)
{ {
if (pImpLib->pImpTypeLib) if (pImpLib->pImpTypeLib)
ITypeLib_Release((ITypeLib *)pImpLib->pImpTypeLib); ITypeLib_Release((ITypeLib *)pImpLib->pImpTypeLib);
SysFreeString(pImpLib->name); SysFreeString(pImpLib->name);
pImpLibNext = pImpLib->next; list_remove(&pImpLib->entry);
heap_free(pImpLib); heap_free(pImpLib);
} }