Typelib Changes 3
Nyef
nyef at softhome.net
Sat Mar 13 12:39:18 CST 2004
Hello all.
Attached is a patch to implement ITypeLib2_GetTypeInfo()
and ITypeLib2_GetTypeInfoOfGuid().
--Alastair Bridgewater
-------------- next part --------------
Index: typelib2.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/typelib2.c,v
retrieving revision 1.13
diff -u -r1.13 typelib2.c
--- typelib2.c 10 Feb 2004 02:26:06 -0000 1.13
+++ typelib2.c 13 Mar 2004 16:35:39 -0000
@@ -1020,6 +1020,39 @@
return offset;
}
+/****************************************************************************
+ * ctl2_find_typeinfo_from_offset
+ *
+ * Finds an ITypeInfo given an offset into the TYPEINFO segment.
+ *
+ * RETURNS
+ *
+ * Success: S_OK.
+ * Failure: TYPE_E_ELEMENTNOTFOUND.
+ */
+static HRESULT ctl2_find_typeinfo_from_offset(
+ ICreateTypeLib2Impl *This, /* [I] The typelib to find the typeinfo in. */
+ int offset, /* [I] The offset of the desired typeinfo. */
+ ITypeInfo **ppTinfo) /* [I] The typeinfo found. */
+{
+ void *typeinfodata;
+ ICreateTypeInfo2Impl *typeinfo;
+
+ typeinfodata = &This->typelib_segment_data[MSFT_SEG_TYPEINFO][offset];
+
+ for (typeinfo = This->typeinfos; typeinfo; typeinfo = typeinfo->next_typeinfo) {
+ if (typeinfo->typeinfo == typeinfodata) {
+ *ppTinfo = (ITypeInfo *)&typeinfo->lpVtblTypeInfo2;
+ ITypeInfo2_AddRef(*ppTinfo);
+ return S_OK;
+ }
+ }
+
+ ERR("Failed to find typeinfo, invariant varied.\n");
+
+ return TYPE_E_ELEMENTNOTFOUND;
+}
+
/*================== ICreateTypeInfo2 Implementation ===================================*/
/******************************************************************************
@@ -3381,11 +3414,15 @@
UINT index,
ITypeInfo** ppTInfo)
{
-/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+ ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface);
- FIXME("(%p,%d,%p), stub!\n", iface, index, ppTInfo);
+ TRACE("(%p,%d,%p)\n", iface, index, ppTInfo);
- return E_OUTOFMEMORY;
+ if ((index < 0) || (index >= This->typelib_header.nrtypeinfos)) {
+ return TYPE_E_ELEMENTNOTFOUND;
+ }
+
+ return ctl2_find_typeinfo_from_offset(This, This->typelib_typeinfo_offsets[index], ppTInfo);
}
/******************************************************************************
@@ -3415,11 +3463,20 @@
REFGUID guid,
ITypeInfo** ppTinfo)
{
-/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */
+ ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface);
+
+ int guidoffset;
+ int typeinfo;
- FIXME("(%p,%s,%p), stub!\n", iface, debugstr_guid(guid), ppTinfo);
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(guid), ppTinfo);
- return E_OUTOFMEMORY;
+ guidoffset = ctl2_find_guid(This, ctl2_hash_guid(guid), guid);
+ if (guidoffset == -1) return TYPE_E_ELEMENTNOTFOUND;
+
+ typeinfo = ((MSFT_GuidEntry *)&This->typelib_segment_data[MSFT_SEG_GUID][guidoffset])->hreftype;
+ if (typeinfo < 0) return TYPE_E_ELEMENTNOTFOUND;
+
+ return ctl2_find_typeinfo_from_offset(This, typeinfo, ppTinfo);
}
/******************************************************************************
More information about the wine-patches
mailing list