Rob Shearman : widl: Support using context handles as the binding handle in client functions.
Alexandre Julliard
julliard at winehq.org
Thu Mar 27 07:22:51 CDT 2008
Module: wine
Branch: master
Commit: 4194daf10835066494e17015b170d83f6c6cebe7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4194daf10835066494e17015b170d83f6c6cebe7
Author: Rob Shearman <rob at 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);
More information about the wine-cvs
mailing list