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