Module: wine Branch: master Commit: 4194daf10835066494e17015b170d83f6c6cebe7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4194daf10835066494e17015b1...
Author: Rob Shearman rob@codeweavers.com Date: Wed Mar 26 13:47:30 2008 +0000
widl: Support using context handles as the binding handle in client functions.
---
tools/widl/client.c | 30 +++++++++++++++++++++++++++--- 1 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/tools/widl/client.c b/tools/widl/client.c index 7747f11..eb65d83 100644 --- a/tools/widl/client.c +++ b/tools/widl/client.c @@ -70,6 +70,20 @@ static void check_pointers(const func_t *func) } }
+const var_t* get_context_handle_var(const func_t* func) +{ + const var_t* var; + + if (!func->args) + return NULL; + + LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry ) + if (is_attr(var->attrs, ATTR_IN) && is_context_handle(var->type)) + return var; + + return NULL; +} + static void write_function_stubs(type_t *iface, unsigned int *proc_offset) { const func_t *func; @@ -85,13 +99,16 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) { const var_t *def = func->def; const var_t* explicit_handle_var; + const var_t* context_handle_var = NULL; int has_full_pointer = is_full_pointer_function(func);
/* check for a defined binding handle */ explicit_handle_var = get_explicit_handle_var(func); + if (!explicit_handle_var) + context_handle_var = get_context_handle_var(func); if (explicit_handle) { - if (!explicit_handle_var) + if (!explicit_handle_var || !context_handle_var) { error("%s() does not define an explicit binding handle!\n", def->name); return; @@ -131,7 +148,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) fprintf(client, " _RetVal;\n"); }
- if (implicit_handle || explicit_handle_var) + if (implicit_handle || explicit_handle_var || context_handle_var) print_client("RPC_BINDING_HANDLE _Handle = 0;\n");
print_client("RPC_MESSAGE _RpcMessage;\n"); @@ -172,6 +189,13 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) print_client("_Handle = %s;\n", explicit_handle_var->name); fprintf(client, "\n"); } + else if (context_handle_var) + { + print_client("if (%s%s != 0)\n", is_ptr(context_handle_var->type) ? "*" : "", context_handle_var->name); + indent++; + print_client("_Handle = NDRCContextBinding(%s%s);\n", is_ptr(context_handle_var->type) ? "*" : "", context_handle_var->name); + indent--; + }
write_remoting_arguments(client, indent, func, PASS_IN, PHASE_BUFFERSIZE);
@@ -179,7 +203,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) indent++; print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); print_client("_StubMsg.BufferLength,\n"); - if (implicit_handle || explicit_handle_var) + if (implicit_handle || explicit_handle_var || context_handle_var) print_client("_Handle);\n"); else print_client("%s__MIDL_AutoBindHandle);\n", iface->name);