Robert Shearman : widl: Calculate the size of buffer required.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 12 06:45:03 CST 2005


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

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

widl: Calculate the size of buffer required.
- Calculate the size of buffer required.
- Fix a typo.
- Set the buffer start and buffer end markers.

---

 tools/widl/client.c |   65 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 61 insertions(+), 4 deletions(-)

diff --git a/tools/widl/client.c b/tools/widl/client.c
index 7d583a0..773b318 100644
--- a/tools/widl/client.c
+++ b/tools/widl/client.c
@@ -66,6 +66,60 @@ static int print_client( const char *for
 }
 
 
+static void print_message_buffer_size(func_t *func)
+{
+    unsigned int total_size = 0;
+
+    if (func->args)
+    {
+        var_t *var = func->args;
+        while (NEXT_LINK(var)) var = NEXT_LINK(var);
+        while (var)
+        {
+            unsigned int alignment = 8;
+    
+            switch (var->type->type)
+            {
+            case RPC_FC_BYTE:
+            case RPC_FC_CHAR:
+            case RPC_FC_USMALL:
+            case RPC_FC_SMALL:
+                total_size += 1;
+                alignment = 1;
+                break;
+    
+            case RPC_FC_WCHAR:
+            case RPC_FC_USHORT:
+            case RPC_FC_SHORT:
+                total_size += 2 + alignment % 2;
+                alignment = 2;
+                break;
+    
+            case RPC_FC_ULONG:
+            case RPC_FC_LONG:
+            case RPC_FC_FLOAT:
+            case RPC_FC_ERROR_STATUS_T:
+                total_size += 4 + alignment % 4;
+                alignment = 4;
+                break;
+    
+            case RPC_FC_HYPER:
+            case RPC_FC_DOUBLE:
+                total_size += 8 + alignment % 8;
+                alignment = 8;
+                break;
+    
+            default:
+                alignment = 1;
+            }
+    
+            var = PREV_LINK(var);
+        }
+    }
+    fprintf(client, " %u", total_size);
+}
+
+
 static void write_function_stubs(type_t *iface)
 {
     func_t *func = iface->funcs;
@@ -130,7 +184,7 @@ static void write_function_stubs(type_t 
 
         /* emit the message buffer size */
         print_client("_StubMsg.BufferLength =");
-        print_client("0"); /* FIXME */
+        print_message_buffer_size(func);
         fprintf(client, ";\n");
 
         print_client("NdrGetBuffer(\n");
@@ -138,7 +192,7 @@ static void write_function_stubs(type_t 
         print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
         print_client("_StubMsg.BufferLength,\n");
         if (implicit_handle)
-            print_client("%_Handle);\n");
+            print_client("_Handle);\n");
         else
             print_client("%s__MIDL_AutoBindHandle);\n", iface->name);
         indent--;
@@ -150,14 +204,17 @@ static void write_function_stubs(type_t 
 
         /* send/receive message */
         /* print_client("NdrNsSendReceive(\n"); */
+        /* print_client("(unsigned char *)_StubMsg.Buffer,\n"); */
+        /* print_client("(RPC_BINDING_HANDLE *) &%s__MIDL_AutoBindHandle);\n", iface->name); */
         print_client("NdrSendReceive(\n");
         indent++;
         print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
         print_client("(unsigned char *)_StubMsg.Buffer);\n");
-        /* print_client("(unsigned char *)_StubMsg.Buffer,\n"); */
-        /* print_client("(RPC_BINDING_HANDLE *) &%s__MIDL_AutoBindHandle);\n", iface->name); */
         indent--;
 
+        print_client("_StubMsg.BufferStart = (unsigned char *)_RpcMessage.Buffer;\n");
+        print_client("_StubMsg.BufferEnd = _StubMsg.BufferStart + _RpcMessage.BufferLength;\n");
+
         /* unmarshal return value */
         if (!is_void(def->type, NULL))
         {




More information about the wine-cvs mailing list