[PATCH v3 2/2] msi: Store the current script in the package.
Zebediah Figura
z.figura12 at gmail.com
Tue Sep 19 12:46:54 CDT 2017
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/msi/action.c | 25 +++++++++++++++----------
dlls/msi/custom.c | 34 ++--------------------------------
dlls/msi/dialog.c | 2 +-
dlls/msi/install.c | 8 ++++----
dlls/msi/msi.c | 6 +++---
dlls/msi/msipriv.h | 8 +++-----
dlls/msi/package.c | 1 +
7 files changed, 29 insertions(+), 55 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 26deff3dfc..915ff173e9 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -506,7 +506,7 @@ static UINT ITERATE_Actions(MSIRECORD *row, LPVOID param)
return ERROR_SUCCESS;
}
- rc = ACTION_PerformAction(package, action, SCRIPT_NONE);
+ rc = ACTION_PerformAction(package, action);
msi_dialog_check_messages( NULL );
@@ -600,7 +600,7 @@ static UINT ACTION_ProcessUISequence(MSIPACKAGE *package)
/********************************************************
* ACTION helper functions and functions that perform the actions
*******************************************************/
-static UINT ACTION_HandleCustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script)
+static UINT ACTION_HandleCustomAction(MSIPACKAGE *package, LPCWSTR action)
{
UINT arc;
INT uirc;
@@ -609,7 +609,7 @@ static UINT ACTION_HandleCustomAction(MSIPACKAGE *package, LPCWSTR action, UINT
if (uirc == IDCANCEL)
return ERROR_INSTALL_USEREXIT;
ui_actioninfo(package, action, TRUE, 0);
- arc = ACTION_CustomAction( package, action, script );
+ arc = ACTION_CustomAction(package, action);
uirc = !arc;
if (arc == ERROR_FUNCTION_NOT_CALLED && needs_ui_sequence(package))
@@ -1542,11 +1542,13 @@ static UINT execute_script( MSIPACKAGE *package, UINT script )
TRACE("executing script %u\n", script);
+ package->script = script;
+
if (script == SCRIPT_ROLLBACK)
{
for (i = package->script_actions_count[script]; i > 0; i--)
{
- rc = ACTION_PerformAction(package, package->script_actions[script][i-1], script);
+ rc = ACTION_PerformAction(package, package->script_actions[script][i-1]);
if (rc != ERROR_SUCCESS)
{
ERR("Execution of script %i halted; action %s returned %u\n",
@@ -1559,7 +1561,7 @@ static UINT execute_script( MSIPACKAGE *package, UINT script )
{
for (i = 0; i < package->script_actions_count[script]; i++)
{
- rc = ACTION_PerformAction(package, package->script_actions[script][i], script);
+ rc = ACTION_PerformAction(package, package->script_actions[script][i]);
if (rc != ERROR_SUCCESS)
{
ERR("Execution of script %i halted; action %s returned %u\n",
@@ -1568,6 +1570,9 @@ static UINT execute_script( MSIPACKAGE *package, UINT script )
}
}
}
+
+ package->script = SCRIPT_NONE;
+
msi_free_action_script(package, script);
return rc;
}
@@ -5650,7 +5655,7 @@ static UINT ACTION_ExecuteAction(MSIPACKAGE *package)
msiobj_release(&uirow->hdr);
}
else
- rc = ACTION_PerformAction(package, action, SCRIPT_NONE);
+ rc = ACTION_PerformAction(package, action);
/* Send all set properties. */
if (!MSI_OpenQuery(package->db, &view, prop_query))
@@ -7889,7 +7894,7 @@ static UINT ACTION_HandleStandardAction(MSIPACKAGE *package, LPCWSTR action)
return rc;
}
-UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, UINT script)
+UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action)
{
UINT rc;
@@ -7899,7 +7904,7 @@ UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, UINT script)
rc = ACTION_HandleStandardAction(package, action);
if (rc == ERROR_FUNCTION_NOT_CALLED)
- rc = ACTION_HandleCustomAction(package, action, script);
+ rc = ACTION_HandleCustomAction(package, action);
if (rc == ERROR_FUNCTION_NOT_CALLED)
WARN("unhandled msi action %s\n", debugstr_w(action));
@@ -7952,7 +7957,7 @@ static UINT ACTION_PerformActionSequence(MSIPACKAGE *package, UINT seq)
return ERROR_FUNCTION_FAILED;
}
- rc = ACTION_PerformAction(package, action, SCRIPT_NONE);
+ rc = ACTION_PerformAction(package, action);
msiobj_release(&row->hdr);
}
@@ -8050,7 +8055,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
msi_set_property( package->db, szRollbackDisabled, szOne, -1 );
}
- rc = ACTION_PerformAction(package, action, SCRIPT_NONE);
+ rc = ACTION_PerformAction(package, action);
/* process the ending type action */
if (rc == ERROR_SUCCESS)
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index 0043edd2e8..02c3440897 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -1132,24 +1132,6 @@ static UINT HANDLE_CustomType53_54( MSIPACKAGE *package, const WCHAR *source, co
return wait_thread_handle( info );
}
-static BOOL action_type_matches_script( UINT type, UINT script )
-{
- switch (script)
- {
- case SCRIPT_NONE:
- return FALSE;
- case SCRIPT_INSTALL:
- return !(type & msidbCustomActionTypeCommit) && !(type & msidbCustomActionTypeRollback);
- case SCRIPT_COMMIT:
- return (type & msidbCustomActionTypeCommit);
- case SCRIPT_ROLLBACK:
- return (type & msidbCustomActionTypeRollback);
- default:
- ERR("unhandled script %u\n", script);
- }
- return FALSE;
-}
-
static UINT defer_custom_action( MSIPACKAGE *package, const WCHAR *action, UINT type )
{
WCHAR *actiondata = msi_dup_property( package->db, action );
@@ -1187,7 +1169,7 @@ static UINT defer_custom_action( MSIPACKAGE *package, const WCHAR *action, UINT
return ERROR_SUCCESS;
}
-UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action, UINT script )
+UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action )
{
static const WCHAR query[] = {
'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
@@ -1227,7 +1209,7 @@ UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action, UINT script )
if (type & msidbCustomActionTypeNoImpersonate)
WARN("msidbCustomActionTypeNoImpersonate not handled\n");
- if (!action_type_matches_script( type, script ))
+ if (package->script == SCRIPT_NONE)
{
rc = defer_custom_action( package, action, type );
goto end;
@@ -1236,15 +1218,6 @@ UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action, UINT script )
{
LPWSTR actiondata = msi_dup_property( package->db, action );
- if (type & msidbCustomActionTypeInScript)
- package->scheduled_action_running = TRUE;
-
- if (type & msidbCustomActionTypeCommit)
- package->commit_action_running = TRUE;
-
- if (type & msidbCustomActionTypeRollback)
- package->rollback_action_running = TRUE;
-
if (deferred_data)
set_deferred_action_props(package, deferred_data);
else if (actiondata)
@@ -1326,9 +1299,6 @@ UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action, UINT script )
}
end:
- package->scheduled_action_running = FALSE;
- package->commit_action_running = FALSE;
- package->rollback_action_running = FALSE;
msiobj_release(&row->hdr);
return rc;
}
diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c
index 1d24acd217..2ccaf62843 100644
--- a/dlls/msi/dialog.c
+++ b/dlls/msi/dialog.c
@@ -4366,7 +4366,7 @@ static UINT event_spawn_wait_dialog( msi_dialog *dialog, const WCHAR *argument )
static UINT event_do_action( msi_dialog *dialog, const WCHAR *argument )
{
- ACTION_PerformAction( dialog->package, argument, SCRIPT_NONE );
+ ACTION_PerformAction( dialog->package, argument );
return ERROR_SUCCESS;
}
diff --git a/dlls/msi/install.c b/dlls/msi/install.c
index 261a259f3f..6ab3f0dfbc 100644
--- a/dlls/msi/install.c
+++ b/dlls/msi/install.c
@@ -105,7 +105,7 @@ UINT WINAPI MsiDoActionW( MSIHANDLE hInstall, LPCWSTR szAction )
return ERROR_SUCCESS;
}
- ret = ACTION_PerformAction( package, szAction, SCRIPT_NONE );
+ ret = ACTION_PerformAction( package, szAction );
msiobj_release( &package->hdr );
return ret;
@@ -736,15 +736,15 @@ BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode)
break;
case MSIRUNMODE_SCHEDULED:
- r = package->scheduled_action_running;
+ r = (package->script == SCRIPT_INSTALL);
break;
case MSIRUNMODE_ROLLBACK:
- r = package->rollback_action_running;
+ r = (package->script == SCRIPT_ROLLBACK);
break;
case MSIRUNMODE_COMMIT:
- r = package->commit_action_running;
+ r = (package->script == SCRIPT_COMMIT);
break;
case MSIRUNMODE_MAINTENANCE:
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index 7e5e23fc51..f8ecfb8f41 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -3747,7 +3747,7 @@ UINT WINAPI MsiCollectUserInfoW(LPCWSTR szProduct)
if (!package)
return ERROR_CALL_NOT_IMPLEMENTED;
- rc = ACTION_PerformAction(package, szFirstRun, SCRIPT_NONE);
+ rc = ACTION_PerformAction(package, szFirstRun);
msiobj_release( &package->hdr );
MsiCloseHandle(handle);
@@ -3773,7 +3773,7 @@ UINT WINAPI MsiCollectUserInfoA(LPCSTR szProduct)
if (!package)
return ERROR_CALL_NOT_IMPLEMENTED;
- rc = ACTION_PerformAction(package, szFirstRun, SCRIPT_NONE);
+ rc = ACTION_PerformAction(package, szFirstRun);
msiobj_release( &package->hdr );
MsiCloseHandle(handle);
@@ -3854,7 +3854,7 @@ UINT WINAPI MsiConfigureFeatureW(LPCWSTR szProduct, LPCWSTR szFeature, INSTALLST
MsiSetInternalUI( INSTALLUILEVEL_BASIC, NULL );
- r = ACTION_PerformAction( package, szCostInitialize, SCRIPT_NONE );
+ r = ACTION_PerformAction( package, szCostInitialize );
if (r != ERROR_SUCCESS)
goto end;
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 4dead0ffa2..3f7387bb30 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -412,6 +412,7 @@ typedef struct tagMSIPACKAGE
struct list mimes;
struct list appids;
+ enum script script;
LPWSTR *script_actions[SCRIPT_MAX];
int script_actions_count[SCRIPT_MAX];
LPWSTR *unique_actions;
@@ -441,9 +442,6 @@ typedef struct tagMSIPACKAGE
struct list sourcelist_info;
struct list sourcelist_media;
- unsigned char scheduled_action_running : 1;
- unsigned char commit_action_running : 1;
- unsigned char rollback_action_running : 1;
unsigned char need_reboot_at_end : 1;
unsigned char need_reboot_now : 1;
unsigned char need_rollback : 1;
@@ -976,9 +974,9 @@ extern WCHAR *gszLogFile DECLSPEC_HIDDEN;
extern HINSTANCE msi_hInstance DECLSPEC_HIDDEN;
/* action related functions */
-extern UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, UINT script) DECLSPEC_HIDDEN;
+extern UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action) DECLSPEC_HIDDEN;
extern void ACTION_FinishCustomActions( const MSIPACKAGE* package) DECLSPEC_HIDDEN;
-extern UINT ACTION_CustomAction(MSIPACKAGE *, const WCHAR *, UINT) DECLSPEC_HIDDEN;
+extern UINT ACTION_CustomAction(MSIPACKAGE *, const WCHAR *) DECLSPEC_HIDDEN;
/* actions in other modules */
extern UINT ACTION_AppSearch(MSIPACKAGE *package) DECLSPEC_HIDDEN;
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 4bccff09db..63377a0532 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -1098,6 +1098,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
msi_load_admin_properties( package );
package->log_file = INVALID_HANDLE_VALUE;
+ package->script = SCRIPT_NONE;
}
return package;
}
--
2.14.1
More information about the wine-patches
mailing list