- Support explicit binding handles.
svn path=/trunk/; revision=13740
+2005-02-25 ekohl\r
+ tools/widl/client.c\r
+ tools/widl/header.c\r
+ tools/widl/header.h\r
+ tools/widl/server.c\r
+\r
+Support multiple interfaces per idl file.\r
+Support explicit binding handles.\r
+\r
+\r
2005-02-24 ekohl\r
include/wine/rpcfc.h\r
tools/widl/client.c\r
2005-02-24 ekohl\r
include/wine/rpcfc.h\r
tools/widl/client.c\r
static void print_message_buffer_size(func_t *func)\r
{\r
unsigned int alignment;\r
static void print_message_buffer_size(func_t *func)\r
{\r
unsigned int alignment;\r
- unsigned int size;\r
- unsigned int last_size = 0;\r
+ int size;\r
+ int last_size = -1;\r
var_t *var;\r
\r
if (!func->args)\r
var_t *var;\r
\r
if (!func->args)\r
case RPC_FC_USHORT:\r
case RPC_FC_SHORT:\r
size = 2;\r
case RPC_FC_USHORT:\r
case RPC_FC_SHORT:\r
size = 2;\r
- if (last_size != 0 && last_size < 2)\r
+ if (last_size != -1 && last_size < 2)\r
alignment += (2 - last_size);\r
break;\r
\r
alignment += (2 - last_size);\r
break;\r
\r
case RPC_FC_LONG:\r
case RPC_FC_FLOAT:\r
size = 4;\r
case RPC_FC_LONG:\r
case RPC_FC_FLOAT:\r
size = 4;\r
- if (last_size != 0 && last_size < 4)\r
+ if (last_size != -1 && last_size < 4)\r
alignment += (4 - last_size);\r
break;\r
\r
case RPC_FC_HYPER:\r
case RPC_FC_DOUBLE:\r
size = 8;\r
alignment += (4 - last_size);\r
break;\r
\r
case RPC_FC_HYPER:\r
case RPC_FC_DOUBLE:\r
size = 8;\r
- if (last_size != 0 && last_size < 4)\r
+ if (last_size != -1 && last_size < 4)\r
alignment += (4 - last_size);\r
break;\r
\r
alignment += (4 - last_size);\r
break;\r
\r
error("Unknown/unsupported type!");\r
}\r
\r
error("Unknown/unsupported type!");\r
}\r
\r
- if (size == 0)\r
- {\r
- if (last_size != 0)\r
- fprintf(client, " +");\r
- fprintf(client, " 0U");\r
- }\r
- else\r
- {\r
- if (last_size != 0)\r
- fprintf(client, " +");\r
- fprintf(client, " %uU", size + alignment);\r
+ if (last_size != -1)\r
+ fprintf(client, " +");\r
+ fprintf(client, " %dU", (size == 0) ? 0 : size + alignment);\r
- last_size = size;\r
- }\r
- \r
\r
var = PREV_LINK(var);\r
}\r
\r
var = PREV_LINK(var);\r
}\r
static void write_function_stubs(type_t *iface)\r
{\r
char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);\r
static void write_function_stubs(type_t *iface)\r
{\r
char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);\r
- int explitit_handle = is_attr(iface->attrs, ATTR_IMPLICIT_HANDLE);\r
+ int explicit_handle = is_attr(iface->attrs, ATTR_EXPLICIT_HANDLE);\r
func_t *func = iface->funcs;\r
var_t* var;\r
func_t *func = iface->funcs;\r
var_t* var;\r
+ var_t* explicit_handle_var;\r
int method_count = 0;\r
unsigned int proc_offset = 0;\r
\r
int method_count = 0;\r
unsigned int proc_offset = 0;\r
\r
{\r
var_t *def = func->def;\r
\r
{\r
var_t *def = func->def;\r
\r
+ /* check for a defined binding handle */\r
+ explicit_handle_var = get_explicit_handle_var(func);\r
+ if (explicit_handle)\r
+ {\r
+ if (!explicit_handle_var)\r
+ {\r
+ error("%s() does not define an explicit binding handle!\n", def->name);\r
+ return;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (explicit_handle_var)\r
+ {\r
+ error("%s() must not define a binding handle!\n", def->name);\r
+ return;\r
+ }\r
+ }\r
+\r
write_type(client, def->type, def, def->tname);\r
fprintf(client, " ");\r
write_name(client, def);\r
write_type(client, def->type, def, def->tname);\r
fprintf(client, " ");\r
write_name(client, def);\r
fprintf(client, " _RetVal;\n");\r
}\r
\r
fprintf(client, " _RetVal;\n");\r
}\r
\r
+ if (implicit_handle || explicit_handle)\r
print_client("RPC_BINDING_HANDLE _Handle = 0;\n");\r
print_client("RPC_MESSAGE _RpcMessage;\n");\r
print_client("MIDL_STUB_MESSAGE _StubMsg;\n");\r
print_client("RPC_BINDING_HANDLE _Handle = 0;\n");\r
print_client("RPC_MESSAGE _RpcMessage;\n");\r
print_client("MIDL_STUB_MESSAGE _StubMsg;\n");\r
print_client("_Handle = %s;\n", implicit_handle);\r
fprintf(client, "\n");\r
}\r
print_client("_Handle = %s;\n", implicit_handle);\r
fprintf(client, "\n");\r
}\r
+ else if (explicit_handle)\r
+ {\r
+ print_client("_Handle = %s;\n", explicit_handle_var->name);\r
+ fprintf(client, "\n");\r
+ }\r
\r
/* emit the message buffer size */\r
print_client("_StubMsg.BufferLength =");\r
\r
/* emit the message buffer size */\r
print_client("_StubMsg.BufferLength =");\r
indent++;\r
print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");\r
print_client("_StubMsg.BufferLength,\n");\r
indent++;\r
print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");\r
print_client("_StubMsg.BufferLength,\n");\r
+ if (implicit_handle || explicit_handle)\r
print_client("%_Handle);\n");\r
else\r
print_client("%s__MIDL_AutoBindHandle);\n", iface->name);\r
print_client("%_Handle);\n");\r
else\r
print_client("%s__MIDL_AutoBindHandle);\n", iface->name);\r
\r
void write_client(ifref_t *ifaces)\r
{\r
\r
void write_client(ifref_t *ifaces)\r
{\r
- ifref_t *lcur = ifaces;\r
- char *file_id = client_token;\r
- int c;\r
+ ifref_t *iface = ifaces;\r
\r
if (!do_client)\r
return;\r
\r
if (!do_client)\r
return;\r
\r
init_client();\r
if (!client)\r
return;\r
\r
\r
init_client();\r
if (!client)\r
return;\r
\r
- write_formatstringsdecl(lcur->iface);\r
- write_implicithandledecl(lcur->iface);\r
+ while (iface)\r
+ {\r
+ fprintf(client, "/*****************************************************************************\n");\r
+ fprintf(client, " * %s interface\n", iface->iface->name);\r
+ fprintf(client, " */\n");\r
+ fprintf(client, "\n");\r
- write_clientinterfacedecl(lcur->iface);\r
- write_stubdescdecl(lcur->iface);\r
- write_bindinghandledecl(lcur->iface);\r
+ write_formatstringsdecl(iface->iface);\r
+ write_implicithandledecl(iface->iface);\r
- write_function_stubs(lcur->iface);\r
- write_stubdescriptor(lcur->iface);\r
+ write_clientinterfacedecl(iface->iface);\r
+ write_stubdescdecl(iface->iface);\r
+ write_bindinghandledecl(iface->iface);\r
- print_client("#if !defined(__RPC_WIN32__)\n");\r
- print_client("#error Invalid build platform for this stub.\n");\r
- print_client("#endif\n");\r
- fprintf(client, "\n");\r
+ write_function_stubs(iface->iface);\r
+ write_stubdescriptor(iface->iface);\r
- write_procformatstring(lcur->iface);\r
- write_typeformatstring();\r
+ print_client("#if !defined(__RPC_WIN32__)\n");\r
+ print_client("#error Invalid build platform for this stub.\n");\r
+ print_client("#endif\n");\r
+ fprintf(client, "\n");\r
- fprintf(client, "\n");\r
+ write_procformatstring(iface->iface);\r
+ write_typeformatstring();\r
+\r
+ fprintf(client, "\n");\r
+\r
+ iface = PREV_LINK(iface);\r
+ }\r
fprintf(header, ";\n\n");
}
fprintf(header, ";\n\n");
}
+
+var_t* get_explicit_handle_var(func_t* func)
+{
+ var_t* var;
+
+ if (!func->args)
+ return NULL;
+
+ var = func->args;
+ while (NEXT_LINK(var)) var = NEXT_LINK(var);
+ while (var)
+ {
+ if (var->type->type == RPC_FC_IGNORE)
+ return var;
+
+ var = PREV_LINK(var);
+ }
+
+ return NULL;
+}
+
+
/********** INTERFACES **********/
int is_object(attr_t *a)
/********** INTERFACES **********/
int is_object(attr_t *a)
static void write_function_proto(type_t *iface)
{
static void write_function_proto(type_t *iface)
{
+ int explicit_handle = is_attr(iface->attrs, ATTR_EXPLICIT_HANDLE);
+ var_t* explicit_handle_var;
+
func_t *cur = iface->funcs;
while (NEXT_LINK(cur)) cur = NEXT_LINK(cur);
while (cur) {
var_t *def = cur->def;
func_t *cur = iface->funcs;
while (NEXT_LINK(cur)) cur = NEXT_LINK(cur);
while (cur) {
var_t *def = cur->def;
+
+ /* check for a defined binding handle */
+ explicit_handle_var = get_explicit_handle_var(cur);
+ if (explicit_handle) {
+ if (!explicit_handle_var) {
+ error("%s() does not define an explicit binding handle!\n", def->name);
+ return;
+ }
+ } else {
+ if (explicit_handle_var) {
+ error("%s() must not define a binding handle!\n", def->name);
+ return;
+ }
+ }
+
/* FIXME: do we need to handle call_as? */
write_type(header, def->type, def, def->tname);
fprintf(header, " ");
/* FIXME: do we need to handle call_as? */
write_type(header, def->type, def, def->tname);
fprintf(header, " ");
extern void write_expr(FILE *h, expr_t *e);
extern void write_constdef(var_t *v);
extern void write_externdef(var_t *v);
extern void write_expr(FILE *h, expr_t *e);
extern void write_constdef(var_t *v);
extern void write_externdef(var_t *v);
+extern var_t* get_explicit_handle_var(func_t* func);
\r
static void write_function_stubs(type_t *iface)\r
{\r
\r
static void write_function_stubs(type_t *iface)\r
{\r
+ int explicit_handle = is_attr(iface->attrs, ATTR_EXPLICIT_HANDLE);\r
func_t *func = iface->funcs;\r
var_t *var;\r
func_t *func = iface->funcs;\r
var_t *var;\r
+ var_t* explicit_handle_var;\r
unsigned int proc_offset = 0;\r
\r
while (NEXT_LINK(func)) func = NEXT_LINK(func);\r
unsigned int proc_offset = 0;\r
\r
while (NEXT_LINK(func)) func = NEXT_LINK(func);\r
{\r
var_t *def = func->def;\r
\r
{\r
var_t *def = func->def;\r
\r
+ /* check for a defined binding handle */\r
+ explicit_handle_var = get_explicit_handle_var(func);\r
+ if (explicit_handle)\r
+ {\r
+ if (!explicit_handle_var)\r
+ {\r
+ error("%s() does not define an explicit binding handle!\n", def->name);\r
+ return;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (explicit_handle_var)\r
+ {\r
+ error("%s() must not define a binding handle!\n", def->name);\r
+ return;\r
+ }\r
+ }\r
+\r
write_type(server, def->type, def, def->tname);\r
fprintf(server, " __RPC_STUB\n");\r
fprintf(server, "%s_", iface->name);\r
write_type(server, def->type, def, def->tname);\r
fprintf(server, " __RPC_STUB\n");\r
fprintf(server, "%s_", iface->name);\r
indent--;\r
fprintf(server, "\n");\r
\r
indent--;\r
fprintf(server, "\n");\r
\r
+ if (explicit_handle)\r
+ {\r
+ print_server("%s = _pRpcMessage->Handle;\n", explicit_handle_var->name);\r
+ fprintf(server, "\n");\r
+ }\r
+\r
print_server("RpcTryFinally\n");\r
print_server("{\n");\r
indent++;\r
print_server("RpcTryFinally\n");\r
print_server("{\n");\r
indent++;\r
\r
void write_server(ifref_t *ifaces)\r
{\r
\r
void write_server(ifref_t *ifaces)\r
{\r
- ifref_t *lcur = ifaces;\r
- char *file_id = server_token;\r
- int c;\r
+ ifref_t *iface = ifaces;\r
\r
if (!do_server)\r
return;\r
\r
if (!do_server)\r
return;\r
\r
init_server();\r
if (!server)\r
return;\r
\r
\r
init_server();\r
if (!server)\r
return;\r
\r
- write_formatstringsdecl(lcur->iface);\r
- write_serverinterfacedecl(lcur->iface);\r
- write_stubdescdecl(lcur->iface);\r
+ while (iface)\r
+ {\r
+ fprintf(server, "/*****************************************************************************\n");\r
+ fprintf(server, " * %s interface\n", iface->iface->name);\r
+ fprintf(server, " */\n");\r
+ fprintf(server, "\n");\r
- write_function_stubs(lcur->iface);\r
+ write_formatstringsdecl(iface->iface);\r
+ write_serverinterfacedecl(iface->iface);\r
+ write_stubdescdecl(iface->iface);\r
- write_stubdescriptor(lcur->iface);\r
- write_dispatchtable(lcur->iface);\r
+ write_function_stubs(iface->iface);\r
- print_server("#if !defined(__RPC_WIN32__)\n");\r
- print_server("#error Invalid build platform for this stub.\n");\r
- print_server("#endif\n");\r
- fprintf(server, "\n");\r
+ write_stubdescriptor(iface->iface);\r
+ write_dispatchtable(iface->iface);\r
- write_procformatstring(lcur->iface);\r
- write_typeformatstring();\r
+ print_server("#if !defined(__RPC_WIN32__)\n");\r
+ print_server("#error Invalid build platform for this stub.\n");\r
+ print_server("#endif\n");\r
+ fprintf(server, "\n");\r
- fprintf(server, "\n");\r
+ write_procformatstring(iface->iface);\r
+ write_typeformatstring();\r
+\r
+ fprintf(server, "\n");\r
+\r
+ iface = PREV_LINK(iface);\r
+ }\r