msi [1/2]: Only cleanup event subscriptions of the dialog being
closed
James Hawkins
truiken at gmail.com
Mon Dec 18 01:48:25 CST 2006
Hi,
If we spawn a new dialog with an existing dialog still open and we
close the new dialog, the subscriptions for the existing dialog will
be lost.
Changelog:
* Only cleanup event subscriptions of the dialog being closed.
dlls/msi/events.c | 20 +++++++++++++++++++-
1 files changed, 19 insertions(+), 1 deletions(-)
--
James Hawkins
-------------- next part --------------
diff --git a/dlls/msi/events.c b/dlls/msi/events.c
index 13805a6..c946512 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;
--
1.4.4.2
More information about the wine-patches
mailing list