- Support multiple interfaces per idl file.
authorEric Kohl <eric.kohl@reactos.org>
Fri, 25 Feb 2005 12:20:36 +0000 (12:20 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Fri, 25 Feb 2005 12:20:36 +0000 (12:20 +0000)
- Support explicit binding handles.

svn path=/trunk/; revision=13740

reactos/tools/widl/ChangeLog
reactos/tools/widl/client.c
reactos/tools/widl/header.c
reactos/tools/widl/header.h
reactos/tools/widl/server.c

index cff8668..7b1dc28 100644 (file)
@@ -1,5 +1,15 @@
 ChangeLog\r
 \r
 ChangeLog\r
 \r
+2005-02-25 ekohl\r
+  tools/widl/client.c\r
+  tools/widl/header.c\r
+  tools/widl/header.h\r
+  tools/widl/server.c\r
+\r
+Support multiple interfaces per idl file.\r
+Support explicit binding handles.\r
+\r
+\r
 2005-02-24 ekohl\r
   include/wine/rpcfc.h\r
   tools/widl/client.c\r
 2005-02-24 ekohl\r
   include/wine/rpcfc.h\r
   tools/widl/client.c\r
index e3a01bc..fc48625 100644 (file)
@@ -225,8 +225,8 @@ static void write_typeformatstring(void)
 static void print_message_buffer_size(func_t *func)\r
 {\r
     unsigned int alignment;\r
 static void print_message_buffer_size(func_t *func)\r
 {\r
     unsigned int alignment;\r
-    unsigned int size;\r
-    unsigned int last_size = 0;\r
+    int size;\r
+    int last_size = -1;\r
     var_t *var;\r
 \r
     if (!func->args)\r
     var_t *var;\r
 \r
     if (!func->args)\r
@@ -253,7 +253,7 @@ static void print_message_buffer_size(func_t *func)
         case RPC_FC_USHORT:\r
         case RPC_FC_SHORT:\r
             size = 2;\r
         case RPC_FC_USHORT:\r
         case RPC_FC_SHORT:\r
             size = 2;\r
-            if (last_size != 0 && last_size < 2)\r
+            if (last_size != -1 && last_size < 2)\r
                 alignment += (2 - last_size);\r
             break;\r
 \r
                 alignment += (2 - last_size);\r
             break;\r
 \r
@@ -261,14 +261,14 @@ static void print_message_buffer_size(func_t *func)
         case RPC_FC_LONG:\r
         case RPC_FC_FLOAT:\r
             size = 4;\r
         case RPC_FC_LONG:\r
         case RPC_FC_FLOAT:\r
             size = 4;\r
-            if (last_size != 0 && last_size < 4)\r
+            if (last_size != -1 && last_size < 4)\r
                 alignment += (4 - last_size);\r
             break;\r
 \r
         case RPC_FC_HYPER:\r
         case RPC_FC_DOUBLE:\r
             size = 8;\r
                 alignment += (4 - last_size);\r
             break;\r
 \r
         case RPC_FC_HYPER:\r
         case RPC_FC_DOUBLE:\r
             size = 8;\r
-            if (last_size != 0 && last_size < 4)\r
+            if (last_size != -1 && last_size < 4)\r
                 alignment += (4 - last_size);\r
             break;\r
 \r
                 alignment += (4 - last_size);\r
             break;\r
 \r
@@ -280,21 +280,11 @@ static void print_message_buffer_size(func_t *func)
             error("Unknown/unsupported type!");\r
         }\r
 \r
             error("Unknown/unsupported type!");\r
         }\r
 \r
-        if (size == 0)\r
-        {\r
-            if (last_size != 0)\r
-                fprintf(client, " +");\r
-            fprintf(client, " 0U");\r
-        }\r
-        else\r
-        {\r
-            if (last_size != 0)\r
-                fprintf(client, " +");\r
-            fprintf(client, " %uU", size + alignment);\r
+        if (last_size != -1)\r
+            fprintf(client, " +");\r
+        fprintf(client, " %dU", (size == 0) ? 0 : size + alignment);\r
 \r
 \r
-            last_size = size;\r
-        }\r
-        \r
+        last_size = size;\r
 \r
         var = PREV_LINK(var);\r
     }\r
 \r
         var = PREV_LINK(var);\r
     }\r
@@ -379,9 +369,10 @@ static void marshall_arguments(func_t *func)
 static void write_function_stubs(type_t *iface)\r
 {\r
     char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);\r
 static void write_function_stubs(type_t *iface)\r
 {\r
     char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);\r
-    int explitit_handle = is_attr(iface->attrs, ATTR_IMPLICIT_HANDLE);\r
+    int explicit_handle = is_attr(iface->attrs, ATTR_EXPLICIT_HANDLE);\r
     func_t *func = iface->funcs;\r
     var_t* var;\r
     func_t *func = iface->funcs;\r
     var_t* var;\r
