Module: wine Branch: refs/heads/master Commit: 413738810f8fad7553f29b75eacce5b5c1f8cfa0 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=413738810f8fad7553f29b75...
Author: Robert Shearman rob@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);