Commit e1e668d4 authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

msi: Store the current script in the package.

parent 5245b9d3
...@@ -506,7 +506,7 @@ static UINT ITERATE_Actions(MSIRECORD *row, LPVOID param) ...@@ -506,7 +506,7 @@ static UINT ITERATE_Actions(MSIRECORD *row, LPVOID param)
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
rc = ACTION_PerformAction(package, action, SCRIPT_NONE); rc = ACTION_PerformAction(package, action);
msi_dialog_check_messages( NULL ); msi_dialog_check_messages( NULL );
...@@ -600,7 +600,7 @@ static UINT ACTION_ProcessUISequence(MSIPACKAGE *package) ...@@ -600,7 +600,7 @@ static UINT ACTION_ProcessUISequence(MSIPACKAGE *package)
/******************************************************** /********************************************************
* ACTION helper functions and functions that perform the actions * 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; UINT arc;
INT uirc; INT uirc;
...@@ -609,7 +609,7 @@ static UINT ACTION_HandleCustomAction(MSIPACKAGE *package, LPCWSTR action, UINT ...@@ -609,7 +609,7 @@ static UINT ACTION_HandleCustomAction(MSIPACKAGE *package, LPCWSTR action, UINT
if (uirc == IDCANCEL) if (uirc == IDCANCEL)
return ERROR_INSTALL_USEREXIT; return ERROR_INSTALL_USEREXIT;
ui_actioninfo(package, action, TRUE, 0); ui_actioninfo(package, action, TRUE, 0);
arc = ACTION_CustomAction( package, action, script ); arc = ACTION_CustomAction(package, action);
uirc = !arc; uirc = !arc;
if (arc == ERROR_FUNCTION_NOT_CALLED && needs_ui_sequence(package)) if (arc == ERROR_FUNCTION_NOT_CALLED && needs_ui_sequence(package))
...@@ -1542,11 +1542,13 @@ static UINT execute_script( MSIPACKAGE *package, UINT script ) ...@@ -1542,11 +1542,13 @@ static UINT execute_script( MSIPACKAGE *package, UINT script )
TRACE("executing script %u\n", script); TRACE("executing script %u\n", script);
package->script = script;
if (script == SCRIPT_ROLLBACK) if (script == SCRIPT_ROLLBACK)
{ {
for (i = package->script_actions_count[script]; i > 0; i--) 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) if (rc != ERROR_SUCCESS)
{ {
ERR("Execution of script %i halted; action %s returned %u\n", ERR("Execution of script %i halted; action %s returned %u\n",
...@@ -1559,7 +1561,7 @@ static UINT execute_script( MSIPACKAGE *package, UINT script ) ...@@ -1559,7 +1561,7 @@ static UINT execute_script( MSIPACKAGE *package, UINT script )
{ {
for (i = 0; i < package->script_actions_count[script]; i++) 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) if (rc != ERROR_SUCCESS)
{ {
ERR("Execution of script %i halted; action %s returned %u\n", ERR("Execution of script %i halted; action %s returned %u\n",
...@@ -1568,6 +1570,9 @@ static UINT execute_script( MSIPACKAGE *package, UINT script ) ...@@ -1568,6 +1570,9 @@ static UINT execute_script( MSIPACKAGE *package, UINT script )
} }
} }
} }
package->script = SCRIPT_NONE;
msi_free_action_script(package, script); msi_free_action_script(package, script);
return rc; return rc;
} }
...@@ -5633,7 +5638,7 @@ static UINT ACTION_ExecuteAction(MSIPACKAGE *package) ...@@ -5633,7 +5638,7 @@ static UINT ACTION_ExecuteAction(MSIPACKAGE *package)
msiobj_release(&uirow->hdr); msiobj_release(&uirow->hdr);
} }
else else
rc = ACTION_PerformAction(package, action, SCRIPT_NONE); rc = ACTION_PerformAction(package, action);
/* Send all set properties. */ /* Send all set properties. */
if (!MSI_OpenQuery(package->db, &view, prop_query)) if (!MSI_OpenQuery(package->db, &view, prop_query))
...@@ -7872,7 +7877,7 @@ static UINT ACTION_HandleStandardAction(MSIPACKAGE *package, LPCWSTR action) ...@@ -7872,7 +7877,7 @@ static UINT ACTION_HandleStandardAction(MSIPACKAGE *package, LPCWSTR action)
return rc; return rc;
} }
UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, UINT script) UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action)
{ {
UINT rc; UINT rc;
...@@ -7882,7 +7887,7 @@ UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, UINT script) ...@@ -7882,7 +7887,7 @@ UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, UINT script)
rc = ACTION_HandleStandardAction(package, action); rc = ACTION_HandleStandardAction(package, action);
if (rc == ERROR_FUNCTION_NOT_CALLED) if (rc == ERROR_FUNCTION_NOT_CALLED)
rc = ACTION_HandleCustomAction(package, action, script); rc = ACTION_HandleCustomAction(package, action);
if (rc == ERROR_FUNCTION_NOT_CALLED) if (rc == ERROR_FUNCTION_NOT_CALLED)
WARN("unhandled msi action %s\n", debugstr_w(action)); WARN("unhandled msi action %s\n", debugstr_w(action));
...@@ -7935,7 +7940,7 @@ static UINT ACTION_PerformActionSequence(MSIPACKAGE *package, UINT seq) ...@@ -7935,7 +7940,7 @@ static UINT ACTION_PerformActionSequence(MSIPACKAGE *package, UINT seq)
return ERROR_FUNCTION_FAILED; return ERROR_FUNCTION_FAILED;
} }
rc = ACTION_PerformAction(package, action, SCRIPT_NONE); rc = ACTION_PerformAction(package, action);
msiobj_release(&row->hdr); msiobj_release(&row->hdr);
} }
...@@ -8033,7 +8038,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, ...@@ -8033,7 +8038,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
msi_set_property( package->db, szRollbackDisabled, szOne, -1 ); 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 */ /* process the ending type action */
if (rc == ERROR_SUCCESS) if (rc == ERROR_SUCCESS)
......
...@@ -1132,24 +1132,6 @@ static UINT HANDLE_CustomType53_54( MSIPACKAGE *package, const WCHAR *source, co ...@@ -1132,24 +1132,6 @@ static UINT HANDLE_CustomType53_54( MSIPACKAGE *package, const WCHAR *source, co
return wait_thread_handle( info ); 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 ) static UINT defer_custom_action( MSIPACKAGE *package, const WCHAR *action, UINT type )
{ {
WCHAR *actiondata = msi_dup_property( package->db, action ); WCHAR *actiondata = msi_dup_property( package->db, action );
...@@ -1187,7 +1169,7 @@ static UINT defer_custom_action( MSIPACKAGE *package, const WCHAR *action, UINT ...@@ -1187,7 +1169,7 @@ static UINT defer_custom_action( MSIPACKAGE *package, const WCHAR *action, UINT
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action, UINT script ) UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action )
{ {
static const WCHAR query[] = { static const WCHAR query[] = {
'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
...@@ -1227,7 +1209,7 @@ UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action, UINT script ) ...@@ -1227,7 +1209,7 @@ UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action, UINT script )
if (type & msidbCustomActionTypeNoImpersonate) if (type & msidbCustomActionTypeNoImpersonate)
WARN("msidbCustomActionTypeNoImpersonate not handled\n"); WARN("msidbCustomActionTypeNoImpersonate not handled\n");
if (!action_type_matches_script( type, script )) if (package->script == SCRIPT_NONE)
{ {
rc = defer_custom_action( package, action, type ); rc = defer_custom_action( package, action, type );
goto end; goto end;
...@@ -1236,15 +1218,6 @@ UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action, UINT script ) ...@@ -1236,15 +1218,6 @@ UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action, UINT script )
{ {
LPWSTR actiondata = msi_dup_property( package->db, action ); 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) if (deferred_data)
set_deferred_action_props(package, deferred_data); set_deferred_action_props(package, deferred_data);
else if (actiondata) else if (actiondata)
...@@ -1326,9 +1299,6 @@ UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action, UINT script ) ...@@ -1326,9 +1299,6 @@ UINT ACTION_CustomAction( MSIPACKAGE *package, LPCWSTR action, UINT script )
} }
end: end:
package->scheduled_action_running = FALSE;
package->commit_action_running = FALSE;
package->rollback_action_running = FALSE;
msiobj_release(&row->hdr); msiobj_release(&row->hdr);
return rc; return rc;
} }
......
...@@ -4366,7 +4366,7 @@ static UINT event_spawn_wait_dialog( msi_dialog *dialog, const WCHAR *argument ) ...@@ -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 ) 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; return ERROR_SUCCESS;
} }
......
...@@ -105,7 +105,7 @@ UINT WINAPI MsiDoActionW( MSIHANDLE hInstall, LPCWSTR szAction ) ...@@ -105,7 +105,7 @@ UINT WINAPI MsiDoActionW( MSIHANDLE hInstall, LPCWSTR szAction )
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
ret = ACTION_PerformAction( package, szAction, SCRIPT_NONE ); ret = ACTION_PerformAction( package, szAction );
msiobj_release( &package->hdr ); msiobj_release( &package->hdr );
return ret; return ret;
...@@ -736,15 +736,15 @@ BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode) ...@@ -736,15 +736,15 @@ BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode)
break; break;
case MSIRUNMODE_SCHEDULED: case MSIRUNMODE_SCHEDULED:
r = package->scheduled_action_running; r = (package->script == SCRIPT_INSTALL);
break; break;
case MSIRUNMODE_ROLLBACK: case MSIRUNMODE_ROLLBACK:
r = package->rollback_action_running; r = (package->script == SCRIPT_ROLLBACK);
break; break;
case MSIRUNMODE_COMMIT: case MSIRUNMODE_COMMIT:
r = package->commit_action_running; r = (package->script == SCRIPT_COMMIT);
break; break;
case MSIRUNMODE_MAINTENANCE: case MSIRUNMODE_MAINTENANCE:
......
...@@ -3747,7 +3747,7 @@ UINT WINAPI MsiCollectUserInfoW(LPCWSTR szProduct) ...@@ -3747,7 +3747,7 @@ UINT WINAPI MsiCollectUserInfoW(LPCWSTR szProduct)
if (!package) if (!package)
return ERROR_CALL_NOT_IMPLEMENTED; return ERROR_CALL_NOT_IMPLEMENTED;
rc = ACTION_PerformAction(package, szFirstRun, SCRIPT_NONE); rc = ACTION_PerformAction(package, szFirstRun);
msiobj_release( &package->hdr ); msiobj_release( &package->hdr );
MsiCloseHandle(handle); MsiCloseHandle(handle);
...@@ -3773,7 +3773,7 @@ UINT WINAPI MsiCollectUserInfoA(LPCSTR szProduct) ...@@ -3773,7 +3773,7 @@ UINT WINAPI MsiCollectUserInfoA(LPCSTR szProduct)
if (!package) if (!package)
return ERROR_CALL_NOT_IMPLEMENTED; return ERROR_CALL_NOT_IMPLEMENTED;
rc = ACTION_PerformAction(package, szFirstRun, SCRIPT_NONE); rc = ACTION_PerformAction(package, szFirstRun);
msiobj_release( &package->hdr ); msiobj_release( &package->hdr );
MsiCloseHandle(handle); MsiCloseHandle(handle);
...@@ -3854,7 +3854,7 @@ UINT WINAPI MsiConfigureFeatureW(LPCWSTR szProduct, LPCWSTR szFeature, INSTALLST ...@@ -3854,7 +3854,7 @@ UINT WINAPI MsiConfigureFeatureW(LPCWSTR szProduct, LPCWSTR szFeature, INSTALLST
MsiSetInternalUI( INSTALLUILEVEL_BASIC, NULL ); MsiSetInternalUI( INSTALLUILEVEL_BASIC, NULL );
r = ACTION_PerformAction( package, szCostInitialize, SCRIPT_NONE ); r = ACTION_PerformAction( package, szCostInitialize );
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
goto end; goto end;
......
...@@ -412,6 +412,7 @@ typedef struct tagMSIPACKAGE ...@@ -412,6 +412,7 @@ typedef struct tagMSIPACKAGE
struct list mimes; struct list mimes;
struct list appids; struct list appids;
enum script script;
LPWSTR *script_actions[SCRIPT_MAX]; LPWSTR *script_actions[SCRIPT_MAX];
int script_actions_count[SCRIPT_MAX]; int script_actions_count[SCRIPT_MAX];
LPWSTR *unique_actions; LPWSTR *unique_actions;
...@@ -441,9 +442,6 @@ typedef struct tagMSIPACKAGE ...@@ -441,9 +442,6 @@ typedef struct tagMSIPACKAGE
struct list sourcelist_info; struct list sourcelist_info;
struct list sourcelist_media; 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_at_end : 1;
unsigned char need_reboot_now : 1; unsigned char need_reboot_now : 1;
unsigned char need_rollback : 1; unsigned char need_rollback : 1;
...@@ -976,9 +974,9 @@ extern WCHAR *gszLogFile DECLSPEC_HIDDEN; ...@@ -976,9 +974,9 @@ extern WCHAR *gszLogFile DECLSPEC_HIDDEN;
extern HINSTANCE msi_hInstance DECLSPEC_HIDDEN; extern HINSTANCE msi_hInstance DECLSPEC_HIDDEN;
/* action related functions */ /* 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 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 */ /* actions in other modules */
extern UINT ACTION_AppSearch(MSIPACKAGE *package) DECLSPEC_HIDDEN; extern UINT ACTION_AppSearch(MSIPACKAGE *package) DECLSPEC_HIDDEN;
......
...@@ -1098,6 +1098,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url ) ...@@ -1098,6 +1098,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
msi_load_admin_properties( package ); msi_load_admin_properties( package );
package->log_file = INVALID_HANDLE_VALUE; package->log_file = INVALID_HANDLE_VALUE;
package->script = SCRIPT_NONE;
} }
return package; return package;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment