widl: Write out argument lists in the server.

- Add framework for updating proc offsets.
- Write out argument lists in the server.
This commit is contained in:
Eric Kohl 2005-12-08 12:48:44 +01:00 committed by Alexandre Julliard
parent 80e262202f
commit ba39a874d4
2 changed files with 131 additions and 18 deletions

View File

@ -126,6 +126,7 @@ static void write_function_stubs(type_t *iface)
{ {
func_t *func = iface->funcs; func_t *func = iface->funcs;
char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE); char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
var_t *var;
int method_count = 0; int method_count = 0;
unsigned int proc_offset = 0; unsigned int proc_offset = 0;
@ -178,11 +179,16 @@ static void write_function_stubs(type_t *iface)
fprintf(client, "\n"); fprintf(client, "\n");
if (implicit_handle) if (implicit_handle)
{
print_client("_Handle = %s;\n", implicit_handle); print_client("_Handle = %s;\n", implicit_handle);
fprintf(client, "\n");
}
/* emit the message buffer size */
print_client("_StubMsg.BufferLength =");
print_client("0"); /* FIXME */
fprintf(client, ";\n");
/* FIXME: marshal arguments */
print_client("_StubMsg.BufferLength = 0UL;\n");
/* print_client("NdrNsGetBuffer(\n"); */
print_client("NdrGetBuffer(\n"); print_client("NdrGetBuffer(\n");
indent++; indent++;
print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
@ -206,11 +212,7 @@ static void write_function_stubs(type_t *iface)
indent--; indent--;
/* unmarshal return value */ /* unmarshal return value */
if (is_void(def->type, NULL)) if (!is_void(def->type, NULL))
{
proc_offset += 2;
}
else
{ {
fprintf(client, "\n"); fprintf(client, "\n");
@ -219,18 +221,28 @@ static void write_function_stubs(type_t *iface)
print_client("NdrConvert(\n"); print_client("NdrConvert(\n");
indent++; indent++;
print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
print_client("(PFORMAT_STRING)&__MIDL_ProcFormatString[%u]);\n", proc_offset); print_client("(PFORMAT_STRING)&__MIDL_ProcFormatString.Format[%u]);\n", proc_offset);
indent -= 2; indent -= 2;
fprintf(client, "\n"); fprintf(client, "\n");
print_client("_RetVal = *(("); print_client("_RetVal = *((");
write_type(client, def->type, def, def->tname); write_type(client, def->type, def, def->tname);
fprintf(client, " __RPC_FAR *)_StubMsg.Buffer)++;\n"); fprintf(client, " __RPC_FAR *)_StubMsg.Buffer)++;\n");
/* FIXME: update proc_offset */
proc_offset += 2;
} }
/* update proc_offset */
if (func->args)
{
var = func->args;
while (NEXT_LINK(var)) var = NEXT_LINK(var);
while (var)
{
proc_offset += 2; /* FIXME */
var = PREV_LINK(var);
}
}
proc_offset += 2; /* FIXME */
indent--; indent--;
print_client("}\n"); print_client("}\n");
print_client("RpcFinally\n"); print_client("RpcFinally\n");
@ -358,6 +370,7 @@ static void write_formatdesc( const char *str )
static void write_formatstringsdecl(type_t *iface) static void write_formatstringsdecl(type_t *iface)
{ {
func_t *func; func_t *func;
var_t *var;
int byte_count = 1; int byte_count = 1;
print_client("#define TYPE_FORMAT_STRING_SIZE %d\n", 3); /* FIXME */ print_client("#define TYPE_FORMAT_STRING_SIZE %d\n", 3); /* FIXME */
@ -367,6 +380,19 @@ static void write_formatstringsdecl(type_t *iface)
while (NEXT_LINK(func)) func = NEXT_LINK(func); while (NEXT_LINK(func)) func = NEXT_LINK(func);
while (func) while (func)
{ {
/* argument list size */
if (func->args)
{
var = func->args;
while (NEXT_LINK(var)) var = NEXT_LINK(var);
while (var)
{
byte_count += 2; /* FIXME: determine real size */
var = PREV_LINK(var);
}
}
/* return value size */
byte_count += 2; /* FIXME: determine real size */ byte_count += 2; /* FIXME: determine real size */
func = PREV_LINK(func); func = PREV_LINK(func);
} }
@ -384,11 +410,11 @@ static void write_formatstringsdecl(type_t *iface)
static void write_implicithandledecl(type_t *iface) static void write_implicithandledecl(type_t *iface)
{ {
char *var = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE); char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
if (var) if (implicit_handle)
{ {
fprintf(client, "handle_t %s;\n", var); fprintf(client, "handle_t %s;\n", implicit_handle);
fprintf(client, "\n"); fprintf(client, "\n");
} }
} }

View File

@ -150,6 +150,9 @@ static unsigned int get_required_stack_size(type_t *type)
static void write_function_stubs(type_t *iface) static void write_function_stubs(type_t *iface)
{ {
func_t *func = iface->funcs; func_t *func = iface->funcs;
var_t *var;
unsigned int proc_offset = 0;
while (NEXT_LINK(func)) func = NEXT_LINK(func); while (NEXT_LINK(func)) func = NEXT_LINK(func);
while (func) while (func)
{ {
@ -176,9 +179,28 @@ static void write_function_stubs(type_t *iface)
fprintf(server, " _RetVal;\n"); fprintf(server, " _RetVal;\n");
} }
/* declare arguments */
if (func->args)
{
var = func->args;
while (NEXT_LINK(var)) var = NEXT_LINK(var);
while (var)
{
print_server("");
write_type(server, var->type, var, var->tname);
fprintf(server, " ");
write_name(server, var);
fprintf(server, ";\n");
var = PREV_LINK(var);
}
}
print_server("MIDL_STUB_MESSAGE _StubMsg;\n"); print_server("MIDL_STUB_MESSAGE _StubMsg;\n");
print_server("RPC_STATUS _Status;\n"); print_server("RPC_STATUS _Status;\n");
fprintf(server, "\n"); fprintf(server, "\n");
print_server("((void)(_Status));\n"); print_server("((void)(_Status));\n");
print_server("NdrServerInitializeNew(\n"); print_server("NdrServerInitializeNew(\n");
indent++; indent++;
@ -194,6 +216,21 @@ static void write_function_stubs(type_t *iface)
print_server("RpcTryExcept\n"); print_server("RpcTryExcept\n");
print_server("{\n"); print_server("{\n");
indent++; indent++;
if (func->args)
{
print_server("if ((_pRpcMessage->DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION)\n");
indent++;
print_server("NdrConvert(\n");
indent++;
print_server("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
print_server("(PFORMAT_STRING)&__MIDL_ProcFormatString.Format[%u]);\n", proc_offset);
indent -= 2;
fprintf(server, "\n");
/* FIXME: unmarshall arguments */
}
print_server("if (_StubMsg.Buffer > _StubMsg.BufferEnd)\n"); print_server("if (_StubMsg.Buffer > _StubMsg.BufferEnd)\n");
print_server("{\n"); print_server("{\n");
indent++; indent++;
@ -219,10 +256,33 @@ static void write_function_stubs(type_t *iface)
print_server(""); print_server("");
write_name(server, def); write_name(server, def);
/* FIXME: handle argument list */ if (func->args)
fprintf(server, "();\n"); {
int first_arg = 1;
/* FIXME: Marshall the return value */ fprintf(server, "(\n");
indent++;
var = func->args;
while (NEXT_LINK(var)) var = NEXT_LINK(var);
while (var)
{
if (first_arg)
first_arg = 0;
else
fprintf(server, ",\n");
print_server("");
write_name(server, var);
var = PREV_LINK(var);
}
fprintf(server, ");\n");
indent--;
}
else
{
fprintf(server, "();\n");
}
/* marshall the return value */
if (!is_void(def->type, NULL)) if (!is_void(def->type, NULL))
{ {
fprintf(server, "\n"); fprintf(server, "\n");
@ -260,6 +320,19 @@ static void write_function_stubs(type_t *iface)
fprintf(server, "}\n"); fprintf(server, "}\n");
fprintf(server, "\n"); fprintf(server, "\n");
/* update proc_offset */
if (func->args)
{
var = func->args;
while (NEXT_LINK(var)) var = NEXT_LINK(var);
while (var)
{
proc_offset += 2; /* FIXME */
var = PREV_LINK(var);
}
}
proc_offset += 2; /* FIXME */
func = PREV_LINK(func); func = PREV_LINK(func);
} }
} }
@ -383,6 +456,7 @@ static void write_formatdesc( const char *str )
static void write_formatstringsdecl(type_t *iface) static void write_formatstringsdecl(type_t *iface)
{ {
func_t *func; func_t *func;
var_t *var;
int byte_count = 1; int byte_count = 1;
print_server("#define TYPE_FORMAT_STRING_SIZE %d\n", 3); /* FIXME */ print_server("#define TYPE_FORMAT_STRING_SIZE %d\n", 3); /* FIXME */
@ -392,6 +466,19 @@ static void write_formatstringsdecl(type_t *iface)
while (NEXT_LINK(func)) func = NEXT_LINK(func); while (NEXT_LINK(func)) func = NEXT_LINK(func);
while (func) while (func)
{ {
/* argument list size */
if (func->args)
{
var = func->args;
while (NEXT_LINK(var)) var = NEXT_LINK(var);
while (var)
{
byte_count += 2; /* FIXME: determine real size */
var = PREV_LINK(var);
}
}
/* return value size */
byte_count += 2; /* FIXME: determine real size */ byte_count += 2; /* FIXME: determine real size */
func = PREV_LINK(func); func = PREV_LINK(func);
} }