From 6f3f2549c1ec366b7ed46f4a2221194291e0d77d Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Mon, 18 Dec 2006 01:48:25 -0600 Subject: [PATCH] msi: Only cleanup event subscriptions of the dialog being closed. --- dlls/msi/events.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/dlls/msi/events.c b/dlls/msi/events.c index 13805a66484..c946512ae36 100644 --- a/dlls/msi/events.c +++ b/dlls/msi/events.c @@ -54,6 +54,7 @@ struct subscriber { }; UINT ControlEvent_HandleControlEvent(MSIPACKAGE *, LPCWSTR, LPCWSTR, msi_dialog*); +static VOID ControlEvent_CleanupDialogSubscriptions(MSIPACKAGE *package, LPWSTR dialog); /* * Create a dialog box and run it if it's modal @@ -123,7 +124,7 @@ static UINT ControlEvent_EndDialog(MSIPACKAGE* package, LPCWSTR argument, package->CurrentInstallState = ERROR_FUNCTION_FAILED; } - ControlEvent_CleanupSubscriptions(package); + ControlEvent_CleanupDialogSubscriptions(package, msi_dialog_get_name( dialog )); msi_dialog_end_dialog( dialog ); return ERROR_SUCCESS; } @@ -320,6 +321,23 @@ VOID ControlEvent_FireSubscribedEvent( MSIPACKAGE *package, LPCWSTR event, } } +static VOID ControlEvent_CleanupDialogSubscriptions(MSIPACKAGE *package, LPWSTR dialog) +{ + struct list *i, *t; + struct subscriber *sub; + + LIST_FOR_EACH_SAFE( i, t, &package->subscriptions ) + { + sub = LIST_ENTRY( i, struct subscriber, entry ); + + if ( lstrcmpW( msi_dialog_get_name( sub->dialog ), dialog )) + continue; + + list_remove( &sub->entry ); + free_subscriber( sub ); + } +} + VOID ControlEvent_CleanupSubscriptions(MSIPACKAGE *package) { struct list *i, *t;