From 2812e11e341b468afc822e4e743602532fe4f281 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 16 Oct 2005 15:27:38 +0000 Subject: [PATCH] Fix [out, size_is, unique] parameter issues. svn path=/trunk/; revision=18499 --- reactos/tools/widl/ChangeLog | 7 ++ reactos/tools/widl/client.c | 145 +++++++++++++++++++++++++---------- reactos/tools/widl/server.c | 86 +++++++++++++++------ 3 files changed, 174 insertions(+), 64 deletions(-) diff --git a/reactos/tools/widl/ChangeLog b/reactos/tools/widl/ChangeLog index 4fe22544a01..85690de3895 100644 --- a/reactos/tools/widl/ChangeLog +++ b/reactos/tools/widl/ChangeLog @@ -1,5 +1,12 @@ ChangeLog +2005-10-16 ekohl + + tools/widl/client.c + tools/widl/server.c + +- Fix [out, size_is, unique] parameter issues. + 2005-10-09 ekohl tools/widl/client.c diff --git a/reactos/tools/widl/client.c b/reactos/tools/widl/client.c index 2b82b658efd..b54d9692c5b 100644 --- a/reactos/tools/widl/client.c +++ b/reactos/tools/widl/client.c @@ -518,7 +518,13 @@ static void write_typeformatstring(type_t *iface) if (type != NULL) type_type = type->type; - print_client("0x11, 0x00, /* FC_RP */\n"); + if (ref_attr) + print_client("0x11, 0x00, /* FC_RP */\n"); + else if (unique_attr) + print_client("0x12, 0x00, /* FC_UP */\n"); + else if (ptr_attr) + print_client("0x14, 0x00, /* FC_FP */\n"); + print_client("NdrFcShort(0x02),\n"); if (string_attr) @@ -873,10 +879,6 @@ static void print_message_buffer_size(func_t *func, unsigned int *type_offset) if ((var->type->type == RPC_FC_CHAR || var->type->type == RPC_FC_WCHAR)) { - if (ptr_attr) - { - /* FIXME: not supported yet */ - } if (ref_attr) { print_client("NdrConformantStringBufferSize(\n"); @@ -899,6 +901,10 @@ static void print_message_buffer_size(func_t *func, unsigned int *type_offset) nothing_printed = 1; indent--; } + else if (ptr_attr) + { + /* FIXME: not supported yet */ + } } } else @@ -910,14 +916,32 @@ static void print_message_buffer_size(func_t *func, unsigned int *type_offset) ((var_t *)sizeis_attr)->name); fprintf(client, "\n"); - print_client("NdrConformantArrayBufferSize(\n"); - indent++; - print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); - print_client("(unsigned char __RPC_FAR *)%s,\n", var->name); - print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n", - local_type_offset + 4); - indent--; - nothing_printed = 1; + if (ref_attr) + { + print_client("NdrConformantArrayBufferSize(\n"); + indent++; + print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); + print_client("(unsigned char __RPC_FAR *)%s,\n", var->name); + print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n", + local_type_offset + 4); + indent--; + nothing_printed = 1; + } + else if (unique_attr) + { + print_client("NdrPointerBufferSize(\n"); + indent++; + print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); + print_client("(unsigned char __RPC_FAR *)%s,\n", var->name); + print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n", + local_type_offset); + nothing_printed = 1; + indent--; + } + else if (ptr_attr) + { + /* FIXME: not supported yet */ + } } } } @@ -945,6 +969,7 @@ static void marshall_in_arguments(func_t *func, unsigned int *type_offset) int ptr_attr, ref_attr, unique_attr; void *sizeis_attr; var_t *var; + int default_align = 0; if (!func->args) return; @@ -980,25 +1005,25 @@ static void marshall_in_arguments(func_t *func, unsigned int *type_offset) string_attr = is_attr(var->attrs, ATTR_STRING); sizeis_attr = get_attrp(var->attrs, ATTR_SIZEIS); - if (sizeis_attr) + if (ref_attr) { - print_client("_StubMsg.MaxCount = %s;\n", - ((var_t *)sizeis_attr)->name); - fprintf(client, "\n"); + if (sizeis_attr) + { + print_client("_StubMsg.MaxCount = %s;\n", + ((var_t *)sizeis_attr)->name); + fprintf(client, "\n"); - print_client("NdrConformantArrayMarshall(\n"); - indent++; - print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); - print_client("(unsigned char __RPC_FAR *)%s,\n", var->name); - print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n", - local_type_offset + 4); - indent--; - fprintf(client, "\n"); - print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); - fprintf(client, "\n"); - } - else if (ref_attr) - { + print_client("NdrConformantArrayMarshall(\n"); + indent++; + print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); + print_client("(unsigned char __RPC_FAR *)%s,\n", var->name); + print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n", + local_type_offset + 4); + indent--; + fprintf(client, "\n"); + default_align = 1; + } + else if (string_attr && (var->type->type == RPC_FC_CHAR || var->type->type == RPC_FC_WCHAR)) { @@ -1010,8 +1035,7 @@ static void marshall_in_arguments(func_t *func, unsigned int *type_offset) local_type_offset + 2); indent--; fprintf(client, "\n"); - print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); - fprintf(client, "\n"); + default_align = 1; } else { @@ -1060,6 +1084,13 @@ static void marshall_in_arguments(func_t *func, unsigned int *type_offset) if (size != 0) { + if (default_align) + { + print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); + fprintf(client, "\n"); + default_align = 0; + } + else if (alignment != 0) print_client("_StubMsg.Buffer += %u;\n", alignment); @@ -1081,6 +1112,13 @@ static void marshall_in_arguments(func_t *func, unsigned int *type_offset) } else if (unique_attr) { + if (sizeis_attr) + { + print_client("_StubMsg.MaxCount = %s;\n", + ((var_t *)sizeis_attr)->name); + fprintf(client, "\n"); + } + print_client("NdrPointerMarshall(\n"); indent++; print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); @@ -1089,6 +1127,7 @@ static void marshall_in_arguments(func_t *func, unsigned int *type_offset) local_type_offset); indent--; fprintf(client, "\n"); + default_align = 1; } } else @@ -1140,6 +1179,14 @@ static void marshall_in_arguments(func_t *func, unsigned int *type_offset) if (size != 0) { + if (default_align) + { + fprintf(client, "\n"); + print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); + fprintf(client, "\n"); + default_align = 0; + } + else if (alignment != 0) print_client("_StubMsg.Buffer += %u;\n", alignment); @@ -1170,6 +1217,7 @@ static void marshall_in_arguments(func_t *func, unsigned int *type_offset) local_type_offset + 4); indent--; fprintf(client, "\n"); + default_align = 1; } } } @@ -1193,6 +1241,7 @@ static void unmarshall_out_arguments(func_t *func, unsigned int *type_offset) var_t *var; var_t *def; unsigned int local_type_offset = *type_offset; + int default_align = 0; def = func->def; @@ -1236,8 +1285,7 @@ static void unmarshall_out_arguments(func_t *func, unsigned int *type_offset) print_client("(unsigned char)0);\n"); indent--; fprintf(client, "\n"); - print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); - fprintf(client, "\n"); + default_align = 1; } else { @@ -1251,8 +1299,7 @@ static void unmarshall_out_arguments(func_t *func, unsigned int *type_offset) print_client("(unsigned char)0);\n"); indent--; fprintf(client, "\n"); - print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); - fprintf(client, "\n"); + default_align = 1; } } else if (is_base_type(var->type)) @@ -1304,12 +1351,9 @@ static void unmarshall_out_arguments(func_t *func, unsigned int *type_offset) { if (var->ptr_level == 1) { - fprintf(client, "\n"); - if (alignment != 0) - print_client("_StubMsg.Buffer += %u;\n", alignment); - if (unique_attr) { + fprintf(client, "\n"); print_client("NdrPointerUnmarshall(\n"); indent++; print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); @@ -1319,9 +1363,22 @@ static void unmarshall_out_arguments(func_t *func, unsigned int *type_offset) print_client("(unsigned char)0);\n"); indent--; fprintf(client, "\n"); + default_align = 1; } else { + fprintf(client, "\n"); + if (default_align) + { + print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); + fprintf(client, "\n"); + default_align = 0; + } + else + if (alignment != 0) + print_client("_StubMsg.Buffer += %u;\n", alignment); + + print_client("*"); write_name(client, var); fprintf(client, " = *(("); @@ -1351,6 +1408,7 @@ static void unmarshall_out_arguments(func_t *func, unsigned int *type_offset) print_client("(unsigned char)0);\n"); indent--; fprintf(client, "\n"); + default_align = 1; } } else @@ -1400,6 +1458,13 @@ static void unmarshall_out_arguments(func_t *func, unsigned int *type_offset) } fprintf(client, "\n"); + if (default_align) + { + print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); + fprintf(client, "\n"); + default_align = 0; + } + else if (alignment != 0) print_client("_StubMsg.Buffer += %u;\n", alignment); print_client("_RetVal = *(("); diff --git a/reactos/tools/widl/server.c b/reactos/tools/widl/server.c index 243721bb4ea..0701cacb270 100644 --- a/reactos/tools/widl/server.c +++ b/reactos/tools/widl/server.c @@ -515,7 +515,12 @@ static void write_typeformatstring(type_t *iface) if (type != NULL) type_type = type->type; - print_server("0x11, 0x00, /* FC_RP */\n"); + if (ref_attr) + print_server("0x11, 0x00, /* FC_RP */\n"); + else if (unique_attr) + print_server("0x12, 0x00, /* FC_UP */\n"); + else if (ptr_attr) + print_server("0x14, 0x00, /* FC_FP */\n"); print_server("NdrFcShort(0x02),\n"); if (string_attr) @@ -622,7 +627,7 @@ static void print_message_buffer_size(func_t *func, unsigned int *type_offset) int last_size = -1; int in_attr; int out_attr; - int string_attr; + int string_attr, unique_attr; void *sizeis_attr; int empty_line; var_t *var; @@ -892,6 +897,7 @@ static void print_message_buffer_size(func_t *func, unsigned int *type_offset) out_attr = is_attr(var->attrs, ATTR_OUT); in_attr = is_attr(var->attrs, ATTR_IN); string_attr = is_attr(var->attrs, ATTR_STRING); + unique_attr = is_attr(var->attrs, ATTR_UNIQUE); /* set 'in' attribute if neither 'in' nor 'out' is found */ if (!out_attr && !in_attr) @@ -899,6 +905,7 @@ static void print_message_buffer_size(func_t *func, unsigned int *type_offset) if (var->ptr_level == 1 && string_attr && + unique_attr == 0 && (var->type->type == RPC_FC_BYTE || var->type->type == RPC_FC_CHAR || var->type->type == RPC_FC_WCHAR)) @@ -968,6 +975,7 @@ static void unmarshall_in_arguments(func_t *func, unsigned int *type_offset) int string_attr; int ptr_attr, ref_attr, unique_attr; void *sizeis_attr; + int default_align = 0; if (!func->args) return; @@ -1011,23 +1019,21 @@ static void unmarshall_in_arguments(func_t *func, unsigned int *type_offset) print_server("(unsigned char)0);\n"); indent--; fprintf(server, "\n"); - print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); - fprintf(server, "\n"); + default_align = 1; } } else if (sizeis_attr) { - print_server("NdrConformantArrayUnmarshall(\n"); - indent++; - print_server("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); - print_server("(unsigned char __RPC_FAR * __RPC_FAR *)&%s,\n", var->name); - print_server("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u],\n", - local_type_offset + 4); - print_server("(unsigned char)0);\n"); - indent--; - fprintf(server, "\n"); - print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); - fprintf(server, "\n"); + print_server("NdrConformantArrayUnmarshall(\n"); + indent++; + print_server("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); + print_server("(unsigned char __RPC_FAR * __RPC_FAR *)&%s,\n", var->name); + print_server("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u],\n", + local_type_offset + 4); + print_server("(unsigned char)0);\n"); + indent--; + fprintf(server, "\n"); + default_align = 1; } else { @@ -1076,6 +1082,13 @@ static void unmarshall_in_arguments(func_t *func, unsigned int *type_offset) if (size != 0) { + if (default_align) + { + print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); + fprintf(server, "\n"); + default_align = 0; + } + else if (alignment != 0) print_server("_StubMsg.Buffer += %u;\n", alignment); @@ -1104,6 +1117,7 @@ static void unmarshall_in_arguments(func_t *func, unsigned int *type_offset) print_server("(unsigned char)0);\n"); indent--; fprintf(server, "\n"); + default_align = 1; } } @@ -1156,6 +1170,13 @@ static void unmarshall_in_arguments(func_t *func, unsigned int *type_offset) if (size != 0) { + if (default_align) + { + print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); + fprintf(server, "\n"); + default_align = 0; + } + else if (alignment != 0) print_server("_StubMsg.Buffer += %u;\n", alignment); @@ -1185,6 +1206,7 @@ static void unmarshall_in_arguments(func_t *func, unsigned int *type_offset) print_server("(unsigned char)0);\n"); indent--; fprintf(server, "\n"); + default_align = 1; } } } @@ -1208,6 +1230,7 @@ static void marshall_out_arguments(func_t *func, unsigned int *type_offset) int ptr_attr, ref_attr, unique_attr; void *sizeis_attr; unsigned int local_type_offset = *type_offset; + int default_align = 0; def = func->def; @@ -1249,8 +1272,7 @@ static void marshall_out_arguments(func_t *func, unsigned int *type_offset) local_type_offset + 4); indent--; fprintf(server, "\n"); - print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); - fprintf(server, "\n"); + default_align = 1; } else { @@ -1269,8 +1291,7 @@ static void marshall_out_arguments(func_t *func, unsigned int *type_offset) local_type_offset + 4); indent--; fprintf(server, "\n"); - print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); - fprintf(server, "\n"); + default_align = 1; } } else if (is_base_type(var->type)) @@ -1320,9 +1341,6 @@ static void marshall_out_arguments(func_t *func, unsigned int *type_offset) if (size != 0) { - if (alignment != 0) - print_server("_StubMsg.Buffer += %u;\n", alignment); - if (var->ptr_level == 1) { if (unique_attr) @@ -1335,9 +1353,20 @@ static void marshall_out_arguments(func_t *func, unsigned int *type_offset) local_type_offset); indent--; fprintf(server, "\n"); + default_align = 1; } else { + if (default_align) + { + print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); + fprintf(server, "\n"); + default_align = 0; + } + else + if (alignment != 0) + print_server("_StubMsg.Buffer += %u;\n", alignment); + fprintf(server, "\n"); print_server("*(("); write_type(server, var->type, NULL, var->tname); @@ -1369,6 +1398,7 @@ static void marshall_out_arguments(func_t *func, unsigned int *type_offset) print_server("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n", local_type_offset + 4); indent--; + default_align = 1; } } @@ -1411,6 +1441,13 @@ static void marshall_out_arguments(func_t *func, unsigned int *type_offset) } fprintf(server, "\n"); + if (default_align) + { + print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n"); + fprintf(server, "\n"); + default_align = 0; + } + else if (alignment != 0) print_server("_StubMsg.Buffer += %u;\n", alignment); print_server("*(("); @@ -1450,7 +1487,7 @@ static int use_return_buffer(func_t *func) static void cleanup_return_buffer(func_t *func, unsigned int *type_offset) { var_t *var; - int string_attr; + int string_attr, unique_attr; void *sizeis_attr; unsigned int local_type_offset = *type_offset; @@ -1464,8 +1501,9 @@ static void cleanup_return_buffer(func_t *func, unsigned int *type_offset) { sizeis_attr = get_attrp(var->attrs, ATTR_SIZEIS); string_attr = is_attr(var->attrs, ATTR_STRING); + unique_attr = is_attr(var->attrs, ATTR_UNIQUE); - if (sizeis_attr != NULL) + if (sizeis_attr != NULL && unique_attr == 0) { if (first_arg == 0) fprintf(server, "\n");