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