From: Rémi Bernon <rbernon(a)codeweavers.com> --- tools/widl/header.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tools/widl/header.c b/tools/widl/header.c index bd625b385af..b815b07c791 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -1646,6 +1646,11 @@ static void write_widl_using_macros(FILE *header, type_t *iface) macro = format_namespace(iface->namespace, "WIDL_using_", "_", NULL, NULL); fprintf(header, "#ifdef %s\n", macro); + fprintf(header, "#define QUERY_INTERFACE_OPT_%s QUERY_INTERFACE_OPT_%s\n", name, iface->c_name); + fprintf(header, "#define QUERY_INTERFACE_%s QUERY_INTERFACE_%s\n", name, iface->c_name); + fprintf(header, "#define QUERY_INTERFACES_OPT_%s QUERY_INTERFACES_OPT_%s\n", name, iface->c_name); + fprintf(header, "#define QUERY_INTERFACES_%s QUERY_INTERFACES_%s\n", name, iface->c_name); + fprintf(header, "#define INTERFACE_VTBL_%s INTERFACE_VTBL_%s\n", name, iface->c_name); if (uuid) fprintf(header, "#define IID_%s IID_%s\n", name, iface->c_name); @@ -1678,9 +1683,31 @@ static void write_widl_impl_macros_methods(FILE *header, const type_t *iface, co static void write_widl_impl_macros(FILE *header, type_t *iface) { const struct uuid *uuid = get_attrp(iface->attrs, ATTR_UUID); + const char *name = iface->short_name ? iface->short_name : iface->name; + type_t *base = type_iface_get_inherit(iface); if (uuid) { + fprintf(header, "#define QUERY_INTERFACE_OPT_%s( object, iid, out, mem ) \\\n", iface->c_name); + fprintf(header, " if ((object)->mem.lpVtbl) QUERY_INTERFACE_%s( object, iid, out, mem )\n", iface->c_name); + fprintf(header, "#define QUERY_INTERFACE_%s( object, iid, out, mem ) \\\n", iface->c_name); + fprintf(header, " if (0 " ); + for (base = iface; base; (base = type_iface_get_inherit(base))) + fprintf(header, "%s|| IsEqualGUID( (iid), &IID_%s )", base == iface ? "" : " \\\n ", base->c_name ); + fprintf(header, ") \\\n" ); + fprintf(header, " { \\\n" ); + fprintf(header, " *(out) = &(object)->mem; \\\n" ); + fprintf(header, " %s_AddRef( &(object)->mem ); \\\n", iface->c_name ); + fprintf(header, " return S_OK; \\\n" ); + fprintf(header, " }\n" ); + fprintf(header, "#define QUERY_INTERFACES_OPT_%s( object, iid, out, X, ... ) \\\n", iface->c_name); + fprintf(header, " QUERY_INTERFACE_OPT_%s( object, iid, out, %s_iface ) \\\n", iface->c_name, name); + fprintf(header, " QUERY_INTERFACES_ ## X( object, iid, out, __VA_ARGS__ )\n"); + fprintf(header, "#define QUERY_INTERFACES_%s( object, iid, out, X, ... ) \\\n", iface->c_name); + fprintf(header, " QUERY_INTERFACE_%s( object, iid, out, %s_iface ) \\\n", iface->c_name, name); + fprintf(header, " QUERY_INTERFACES_ ## X( object, iid, out, __VA_ARGS__ )\n"); + fprintf(header, "\n"); + fprintf(header, "#define INTERFACE_VTBL_%s( pfx ) \\\n", iface->c_name); fprintf(header, " static const %sVtbl %s_vtbl = \\\n", iface->c_name, "pfx ## "); fprintf(header, " { \\\n"); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6207