+    var_t* explicit_handle_var;\r
     int method_count = 0;\r
     unsigned int proc_offset = 0;\r
 \r
     int method_count = 0;\r
     unsigned int proc_offset = 0;\r
 \r
@@ -390,6 +381,25 @@ static void write_function_stubs(type_t *iface)
     {\r
         var_t *def = func->def;\r
 \r
     {\r
         var_t *def = func->def;\r
 \r
+        /* check for a defined binding handle */\r
+        explicit_handle_var = get_explicit_handle_var(func);\r
+        if (explicit_handle)\r
+        {\r
+            if (!explicit_handle_var)\r
+            {\r
+                error("%s() does not define an explicit binding handle!\n", def->name);\r
+                return;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            if (explicit_handle_var)\r
+            {\r
+                error("%s() must not define a binding handle!\n", def->name);\r
+                return;\r
+            }\r
+        }\r
+\r
         write_type(client, def->type, def, def->tname);\r
         fprintf(client, " ");\r
         write_name(client, def);\r
         write_type(client, def->type, def, def->tname);\r
         fprintf(client, " ");\r
         write_name(client, def);\r
@@ -411,7 +421,7 @@ static void write_function_stubs(type_t *iface)
             fprintf(client, " _RetVal;\n");\r
         }\r
 \r
             fprintf(client, " _RetVal;\n");\r
         }\r
 \r
-        if (implicit_handle)\r
+        if (implicit_handle || explicit_handle)\r
             print_client("RPC_BINDING_HANDLE _Handle = 0;\n");\r
         print_client("RPC_MESSAGE _RpcMessage;\n");\r
         print_client("MIDL_STUB_MESSAGE _StubMsg;\n");\r
             print_client("RPC_BINDING_HANDLE _Handle = 0;\n");\r
         print_client("RPC_MESSAGE _RpcMessage;\n");\r
         print_client("MIDL_STUB_MESSAGE _StubMsg;\n");\r
@@ -434,6 +444,11 @@ static void write_function_stubs(type_t *iface)
             print_client("_Handle = %s;\n", implicit_handle);\r
             fprintf(client, "\n");\r
         }\r
             print_client("_Handle = %s;\n", implicit_handle);\r
             fprintf(client, "\n");\r
         }\r
+        else if (explicit_handle)\r
+        {\r
+            print_client("_Handle = %s;\n", explicit_handle_var->name);\r
+            fprintf(client, "\n");\r
+        }\r
 \r
         /* emit the message buffer size */\r
         print_client("_StubMsg.BufferLength =");\r
 \r
         /* emit the message buffer size */\r
         print_client("_StubMsg.BufferLength =");\r
@@ -445,7 +460,7 @@ static void write_function_stubs(type_t *iface)
         indent++;\r
         print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");\r
         print_client("_StubMsg.BufferLength,\n");\r
         indent++;\r
         print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");\r
         print_client("_StubMsg.BufferLength,\n");\r
-        if (implicit_handle)\r
+        if (implicit_handle || explicit_handle)\r
             print_client("%_Handle);\n");\r
         else\r
             print_client("%s__MIDL_AutoBindHandle);\n", iface->name);\r
             print_client("%_Handle);\n");\r
         else\r
             print_client("%s__MIDL_AutoBindHandle);\n", iface->name);\r
