- Support [out, unique] base type parameters.
Modified: trunk/reactos/tools/widl/client.c
Modified: trunk/reactos/tools/widl/server.c
_____
Modified: trunk/reactos/tools/widl/client.c
--- trunk/reactos/tools/widl/client.c 2005-10-09 00:45:33 UTC (rev
18369)
+++ trunk/reactos/tools/widl/client.c 2005-10-09 08:36:50 UTC (rev
18370)
@@ -333,7 +333,8 @@
if (is_base_type(var->type))
{
print_client("0x4e, /* FC_IN_PARAM_BASETYPE
*/\n");
- print_client("0x%02x, /* FC_<type> */\n",
get_base_type(var->type->type));
+ print_client("0x%02x, /* FC_<type> */\n",
+ get_base_type(var->type->type));
}
else if (var->type->type == RPC_FC_RP)
{
@@ -361,27 +362,18 @@
}
else if (var->ptr_level == 1)
{
-// if (is_base_type(var->type))
-// {
- if (in_attr & !out_attr)
- print_client("0x4d, /* FC_IN_PARAM
*/\n");
- else if (!in_attr & out_attr)
- print_client("0x51, /* FC_OUT_PARAM
*/\n");
- else if (in_attr & out_attr)
- print_client("0x50, /* FC_IN_OUT_PARAM
*/\n");
- fprintf(client, "#ifndef _ALPHA_\n");
- print_client("0x01,\n");
- fprintf(client, "#else\n");
- print_client("0x02,\n");
- fprintf(client, "#endif\n");
- print_client("NdrFcShort(0x%x),\n",
type_offset);
-// }
-// else
-// {
-// error("%s:%d Unknown/unsupported type
0x%x\n",
-// __FUNCTION__,__LINE__,
var->type->type);
-// return;
-// }
+ if (in_attr & !out_attr)
+ print_client("0x4d, /* FC_IN_PARAM */\n");
+ else if (!in_attr & out_attr)
+ print_client("0x51, /* FC_OUT_PARAM */\n");
+ else if (in_attr & out_attr)
+ print_client("0x50, /* FC_IN_OUT_PARAM
*/\n");
+ fprintf(client, "#ifndef _ALPHA_\n");
+ print_client("0x01,\n");
+ fprintf(client, "#else\n");
+ print_client("0x02,\n");
+ fprintf(client, "#endif\n");
+ print_client("NdrFcShort(0x%x),\n", type_offset);
}
else
{
@@ -481,7 +473,7 @@
print_client("0x11, 0x%02X, /* FC_RP,
[flags] */\n", flags);
print_client("NdrFcShort(0x%02X),\n",
0x02);
print_client("0x%02X,\n",
var->type->ref->ref->type);
- print_client("0x%02X,\n", 3); /* alignment
-1 */
+ print_client("0x%02X,\n", 3); /* alignment
- 1 */
print_client("NdrFcShort(0x%02X),\n",
get_type_size(var->type->ref->ref, 4));
field = var->type->ref->ref->fields;
@@ -576,7 +568,7 @@
if (ref_attr)
print_client("0x11, 0x0c, /* FC_RP
[allocated_on_stack] [simple_pointer] */\n");
else if (unique_attr)
- print_client("0x12, 0x0c, /* FC_FP
[allocated_on_stack] [simple_pointer] */\n");
+ print_client("0x12, 0x0c, /* FC_UP
[allocated_on_stack] [simple_pointer] */\n");
else if (ptr_attr)
print_client("0x14, 0x0c, /* FC_FP
[allocated_on_stack] [simple_pointer] */\n");
}
@@ -1196,6 +1188,7 @@
unsigned int last_size = 0;
int out_attr;
int string_attr;
+ int ptr_attr, ref_attr, unique_attr;
void *sizeis_attr;
var_t *var;
var_t *def;
@@ -1214,6 +1207,12 @@
sizeis_attr = get_attrp(var->attrs, ATTR_SIZEIS);
string_attr = is_attr(var->attrs, ATTR_STRING);
+ ptr_attr = is_attr(var->attrs, ATTR_PTR);
+ ref_attr = is_attr(var->attrs, ATTR_REF);
+ unique_attr = is_attr(var->attrs, ATTR_UNIQUE);
+ if (ptr_attr + ref_attr + unique_attr == 0)
+ ref_attr = 1;
+
if (out_attr)
{
if (var->ptr_level > 1)
@@ -1309,15 +1308,30 @@
if (alignment != 0)
print_client("_StubMsg.Buffer +=
%u;\n", alignment);
- print_client("*");
- write_name(client, var);
- fprintf(client, " = *((");
- write_type(client, var->type, NULL,
var->tname);
- fprintf(client, " __RPC_FAR
*)_StubMsg.Buffer);\n");
+ if (unique_attr)
+ {
+
print_client("NdrPointerUnmarshall(\n");
+ indent++;
+
print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
+ print_client("(unsigned char __RPC_FAR
* __RPC_FAR *)&%s,\n", var->name);
+
print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u],\n",
+ local_type_offset);
+ print_client("(unsigned char)0);\n");
+ indent--;
+ fprintf(client, "\n");
+ }
+ else
+ {
+ print_client("*");
+ write_name(client, var);
+ fprintf(client, " = *((");
+ write_type(client, var->type, NULL,
var->tname);
+ fprintf(client, " __RPC_FAR
*)_StubMsg.Buffer);\n");
- print_client("_StubMsg.Buffer += sizeof(");
- write_type(client, var->type, NULL,
var->tname);
- fprintf(client, ");\n");
+ print_client("_StubMsg.Buffer +=
sizeof(");
+ write_type(client, var->type, NULL,
var->tname);
+ fprintf(client, ");\n");
+ }
}
last_size = size;
_____
Modified: trunk/reactos/tools/widl/server.c
--- trunk/reactos/tools/widl/server.c 2005-10-09 00:45:33 UTC (rev
18369)
+++ trunk/reactos/tools/widl/server.c 2005-10-09 08:36:50 UTC (rev
18370)
@@ -338,7 +338,8 @@
if (is_base_type(var->type))
{
print_server("0x4e, /* FC_IN_PARAM_BASETYPE
*/\n");
- print_server("0x%02x, /* FC_<type> */\n",
get_base_type(var->type->type));
+ print_server("0x%02x, /* FC_<type> */\n",
+ get_base_type(var->type->type));
}
else if (var->type->type == RPC_FC_RP)
{
@@ -364,27 +365,18 @@
}
else if (var->ptr_level == 1)
{
-// if (is_base_type(var->type))
-// {
- if (in_attr & !out_attr)
- print_server("0x4d, /* FC_IN_PARAM
*/\n");
- else if (!in_attr & out_attr)
- print_server("0x51, /* FC_OUT_PARAM
*/\n");
- else if (in_attr & out_attr)
- print_server("0x50, /* FC_IN_OUT_PARAM
*/\n");
- fprintf(server, "#ifndef _ALPHA_\n");
- print_server("0x01,\n");
- fprintf(server, "#else\n");
- print_server("0x02,\n");
- fprintf(server, "#endif\n");
- print_server("NdrFcShort(0x%x),\n",
type_offset);
-// }
-// else
-// {
-// error("%s:%d Unknown/unsupported type
0x%x\n",
-// __FUNCTION__,__LINE__,
var->type->type);
-// return;
-// }
+ if (in_attr & !out_attr)
+ print_server("0x4d, /* FC_IN_PARAM */\n");
+ else if (!in_attr & out_attr)
+ print_server("0x51, /* FC_OUT_PARAM */\n");
+ else if (in_attr & out_attr)
+ print_server("0x50, /* FC_IN_OUT_PARAM
*/\n");
+ fprintf(server, "#ifndef _ALPHA_\n");
+ print_server("0x01,\n");
+ fprintf(server, "#else\n");
+ print_server("0x02,\n");
+ fprintf(server, "#endif\n");
+ print_server("NdrFcShort(0x%x),\n", type_offset);
}
type_offset += get_var_type_offset(var);
@@ -478,7 +470,7 @@
print_server("0x11, 0x%02X, /* FC_RP,
[flags] */\n", flags);
print_server("NdrFcShort(0x%02X),\n",
0x02);
print_server("0x%02X,\n",
var->type->ref->ref->type);
- print_server("0x%02X,\n", 3); /* alignment
-1 */
+ print_server("0x%02X,\n", 3); /* alignment
- 1 */
print_server("NdrFcShort(0x%02X),\n",
get_type_size(var->type->ref->ref, 4));
field = var->type->ref->ref->fields;
@@ -573,7 +565,7 @@
if (ref_attr)
print_server("0x11, 0x0c, /* FC_RP
[allocated_on_stack] [simple_pointer] */\n");
else if (unique_attr)
- print_server("0x12, 0x0c, /* FC_FP
[allocated_on_stack] [simple_pointer] */\n");
+ print_server("0x12, 0x0c, /* FC_UP
[allocated_on_stack] [simple_pointer] */\n");
else if (ptr_attr)
print_server("0x14, 0x0c, /* FC_FP
[allocated_on_stack] [simple_pointer] */\n");
}
@@ -875,7 +867,7 @@
print_server("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
print_server("(unsigned char __RPC_FAR *)%s,\n",
var->name);
print_server("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n",
- local_type_offset + 4); /* FIXME */
+ local_type_offset + 4);
indent--;
fprintf(server,"\n");
}
@@ -1213,6 +1205,7 @@
var_t *def;
int out_attr;
int string_attr;
+ int ptr_attr, ref_attr, unique_attr;
void *sizeis_attr;
unsigned int local_type_offset = *type_offset;
@@ -1231,6 +1224,12 @@
sizeis_attr = get_attrp(var->attrs, ATTR_SIZEIS);
string_attr = is_attr(var->attrs, ATTR_STRING);
+ ptr_attr = is_attr(var->attrs, ATTR_PTR);
+ ref_attr = is_attr(var->attrs, ATTR_REF);
+ unique_attr = is_attr(var->attrs, ATTR_UNIQUE);
+ if (ptr_attr + ref_attr + unique_attr == 0)
+ ref_attr = 1;
+
if (sizeis_attr != NULL)
{
if (string_attr)
@@ -1326,16 +1325,30 @@
if (var->ptr_level == 1)
{
- fprintf(server, "\n");
- print_server("*((");
- write_type(server, var->type, NULL,
var->tname);
- fprintf(server, " __RPC_FAR
*)_StubMsg.Buffer) = *");
- write_name(server, var);
- fprintf(server, ";\n");
+ if (unique_attr)
+ {
+ print_server("NdrPointerMarshall(\n");
+ indent++;
+
print_server("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
+ print_server("(unsigned char __RPC_FAR
*)%s,\n", var->name);
+
print_server("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n",
+ local_type_offset);
+ indent--;
+ fprintf(server, "\n");
+ }
+ else
+ {
+ fprintf(server, "\n");
+ print_server("*((");
+ write_type(server, var->type, NULL,
var->tname);
+ fprintf(server, " __RPC_FAR
*)_StubMsg.Buffer) = *");
+ write_name(server, var);
+ fprintf(server, ";\n");
- print_server("_StubMsg.Buffer += sizeof(");
- write_type(server, var->type, NULL,
var->tname);
- fprintf(server, ");");
+ print_server("_StubMsg.Buffer +=
sizeof(");
+ write_type(server, var->type, NULL,
var->tname);
+ fprintf(server, ");");
+ }
}
else
{