Dan Hipschman : widl: Output format-strings for interface pointers.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Aug 18 05:40:32 CDT 2006


Module: wine
Branch: master
Commit: 3870bf0d9e69924ac98633f5a0b541f77ec8f144
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=3870bf0d9e69924ac98633f5a0b541f77ec8f144

Author: Dan Hipschman <dsh at linux.ucla.edu>
Date:   Thu Aug 17 18:09:20 2006 -0700

widl: Output format-strings for interface pointers.

---

 tools/widl/typegen.c |   30 ++++++++++++++++++++++++++++++
 1 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 2d7e07f..523556f 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -1279,6 +1279,31 @@ static size_t write_union_tfs(FILE *file
     return *typeformat_offset;
 }
 
+static size_t write_ip_tfs(FILE *file, const attr_t *attrs, const type_t *type,
+                           const char *name, unsigned int *typeformat_offset)
+{
+    size_t i;
+    size_t start_offset = *typeformat_offset;
+    const UUID *uuid = get_attrp(attrs, ATTR_UUID);
+
+    if (! uuid)
+        error("%s: interface %s missing UUID\n", __FUNCTION__, name);
+
+    print_file(file, 2, "0x2f,\t/* FC_IP */\n");
+    print_file(file, 2, "0x5a,\t/* FC_CONSTANT_IID */\n");
+    print_file(file, 2, "NdrFcLong(0x%08lx),\n", uuid->Data1);
+    print_file(file, 2, "NdrFcShort(0x%04x),\n", uuid->Data2);
+    print_file(file, 2, "NdrFcShort(0x%04x),\n", uuid->Data3);
+    for (i = 0; i < 8; ++i)
+        print_file(file, 2, "0x%02x,\n", uuid->Data4[i]);
+
+    if (file)
+        fprintf(file, "\n");
+
+    *typeformat_offset += 18;
+    return start_offset;
+}
+
 static size_t write_typeformatstring_var(FILE *file, int indent,
                                          const var_t *var, unsigned int *typeformat_offset)
 {
@@ -1339,6 +1364,11 @@ static size_t write_typeformatstring_var
             int pointer_type = get_attrv(var->attrs, ATTR_POINTERTYPE);
             if (!pointer_type) pointer_type = RPC_FC_RP;
 
+            if (type->type == RPC_FC_IP)
+            {
+                return write_ip_tfs(file, type->attrs, type, type->name, typeformat_offset);
+            }
+
             /* special case for pointers to base types */
             switch (type->type)
             {




More information about the wine-cvs mailing list