@@ -691,39 +706,47 @@ static void init_client(void)
 \r
 void write_client(ifref_t *ifaces)\r
 {\r
 \r
 void write_client(ifref_t *ifaces)\r
 {\r
-    ifref_t *lcur = ifaces;\r
-    char *file_id = client_token;\r
-    int c;\r
+    ifref_t *iface = ifaces;\r
 \r
     if (!do_client)\r
         return;\r
 \r
     if (!do_client)\r
         return;\r
-    if (!lcur)\r
+    if (!iface)\r
         return;\r
         return;\r
-    END_OF_LIST(lcur);\r
+    END_OF_LIST(iface);\r
 \r
     init_client();\r
     if (!client)\r
         return;\r
 \r
 \r
     init_client();\r
     if (!client)\r
         return;\r
 \r
-    write_formatstringsdecl(lcur->iface);\r
-    write_implicithandledecl(lcur->iface);\r
+    while (iface)\r
+    {\r
+        fprintf(client, "/*****************************************************************************\n");\r
+        fprintf(client, " * %s interface\n", iface->iface->name);\r
+        fprintf(client, " */\n");\r
+        fprintf(client, "\n");\r
 \r
 \r
-    write_clientinterfacedecl(lcur->iface);\r
-    write_stubdescdecl(lcur->iface);\r
-    write_bindinghandledecl(lcur->iface);\r
+        write_formatstringsdecl(iface->iface);\r
+        write_implicithandledecl(iface->iface);\r
 \r
 \r
-    write_function_stubs(lcur->iface);\r
-    write_stubdescriptor(lcur->iface);\r
+        write_clientinterfacedecl(iface->iface);\r
+        write_stubdescdecl(iface->iface);\r
+        write_bindinghandledecl(iface->iface);\r
 \r
 \r
-    print_client("#if !defined(__RPC_WIN32__)\n");\r
-    print_client("#error  Invalid build platform for this stub.\n");\r
-    print_client("#endif\n");\r
-    fprintf(client, "\n");\r
+        write_function_stubs(iface->iface);\r
+        write_stubdescriptor(iface->iface);\r
 \r
 \r
-    write_procformatstring(lcur->iface);\r
-    write_typeformatstring();\r
+        print_client("#if !defined(__RPC_WIN32__)\n");\r
+        print_client("#error  Invalid build platform for this stub.\n");\r
+        print_client("#endif\n");\r
+        fprintf(client, "\n");\r
 \r
 \r
-    fprintf(client, "\n");\r
+        write_procformatstring(iface->iface);\r
+        write_typeformatstring();\r
+\r
+        fprintf(client, "\n");\r
+\r
+        iface = PREV_LINK(iface);\r
+    }\r
 \r
     fclose(client);\r
 }\r
 \r
     fclose(client);\r
 }\r
index f8db956..3a3345b 100644 (file)
@@ -427,6 +427,28 @@ void write_externdef(var_t *v)
   fprintf(header, ";\n\n");
 }
 
   fprintf(header, ";\n\n");
 }
 
+
+var_t* get_explicit_handle_var(func_t* func)
+{
+    var_t* var;
+
+    if (!func->args)
+        return NULL;
+
+    var = func->args;
+    while (NEXT_LINK(var)) var = NEXT_LINK(var);
+    while (var)
+    {
+        if (var->type->type == RPC_FC_IGNORE)
+            return var;
+
+        var = PREV_LINK(var);
+    }
+
+    return NULL;
+}
+
+
 /********** INTERFACES **********/
 
 int is_object(attr_t *a)
 /********** INTERFACES **********/
 
 int is_object(attr_t *a)
