oleaut32: Convert TLBImpLib to use standard linked list.
This commit is contained in:
parent
5e9884a488
commit
3d03a5e239
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue