Rob Shearman : msi: Implement MsiGetMode for MSIRUNMODE_SCHEDULED, MSIRUNMODE_COMMIT and MSIRUNMODE_ROLLBACK.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jun 26 07:11:53 CDT 2007


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Mon Jun 25 20:47:38 2007 +0100

msi: Implement MsiGetMode for MSIRUNMODE_SCHEDULED, MSIRUNMODE_COMMIT and MSIRUNMODE_ROLLBACK.

---

 dlls/msi/action.c  |   22 +++++++++++-----------
 dlls/msi/custom.c  |   20 +++++++++++++++++++-
 dlls/msi/events.c  |    2 +-
 dlls/msi/install.c |   14 +++++++++++++-
 dlls/msi/msi.c     |    6 +++---
 dlls/msi/msipriv.h |   10 +++++++---
 dlls/msi/package.c |    3 +++
 7 files changed, 57 insertions(+), 20 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 820d91d..01b5abb 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -748,9 +748,9 @@ static UINT ACTION_PerformActionSequence(MSIPACKAGE *package, UINT seq, BOOL UI)
         }
 
         if (UI)
-            rc = ACTION_PerformUIAction(package,action);
+            rc = ACTION_PerformUIAction(package,action,-1);
         else
-            rc = ACTION_PerformAction(package,action,FALSE);
+            rc = ACTION_PerformAction(package,action,-1,FALSE);
 end:
         msiobj_release(&row->hdr);
     }
@@ -789,9 +789,9 @@ static UINT ITERATE_Actions(MSIRECORD *row, LPVOID param)
     }
 
     if (iap->UI)
-        rc = ACTION_PerformUIAction(iap->package,action);
+        rc = ACTION_PerformUIAction(iap->package,action,-1);
     else
-        rc = ACTION_PerformAction(iap->package,action,FALSE);
+        rc = ACTION_PerformAction(iap->package,action,-1,FALSE);
 
     msi_dialog_check_messages( NULL );
 
@@ -980,12 +980,12 @@ static BOOL ACTION_HandleStandardAction(MSIPACKAGE *package, LPCWSTR action,
 }
 
 static BOOL ACTION_HandleCustomAction( MSIPACKAGE* package, LPCWSTR action,
-                                       UINT* rc, BOOL force )
+                                       UINT* rc, UINT script, BOOL force )
 {
     BOOL ret=FALSE;
     UINT arc;
 
-    arc = ACTION_CustomAction(package,action, force);
+    arc = ACTION_CustomAction(package, action, script, force);
 
     if (arc != ERROR_CALL_NOT_IMPLEMENTED)
     {
@@ -1003,7 +1003,7 @@ static BOOL ACTION_HandleCustomAction( MSIPACKAGE* package, LPCWSTR action,
  * But until I get write access to the database that is hard, so I am going to
  * hack it to see if I can get something to run.
  */
-UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, BOOL force)
+UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, UINT script, BOOL force)
 {
     UINT rc = ERROR_SUCCESS; 
     BOOL handled;
@@ -1013,7 +1013,7 @@ UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, BOOL force)
     handled = ACTION_HandleStandardAction(package, action, &rc, force);
 
     if (!handled)
-        handled = ACTION_HandleCustomAction(package, action, &rc, force);
+        handled = ACTION_HandleCustomAction(package, action, &rc, script, force);
 
     if (!handled)
     {
@@ -1024,7 +1024,7 @@ UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, BOOL force)
     return rc;
 }
 
