Module: wine Branch: master Commit: 1ab830188a5a823030db105e803e6a6d764bcd88 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1ab830188a5a823030db105e80...
Author: Hans Leidekker hans@codeweavers.com Date: Fri May 20 12:34:00 2011 +0200
msi: Execute the rollback script if the installation failed.
---
dlls/msi/action.c | 50 ++++++++++++++++++++++++++++++++++++-------------- dlls/msi/custom.c | 6 ------ 2 files changed, 36 insertions(+), 20 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c index 45b3d79..f0c05d6 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -2316,28 +2316,40 @@ static UINT ACTION_CostInitialize(MSIPACKAGE *package) return ERROR_SUCCESS; }
-static UINT execute_script(MSIPACKAGE *package, UINT script ) +static UINT execute_script_action( MSIPACKAGE *package, UINT script, UINT index ) { - UINT i; - UINT rc = ERROR_SUCCESS; + const WCHAR *action = package->script->Actions[script][index]; + ui_actionstart( package, action ); + TRACE("executing %s\n", debugstr_w(action)); + return ACTION_PerformAction( package, action, script ); +} + +static UINT execute_script( MSIPACKAGE *package, UINT script ) +{ + UINT i, rc = ERROR_SUCCESS;
- TRACE("Executing Script %i\n",script); + TRACE("executing script %u\n", script);
if (!package->script) { ERR("no script!\n"); return ERROR_FUNCTION_FAILED; } - - for (i = 0; i < package->script->ActionCount[script]; i++) + if (script == ROLLBACK_SCRIPT) { - LPWSTR action; - action = package->script->Actions[script][i]; - ui_actionstart(package, action); - TRACE("Executing Action (%s)\n",debugstr_w(action)); - rc = ACTION_PerformAction(package, action, script); - if (rc != ERROR_SUCCESS) - break; + for (i = package->script->ActionCount[script]; i > 0; i--) + { + rc = execute_script_action( package, script, i - 1 ); + if (rc != ERROR_SUCCESS) break; + } + } + else + { + for (i = 0; i < package->script->ActionCount[script]; i++) + { + rc = execute_script_action( package, script, i ); + if (rc != ERROR_SUCCESS) break; + } } msi_free_action_script(package, script); return rc; @@ -8153,7 +8165,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, LPCWSTR szCommandLine ) { UINT rc; - BOOL ui_exists; + BOOL ui_exists, needs_rollback = FALSE; static const WCHAR szDisableRollback[] = {'D','I','S','A','B','L','E','R','O','L','L','B','A','C','K',0}; static const WCHAR szAction[] = {'A','C','T','I','O','N',0}; static const WCHAR szInstall[] = {'I','N','S','T','A','L','L',0}; @@ -8248,11 +8260,21 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, else if (rc == ERROR_INSTALL_SUSPEND) ACTION_PerformActionSequence(package, -4); else /* failed */ + { ACTION_PerformActionSequence(package, -3); + needs_rollback = TRUE; + }
/* finish up running custom actions */ ACTION_FinishCustomActions(package);
+ if (needs_rollback && !msi_get_property_int( package->db, szRollbackDisabled, 0 )) + { + WARN("installation failed, running rollback script\n"); + msi_set_property( package->db, szRollbackDisabled, NULL ); + execute_script( package, ROLLBACK_SCRIPT ); + } + if (rc == ERROR_SUCCESS && package->need_reboot) return ERROR_SUCCESS_REBOOT_REQUIRED;
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c index 2eb7bad..1a23175 100644 --- a/dlls/msi/custom.c +++ b/dlls/msi/custom.c @@ -328,12 +328,6 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL
msi_free(actiondata); } - if (type & msidbCustomActionTypeRollback) - { - FIXME("Rollbacks not supported yet\n"); - rc = ERROR_SUCCESS; - goto end; - } } else if (!check_execution_scheduling_options(package,action,type)) {