Alexandre Julliard : widl: Register the PSFactoryBuffer class as factory if it' s defined in the idl file.
Alexandre Julliard
julliard at winehq.org
Fri Dec 17 11:30:48 CST 2010
Module: wine
Branch: master
Commit: 875c1b8739982187dfa923fcd3336d47aefa80c0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=875c1b8739982187dfa923fcd3336d47aefa80c0
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Dec 17 14:58:47 2010 +0100
widl: Register the PSFactoryBuffer class as factory if it's defined in the idl file.
---
tools/widl/register.c | 32 ++++++++++++++++++++++++++------
1 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/tools/widl/register.c b/tools/widl/register.c
index f709214..9913f8c 100644
--- a/tools/widl/register.c
+++ b/tools/widl/register.c
@@ -61,9 +61,26 @@ static const char *get_coclass_threading( const type_t *class )
return models[get_attrv( class->attrs, ATTR_THREADING )];
}
-static int write_interface( const type_t *iface )
+static const type_t *find_ps_factory( const statement_list_t *stmts )
+{
+ const statement_t *stmt;
+
+ if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, const statement_t, entry )
+ {
+ if (stmt->type == STMT_TYPE)
+ {
+ const type_t *type = stmt->u.type;
+ if (type_get_type(type) == TYPE_COCLASS && !strcmp( type->name, "PSFactoryBuffer" ))
+ return type;
+ }
+ }
+ return NULL;
+}
+
+static int write_interface( const type_t *iface, const type_t *ps_factory )
{
const UUID *uuid = get_attrp( iface->attrs, ATTR_UUID );
+ const UUID *ps_uuid = ps_factory ? get_attrp( ps_factory->attrs, ATTR_UUID ) : NULL;
if (!uuid) return 0;
if (!is_object( iface )) return 0;
@@ -77,13 +94,14 @@ static int write_interface( const type_t *iface )
put_str( indent, "{\n" );
indent++;
put_str( indent, "NumMethods = s %u\n", count_methods( iface ));
- put_str( indent, "ProxyStubClsid32 = s '%%CLSID_PSFactoryBuffer%%'\n" );
+ put_str( indent, "ProxyStubClsid32 = s '%s'\n",
+ ps_uuid ? format_uuid( ps_uuid ) : "%CLSID_PSFactoryBuffer%" );
indent--;
put_str( indent, "}\n" );
return 1;
}
-static int write_interfaces( const statement_list_t *stmts )
+static int write_interfaces( const statement_list_t *stmts, const type_t *ps_factory )
{
const statement_t *stmt;
int count = 0;
@@ -91,7 +109,7 @@ static int write_interfaces( const statement_list_t *stmts )
if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, const statement_t, entry )
{
if (stmt->type == STMT_TYPE && type_get_type( stmt->u.type ) == TYPE_INTERFACE)
- count += write_interface( stmt->u.type );
+ count += write_interface( stmt->u.type, ps_factory );
}
return count;
}
@@ -204,6 +222,7 @@ static inline void put_string( const char *str )
void write_regscript( const statement_list_t *stmts )
{
int count;
+ const type_t *ps_factory;
if (!do_regscript) return;
if (do_everything && !need_proxy_file( stmts )) return;
@@ -215,12 +234,13 @@ void write_regscript( const statement_list_t *stmts )
put_str( indent, "NoRemove Interface\n" );
put_str( indent++, "{\n" );
- count = write_interfaces( stmts );
+ ps_factory = find_ps_factory( stmts );
+ count = write_interfaces( stmts, ps_factory );
put_str( --indent, "}\n" );
put_str( indent, "NoRemove CLSID\n" );
put_str( indent++, "{\n" );
- if (count)
+ if (count && !ps_factory)
{
put_str( indent, "ForceRemove '%%CLSID_PSFactoryBuffer%%' = s 'PSFactoryBuffer'\n" );
put_str( indent++, "{\n" );
More information about the wine-cvs
mailing list