-UINT ACTION_PerformUIAction(MSIPACKAGE *package, const WCHAR *action)
+UINT ACTION_PerformUIAction(MSIPACKAGE *package, const WCHAR *action, UINT script)
 {
     UINT rc = ERROR_SUCCESS;
     BOOL handled = FALSE;
@@ -1034,7 +1034,7 @@ UINT ACTION_PerformUIAction(MSIPACKAGE *package, const WCHAR *action)
     handled = ACTION_HandleStandardAction(package, action, &rc,TRUE);
 
     if (!handled)
-        handled = ACTION_HandleCustomAction(package, action, &rc, FALSE);
+        handled = ACTION_HandleCustomAction(package, action, &rc, script, FALSE);
 
     if( !handled && ACTION_DialogBox(package,action) == ERROR_SUCCESS )
         handled = TRUE;
@@ -1598,7 +1598,7 @@ static UINT execute_script(MSIPACKAGE *package, UINT script )
         action = package->script->Actions[script][i];
         ui_actionstart(package, action);
         TRACE("Executing Action (%s)\n",debugstr_w(action));
-        rc = ACTION_PerformAction(package, action, TRUE);
+        rc = ACTION_PerformAction(package, action, script, TRUE);
         if (rc != ERROR_SUCCESS)
             break;
     }
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index af9c8dc..2ea73f9 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -174,7 +174,7 @@ static void set_deferred_action_props(MSIPACKAGE *package, LPWSTR deferred_data)
     MSI_SetPropertyW(package, ProdCode, beg);
 }
 
-UINT ACTION_CustomAction(MSIPACKAGE *package,LPCWSTR action, BOOL execute)
+UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL execute)
 {
     UINT rc = ERROR_SUCCESS;
     MSIRECORD * row = 0;
@@ -258,6 +258,21 @@ UINT ACTION_CustomAction(MSIPACKAGE *package,LPCWSTR action, BOOL execute)
 
             LPWSTR actiondata = msi_dup_property( package, action );
 
+            switch (script)
+            {
+            case INSTALL_SCRIPT:
+                package->scheduled_action_running = TRUE;
+                break;
+            case COMMIT_SCRIPT:
+                package->commit_action_running = TRUE;
+                break;
+            case ROLLBACK_SCRIPT:
+                package->rollback_action_running = TRUE;
+                break;
+            default:
+                break;
+            }
+
             if (deferred_data)
                 set_deferred_action_props(package, deferred_data);
             else if (actiondata)
@@ -334,6 +349,9 @@ UINT ACTION_CustomAction(MSIPACKAGE *package,LPCWSTR action, BOOL execute)
     }
 
 end:
+    package->scheduled_action_running = FALSE;
+    package->commit_action_running = FALSE;
+    package->rollback_action_running = FALSE;
     msi_free(action_copy);
     msiobj_release(&row->hdr);
     return rc;
