Jacek Caban : widl: Generate async interface table.

Alexandre Julliard julliard at winehq.org
Wed Nov 7 14:47:32 CST 2018


Module: wine
Branch: master
Commit: 824d51358511621616570b66a436034dac2f5140
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=824d51358511621616570b66a436034dac2f5140

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Nov  7 16:15:22 2018 +0100

widl: Generate async interface table.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/widl/proxy.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
index a6c3c32..4c7d85d 100644
--- a/tools/widl/proxy.c
+++ b/tools/widl/proxy.c
@@ -895,6 +895,7 @@ static void write_proxy_routines(const statement_list_t *stmts)
   unsigned int proc_offset = 0;
   char *file_id = proxy_token;
   int i, count, have_baseiid = 0;
+  unsigned int table_version;
   type_t **interfaces;
   const type_t * delegate_to;
 
@@ -1006,6 +1007,26 @@ static void write_proxy_routines(const statement_list_t *stmts)
   fprintf(proxy, "}\n");
   fprintf(proxy, "\n");
 
+  table_version = get_stub_mode() == MODE_Oif ? 2 : 1;
+  for (i = 0; i < count; i++)
+  {
+      if (interfaces[i]->details.iface->async_iface != interfaces[i]) continue;
+      if (table_version != 6)
+      {
+          fprintf(proxy, "static const IID *_AsyncInterfaceTable[] =\n");
+          fprintf(proxy, "{\n");
+          table_version = 6;
+      }
+      fprintf(proxy, "    &IID_%s,\n", interfaces[i]->name);
+      fprintf(proxy, "    (IID*)(LONG_PTR)-1,\n");
+  }
+  if (table_version == 6)
+  {
+      fprintf(proxy, "    0\n");
+      fprintf(proxy, "};\n");
+      fprintf(proxy, "\n");
+  }
+
   fprintf(proxy, "const ExtendedProxyFileInfo %s_ProxyFileInfo DECLSPEC_HIDDEN =\n", file_id);
   fprintf(proxy, "{\n");
   fprintf(proxy, "    (const PCInterfaceProxyVtblList*)_%s_ProxyVtblList,\n", file_id);
@@ -1015,8 +1036,8 @@ static void write_proxy_routines(const statement_list_t *stmts)
   else fprintf(proxy, "    0,\n");
   fprintf(proxy, "    _%s_IID_Lookup,\n", file_id);
   fprintf(proxy, "    %d,\n", count);
-  fprintf(proxy, "    %d,\n", get_stub_mode() == MODE_Oif ? 2 : 1);
-  fprintf(proxy, "    0,\n");
+  fprintf(proxy, "    %u,\n", table_version);
+  fprintf(proxy, "    %s,\n", table_version == 6 ? "_AsyncInterfaceTable" : "0");
   fprintf(proxy, "    0,\n");
   fprintf(proxy, "    0,\n");
   fprintf(proxy, "    0\n");




More information about the wine-cvs mailing list