Robert Shearman : widl: Add support for marshalling and unmarshalling conformant strings.
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(a)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);
participants (1)
-
Alexandre Julliard