Hans Leidekker : msi: Fix the file actions to revert components to the installed state during rollback .
Alexandre Julliard
julliard at winehq.org
Tue May 24 12:53:45 CDT 2011
Module: wine
Branch: master
Commit: c88f128537a49858094714da7a858d9637811cd1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c88f128537a49858094714da7a858d9637811cd1
Author: Hans Leidekker <hans at codeweavers.com>
Date: Tue May 24 10:50:43 2011 +0200
msi: Fix the file actions to revert components to the installed state during rollback.
---
dlls/msi/files.c | 76 ++++++++++++++---------------------------------------
1 files changed, 20 insertions(+), 56 deletions(-)
diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 97dbfa0..8b2feb9 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -63,7 +63,7 @@ static void msi_file_update_ui( MSIPACKAGE *package, MSIFILE *f, const WCHAR *ac
msi_ui_progress( package, 2, f->FileSize, 0, 0 );
}
-static msi_file_state calculate_install_state( MSIFILE *file )
+static msi_file_state calculate_install_state( MSIPACKAGE *package, MSIFILE *file )
{
MSICOMPONENT *comp = file->Component;
VS_FIXEDFILEINFO *file_version;
@@ -71,8 +71,8 @@ static msi_file_state calculate_install_state( MSIFILE *file )
msi_file_state state;
DWORD file_size;
- if (comp->ActionRequest != INSTALLSTATE_LOCAL || !comp->Enabled ||
- (comp->assembly && comp->assembly->installed))
+ comp->Action = msi_get_component_action( package, comp );
+ if (comp->Action != INSTALLSTATE_LOCAL || (comp->assembly && comp->assembly->installed))
{
TRACE("file %s is not scheduled for install\n", debugstr_w(file->File));
return msifs_skipped;
@@ -147,13 +147,12 @@ static void schedule_install_files(MSIPACKAGE *package)
{
MSICOMPONENT *comp = file->Component;
- file->state = calculate_install_state( file );
+ file->state = calculate_install_state( package, file );
if (file->state == msifs_overwrite && (comp->Attributes & msidbComponentAttributesNeverOverwrite))
{
TRACE("not overwriting %s\n", debugstr_w(file->TargetPath));
file->state = msifs_skipped;
}
- comp->Action = INSTALLSTATE_LOCAL;
msi_ui_progress( package, 2, file->FileSize, 0, 0 );
}
}
@@ -393,8 +392,8 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
msi_init_assembly_caches( package );
LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry )
{
- if (comp->ActionRequest == INSTALLSTATE_LOCAL && comp->Enabled &&
- comp->assembly && !comp->assembly->installed)
+ comp->Action = msi_get_component_action( package, comp );
+ if (comp->Action == INSTALLSTATE_LOCAL && comp->assembly && !comp->assembly->installed)
{
rc = msi_install_assembly( package, comp );
if (rc != ERROR_SUCCESS)
@@ -783,20 +782,13 @@ static UINT ITERATE_MoveFiles( MSIRECORD *rec, LPVOID param )
if (!comp)
return ERROR_SUCCESS;
- if (!comp->Enabled)
+ comp->Action = msi_get_component_action( package, comp );
+ if (comp->Action != INSTALLSTATE_LOCAL)
{
- TRACE("component is disabled\n");
+ TRACE("component not scheduled for installation %s\n", debugstr_w(component));
return ERROR_SUCCESS;
}
- if (comp->ActionRequest != INSTALLSTATE_LOCAL && comp->ActionRequest != INSTALLSTATE_SOURCE)
- {
- TRACE("Component not scheduled for installation: %s\n", debugstr_w(component));
- comp->Action = comp->Installed;
- return ERROR_SUCCESS;
- }
- comp->Action = comp->ActionRequest;
-
sourcename = MSI_RecordGetString(rec, 3);
options = MSI_RecordGetInteger(rec, 7);
@@ -979,20 +971,13 @@ static UINT ITERATE_DuplicateFiles(MSIRECORD *row, LPVOID param)
if (!comp)
return ERROR_SUCCESS;
- if (!comp->Enabled)
+ comp->Action = msi_get_component_action( package, comp );
+ if (comp->Action != INSTALLSTATE_LOCAL)
{
- TRACE("component is disabled\n");
+ TRACE("component not scheduled for installation %s\n", debugstr_w(component));
return ERROR_SUCCESS;
}
- if (comp->ActionRequest != INSTALLSTATE_LOCAL)
- {
- TRACE("Component not scheduled for installation %s\n", debugstr_w(component));
- comp->Action = comp->Installed;
- return ERROR_SUCCESS;
- }
- comp->Action = INSTALLSTATE_LOCAL;
-
file_key = MSI_RecordGetString(row,3);
if (!file_key)
{
@@ -1067,20 +1052,13 @@ static UINT ITERATE_RemoveDuplicateFiles( MSIRECORD *row, LPVOID param )
if (!comp)
return ERROR_SUCCESS;
- if (!comp->Enabled)
+ comp->Action = msi_get_component_action( package, comp );
+ if (comp->Action != INSTALLSTATE_ABSENT)
{
- TRACE("component is disabled\n");
+ TRACE("component not scheduled for removal %s\n", debugstr_w(component));
return ERROR_SUCCESS;
}
- if (comp->ActionRequest != INSTALLSTATE_ABSENT)
- {
- TRACE("Component not scheduled for removal %s\n", debugstr_w(component));
- comp->Action = comp->Installed;
- return ERROR_SUCCESS;
- }
- comp->Action = INSTALLSTATE_ABSENT;
-
file_key = MSI_RecordGetString( row, 3 );
if (!file_key)
{
@@ -1139,15 +1117,13 @@ UINT ACTION_RemoveDuplicateFiles( MSIPACKAGE *package )
static BOOL verify_comp_for_removal(MSICOMPONENT *comp, UINT install_mode)
{
- INSTALLSTATE request = comp->ActionRequest;
-
/* special case */
- if (request != INSTALLSTATE_SOURCE &&
+ if (comp->Action != INSTALLSTATE_SOURCE &&
comp->Attributes & msidbComponentAttributesSourceOnly &&
(install_mode == msidbRemoveFileInstallModeOnRemove ||
install_mode == msidbRemoveFileInstallModeOnBoth)) return TRUE;
- switch (request)
+ switch (comp->Action)
{
case INSTALLSTATE_LOCAL:
case INSTALLSTATE_SOURCE:
@@ -1182,16 +1158,10 @@ static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param)
if (!comp)
return ERROR_SUCCESS;
- if (!comp->Enabled)
- {
- TRACE("component is disabled\n");
- return ERROR_SUCCESS;
- }
-
+ comp->Action = msi_get_component_action( package, comp );
if (!verify_comp_for_removal(comp, install_mode))
{
TRACE("Skipping removal due to install mode\n");
- comp->Action = comp->Installed;
return ERROR_SUCCESS;
}
@@ -1300,16 +1270,10 @@ UINT ACTION_RemoveFiles( MSIPACKAGE *package )
if ( file->state == msifs_installed )
ERR("removing installed file %s\n", debugstr_w(file->TargetPath));
- if ( file->Component->ActionRequest != INSTALLSTATE_ABSENT ||
- file->Component->Installed == INSTALLSTATE_SOURCE )
+ file->Component->Action = msi_get_component_action( package, file->Component );
+ if (file->Component->Action != INSTALLSTATE_ABSENT || file->Component->Installed == INSTALLSTATE_SOURCE)
continue;
- if (!file->Component->Enabled)
- {
- TRACE("component is disabled\n");
- continue;
- }
-
if (file->Component->Attributes & msidbComponentAttributesPermanent)
{
TRACE("permanent component, not removing file\n");
More information about the wine-cvs
mailing list