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