James Hawkins : msi: Return to the parent dialog when the argument to the EndDialog event is Return .

Alexandre Julliard julliard at wine.codeweavers.com
Fri Sep 29 09:46:05 CDT 2006


Module: wine
Branch: master
Commit: 3d812659e87c472a81a152f2ddfe27bd18801deb
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=3d812659e87c472a81a152f2ddfe27bd18801deb

Author: James Hawkins <truiken at gmail.com>
Date:   Thu Sep 28 16:20:40 2006 -0700

msi: Return to the parent dialog when the argument to the EndDialog event is Return.

---

 dlls/msi/dialog.c  |   17 +++++++++++++++--
 dlls/msi/events.c  |   15 ++++++++++-----
 dlls/msi/msipriv.h |    4 +++-
 dlls/msi/preview.c |    2 +-
 4 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c
index 958d63a..74eefe5 100644
--- a/dlls/msi/dialog.c
+++ b/dlls/msi/dialog.c
@@ -82,6 +82,7 @@ typedef struct msi_font_tag
 struct msi_dialog_tag
 {
     MSIPACKAGE *package;
+    msi_dialog *parent;
     msi_dialog_event_handler event_handler;
     BOOL finished;
     INT scale;
@@ -222,6 +223,16 @@ static LPWSTR msi_dialog_dup_property( m
     return strdupW( property );
 }
 
+msi_dialog *msi_dialog_get_parent( msi_dialog *dialog )
+{
+    return dialog->parent;
+}
+
+LPWSTR msi_dialog_get_name( msi_dialog *dialog )
+{
+    return dialog->name;
+}
+
 /*
  * msi_dialog_get_style
  *
@@ -3060,8 +3071,9 @@ static LRESULT WINAPI MSIHiddenWindowPro
 
 /* functions that interface to other modules within MSI */
 
-msi_dialog *msi_dialog_create( MSIPACKAGE* package, LPCWSTR szDialogName,
-                                msi_dialog_event_handler event_handler )
+msi_dialog *msi_dialog_create( MSIPACKAGE* package,
+                               LPCWSTR szDialogName, msi_dialog *parent,
+                               msi_dialog_event_handler event_handler )
 {
     MSIRECORD *rec = NULL;
     msi_dialog *dialog;
@@ -3073,6 +3085,7 @@ msi_dialog *msi_dialog_create( MSIPACKAG
     if( !dialog )
         return NULL;
     strcpyW( dialog->name, szDialogName );
+    dialog->parent = parent;
     msiobj_addref( &package->hdr );
     dialog->package = package;
     dialog->event_handler = event_handler;
diff --git a/dlls/msi/events.c b/dlls/msi/events.c
index 72e5217..e9b7d55 100644
--- a/dlls/msi/events.c
+++ b/dlls/msi/events.c
@@ -58,13 +58,13 @@ UINT ControlEvent_HandleControlEvent(MSI
 /*
  * Create a dialog box and run it if it's modal
  */
-static UINT event_do_dialog( MSIPACKAGE *package, LPCWSTR name, BOOL destroy_modeless )
+static UINT event_do_dialog( MSIPACKAGE *package, LPCWSTR name, msi_dialog *parent, BOOL destroy_modeless )
 {
     msi_dialog *dialog;
     UINT r;
 
     /* create a new dialog */
-    dialog = msi_dialog_create( package, name,
+    dialog = msi_dialog_create( package, name, parent,
                                 ControlEvent_HandleControlEvent );
     if( dialog )
     {
@@ -111,7 +111,12 @@ static UINT ControlEvent_EndDialog(MSIPA
     else if (lstrcmpW(argument, szIgnore) == 0)
         package->CurrentInstallState = -1;
     else if (lstrcmpW(argument, szReturn) == 0)
+    {
+        msi_dialog *parent = msi_dialog_get_parent(dialog);
+        msi_free(package->next_dialog);
+        package->next_dialog = (parent) ? strdupW(msi_dialog_get_name(parent)) : NULL;
         package->CurrentInstallState = ERROR_SUCCESS;
+    }
     else
     {
         ERR("Unknown argument string %s\n",debugstr_w(argument));
@@ -143,7 +148,7 @@ static UINT ControlEvent_SpawnDialog(MSI
                               msi_dialog *dialog)
 {
     /* don't destroy a modeless dialogs that might be our parent */
-    event_do_dialog( package, argument, FALSE );
+    event_do_dialog( package, argument, dialog, FALSE );
     if( package->CurrentInstallState != ERROR_SUCCESS )
         msi_dialog_end_dialog( dialog );
     return ERROR_SUCCESS;
@@ -353,13 +358,13 @@ UINT ACTION_DialogBox( MSIPACKAGE* packa
      *  dialog, as it returns ERROR_IO_PENDING when we try to run
      *  its message loop.
      */
-    r = event_do_dialog( package, szDialogName, TRUE );
+    r = event_do_dialog( package, szDialogName, NULL, TRUE );
     while( r == ERROR_SUCCESS && package->next_dialog )
     {
         LPWSTR name = package->next_dialog;
 
         package->next_dialog = NULL;
-        r = event_do_dialog( package, name, TRUE );
+        r = event_do_dialog( package, name, NULL, TRUE );
         msi_free( name );
     }
 
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 0d27ec8..cc3b88b 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -451,7 +451,7 @@ extern LONG msi_reg_set_subkey_val( HKEY
 
 /* msi dialog interface */
 typedef UINT (*msi_dialog_event_handler)( MSIPACKAGE*, LPCWSTR, LPCWSTR, msi_dialog* );
-extern msi_dialog *msi_dialog_create( MSIPACKAGE*, LPCWSTR, msi_dialog_event_handler );
+extern msi_dialog *msi_dialog_create( MSIPACKAGE*, LPCWSTR, msi_dialog*, msi_dialog_event_handler );
 extern UINT msi_dialog_run_message_loop( msi_dialog* );
 extern void msi_dialog_end_dialog( msi_dialog* );
 extern void msi_dialog_check_messages( HANDLE );
@@ -462,6 +462,8 @@ extern void msi_dialog_unregister_class(
 extern void msi_dialog_handle_event( msi_dialog*, LPCWSTR, LPCWSTR, MSIRECORD * );
 extern UINT msi_dialog_reset( msi_dialog *dialog );
 extern UINT msi_dialog_directorylist_up( msi_dialog *dialog );
+extern msi_dialog *msi_dialog_get_parent( msi_dialog *dialog );
+extern LPWSTR msi_dialog_get_name( msi_dialog *dialog );
 
 /* preview */
 extern MSIPREVIEW *MSI_EnableUIPreview( MSIDATABASE * );
diff --git a/dlls/msi/preview.c b/dlls/msi/preview.c
index 161bcc7..4f4cc5c 100644
--- a/dlls/msi/preview.c
+++ b/dlls/msi/preview.c
@@ -103,7 +103,7 @@ UINT MSI_PreviewDialogW( MSIPREVIEW *pre
     /* an empty name means we should just destroy the current preview dialog */
     if( szDialogName )
     {
-        dialog = msi_dialog_create( preview->package, szDialogName,
+        dialog = msi_dialog_create( preview->package, szDialogName, NULL,
                                     preview_event_handler );
         if( dialog )
             msi_dialog_do_preview( dialog );




More information about the wine-cvs mailing list