widl: Support using custom handle types with the implicit_handle attribute.

This commit is contained in:
Alexandre Julliard 2011-05-31 13:01:32 +02:00
parent 4fc0d3c317
commit 21cbdaa1eb
3 changed files with 26 additions and 10 deletions

View File

@ -75,7 +75,7 @@ static void check_pointers(const var_t *func)
static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
{
const statement_t *stmt;
const char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
const var_t *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
int method_count = 0;
if (!implicit_handle)
@ -245,7 +245,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
}
else if (implicit_handle)
{
print_client("__frame->_Handle = %s;\n", implicit_handle);
print_client("__frame->_Handle = %s;\n", implicit_handle->name);
fprintf(client, "\n");
}
@ -334,7 +334,7 @@ static void write_stubdescdecl(type_t *iface)
static void write_stubdescriptor(type_t *iface, int expr_eval_routines)
{
const char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
const var_t *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
print_client("static const MIDL_STUB_DESC %s_StubDesc =\n", iface->name);
print_client("{\n");
@ -345,7 +345,7 @@ static void write_stubdescriptor(type_t *iface, int expr_eval_routines)
print_client("{\n");
indent++;
if (implicit_handle)
print_client("&%s,\n", implicit_handle);
print_client("&%s,\n", implicit_handle->name);
else
print_client("&%s__MIDL_AutoBindHandle,\n", iface->name);
indent--;
@ -423,12 +423,12 @@ static void write_clientinterfacedecl(type_t *iface)
static void write_implicithandledecl(type_t *iface)
{
const char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
const var_t *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
if (implicit_handle)
{
fprintf(client, "handle_t %s;\n", implicit_handle);
fprintf(client, "\n");
write_type_decl( client, implicit_handle->type, implicit_handle->name );
fprintf(client, ";\n\n");
}
}

View File

@ -1078,14 +1078,19 @@ static void write_com_interface_end(FILE *header, type_t *iface)
static void write_rpc_interface_start(FILE *header, const type_t *iface)
{
unsigned int ver = get_attrv(iface->attrs, ATTR_VERSION);
const char *var = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
const var_t *var = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
fprintf(header, "/*****************************************************************************\n");
fprintf(header, " * %s interface (v%d.%d)\n", iface->name, MAJORVERSION(ver), MINORVERSION(ver));
fprintf(header, " */\n");
fprintf(header,"#ifndef __%s_INTERFACE_DEFINED__\n", iface->name);
fprintf(header,"#define __%s_INTERFACE_DEFINED__\n\n", iface->name);
if (var) fprintf(header, "extern handle_t %s;\n", var);
if (var)
{
fprintf(header, "extern ");
write_type_decl( header, var->type, var->name );
fprintf(header, ";\n");
}
if (old_names)
{
fprintf(header, "extern RPC_IF_HANDLE %s%s_ClientIfHandle;\n", prefix_client, iface->name);

View File

@ -522,7 +522,7 @@ attribute: { $$ = NULL; }
| tIGNORE { $$ = make_attr(ATTR_IGNORE); }
| tIIDIS '(' expr ')' { $$ = make_attrp(ATTR_IIDIS, $3); }
| tIMMEDIATEBIND { $$ = make_attr(ATTR_IMMEDIATEBIND); }
| tIMPLICITHANDLE '(' tHANDLET aIDENTIFIER ')' { $$ = make_attrp(ATTR_IMPLICIT_HANDLE, $4); }
| tIMPLICITHANDLE '(' arg ')' { $$ = make_attrp(ATTR_IMPLICIT_HANDLE, $3); }
| tIN { $$ = make_attr(ATTR_IN); }
| tINPUTSYNC { $$ = make_attr(ATTR_INPUTSYNC); }
| tLENGTHIS '(' m_exprs ')' { $$ = make_attrp(ATTR_LENGTHIS, $3); }
@ -2124,6 +2124,17 @@ static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
if (!allowed_attr[attr->type].on_interface)
error_loc("inapplicable attribute %s for interface %s\n",
allowed_attr[attr->type].display_name, name);
if (attr->type == ATTR_IMPLICIT_HANDLE)
{
const var_t *var = attr->u.pval;
if (type_get_type( var->type) == TYPE_BASIC &&
type_basic_get_type( var->type ) == TYPE_BASIC_HANDLE)
continue;
if (is_aliaschain_attr( var->type, ATTR_HANDLE ))
continue;
error_loc("attribute %s requires a handle type in interface %s\n",
allowed_attr[attr->type].display_name, name);
}
}
return attrs;
}