Robert Shearman : widl: Add support for marshalling and unmarshalling conformant strings.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 26 11:46:43 CST 2005


Module: wine
Branch: refs/heads/master
Commit: 413738810f8fad7553f29b75eacce5b5c1f8cfa0
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=413738810f8fad7553f29b75eacce5b5c1f8cfa0

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon Dec 26 13:12:03 2005 +0100

widl: Add support for marshalling and unmarshalling conformant strings.

---

 tools/widl/client.c  |    3 ++
 tools/widl/server.c  |    3 ++
 tools/widl/typegen.c |   64 +++++++++++++++++++++++++++++++++++++++++++++-----
 tools/widl/typegen.h |    4 ++-
 4 files changed, 64 insertions(+), 10 deletions(-)

diff --git a/tools/widl/client.c b/tools/widl/client.c
index ba73b35..56b8f91 100644
--- a/tools/widl/client.c
+++ b/tools/widl/client.c
@@ -128,6 +128,7 @@ static void write_function_stubs(type_t 
     var_t *var;
     int method_count = 0;
     unsigned int proc_offset = 0;
+    unsigned int type_offset = 2;
 
     while (NEXT_LINK(func)) func = NEXT_LINK(func);
     while (func)
@@ -226,7 +227,7 @@ static void write_function_stubs(type_t 
 
 
         /* marshal arguments */
-        marshall_arguments(client, indent, func);
+        marshall_arguments(client, indent, func, &type_offset);
 
         /* send/receive message */
         /* print_client("NdrNsSendReceive(\n"); */
diff --git a/tools/widl/server.c b/tools/widl/server.c
index 319094c..005d85b 100644
--- a/tools/widl/server.c
+++ b/tools/widl/server.c
@@ -95,6 +95,7 @@ static void write_function_stubs(type_t 
     var_t *var;
     var_t* explicit_handle_var;
     unsigned int proc_offset = 0;
+    unsigned int type_offset = 2;
 
     while (NEXT_LINK(func)) func = NEXT_LINK(func);
     while (func)
@@ -197,7 +198,7 @@ static void write_function_stubs(type_t 
             indent -= 2;
             fprintf(server, "\n");
 
-            unmarshall_arguments(server, indent, func);
+            unmarshall_arguments(server, indent, func, &type_offset);
         }
 
         print_server("if (_StubMsg.Buffer > _StubMsg.BufferEnd)\n");
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 87bf2ab..48c18b4 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -281,7 +281,7 @@ unsigned int get_required_buffer_size(ty
     }
 }
 
-void marshall_arguments(FILE *file, int indent, func_t *func)
+void marshall_arguments(FILE *file, int indent, func_t *func, unsigned int *type_offset)
 {
     unsigned int last_size = 0;
     var_t *var;
@@ -332,8 +332,8 @@ void marshall_arguments(FILE *file, int 
                 break;
 
             default:
+                error("marshall_arguments: Unsupported type: %s (0x%02x, ptr_level: 0)\n", var->name, var->type->type);
                 size = 0;
-                error("Unknown/unsupported type: %s (0x%02x)\n", var->name, var->type->type);
             }
 
             if (alignment != 0)
@@ -351,17 +351,43 @@ void marshall_arguments(FILE *file, int 
 
             last_size = size;
         }
+        else if (var->ptr_level == 1)
+        {
+            if (is_attr(var->attrs, ATTR_STRING))
+            {
+                switch (var->type->type)
+                {
+                case RPC_FC_CHAR:
+                case RPC_FC_WCHAR:
+                    print_file(file, indent,
+                        "NdrConformantStringMarshall(&_StubMsg, (unsigned char *)%s, &__MIDL_TypeFormatString.Format[%d]);\n",
+                        var->name, *type_offset);
+                    break;
+                default:
+                    error("marshall_arguments: Unsupported [string] type: %s (0x%02x, ptr_level: 1)\n", var->name, var->type->type);
+                }
+            }
+            else
+            {
+                switch (var->type->type)
+                {
+                default:
+                    error("marshall_arguments: Unsupported type: %s (0x%02x, ptr_level: 1)\n", var->name, var->type->type);
+                }
+            }
+            last_size = 1;
+        }
         else
         {
             error("marshall_arguments: Pointer level %d not supported for variable %s\n", var->ptr_level, var->name);
-            last_size = 0;
+            last_size = 1;
         }
 
         var = PREV_LINK(var);
     }
 }
 
-void unmarshall_arguments(FILE *file, int indent, func_t *func)
+void unmarshall_arguments(FILE *file, int indent, func_t *func, unsigned int *type_offset)
 {
     unsigned int last_size = 0;
     var_t *var;
@@ -413,8 +439,8 @@ void unmarshall_arguments(FILE *file, in
                 break;
 
             default:
+                error("unmarshall_arguments: Unsupported type: %s (0x%02x, ptr_level: 0)\n", var->name, var->type->type);
                 size = 0;
-                error("Unknown/unsupported type: %s (0x%02x)\n", var->name, var->type->type);
             }
 
             if (alignment != 0)
@@ -432,10 +458,36 @@ void unmarshall_arguments(FILE *file, in
 
             last_size = size;
         }
+        else if (var->ptr_level == 1)
+        {
+            if (is_attr(var->attrs, ATTR_STRING))
+            {
+                switch (var->type->type)
+                {
+                case RPC_FC_CHAR:
+                case RPC_FC_WCHAR:
+                    print_file(file, indent,
+                        "NdrConformantStringUnmarshall(&_StubMsg, (unsigned char *)%s, &__MIDL_TypeFormatString.Format[%d], 0);\n",
+                        var->name, *type_offset);
+                    break;
+                default:
+                    error("unmarshall_arguments: Unsupported [string] type: %s (0x%02x, ptr_level: 1)\n", var->name, var->type->type);
+                }
+            }
+            else
+            {
+                switch (var->type->type)
+                {
+                default:
+                    error("unmarshall_arguments: Unsupported type: %s (0x%02x, ptr_level: 1)\n", var->name, var->type->type);
+                }
+            }
+            last_size = 1;
+        }
         else
         {
             error("unmarshall_arguments: Pointer level %d not supported for variable %s\n", var->ptr_level, var->name);
-            last_size = 0;
+            last_size = 1;
         }
 
         var = PREV_LINK(var);
diff --git a/tools/widl/typegen.h b/tools/widl/typegen.h
index fe8dc38..c444132 100644
--- a/tools/widl/typegen.h
+++ b/tools/widl/typegen.h
@@ -23,7 +23,7 @@
 void write_procformatstring(FILE *file, type_t *iface);
 void write_typeformatstring(FILE *file, type_t *iface);
 unsigned int get_required_buffer_size(type_t *type);
-void marshall_arguments(FILE *file, int indent, func_t *func);
-void unmarshall_arguments(FILE *file, int indent, func_t *func);
+void marshall_arguments(FILE *file, int indent, func_t *func, unsigned int *type_offset);
+void unmarshall_arguments(FILE *file, int indent, func_t *func, unsigned int *type_offset);
 size_t get_size_procformatstring_var(var_t *var);
 size_t get_size_typeformatstring_var(var_t *var);




More information about the wine-cvs mailing list