oleaut32: Store ITypeInfoImpls in an array.

This commit is contained in:
Andrew Eikum 2011-03-04 15:53:51 -06:00 committed by Alexandre Julliard
parent 9d5ca542b3
commit b3e61a5661
1 changed files with 49 additions and 95 deletions

View File

@ -998,7 +998,7 @@ typedef struct tagITypeLibImpl
BSTR HelpStringDll; BSTR HelpStringDll;
DWORD dwHelpContext; DWORD dwHelpContext;
int TypeInfoCount; /* nr of typeinfo's in librarry */ int TypeInfoCount; /* nr of typeinfo's in librarry */
struct tagITypeInfoImpl *pTypeInfo; /* linked list of type info data */ struct tagITypeInfoImpl **typeinfos;
int ctCustData; /* number of items in cust data list */ int ctCustData; /* number of items in cust data list */
TLBCustData * pCustData; /* linked list to cust data */ TLBCustData * pCustData; /* linked list to cust data */
TLBImpLib * pImpLibs; /* linked list to all imported typelibs */ TLBImpLib * pImpLibs; /* linked list to all imported typelibs */
@ -1130,7 +1130,6 @@ typedef struct tagITypeInfoImpl
int ctCustData; int ctCustData;
TLBCustData * pCustData; /* linked list to cust data; */ TLBCustData * pCustData; /* linked list to cust data; */
struct tagITypeInfoImpl * next;
} ITypeInfoImpl; } ITypeInfoImpl;
static inline ITypeInfoImpl *info_impl_from_ITypeComp( ITypeComp *iface ) static inline ITypeInfoImpl *info_impl_from_ITypeComp( ITypeComp *iface )
@ -3062,18 +3061,19 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength)
if(pTypeLibImpl->dispatch_href != -1) if(pTypeLibImpl->dispatch_href != -1)
MSFT_DoRefType(&cx, pTypeLibImpl, pTypeLibImpl->dispatch_href); MSFT_DoRefType(&cx, pTypeLibImpl, pTypeLibImpl->dispatch_href);
/* type info's */ /* type infos */
if(tlbHeader.nrtypeinfos >= 0 ) if(tlbHeader.nrtypeinfos >= 0 )
{ {
/*pTypeLibImpl->TypeInfoCount=tlbHeader.nrtypeinfos; */ ITypeInfoImpl **ppTI;
ITypeInfoImpl **ppTI = &(pTypeLibImpl->pTypeInfo);
int i; int i;
ppTI = pTypeLibImpl->typeinfos = heap_alloc_zero(sizeof(ITypeInfoImpl*) * tlbHeader.nrtypeinfos);
for(i = 0; i < tlbHeader.nrtypeinfos; i++) for(i = 0; i < tlbHeader.nrtypeinfos; i++)
{ {
*ppTI = MSFT_DoTypeInfo(&cx, i, pTypeLibImpl); *ppTI = MSFT_DoTypeInfo(&cx, i, pTypeLibImpl);
ppTI = &((*ppTI)->next); ++ppTI;
(pTypeLibImpl->TypeInfoCount)++; (pTypeLibImpl->TypeInfoCount)++;
} }
} }
@ -3941,7 +3941,8 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
I'll just follow the links along the BlkEntry chain and read I'll just follow the links along the BlkEntry chain and read
them in the order in which they are in the file */ them in the order in which they are in the file */
ppTypeInfoImpl = &(pTypeLibImpl->pTypeInfo); pTypeLibImpl->typeinfos = heap_alloc_zero(pTypeLibImpl->TypeInfoCount * sizeof(ITypeInfoImpl*));
ppTypeInfoImpl = pTypeLibImpl->typeinfos;
for(pBlk = pFirstBlk, order = pHeader->first_blk - 1, i = 0; for(pBlk = pFirstBlk, order = pHeader->first_blk - 1, i = 0;
pBlkEntry[order].next != 0; pBlkEntry[order].next != 0;
@ -4061,7 +4062,7 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
X(32); X(32);
X(34); X(34);
#undef X #undef X
ppTypeInfoImpl = &((*ppTypeInfoImpl)->next); ++ppTypeInfoImpl;
pBlk = (char*)pBlk + pBlkEntry[order].len; pBlk = (char*)pBlk + pBlkEntry[order].len;
} }
@ -4131,7 +4132,6 @@ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface)
TLBRefType *ref_type; TLBRefType *ref_type;
void *cursor2; void *cursor2;
int i; int i;
ITypeInfoImpl *pTI, *pTINext;
/* remove cache entry */ /* remove cache entry */
if(This->path) if(This->path)
@ -4188,11 +4188,9 @@ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface)
heap_free(ref_type); heap_free(ref_type);
} }
for (pTI = This->pTypeInfo; pTI; pTI = pTINext) for (i = 0; i < This->TypeInfoCount; ++i)
{ ITypeInfoImpl_Destroy(This->typeinfos[i]);
pTINext = pTI->next; heap_free(This->typeinfos);
ITypeInfoImpl_Destroy(pTI);
}
heap_free(This); heap_free(This);
return 0; return 0;
} }
@ -4220,30 +4218,19 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfo(
UINT index, UINT index,
ITypeInfo **ppTInfo) ITypeInfo **ppTInfo)
{ {
UINT i; ITypeLibImpl *This = (ITypeLibImpl*)iface;
ITypeLibImpl *This = (ITypeLibImpl *)iface; TRACE("%p %u %p\n", This, index, ppTInfo);
ITypeInfoImpl *pTypeInfo = This->pTypeInfo;
TRACE("(%p)->(index=%d)\n", This, index); if(!ppTInfo)
return E_INVALIDARG;
if (!ppTInfo) return E_INVALIDARG; if(index >= This->TypeInfoCount)
/* search element n in list */
for(i=0; i < index; i++)
{
pTypeInfo = pTypeInfo->next;
if (!pTypeInfo)
{
TRACE("-- element not found\n");
return TYPE_E_ELEMENTNOTFOUND; return TYPE_E_ELEMENTNOTFOUND;
}
}
*ppTInfo = (ITypeInfo *) pTypeInfo;
*ppTInfo = (ITypeInfo*)This->typeinfos[index];
ITypeInfo_AddRef(*ppTInfo); ITypeInfo_AddRef(*ppTInfo);
TRACE("-- found (%p)\n",*ppTInfo);
return S_OK; return S_OK;
} }
@ -4258,29 +4245,17 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfoType(
TYPEKIND *pTKind) TYPEKIND *pTKind)
{ {
ITypeLibImpl *This = (ITypeLibImpl *)iface; ITypeLibImpl *This = (ITypeLibImpl *)iface;
UINT i;
ITypeInfoImpl *pTInfo = This->pTypeInfo;
TRACE("(%p, %d, %p)\n", This, index, pTKind); TRACE("(%p, %d, %p)\n", This, index, pTKind);
if(!pTKind) return E_INVALIDARG; if(!pTKind)
return E_INVALIDARG;
if(ITypeLib2_GetTypeInfoCount(iface) <= index) if(index >= This->TypeInfoCount)
return TYPE_E_ELEMENTNOTFOUND; return TYPE_E_ELEMENTNOTFOUND;
/* search element n in list */ *pTKind = This->typeinfos[index]->TypeAttr.typekind;
for(i=0; i < index; i++)
{
if(!pTInfo)
{
TRACE("-- element not found\n");
return TYPE_E_ELEMENTNOTFOUND;
}
pTInfo = pTInfo->next;
}
*pTKind = pTInfo->TypeAttr.typekind;
TRACE("-- found Type (%d)\n", *pTKind);
return S_OK; return S_OK;
} }
@ -4295,36 +4270,19 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfoOfGuid(
ITypeInfo **ppTInfo) ITypeInfo **ppTInfo)
{ {
ITypeLibImpl *This = (ITypeLibImpl *)iface; ITypeLibImpl *This = (ITypeLibImpl *)iface;
ITypeInfoImpl *pTypeInfo = This->pTypeInfo; /* head of list */ UINT i;
TRACE("(%p)\n\tguid:\t%s)\n",This,debugstr_guid(guid)); TRACE("%p %s %p\n", This, debugstr_guid(guid), ppTInfo);
if (!pTypeInfo) for(i = 0; i < This->TypeInfoCount; ++i){
{ if(IsEqualIID(&This->typeinfos[i]->TypeAttr.guid, guid)){
WARN("-- element not found\n"); *ppTInfo = (ITypeInfo*)This->typeinfos[i];
return TYPE_E_ELEMENTNOTFOUND;
}
/* search linked list for guid */
while( !IsEqualIID(guid,&pTypeInfo->TypeAttr.guid) )
{
pTypeInfo = pTypeInfo->next;
if (!pTypeInfo)
{
/* end of list reached */
WARN("-- element not found\n");
return TYPE_E_ELEMENTNOTFOUND;
}
}
TRACE("-- found (%p, %s)\n",
pTypeInfo,
debugstr_w(pTypeInfo->Name));
*ppTInfo = (ITypeInfo*)pTypeInfo;
ITypeInfo_AddRef(*ppTInfo); ITypeInfo_AddRef(*ppTInfo);
return S_OK; return S_OK;
}
}
return TYPE_E_ELEMENTNOTFOUND;
} }
/* ITypeLib::GetLibAttr /* ITypeLib::GetLibAttr
@ -4480,17 +4438,16 @@ static HRESULT WINAPI ITypeLib2_fnIsName(
BOOL *pfName) BOOL *pfName)
{ {
ITypeLibImpl *This = (ITypeLibImpl *)iface; ITypeLibImpl *This = (ITypeLibImpl *)iface;
ITypeInfoImpl *pTInfo;
TLBFuncDesc *pFInfo; TLBFuncDesc *pFInfo;
TLBVarDesc *pVInfo; TLBVarDesc *pVInfo;
int i; UINT nNameBufLen = (lstrlenW(szNameBuf)+1)*sizeof(WCHAR), i, j;
UINT nNameBufLen = (lstrlenW(szNameBuf)+1)*sizeof(WCHAR);
TRACE("(%p)->(%s,%08x,%p)\n", This, debugstr_w(szNameBuf), lHashVal, TRACE("(%p)->(%s,%08x,%p)\n", This, debugstr_w(szNameBuf), lHashVal,
pfName); pfName);
*pfName=TRUE; *pfName=TRUE;
for(pTInfo=This->pTypeInfo;pTInfo;pTInfo=pTInfo->next){ for(j = 0; j < This->TypeInfoCount; ++j){
ITypeInfoImpl *pTInfo = This->typeinfos[j];
if(!memcmp(szNameBuf,pTInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; if(!memcmp(szNameBuf,pTInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit;
for(pFInfo=pTInfo->funclist;pFInfo;pFInfo=pFInfo->next) { for(pFInfo=pTInfo->funclist;pFInfo;pFInfo=pFInfo->next) {
if(!memcmp(szNameBuf,pFInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; if(!memcmp(szNameBuf,pFInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit;
@ -4526,13 +4483,13 @@ static HRESULT WINAPI ITypeLib2_fnFindName(
UINT16 *pcFound) UINT16 *pcFound)
{ {
ITypeLibImpl *This = (ITypeLibImpl *)iface; ITypeLibImpl *This = (ITypeLibImpl *)iface;
ITypeInfoImpl *pTInfo;
TLBFuncDesc *pFInfo; TLBFuncDesc *pFInfo;
TLBVarDesc *pVInfo; TLBVarDesc *pVInfo;
int i,j = 0; int i,j = 0, k;
UINT nNameBufLen = (lstrlenW(szNameBuf)+1)*sizeof(WCHAR); UINT nNameBufLen = (lstrlenW(szNameBuf)+1)*sizeof(WCHAR);
for(pTInfo=This->pTypeInfo;pTInfo && j<*pcFound; pTInfo=pTInfo->next){ for(k = 0; k < This->TypeInfoCount; ++k){
ITypeInfoImpl *pTInfo = This->typeinfos[k];
if(!memcmp(szNameBuf,pTInfo->Name, nNameBufLen)) goto ITypeLib2_fnFindName_exit; if(!memcmp(szNameBuf,pTInfo->Name, nNameBufLen)) goto ITypeLib2_fnFindName_exit;
for(pFInfo=pTInfo->funclist;pFInfo;pFInfo=pFInfo->next) { for(pFInfo=pTInfo->funclist;pFInfo;pFInfo=pFInfo->next) {
if(!memcmp(szNameBuf,pFInfo->Name,nNameBufLen)) goto ITypeLib2_fnFindName_exit; if(!memcmp(szNameBuf,pFInfo->Name,nNameBufLen)) goto ITypeLib2_fnFindName_exit;
@ -4767,8 +4724,7 @@ static HRESULT WINAPI ITypeLibComp_fnBind(
BINDPTR * pBindPtr) BINDPTR * pBindPtr)
{ {
ITypeLibImpl *This = impl_from_ITypeComp(iface); ITypeLibImpl *This = impl_from_ITypeComp(iface);
ITypeInfoImpl *pTypeInfo; int typemismatch=0, i;
int typemismatch=0;
TRACE("(%s, 0x%x, 0x%x, %p, %p, %p)\n", debugstr_w(szName), lHash, wFlags, ppTInfo, pDescKind, pBindPtr); TRACE("(%s, 0x%x, 0x%x, %p, %p, %p)\n", debugstr_w(szName), lHash, wFlags, ppTInfo, pDescKind, pBindPtr);
@ -4776,8 +4732,8 @@ static HRESULT WINAPI ITypeLibComp_fnBind(
pBindPtr->lptcomp = NULL; pBindPtr->lptcomp = NULL;
*ppTInfo = NULL; *ppTInfo = NULL;
for (pTypeInfo = This->pTypeInfo; pTypeInfo; pTypeInfo = pTypeInfo->next) for(i = 0; i < This->TypeInfoCount; ++i){
{ ITypeInfoImpl *pTypeInfo = This->typeinfos[i];
TRACE("testing %s\n", debugstr_w(pTypeInfo->Name)); TRACE("testing %s\n", debugstr_w(pTypeInfo->Name));
/* FIXME: check wFlags here? */ /* FIXME: check wFlags here? */
@ -4904,15 +4860,16 @@ static HRESULT WINAPI ITypeLibComp_fnBindType(
ITypeComp ** ppTComp) ITypeComp ** ppTComp)
{ {
ITypeLibImpl *This = impl_from_ITypeComp(iface); ITypeLibImpl *This = impl_from_ITypeComp(iface);
ITypeInfoImpl *pTypeInfo; UINT i;
TRACE("(%s, %x, %p, %p)\n", debugstr_w(szName), lHash, ppTInfo, ppTComp); TRACE("(%s, %x, %p, %p)\n", debugstr_w(szName), lHash, ppTInfo, ppTComp);
if(!szName || !ppTInfo || !ppTComp) if(!szName || !ppTInfo || !ppTComp)
return E_INVALIDARG; return E_INVALIDARG;
for (pTypeInfo = This->pTypeInfo; pTypeInfo; pTypeInfo = pTypeInfo->next) for(i = 0; i < This->TypeInfoCount; ++i)
{ {
ITypeInfoImpl *pTypeInfo = This->typeinfos[i];
/* FIXME: should use lHash to do the search */ /* FIXME: should use lHash to do the search */
if (pTypeInfo->Name && !strcmpiW(pTypeInfo->Name, szName)) if (pTypeInfo->Name && !strcmpiW(pTypeInfo->Name, szName))
{ {
@ -7707,7 +7664,10 @@ HRESULT WINAPI CreateDispTypeInfo(
pTypeLibImpl = TypeLibImpl_Constructor(); pTypeLibImpl = TypeLibImpl_Constructor();
if (!pTypeLibImpl) return E_FAIL; if (!pTypeLibImpl) return E_FAIL;
pTIIface = ITypeInfoImpl_Constructor(); pTypeLibImpl->TypeInfoCount = 2;
pTypeLibImpl->typeinfos = heap_alloc_zero(pTypeLibImpl->TypeInfoCount * sizeof(ITypeInfoImpl*));
pTIIface = pTypeLibImpl->typeinfos[0] = ITypeInfoImpl_Constructor();
pTIIface->pTypeLib = pTypeLibImpl; pTIIface->pTypeLib = pTypeLibImpl;
pTIIface->index = 0; pTIIface->index = 0;
pTIIface->Name = NULL; pTIIface->Name = NULL;
@ -7762,10 +7722,7 @@ HRESULT WINAPI CreateDispTypeInfo(
dump_TypeInfo(pTIIface); dump_TypeInfo(pTIIface);
pTypeLibImpl->pTypeInfo = pTIIface; pTIClass = pTypeLibImpl->typeinfos[1] = ITypeInfoImpl_Constructor();
pTypeLibImpl->TypeInfoCount++;
pTIClass = ITypeInfoImpl_Constructor();
pTIClass->pTypeLib = pTypeLibImpl; pTIClass->pTypeLib = pTypeLibImpl;
pTIClass->index = 1; pTIClass->index = 1;
pTIClass->Name = NULL; pTIClass->Name = NULL;
@ -7794,9 +7751,6 @@ HRESULT WINAPI CreateDispTypeInfo(
dump_TypeInfo(pTIClass); dump_TypeInfo(pTIClass);
pTIIface->next = pTIClass;
pTypeLibImpl->TypeInfoCount++;
*pptinfo = (ITypeInfo*)pTIClass; *pptinfo = (ITypeInfo*)pTIClass;
ITypeInfo_AddRef(*pptinfo); ITypeInfo_AddRef(*pptinfo);