diff --git a/dlls/msi/events.c b/dlls/msi/events.c
index faaaf2f..b85a5c5 100644
--- a/dlls/msi/events.c
+++ b/dlls/msi/events.c
@@ -168,7 +168,7 @@ static UINT ControlEvent_SpawnWaitDialog(MSIPACKAGE* package, LPCWSTR argument,
 static UINT ControlEvent_DoAction(MSIPACKAGE* package, LPCWSTR argument, 
                                   msi_dialog* dialog)
 {
-    ACTION_PerformAction(package,argument,TRUE);
+    ACTION_PerformAction(package,argument,-1,TRUE);
     return ERROR_SUCCESS;
 }
 
diff --git a/dlls/msi/install.c b/dlls/msi/install.c
index b6cff6d..91877e3 100644
--- a/dlls/msi/install.c
+++ b/dlls/msi/install.c
@@ -69,7 +69,7 @@ UINT WINAPI MsiDoActionW( MSIHANDLE hInstall, LPCWSTR szAction )
     if (!package)
         return ERROR_INVALID_HANDLE;
  
-    ret = ACTION_PerformUIAction( package, szAction );
+    ret = ACTION_PerformUIAction( package, szAction, -1 );
     msiobj_release( &package->hdr );
 
     return ret;
@@ -452,8 +452,13 @@ UINT WINAPI MsiSetTargetPathW(MSIHANDLE hInstall, LPCWSTR szFolder,
  */
 BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode)
 {
+    MSIPACKAGE *package;
     BOOL r = FALSE;
 
+    package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+    if (!package)
+        return FALSE;
+
     switch (iRunMode)
     {
     case MSIRUNMODE_WINDOWS9X:
@@ -467,8 +472,15 @@ BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode)
         break;
 
     case MSIRUNMODE_SCHEDULED:
+        r = package->scheduled_action_running;
+        break;
+
     case MSIRUNMODE_ROLLBACK:
+        r = package->rollback_action_running;
+        break;
+
     case MSIRUNMODE_COMMIT:
+        r = package->commit_action_running;
         break;
 
     default:
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index 59a6f67..b332f0e 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -1765,7 +1765,7 @@ UINT WINAPI MsiCollectUserInfoW(LPCWSTR szProduct)
         return ERROR_INVALID_PARAMETER;
 
     package = msihandle2msiinfo(handle, MSIHANDLETYPE_PACKAGE);
-    rc = ACTION_PerformUIAction(package, szFirstRun);
+    rc = ACTION_PerformUIAction(package, szFirstRun, -1);
     msiobj_release( &package->hdr );
 
     MsiCloseHandle(handle);
@@ -1787,7 +1787,7 @@ UINT WINAPI MsiCollectUserInfoA(LPCSTR szProduct)
         return ERROR_INVALID_PARAMETER;
 
     package = msihandle2msiinfo(handle, MSIHANDLETYPE_PACKAGE);
-    rc = ACTION_PerformUIAction(package, szFirstRun);
+    rc = ACTION_PerformUIAction(package, szFirstRun, -1);
     msiobj_release( &package->hdr );
 
     MsiCloseHandle(handle);
@@ -1869,7 +1869,7 @@ UINT WINAPI MsiConfigureFeatureW(LPCWSTR szProduct, LPCWSTR szFeature, INSTALLST
 
     MsiSetInternalUI( INSTALLUILEVEL_BASIC, NULL );
 
-    r = ACTION_PerformUIAction( package, szCostInit );
+    r = ACTION_PerformUIAction( package, szCostInit, -1 );
     if (r != ERROR_SUCCESS)
         goto end;
 
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index e577fc5..3dd0cb3 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -248,6 +248,10 @@ typedef struct tagMSIPACKAGE
     UINT WordCount;
 
     struct list subscriptions;
+
+    unsigned char scheduled_action_running : 1;
+    unsigned char commit_action_running : 1;
+    unsigned char rollback_action_running : 1;
 } MSIPACKAGE;
 
 typedef struct tagMSIPREVIEW
@@ -731,10 +735,10 @@ extern WCHAR gszLogFile[MAX_PATH];
 extern HINSTANCE msi_hInstance;
 
 /* action related functions */
-extern UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, BOOL force);
-extern UINT ACTION_PerformUIAction(MSIPACKAGE *package, const WCHAR *action);
+extern UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, UINT script, BOOL force);
+extern UINT ACTION_PerformUIAction(MSIPACKAGE *package, const WCHAR *action, UINT script);
 extern void ACTION_FinishCustomActions( const MSIPACKAGE* package);
-extern UINT ACTION_CustomAction(MSIPACKAGE *package,const WCHAR *action, BOOL execute);
+extern UINT ACTION_CustomAction(MSIPACKAGE *package,const WCHAR *action, UINT script, BOOL execute);
 
 static inline void msi_feature_set_state( MSIFEATURE *feature, INSTALLSTATE state )
 {
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 1dd661d..c53def9 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -702,6 +702,9 @@ static MSIPACKAGE *msi_alloc_package( void )
         package->LastAction = NULL;
         package->dialog = NULL;
         package->next_dialog = NULL;
+        package->scheduled_action_running = FALSE;
+        package->commit_action_running = FALSE;
+        package->rollback_action_running = FALSE;
     }
 
     return package;




More information about the wine-cvs mailing list