Robert Shearman : widl: Handle marshaling and unmarshaling structures.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 26 11:47:04 CST 2005


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

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

widl: Handle marshaling and unmarshaling structures.

---

 tools/widl/typegen.c |   43 ++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 42 insertions(+), 1 deletions(-)

diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 1ed4ec7..f1f791d 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -428,11 +428,32 @@ void marshall_arguments(FILE *file, int 
             }
             else
             {
+                const char *ndrtype;
+
                 switch (var->type->type)
                 {
+                case RPC_FC_STRUCT:
+                    ndrtype = "SimpleStruct";
+                    break;
+                case RPC_FC_CSTRUCT:
+                case RPC_FC_CPSTRUCT:
+                    ndrtype = "ConformantStruct";
+                    break;
+                case RPC_FC_CVSTRUCT:
+                    ndrtype = "ConformantVaryingStruct";
+                    break;
+                case RPC_FC_BOGUS_STRUCT:
+                    ndrtype = "ComplexStruct";
+                    break;
                 default:
-                    error("marshall_arguments: Unsupported type: %s (0x%02x, ptr_level: 1)\n", var->name, var->type->type);
+                    error("marshall_arguments: Unsupported type: %s (0x%02x, ptr_level: %d)\n",
+                        var->name, var->type->type, var->ptr_level);
+                    ndrtype = NULL;
                 }
+
+                print_file(file, indent,
+                    "Ndr%sMarshall(&_StubMsg, (unsigned char *)%s, &__MIDL_TypeFormatString.Format[%d]);\n",
+                    ndrtype, var->name, *type_offset);
             }
             last_size = 1;
         }
@@ -583,12 +604,32 @@ void unmarshall_arguments(FILE *file, in
             }
             else
             {
+                const char *ndrtype;
+
                 switch (var->type->type)
                 {
+                case RPC_FC_STRUCT:
+                    ndrtype = "SimpleStruct";
+                    break;
+                case RPC_FC_CSTRUCT:
+                case RPC_FC_CPSTRUCT:
+                    ndrtype = "ConformantStruct";
+                    break;
+                case RPC_FC_CVSTRUCT:
+                    ndrtype = "ConformantVaryingStruct";
+                    break;
+                case RPC_FC_BOGUS_STRUCT:
+                    ndrtype = "ComplexStruct";
+                    break;
                 default:
                     error("unmarshall_arguments: Unsupported type: %s (0x%02x, ptr_level: %d)\n",
                         var->name, var->type->type, var->ptr_level);
+                    ndrtype = NULL;
                 }
+
+                print_file(file, indent,
+                    "Ndr%sUnmarshall(&_StubMsg, (unsigned char *)%s, &__MIDL_TypeFormatString.Format[%d], 0);\n",
+                    ndrtype, var->name, *type_offset);
             }
             last_size = 1;
         }




More information about the wine-cvs mailing list