widl #25: interface inheritance

Huw D M Davies h.davies1 at physics.ox.ac.uk
Mon Jan 24 15:20:26 CST 2005


        Huw Davies <huw at codeweavers.com>
        Add interface inheritance.

Index: tools/widl/write_msft.c
===================================================================
RCS file: /home/wine/wine/tools/widl/write_msft.c,v
retrieving revision 1.20
diff -u -p -r1.20 write_msft.c
--- tools/widl/write_msft.c	24 Jan 2005 13:31:50 -0000	1.20
+++ tools/widl/write_msft.c	24 Jan 2005 21:15:45 -0000
@@ -1502,6 +1502,18 @@ static HRESULT add_var_desc(msft_typeinf
     return S_OK;
 }
 
+static HRESULT add_impl_type(msft_typeinfo_t *typeinfo, type_t *ref)
+{
+    if(ref->typelib_idx == -1)
+        add_interface_typeinfo(typeinfo->typelib, ref);
+    if(ref->typelib_idx == -1)
+        error("add_impl_type: unable to add inherited interface\n");
+
+    typeinfo->typeinfo->datatype1 = typeinfo->typelib->typelib_typeinfo_offsets[ref->typelib_idx];
+    typeinfo->typeinfo->cImplTypes++;
+    return S_OK;
+}
+
 static msft_typeinfo_t *create_msft_typeinfo(msft_typelib_t *typelib, enum type_kind kind,
                                              char *name, attr_t *attr, int idx)
 {
@@ -1602,6 +1614,9 @@ static void add_interface_typeinfo(msft_
     msft_typeinfo = create_msft_typeinfo(typelib, TKIND_INTERFACE, interface->name, interface->attrs,
                                          typelib->typelib_header.nrtypeinfos);
     msft_typeinfo->typeinfo->size = 4;
+
+    if(interface->ref)
+        add_impl_type(msft_typeinfo, interface->ref);
 
     while(NEXT_LINK(cur)) cur = NEXT_LINK(cur);
     while(cur) {



More information about the wine-patches mailing list