Andrew Eikum : oleaut32: Implement ICreateTypeLib::CreateTypeInfo.
Alexandre Julliard
julliard at winehq.org
Tue May 28 15:16:58 CDT 2013
Module: wine
Branch: master
Commit: d72a797f0067c5be93101171f973ea6892d87070
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d72a797f0067c5be93101171f973ea6892d87070
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Fri May 24 11:28:42 2013 -0500
oleaut32: Implement ICreateTypeLib::CreateTypeInfo.
---
dlls/oleaut32/typelib.c | 104 ++++++++++++++++++++++++++++++++++++++---------
1 files changed, 85 insertions(+), 19 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 83b503c..c9ee1cd 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -1652,6 +1652,18 @@ static inline TLBCustData *TLB_get_custdata_by_guid(struct list *custdata_list,
return NULL;
}
+static inline ITypeInfoImpl *TLB_get_typeinfo_by_name(ITypeInfoImpl **typeinfos,
+ UINT n, const OLECHAR *name)
+{
+ while(n){
+ if(!lstrcmpiW((*typeinfos)->Name, name))
+ return *typeinfos;
+ ++typeinfos;
+ --n;
+ }
+ return NULL;
+}
+
static TLBVarDesc *TLBVarDesc_Constructor(UINT n)
{
TLBVarDesc *ret;
@@ -5051,31 +5063,25 @@ static HRESULT WINAPI ITypeLibComp_fnBindType(
ITypeComp ** ppTComp)
{
ITypeLibImpl *This = impl_from_ITypeComp(iface);
- int i;
+ ITypeInfoImpl *info;
TRACE("(%s, %x, %p, %p)\n", debugstr_w(szName), lHash, ppTInfo, ppTComp);
if(!szName || !ppTInfo || !ppTComp)
return E_INVALIDARG;
- for(i = 0; i < This->TypeInfoCount; ++i)
- {
- ITypeInfoImpl *pTypeInfo = This->typeinfos[i];
- /* FIXME: should use lHash to do the search */
- if (pTypeInfo->Name && !strcmpiW(pTypeInfo->Name, szName))
- {
- TRACE("returning %p\n", pTypeInfo);
- *ppTInfo = (ITypeInfo *)&pTypeInfo->ITypeInfo2_iface;
- ITypeInfo_AddRef(*ppTInfo);
- *ppTComp = &pTypeInfo->ITypeComp_iface;
- ITypeComp_AddRef(*ppTComp);
- return S_OK;
- }
+ info = TLB_get_typeinfo_by_name(This->typeinfos, This->TypeInfoCount, szName);
+ if(!info){
+ *ppTInfo = NULL;
+ *ppTComp = NULL;
+ return S_OK;
}
- TRACE("not found\n");
- *ppTInfo = NULL;
- *ppTComp = NULL;
+ *ppTInfo = (ITypeInfo *)&info->ITypeInfo2_iface;
+ ITypeInfo_AddRef(*ppTInfo);
+ *ppTComp = &info->ITypeComp_iface;
+ ITypeComp_AddRef(*ppTComp);
+
return S_OK;
}
@@ -8102,8 +8108,68 @@ static HRESULT WINAPI ICreateTypeLib2_fnCreateTypeInfo(ICreateTypeLib2 *iface,
LPOLESTR name, TYPEKIND kind, ICreateTypeInfo **ctinfo)
{
ITypeLibImpl *This = impl_from_ICreateTypeLib2(iface);
- FIXME("%p %s %d %p - stub\n", This, wine_dbgstr_w(name), kind, ctinfo);
- return E_NOTIMPL;
+ ITypeInfoImpl *info;
+ HRESULT hres;
+
+ TRACE("%p %s %d %p\n", This, wine_dbgstr_w(name), kind, ctinfo);
+
+ if (!ctinfo || !name)
+ return E_INVALIDARG;
+
+ info = TLB_get_typeinfo_by_name(This->typeinfos, This->TypeInfoCount, name);
+ if (info)
+ return TYPE_E_NAMECONFLICT;
+
+ if (This->typeinfos)
+ This->typeinfos = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->typeinfos,
+ sizeof(ITypeInfoImpl*) * (This->TypeInfoCount + 1));
+ else
+ This->typeinfos = heap_alloc_zero(sizeof(ITypeInfoImpl*));
+
+ info = This->typeinfos[This->TypeInfoCount] = ITypeInfoImpl_Constructor();
+
+ info->pTypeLib = This;
+ info->Name = SysAllocString(name);
+ info->index = This->TypeInfoCount;
+ info->TypeAttr.typekind = kind;
+ info->TypeAttr.cbAlignment = 4;
+
+ switch(info->TypeAttr.typekind) {
+ case TKIND_ENUM:
+ case TKIND_INTERFACE:
+ case TKIND_DISPATCH:
+ case TKIND_COCLASS:
+ info->TypeAttr.cbSizeInstance = 4;
+ break;
+ case TKIND_RECORD:
+ case TKIND_UNION:
+ info->TypeAttr.cbSizeInstance = 0;
+ break;
+ case TKIND_MODULE:
+ info->TypeAttr.cbSizeInstance = 2;
+ break;
+ case TKIND_ALIAS:
+ info->TypeAttr.cbSizeInstance = -0x75;
+ break;
+ default:
+ FIXME("unrecognized typekind %d\n", info->TypeAttr.typekind);
+ info->TypeAttr.cbSizeInstance = 0xdeadbeef;
+ break;
+ }
+
+ hres = ITypeInfo2_QueryInterface(&info->ITypeInfo2_iface,
+ &IID_ICreateTypeInfo, (void **)ctinfo);
+ if (FAILED(hres)) {
+ SysFreeString(info->Name);
+ ITypeInfo2_Release(&info->ITypeInfo2_iface);
+ return hres;
+ }
+
+ info->hreftype = info->index * sizeof(MSFT_TypeInfoBase);
+
+ ++This->TypeInfoCount;
+
+ return S_OK;
}
static HRESULT WINAPI ICreateTypeLib2_fnSetName(ICreateTypeLib2 *iface,
More information about the wine-cvs
mailing list