@@ -663,10 +685,28 @@ static void write_method_proto(type_t *iface)
 
 static void write_function_proto(type_t *iface)
 {
 
 static void write_function_proto(type_t *iface)
 {
+  int explicit_handle = is_attr(iface->attrs, ATTR_EXPLICIT_HANDLE);
+  var_t* explicit_handle_var;
+
   func_t *cur = iface->funcs;
   while (NEXT_LINK(cur)) cur = NEXT_LINK(cur);
   while (cur) {
     var_t *def = cur->def;
   func_t *cur = iface->funcs;
   while (NEXT_LINK(cur)) cur = NEXT_LINK(cur);
   while (cur) {
     var_t *def = cur->def;
+
+    /* check for a defined binding handle */
+    explicit_handle_var = get_explicit_handle_var(cur);
+    if (explicit_handle) {
+      if (!explicit_handle_var) {
+        error("%s() does not define an explicit binding handle!\n", def->name);
+        return;
+      }
+    } else {
+      if (explicit_handle_var) {
+        error("%s() must not define a binding handle!\n", def->name);
+        return;
+      }
+    }
+
     /* FIXME: do we need to handle call_as? */
     write_type(header, def->type, def, def->tname);
     fprintf(header, " ");
     /* FIXME: do we need to handle call_as? */
     write_type(header, def->type, def, def->tname);
     fprintf(header, " ");
index bd69a73..6d276c3 100644 (file)
@@ -40,5 +40,5 @@ extern void write_typedef(type_t *type, var_t *names);
 extern void write_expr(FILE *h, expr_t *e);
 extern void write_constdef(var_t *v);
 extern void write_externdef(var_t *v);
 extern void write_expr(FILE *h, expr_t *e);
 extern void write_constdef(var_t *v);
 extern void write_externdef(var_t *v);
-
+extern var_t* get_explicit_handle_var(func_t* func);
 #endif
 #endif
index 2520a3b..ad296c3 100644 (file)
@@ -336,8 +336,10 @@ static void unmarshall_arguments(func_t *func)
 \r
 static void write_function_stubs(type_t *iface)\r
 {\r
 \r
 static void write_function_stubs(type_t *iface)\r
 {\r
+    int explicit_handle = is_attr(iface->attrs, ATTR_EXPLICIT_HANDLE);\r
     func_t *func = iface->funcs;\r
     var_t *var;\r
     func_t *func = iface->funcs;\r
     var_t *var;\r
+    var_t* explicit_handle_var;\r
     unsigned int proc_offset = 0;\r
 \r
     while (NEXT_LINK(func)) func = NEXT_LINK(func);\r
     unsigned int proc_offset = 0;\r
 \r
     while (NEXT_LINK(func)) func = NEXT_LINK(func);\r
@@ -345,6 +347,25 @@ static void write_function_stubs(type_t *iface)
     {\r
         var_t *def = func->def;\r
 \r
     {\r
         var_t *def = func->def;\r
 \r
+        /* check for a defined binding handle */\r
+        explicit_handle_var = get_explicit_handle_var(func);\r
+        if (explicit_handle)\r
+        {\r
+            if (!explicit_handle_var)\r
+            {\r
+                error("%s() does not define an explicit binding handle!\n", def->name);\r
+                return;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            if (explicit_handle_var)\r
+            {\r
+                error("%s() must not define a binding handle!\n", def->name);\r
+                return;\r
+            }\r
+        }\r
+\r
         write_type(server, def->type, def, def->tname);\r
         fprintf(server, " __RPC_STUB\n");\r
         fprintf(server, "%s_", iface->name);\r
         write_type(server, def->type, def, def->tname);\r
         fprintf(server, " __RPC_STUB\n");\r
         fprintf(server, "%s_", iface->name);\r
@@ -397,6 +418,12 @@ static void write_function_stubs(type_t *iface)
         indent--;\r
         fprintf(server, "\n");\r
 \r
         indent--;\r
         fprintf(server, "\n");\r
 \r
+        if (explicit_handle)\r
+        {\r
+            print_server("%s = _pRpcMessage->Handle;\n", explicit_handle_var->name);\r
+            fprintf(server, "\n");\r
+        }\r
+\r
         print_server("RpcTryFinally\n");\r
         print_server("{\n");\r
         indent++;\r
         print_server("RpcTryFinally\n");\r
         print_server("{\n");\r
         indent++;\r
@@ -698,38 +725,46 @@ static void init_server(void)
 \r
 void write_server(ifref_t *ifaces)\r
 {\r
 \r
 void write_server(ifref_t *ifaces)\r
 {\r
-    ifref_t *lcur = ifaces;\r
-    char *file_id = server_token;\r
-    int c;\r
+    ifref_t *iface = ifaces;\r
 \r
     if (!do_server)\r
         return;\r
 \r
     if (!do_server)\r
         return;\r
-    if (!lcur)\r
+    if (!iface)\r
         return;\r
         return;\r
-    END_OF_LIST(lcur);\r
+    END_OF_LIST(iface);\r
 \r
     init_server();\r
     if (!server)\r
         return;\r
 \r
 \r
     init_server();\r
     if (!server)\r
         return;\r
 \r
-    write_formatstringsdecl(lcur->iface);\r
-    write_serverinterfacedecl(lcur->iface);\r
-    write_stubdescdecl(lcur->iface);\r
+    while (iface)\r
+    {\r
+        fprintf(server, "/*****************************************************************************\n");\r
+        fprintf(server, " * %s interface\n", iface->iface->name);\r
+        fprintf(server, " */\n");\r
+        fprintf(server, "\n");\r
 \r
 \r
-    write_function_stubs(lcur->iface);\r
+        write_formatstringsdecl(iface->iface);\r
+        write_serverinterfacedecl(iface->iface);\r
+        write_stubdescdecl(iface->iface);\r
 \r
 \r
-    write_stubdescriptor(lcur->iface);\r
-    write_dispatchtable(lcur->iface);\r
+        write_function_stubs(iface->iface);\r
 \r
 \r
-    print_server("#if !defined(__RPC_WIN32__)\n");\r
-    print_server("#error  Invalid build platform for this stub.\n");\r
-    print_server("#endif\n");\r
-    fprintf(server, "\n");\r
+        write_stubdescriptor(iface->iface);\r
+        write_dispatchtable(iface->iface);\r
 \r
 \r
-    write_procformatstring(lcur->iface);\r
-    write_typeformatstring();\r
+        print_server("#if !defined(__RPC_WIN32__)\n");\r
+        print_server("#error  Invalid build platform for this stub.\n");\r
+        print_server("#endif\n");\r
+        fprintf(server, "\n");\r
 \r
 \r
-    fprintf(server, "\n");\r
+        write_procformatstring(iface->iface);\r
+        write_typeformatstring();\r
+\r
+        fprintf(server, "\n");\r
+\r
+        iface = PREV_LINK(iface);\r
+    }\r
 \r
     fclose(server);\r
 }\r
 \r
     fclose(server);\r
 }\r