- Silence the FIXME about constructor/destructor since it is wrong for

99.9% of cases (if MS will ever use the feature at all)
- Added stubs for ITypeComp interface in ITypeLib
- Implementation of ITypeComp in ITypeInfo
This commit is contained in:
Robert Shearman 2003-06-27 19:40:03 +00:00 committed by Alexandre Julliard
parent 85d4281616
commit 860a2714ae

View File

@ -632,6 +632,7 @@ typedef struct tagTLBImpLib
typedef struct tagITypeLibImpl typedef struct tagITypeLibImpl
{ {
ICOM_VFIELD(ITypeLib2); ICOM_VFIELD(ITypeLib2);
ICOM_VTABLE(ITypeComp) * lpVtblTypeComp;
UINT ref; UINT ref;
TLIBATTR LibAttr; /* guid,lcid,syskind,version,flags */ TLIBATTR LibAttr; /* guid,lcid,syskind,version,flags */
@ -654,6 +655,10 @@ typedef struct tagITypeLibImpl
} ITypeLibImpl; } ITypeLibImpl;
static struct ICOM_VTABLE(ITypeLib2) tlbvt; static struct ICOM_VTABLE(ITypeLib2) tlbvt;
static struct ICOM_VTABLE(ITypeComp) tlbtcvt;
#define _ITypeComp_Offset(impl) ((int)(&(((impl*)0)->lpVtblTypeComp)))
#define ICOM_THIS_From_ITypeComp(impl, iface) impl* This = (impl*)(((char*)iface)-_ITypeComp_Offset(impl))
/* ITypeLib methods */ /* ITypeLib methods */
static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength); static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength);
@ -734,6 +739,7 @@ typedef struct tagTLBImplType
typedef struct tagITypeInfoImpl typedef struct tagITypeInfoImpl
{ {
ICOM_VFIELD(ITypeInfo2); ICOM_VFIELD(ITypeInfo2);
ICOM_VTABLE(ITypeComp) * lpVtblTypeComp;
UINT ref; UINT ref;
TYPEATTR TypeAttr ; /* _lots_ of type information. */ TYPEATTR TypeAttr ; /* _lots_ of type information. */
ITypeLibImpl * pTypeLib; /* back pointer to typelib */ ITypeLibImpl * pTypeLib; /* back pointer to typelib */
@ -762,6 +768,7 @@ typedef struct tagITypeInfoImpl
} ITypeInfoImpl; } ITypeInfoImpl;
static struct ICOM_VTABLE(ITypeInfo2) tinfvt; static struct ICOM_VTABLE(ITypeInfo2) tinfvt;
static struct ICOM_VTABLE(ITypeComp) tcompvt;
static ITypeInfo2 * WINAPI ITypeInfo_Constructor(); static ITypeInfo2 * WINAPI ITypeInfo_Constructor();
@ -1846,7 +1853,7 @@ ITypeInfoImpl * MSFT_DoTypeInfo(
ptiRet->pTypeLib = pLibInfo; ptiRet->pTypeLib = pLibInfo;
ptiRet->index=count; ptiRet->index=count;
/* fill in the typeattr fields */ /* fill in the typeattr fields */
FIXME("Assign constructor/destructor memid\n"); WARN("Assign constructor/destructor memid\n");
MSFT_ReadGuid(&ptiRet->TypeAttr.guid, tiBase.posguid, pcx); MSFT_ReadGuid(&ptiRet->TypeAttr.guid, tiBase.posguid, pcx);
ptiRet->TypeAttr.lcid=pLibInfo->LibAttr.lcid; /* FIXME: correct? */ ptiRet->TypeAttr.lcid=pLibInfo->LibAttr.lcid; /* FIXME: correct? */
@ -2076,6 +2083,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength)
if (!pTypeLibImpl) return NULL; if (!pTypeLibImpl) return NULL;
pTypeLibImpl->lpVtbl = &tlbvt; pTypeLibImpl->lpVtbl = &tlbvt;
pTypeLibImpl->lpVtblTypeComp = &tlbtcvt;
pTypeLibImpl->ref = 1; pTypeLibImpl->ref = 1;
/* get pointer to beginning of typelib data */ /* get pointer to beginning of typelib data */
@ -3389,8 +3397,12 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeComp(
ITypeComp **ppTComp) ITypeComp **ppTComp)
{ {
ICOM_THIS( ITypeLibImpl, iface); ICOM_THIS( ITypeLibImpl, iface);
FIXME("(%p): stub!\n",This);
return E_NOTIMPL; TRACE("(%p)->(%p)\n",This,ppTComp);
*ppTComp = (ITypeComp *)&This->lpVtblTypeComp;
ITypeComp_AddRef(*ppTComp);
return S_OK;
} }
/* ITypeLib::GetDocumentation /* ITypeLib::GetDocumentation
@ -3749,6 +3761,64 @@ static ICOM_VTABLE(ITypeLib2) tlbvt = {
ITypeLib2_fnGetAllCustData ITypeLib2_fnGetAllCustData
}; };
static HRESULT WINAPI ITypeLibComp_fnQueryInterface(ITypeComp * iface, REFIID riid, LPVOID * ppv)
{
ICOM_THIS_From_ITypeComp(ITypeLibImpl, iface);
return ITypeInfo_QueryInterface((ITypeInfo *)This, riid, ppv);
}
static ULONG WINAPI ITypeLibComp_fnAddRef(ITypeComp * iface)
{
ICOM_THIS_From_ITypeComp(ITypeLibImpl, iface);
return ITypeInfo_AddRef((ITypeInfo *)This);
}
static ULONG WINAPI ITypeLibComp_fnRelease(ITypeComp * iface)
{
ICOM_THIS_From_ITypeComp(ITypeLibImpl, iface);
return ITypeInfo_Release((ITypeInfo *)This);
}
static HRESULT WINAPI ITypeLibComp_fnBind(
ITypeComp * iface,
OLECHAR * szName,
unsigned long lHash,
unsigned short wFlags,
ITypeInfo ** ppTInfo,
DESCKIND * pDescKind,
BINDPTR * pBindPtr)
{
FIXME("(%s, %lx, 0x%x, %p, %p, %p): stub\n", debugstr_w(szName), lHash, wFlags, ppTInfo, pDescKind, pBindPtr);
return E_NOTIMPL;
}
static HRESULT WINAPI ITypeLibComp_fnBindType(
ITypeComp * iface,
OLECHAR * szName,
unsigned long lHash,
ITypeInfo ** ppTInfo,
ITypeComp ** ppTComp)
{
FIXME("(%s, %lx, %p, %p): stub\n", debugstr_w(szName), lHash, ppTInfo, ppTComp);
return E_NOTIMPL;
}
static ICOM_VTABLE(ITypeComp) tlbtcvt =
{
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
ITypeLibComp_fnQueryInterface,
ITypeLibComp_fnAddRef,
ITypeLibComp_fnRelease,
ITypeLibComp_fnBind,
ITypeLibComp_fnBindType
};
/*================== ITypeInfo(2) Methods ===================================*/ /*================== ITypeInfo(2) Methods ===================================*/
static ITypeInfo2 * WINAPI ITypeInfo_Constructor(void) static ITypeInfo2 * WINAPI ITypeInfo_Constructor(void)
{ {
@ -3758,6 +3828,7 @@ static ITypeInfo2 * WINAPI ITypeInfo_Constructor(void)
if (pTypeInfoImpl) if (pTypeInfoImpl)
{ {
pTypeInfoImpl->lpVtbl = &tinfvt; pTypeInfoImpl->lpVtbl = &tinfvt;
pTypeInfoImpl->lpVtblTypeComp = &tcompvt;
pTypeInfoImpl->ref=1; pTypeInfoImpl->ref=1;
} }
TRACE("(%p)\n", pTypeInfoImpl); TRACE("(%p)\n", pTypeInfoImpl);
@ -3866,7 +3937,11 @@ static HRESULT WINAPI ITypeInfo_fnGetTypeComp( ITypeInfo2 *iface,
ITypeComp * *ppTComp) ITypeComp * *ppTComp)
{ {
ICOM_THIS( ITypeInfoImpl, iface); ICOM_THIS( ITypeInfoImpl, iface);
FIXME("(%p) stub!\n", This);
TRACE("(%p)->(%p) stub!\n", This, ppTComp);
*ppTComp = (ITypeComp *)&This->lpVtblTypeComp;
ITypeComp_AddRef(*ppTComp);
return S_OK; return S_OK;
} }
@ -5371,3 +5446,124 @@ static ICOM_VTABLE(ITypeInfo2) tinfvt =
ITypeInfo2_fnGetAllVarCustData, ITypeInfo2_fnGetAllVarCustData,
ITypeInfo2_fnGetAllImplTypeCustData, ITypeInfo2_fnGetAllImplTypeCustData,
}; };
static HRESULT WINAPI ITypeComp_fnQueryInterface(ITypeComp * iface, REFIID riid, LPVOID * ppv)
{
ICOM_THIS_From_ITypeComp(ITypeInfoImpl, iface);
return ITypeInfo_QueryInterface((ITypeInfo *)This, riid, ppv);
}
static ULONG WINAPI ITypeComp_fnAddRef(ITypeComp * iface)
{
ICOM_THIS_From_ITypeComp(ITypeInfoImpl, iface);
return ITypeInfo_AddRef((ITypeInfo *)This);
}
static ULONG WINAPI ITypeComp_fnRelease(ITypeComp * iface)
{
ICOM_THIS_From_ITypeComp(ITypeInfoImpl, iface);
return ITypeInfo_Release((ITypeInfo *)This);
}
static HRESULT WINAPI ITypeComp_fnBind(
ITypeComp * iface,
OLECHAR * szName,
unsigned long lHash,
unsigned short wFlags,
ITypeInfo ** ppTInfo,
DESCKIND * pDescKind,
BINDPTR * pBindPtr)
{
ICOM_THIS_From_ITypeComp(ITypeInfoImpl, iface);
TLBFuncDesc * pFDesc;
TLBVarDesc * pVDesc;
TRACE("(%s, %lx, 0x%x, %p, %p, %p)\n", debugstr_w(szName), lHash, wFlags, ppTInfo, pDescKind, pBindPtr);
for(pFDesc = This->funclist; pFDesc; pFDesc = pFDesc->next)
if (pFDesc->funcdesc.invkind & wFlags)
if (!strcmpW(pFDesc->Name, szName)) {
break;
}
if (pFDesc)
{
*pDescKind = DESCKIND_FUNCDESC;
pBindPtr->lpfuncdesc = &pFDesc->funcdesc;
*ppTInfo = (ITypeInfo *)&This->lpVtbl;
return S_OK;
} else {
if (!(wFlags & ~(INVOKE_PROPERTYGET)))
{
for(pVDesc = This->varlist; pVDesc; pVDesc = pVDesc->next) {
if (!strcmpW(pVDesc->Name, szName)) {
*pDescKind = DESCKIND_VARDESC;
pBindPtr->lpvardesc = &pVDesc->vardesc;
*ppTInfo = (ITypeInfo *)&This->lpVtbl;
return S_OK;
}
}
}
}
/* not found, look for it in inherited interfaces */
if ((This->TypeAttr.typekind == TKIND_INTERFACE) && This->TypeAttr.cImplTypes) {
/* recursive search */
ITypeInfo *pTInfo;
ITypeComp *pTComp;
HRESULT hr;
hr=ITypeInfo_GetRefTypeInfo((ITypeInfo *)&This->lpVtbl, This->impltypelist->hRef, &pTInfo);
if (SUCCEEDED(hr))
{
hr = ITypeInfo_GetTypeComp(pTInfo,&pTComp);
ITypeInfo_Release(pTInfo);
}
if (SUCCEEDED(hr))
{
hr = ITypeComp_Bind(pTComp, szName, lHash, wFlags, ppTInfo, pDescKind, pBindPtr);
ITypeComp_Release(pTComp);
return hr;
}
WARN("Could not search inherited interface!\n");
}
ERR("did not find member with name %s, flags 0x%x!\n", debugstr_w(szName), wFlags);
*pDescKind = DESCKIND_NONE;
pBindPtr->lpfuncdesc = NULL;
*ppTInfo = NULL;
return DISP_E_MEMBERNOTFOUND;
}
static HRESULT WINAPI ITypeComp_fnBindType(
ITypeComp * iface,
OLECHAR * szName,
unsigned long lHash,
ITypeInfo ** ppTInfo,
ITypeComp ** ppTComp)
{
TRACE("(%s, %lx, %p, %p)\n", debugstr_w(szName), lHash, ppTInfo, ppTComp);
/* strange behaviour (does nothing) but like the
* original */
if (!ppTInfo || !ppTComp)
return E_POINTER;
*ppTInfo = NULL;
*ppTComp = NULL;
return S_OK;
}
static ICOM_VTABLE(ITypeComp) tcompvt =
{
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
ITypeComp_fnQueryInterface,
ITypeComp_fnAddRef,
ITypeComp_fnRelease,
ITypeComp_fnBind,
ITypeComp_fnBindType
};