Type library creation, take 3, part 4 of 6
Nyef
nyef at softhome.net
Sat Feb 7 06:12:04 CST 2004
Hello all.
This is the fourth of six patches covering my changes to the
type library creation code over the past fortnight.
This patch contains:
Stubbed-out implementation of the ITypeLib interface.
A fix to ICreateTypeInfo::AddRefTypeInfo() to use Release() instead of hacking a refcount directly.
A missed API doc comment for the ITypeInfo interface.
--Alastair Bridgewater
-------------- next part --------------
--- typelib2.c.last 2004-02-07 06:53:14.000000000 -0500
+++ typelib2.c 2004-02-07 06:53:17.000000000 -0500
@@ -86,6 +86,36 @@
* METHODS
*/
+/******************************************************************************
+ * ITypeLib2 {OLEAUT32}
+ *
+ * NOTES
+ * The ITypeLib2 interface provides an interface whereby one may query MSFT
+ * format type library (.tlb) files.
+ *
+ * This interface inherits from ITypeLib, and can be freely cast back and
+ * forth between an ITypeLib and an ITypeLib2 on local clients. This
+ * dispensation applies only to ITypeLib objects obtained on MSFT format type
+ * libraries (those made through CreateTypeLib2).
+ *
+ * METHODS
+ */
+
+/******************************************************************************
+ * ITypeInfo2 {OLEAUT32}
+ *
+ * NOTES
+ * The ITypeInfo2 interface provides an interface whereby one may query type
+ * information stored in MSFT format type library (.tlb) files.
+ *
+ * This interface inherits from ITypeInfo, and can be freely cast back and
+ * forth between an ITypeInfo and an ITypeInfo2 on local clients. This
+ * dispensation applies only to ITypeInfo objects obtained on MSFT format type
+ * libraries (those made through CreateTypeLib2).
+ *
+ * METHODS
+ */
+
/*================== Implementation Structures ===================================*/
enum MSFT_segment_index {
@@ -137,6 +167,9 @@
struct tagICreateTypeInfo2Impl *last_typeinfo;
} ICreateTypeLib2Impl;
+#define _ITypeLib2_Offset(impl) ((int)(&(((impl*)0)->lpVtblTypeLib2)))
+#define ICOM_THIS_From_ITypeLib2(impl, iface) impl* This = (impl*)(((char*)iface)-_ITypeLib2_Offset(impl))
+
typedef struct tagICreateTypeInfo2Impl
{
ICOM_VFIELD(ICreateTypeInfo2);
@@ -1210,13 +1243,12 @@
if (container == (ITypeLib *)&This->typelib->lpVtblTypeLib2) {
*phRefType = This->typelib->typelib_typeinfo_offsets[index];
- This->typelib->ref--; /* FIXME: no vtbl yet. */
- return S_OK;
} else {
FIXME("(%p,%p,%p), pTInfo from different typelib.\n", iface, pTInfo, phRefType);
- ITypeLib_Release(container);
- return S_OK;
}
+
+ ITypeLib_Release(container);
+ return S_OK;
}
/******************************************************************************
@@ -2802,7 +2834,7 @@
*ppvObject = This;
} else if (IsEqualIID(riid, &IID_ITypeLib) ||
IsEqualIID(riid, &IID_ITypeLib2)) {
- FIXME("QI for ITypeLib interfaces not supported yet.\n");
+ *ppvObject = &This->lpVtblTypeLib2;
}
if(*ppvObject)
@@ -3235,6 +3267,307 @@
return E_OUTOFMEMORY;
}
+/*================== ITypeLib2 Implementation ===================================*/
+
+/******************************************************************************
+ * ITypeLib2_QueryInterface {OLEAUT32}
+ *
+ * See IUnknown_QueryInterface.
+ */
+static HRESULT WINAPI ITypeLib2_fnQueryInterface(ITypeLib2 * iface, REFIID riid, LPVOID * ppv)
+{
+ ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface);
+
+ return ICreateTypeLib2_QueryInterface((ICreateTypeLib2 *)This, riid, ppv);
+}
+
+/******************************************************************************
+ * ITypeLib2_AddRef {OLEAUT32}
+ *
+ * See IUnknown_AddRef.
+ */
+static ULONG WINAPI ITypeLib2_fnAddRef(ITypeLib2 * iface)
+{
+ ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface);
+
+ return ICreateTypeLib2_AddRef((ICreateTypeLib2 *)This);
+}
+
+/******************************************************************************
+ * ITypeLib2_Release {OLEAUT32}
+ *
+ * See IUnknown_Release.
+ */
+static ULONG WINAPI ITypeLib2_fnRelease(ITypeLib2 * iface)
+{
+ ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface);
+
+ return ICreateTypeLib2_Release((ICreateTypeLib2 *)This);
+}
+
+/******************************************************************************
+ * ITypeLib2_GetTypeInfoCount {OLEAUT32}
+ *
+ * See ITypeLib_GetTypeInfoCount.
+ */
+static UINT WINAPI ITypeLib2_fnGetTypeInfoCount(
+ ITypeLib2 * iface)
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p), stub!\n", iface);
+
+ return 0;
+}
+
+/******************************************************************************
+ * ITypeLib2_GetTypeInfo {OLEAUT32}
+ *
+ * See ITypeLib_GetTypeInfo.
+ */
+static HRESULT WINAPI ITypeLib2_fnGetTypeInfo(
+ ITypeLib2 * iface,
+ UINT index,
+ ITypeInfo** ppTInfo)
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%d,%p), stub!\n", iface, index, ppTInfo);
+
+ return E_OUTOFMEMORY;
+}
+
+/******************************************************************************
+ * ITypeLib2_GetTypeInfoType {OLEAUT32}
+ *
+ * See ITypeLib_GetTypeInfoType.
+ */
+static HRESULT WINAPI ITypeLib2_fnGetTypeInfoType(
+ ITypeLib2 * iface,
+ UINT index,
+ TYPEKIND* pTKind)
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%d,%p), stub!\n", iface, index, pTKind);
+
+ return E_OUTOFMEMORY;
+}
+
+/******************************************************************************
+ * ITypeLib2_GetTypeInfoOfGuid {OLEAUT32}
+ *
+ * See ITypeLib_GetTypeInfoOfGuid.
+ */
+static HRESULT WINAPI ITypeLib2_fnGetTypeInfoOfGuid(
+ ITypeLib2 * iface,
+ REFGUID guid,
+ ITypeInfo** ppTinfo)
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%s,%p), stub!\n", iface, debugstr_guid(guid), ppTinfo);
+
+ return E_OUTOFMEMORY;
+}
+
+/******************************************************************************
+ * ITypeLib2_GetLibAttr {OLEAUT32}
+ *
+ * See ITypeLib_GetLibAttr.
+ */
+static HRESULT WINAPI ITypeLib2_fnGetLibAttr(
+ ITypeLib2 * iface,
+ TLIBATTR** ppTLibAttr)
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%p), stub!\n", iface, ppTLibAttr);
+
+ return E_OUTOFMEMORY;
+}
+
+/******************************************************************************
+ * ITypeLib2_GetTypeComp {OLEAUT32}
+ *
+ * See ITypeLib_GetTypeComp.
+ */
+static HRESULT WINAPI ITypeLib2_fnGetTypeComp(
+ ITypeLib2 * iface,
+ ITypeComp** ppTComp)
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%p), stub!\n", iface, ppTComp);
+
+ return E_OUTOFMEMORY;
+}
+
+/******************************************************************************
+ * ITypeLib2_GetDocumentation {OLEAUT32}
+ *
+ * See ITypeLib_GetDocumentation.
+ */
+static HRESULT WINAPI ITypeLib2_fnGetDocumentation(
+ ITypeLib2 * iface,
+ INT index,
+ BSTR* pBstrName,
+ BSTR* pBstrDocString,
+ DWORD* pdwHelpContext,
+ BSTR* pBstrHelpFile)
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%d,%p,%p,%p,%p), stub!\n", iface, index, pBstrName, pBstrDocString, pdwHelpContext, pBstrHelpFile);
+
+ return E_OUTOFMEMORY;
+}
+
+/******************************************************************************
+ * ITypeLib2_IsName {OLEAUT32}
+ *
+ * See ITypeLib_IsName.
+ */
+static HRESULT WINAPI ITypeLib2_fnIsName(
+ ITypeLib2 * iface,
+ LPOLESTR szNameBuf,
+ ULONG lHashVal,
+ BOOL* pfName)
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%s,%lx,%p), stub!\n", iface, debugstr_w(szNameBuf), lHashVal, pfName);
+
+ return E_OUTOFMEMORY;
+}
+
+/******************************************************************************
+ * ITypeLib2_FindName {OLEAUT32}
+ *
+ * See ITypeLib_FindName.
+ */
+static HRESULT WINAPI ITypeLib2_fnFindName(
+ ITypeLib2 * iface,
+ LPOLESTR szNameBuf,
+ ULONG lHashVal,
+ ITypeInfo** ppTInfo,
+ MEMBERID* rgMemId,
+ USHORT* pcFound)
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%s,%lx,%p,%p,%p), stub!\n", iface, debugstr_w(szNameBuf), lHashVal, ppTInfo, rgMemId, pcFound);
+
+ return E_OUTOFMEMORY;
+}
+
+/******************************************************************************
+ * ITypeLib2_ReleaseTLibAttr {OLEAUT32}
+ *
+ * See ITypeLib_ReleaseTLibAttr.
+ */
+static void WINAPI ITypeLib2_fnReleaseTLibAttr(
+ ITypeLib2 * iface,
+ TLIBATTR* pTLibAttr)
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%p), stub!\n", iface, pTLibAttr);
+}
+
+/******************************************************************************
+ * ICreateTypeLib2_GetCustData {OLEAUT32}
+ *
+ * Retrieves a custom data value stored on a type library.
+ *
+ * RETURNS
+ *
+ * Success: S_OK
+ * Failure: E_OUTOFMEMORY or E_INVALIDARG.
+ */
+static HRESULT WINAPI ITypeLib2_fnGetCustData(
+ ITypeLib2 * iface, /* [I] The type library in which to find the custom data. */
+ REFGUID guid, /* [I] The GUID under which the custom data is stored. */
+ VARIANT* pVarVal) /* [O] The custom data. */
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%s,%p), stub!\n", iface, debugstr_guid(guid), pVarVal);
+
+ return E_OUTOFMEMORY;
+}
+
+/******************************************************************************
+ * ICreateTypeLib2_GetLibStatistics {OLEAUT32}
+ *
+ * Retrieves some statistics about names in a type library, supposedly for
+ * hash table optimization purposes.
+ *
+ * RETURNS
+ *
+ * Success: S_OK
+ * Failure: E_OUTOFMEMORY or E_INVALIDARG.
+ */
+static HRESULT WINAPI ITypeLib2_fnGetLibStatistics(
+ ITypeLib2 * iface, /* [I] The type library to get statistics about. */
+ ULONG* pcUniqueNames, /* [O] The number of unique names in the type library. */
+ ULONG* pcchUniqueNames) /* [O] The number of changed (?) characters in names in the type library. */
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%p,%p), stub!\n", iface, pcUniqueNames, pcchUniqueNames);
+
+ return E_OUTOFMEMORY;
+}
+
+/******************************************************************************
+ * ICreateTypeLib2_GetDocumentation2 {OLEAUT32}
+ *
+ * Obtain locale-aware help string information.
+ *
+ * RETURNS
+ *
+ * Success: S_OK
+ * Failure: STG_E_INSUFFICIENTMEMORY or E_INVALIDARG.
+ */
+static HRESULT WINAPI ITypeLib2_fnGetDocumentation2(
+ ITypeLib2 * iface,
+ INT index,
+ LCID lcid,
+ BSTR* pbstrHelpString,
+ DWORD* pdwHelpStringContext,
+ BSTR* pbstrHelpStringDll)
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%d,%ld,%p,%p,%p), stub!\n", iface, index, lcid, pbstrHelpString, pdwHelpStringContext, pbstrHelpStringDll);
+
+ return E_OUTOFMEMORY;
+}
+
+/******************************************************************************
+ * ICreateTypeLib2_GetAllCustData {OLEAUT32}
+ *
+ * Retrieve all of the custom data for a type library.
+ *
+ * RETURNS
+ *
+ * Success: S_OK
+ * Failure: E_OUTOFMEMORY or E_INVALIDARG.
+ */
+static HRESULT WINAPI ITypeLib2_fnGetAllCustData(
+ ITypeLib2 * iface, /* [I] The type library in which to find the custom data. */
+ CUSTDATA* pCustData) /* [O] The structure in which to place the custom data. */
+{
+/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+
+ FIXME("(%p,%p), stub!\n", iface, pCustData);
+
+ return E_OUTOFMEMORY;
+}
+
+
+/*================== ICreateTypeLib2 & ITypeLib2 VTABLEs And Creation ===================================*/
static ICOM_VTABLE(ICreateTypeLib2) ctypelib2vt =
{
@@ -3261,6 +3594,31 @@
ICreateTypeLib2_fnSetHelpStringDll
};
+static ICOM_VTABLE(ITypeLib2) typelib2vt =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+
+ ITypeLib2_fnQueryInterface,
+ ITypeLib2_fnAddRef,
+ ITypeLib2_fnRelease,
+
+ ITypeLib2_fnGetTypeInfoCount,
+ ITypeLib2_fnGetTypeInfo,
+ ITypeLib2_fnGetTypeInfoType,
+ ITypeLib2_fnGetTypeInfoOfGuid,
+ ITypeLib2_fnGetLibAttr,
+ ITypeLib2_fnGetTypeComp,
+ ITypeLib2_fnGetDocumentation,
+ ITypeLib2_fnIsName,
+ ITypeLib2_fnFindName,
+ ITypeLib2_fnReleaseTLibAttr,
+
+ ITypeLib2_fnGetCustData,
+ ITypeLib2_fnGetLibStatistics,
+ ITypeLib2_fnGetDocumentation2,
+ ITypeLib2_fnGetAllCustData,
+};
+
static ICreateTypeLib2 *ICreateTypeLib2_Constructor(SYSKIND syskind, LPCOLESTR szFile)
{
ICreateTypeLib2Impl *pCreateTypeLib2Impl;
@@ -3297,6 +3655,7 @@
memset(pCreateTypeLib2Impl->typelib_namehash_segment, 0xff, 0x200);
pCreateTypeLib2Impl->lpVtbl = &ctypelib2vt;
+ pCreateTypeLib2Impl->lpVtblTypeLib2 = &typelib2vt;
pCreateTypeLib2Impl->ref = 1;
if (failed) {
More information about the wine-patches
mailing list