Jacek Caban : widl: Produce __uuidof-compatible headers.

Alexandre Julliard julliard at winehq.org
Fri Jul 15 11:45:11 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jul 14 17:21:45 2011 +0200

widl: Produce __uuidof-compatible headers.

---

 tools/widl/header.c |   74 +++++++++++++++++++++++++++++++++------------------
 1 files changed, 48 insertions(+), 26 deletions(-)

diff --git a/tools/widl/header.c b/tools/widl/header.c
index 7569995..9d20a3e 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -129,6 +129,28 @@ void write_guid(FILE *f, const char *guid_prefix, const char *name, const UUID *
         uuid->Data4[6], uuid->Data4[7]);
 }
 
+static void write_uuid_decl(FILE *f, const char *name, const UUID *uuid)
+{
+  fprintf(f, "#ifdef __CRT_UUID_DECL\n");
+  fprintf(f, "__CRT_UUID_DECL(%s, 0x%08x, 0x%04x, 0x%04x, 0x%02x,0x%02x, 0x%02x,"
+        "0x%02x,0x%02x,0x%02x,0x%02x,0x%02x)\n",
+        name, uuid->Data1, uuid->Data2, uuid->Data3, uuid->Data4[0], uuid->Data4[1],
+        uuid->Data4[2], uuid->Data4[3], uuid->Data4[4], uuid->Data4[5], uuid->Data4[6],
+        uuid->Data4[7]);
+  fprintf(f, "#endif\n");
+}
+
+static const char *uuid_string(const UUID *uuid)
+{
+  static char buf[37];
+
+  sprintf(buf, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+        uuid->Data1, uuid->Data2, uuid->Data3, uuid->Data4[0], uuid->Data4[1], uuid->Data4[2],
+        uuid->Data4[3], uuid->Data4[4], uuid->Data4[5], uuid->Data4[6], uuid->Data4[7]);
+
+  return buf;
+}
+
 const char *get_name(const var_t *v)
 {
     static char buffer[256];
@@ -1014,24 +1036,6 @@ static void write_forward(FILE *header, type_t *iface)
   fprintf(header, "#endif\n\n" );
 }
 
-static void write_iface_guid(FILE *header, const type_t *iface)
-{
-  const UUID *uuid = get_attrp(iface->attrs, ATTR_UUID);
-  write_guid(header, "IID", iface->name, uuid);
-} 
-
-static void write_dispiface_guid(FILE *header, const type_t *iface)
-{
-  const UUID *uuid = get_attrp(iface->attrs, ATTR_UUID);
-  write_guid(header, "DIID", iface->name, uuid);
-}
-
-static void write_coclass_guid(FILE *header, const type_t *cocl)
-{
-  const UUID *uuid = get_attrp(cocl->attrs, ATTR_UUID);
-  write_guid(header, "CLSID", cocl->name, uuid);
-}
-
 static void write_com_interface_start(FILE *header, const type_t *iface)
 {
   int dispinterface = is_attr(iface->attrs, ATTR_DISPINTERFACE);
@@ -1045,21 +1049,26 @@ static void write_com_interface_start(FILE *header, const type_t *iface)
 static void write_com_interface_end(FILE *header, type_t *iface)
 {
   int dispinterface = is_attr(iface->attrs, ATTR_DISPINTERFACE);
-  if (dispinterface)
-    write_dispiface_guid(header, iface);
-  else
-    write_iface_guid(header, iface);
+  const UUID *uuid = get_attrp(iface->attrs, ATTR_UUID);
+
+  if (uuid)
+      write_guid(header, dispinterface ? "DIID" : "IID", iface->name, uuid);
+
   /* C++ interface */
   fprintf(header, "#if defined(__cplusplus) && !defined(CINTERFACE)\n");
+  if (uuid)
+      fprintf(header, "MIDL_INTERFACE(\"%s\")\n", uuid_string(uuid));
+  else
+      fprintf(header, "interface ");
   if (type_iface_get_inherit(iface))
   {
-    fprintf(header, "interface %s : public %s\n", iface->name,
+    fprintf(header, "%s : public %s\n", iface->name,
             type_iface_get_inherit(iface)->name);
     fprintf(header, "{\n");
   }
   else
   {
-    fprintf(header, "interface %s\n", iface->name);
+    fprintf(header, "%s\n", iface->name);
     fprintf(header, "{\n");
     fprintf(header, "    BEGIN_INTERFACE\n");
     fprintf(header, "\n");
@@ -1075,6 +1084,8 @@ static void write_com_interface_end(FILE *header, type_t *iface)
   if (!type_iface_get_inherit(iface))
     fprintf(header, "    END_INTERFACE\n");
   fprintf(header, "};\n");
+  if (uuid)
+      write_uuid_decl(header, iface->name, uuid);
   fprintf(header, "#else\n");
   /* C interface */
   fprintf(header, "typedef struct %sVtbl {\n", iface->name);
@@ -1148,12 +1159,23 @@ static void write_rpc_interface_end(FILE *header, const type_t *iface)
 
 static void write_coclass(FILE *header, type_t *cocl)
 {
+  const UUID *uuid = get_attrp(cocl->attrs, ATTR_UUID);
+
   fprintf(header, "/*****************************************************************************\n");
   fprintf(header, " * %s coclass\n", cocl->name);
   fprintf(header, " */\n\n");
-  write_coclass_guid(header, cocl);
+  if (uuid)
+      write_guid(header, "CLSID", cocl->name, uuid);
   fprintf(header, "\n#ifdef __cplusplus\n");
-  fprintf(header, "class %s;\n", cocl->name);
+  if (uuid)
+  {
+      fprintf(header, "class DECLSPEC_UUID(\"%s\") %s;\n", uuid_string(uuid), cocl->name);
+      write_uuid_decl(header, cocl->name, uuid);
+  }
+  else
+  {
+      fprintf(header, "class %s;\n", cocl->name);
+  }
   fprintf(header, "#endif\n");
   fprintf(header, "\n");
 }




More information about the wine-cvs mailing list