[1/3] msi: Always ignore disabled components.

Hans Leidekker hans at codeweavers.com
Tue Nov 30 08:18:00 CST 2010


---
 dlls/msi/action.c        |   37 +++++++++++++++++++++++--------------
 dlls/msi/helpers.c       |    5 ++---
 dlls/msi/install.c       |    3 ++-
 dlls/msi/tests/package.c |   42 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 69 insertions(+), 18 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index d64abf5..6200d9b 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -1220,7 +1220,8 @@ static UINT load_component( MSIRECORD *row, LPVOID param )
     comp->KeyPath = msi_dup_record_field( row, 6 );
 
     comp->Installed = INSTALLSTATE_UNKNOWN;
-    msi_component_set_state(package, comp, INSTALLSTATE_UNKNOWN);
+    comp->Action = INSTALLSTATE_UNKNOWN;
+    comp->ActionRequest = INSTALLSTATE_UNKNOWN;
 
     comp->assembly = load_assembly( package, comp );
     return ERROR_SUCCESS;
@@ -1733,7 +1734,7 @@ static void ACTION_GetComponentInstallStates(MSIPACKAGE *package)
 
     LIST_FOR_EACH_ENTRY(comp, &package->components, MSICOMPONENT, entry)
     {
-        if (!comp->ComponentId)
+        if (!comp->Enabled || !comp->ComponentId)
             continue;
 
         if (state != INSTALLSTATE_LOCAL && state != INSTALLSTATE_DEFAULT)
@@ -1928,6 +1929,8 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
         /* features with components that have compressed files are made local */
         LIST_FOR_EACH_ENTRY( cl, &feature->Components, ComponentList, entry )
         {
+            if (!cl->component->Enabled) continue;
+
             if (cl->component->ForceLocalState &&
                 feature->ActionRequest == INSTALLSTATE_SOURCE)
             {
@@ -1940,6 +1943,8 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
         {
             component = cl->component;
 
+            if (!component->Enabled) continue;
+
             switch (feature->ActionRequest)
             {
             case INSTALLSTATE_ABSENT:
@@ -1970,6 +1975,8 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
 
     LIST_FOR_EACH_ENTRY( component, &package->components, MSICOMPONENT, entry )
     {
+        if (!component->Enabled) continue;
+
         /* check if it's local or source */
         if (!(component->Attributes & msidbComponentAttributesOptional) &&
              (component->hasLocalFeature || component->hasSourceFeature))
@@ -2008,6 +2015,8 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
 
     LIST_FOR_EACH_ENTRY( component, &package->components, MSICOMPONENT, entry )
     {
+        if (!component->Enabled) continue;
+
         if (component->ActionRequest == INSTALLSTATE_DEFAULT)
         {
             TRACE("%s was default, setting to local\n", debugstr_w(component->Component));
@@ -2283,6 +2292,18 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
         msiobj_release(&view->hdr);
     }
 
+    TRACE("Evaluating component conditions\n");
+    LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry )
+    {
+        if (MSI_EvaluateConditionW( package, comp->Condition ) == MSICONDITION_FALSE)
+        {
+            TRACE("Disabling component %s\n", debugstr_w(comp->Component));
+            comp->Enabled = FALSE;
+        }
+        else
+            comp->Enabled = TRUE;
+    }
+
     /* read components states from the registry */
     ACTION_GetComponentInstallStates(package);
     ACTION_GetFeatureInstallStates(package);
@@ -2298,18 +2319,6 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
             msiobj_release( &view->hdr );
         }
     }
-    TRACE("Evaluating component conditions\n");
-
-    LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry )
-    {
-        if (MSI_EvaluateConditionW( package, comp->Condition ) == MSICONDITION_FALSE)
-        {
-            TRACE("Disabling component %s\n", debugstr_w(comp->Component));
-            comp->Enabled = FALSE;
-        }
-        else
-            comp->Enabled = TRUE;
-    }
 
     TRACE("Calculating file install states\n");
     set_file_install_states( package );
diff --git a/dlls/msi/helpers.c b/dlls/msi/helpers.c
index f6f458f..d9410a3 100644
--- a/dlls/msi/helpers.c
+++ b/dlls/msi/helpers.c
@@ -658,13 +658,12 @@ void ACTION_UpdateComponentStates(MSIPACKAGE *package, LPCWSTR szFeature)
     {
         MSICOMPONENT* component = cl->component;
     
+        if (!component->Enabled) continue;
+ 
         TRACE("MODIFYING(%i): Component %s (Installed %i, Action %i, Request %i)\n",
             newstate, debugstr_w(component->Component), component->Installed, 
             component->Action, component->ActionRequest);
         
-        if (!component->Enabled)
-            continue;
- 
         if (newstate == INSTALLSTATE_LOCAL)
             msi_component_set_state(package, component, INSTALLSTATE_LOCAL);
         else 
diff --git a/dlls/msi/install.c b/dlls/msi/install.c
index 1579a5e..a470523 100644
--- a/dlls/msi/install.c
+++ b/dlls/msi/install.c
@@ -1158,7 +1158,8 @@ static UINT MSI_SetComponentStateW(MSIPACKAGE *package, LPCWSTR szComponent,
     if (!comp)
         return ERROR_UNKNOWN_COMPONENT;
 
-    comp->Installed = iState;
+    if (comp->Enabled)
+        comp->Installed = iState;
 
     return ERROR_SUCCESS;
 }
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 1f1d8d2..f026d95 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -7707,6 +7707,7 @@ static void test_removefiles(void)
     MSIHANDLE hpkg;
     UINT r;
     MSIHANDLE hdb;
+    INSTALLSTATE installed, action;
 
     hdb = create_package_db();
     ok ( hdb, "failed to create package database\n" );
@@ -7741,6 +7742,9 @@ static void test_removefiles(void)
     r = add_component_entry( hdb, "'carbon', '', 'TARGETDIR', 0, '', 'carbon_file'" );
     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
 
+    r = add_component_entry( hdb, "'oxygen', '', 'TARGETDIR', 0, '0', 'oxygen_file'" );
+    ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
+
     r = create_feature_components_table( hdb );
     ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r );
 
@@ -7762,6 +7766,9 @@ static void test_removefiles(void)
     r = add_feature_components_entry( hdb, "'one', 'carbon'" );
     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
 
+    r = add_feature_components_entry( hdb, "'one', 'oxygen'" );
+    ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
+
     r = create_file_table( hdb );
     ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r );
 
@@ -7783,6 +7790,9 @@ static void test_removefiles(void)
     r = add_file_entry( hdb, "'carbon_file', 'carbon', 'carbon.txt', 0, '', '1033', 16384, 1" );
     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
 
+    r = add_file_entry( hdb, "'oxygen_file', 'oxygen', 'oxygen.txt', 0, '', '1033', 16384, 1" );
+    ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
+
     r = create_remove_file_table( hdb );
     ok( r == ERROR_SUCCESS, "cannot create Remove File table: %d\n", r);
 
@@ -7803,18 +7813,28 @@ static void test_removefiles(void)
     create_test_file( "beryllium.txt" );
     create_test_file( "boron.txt" );
     create_test_file( "carbon.txt" );
+    create_test_file( "oxygen.txt" );
 
     r = MsiSetProperty( hpkg, "TARGETDIR", CURR_DIR );
     ok( r == ERROR_SUCCESS, "set property failed\n");
 
     MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
 
+    r = MsiGetComponentState( hpkg, "oxygen", &installed, &action );
+    ok( r == ERROR_UNKNOWN_COMPONENT, "expected ERROR_UNKNOWN_COMPONENT, got %u\n", r );
+
     r = MsiDoAction( hpkg, "CostInitialize");
     ok( r == ERROR_SUCCESS, "cost init failed\n");
 
     r = MsiDoAction( hpkg, "FileCost");
     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
 
+    installed = action = 0xdeadbeef;
+    r = MsiGetComponentState( hpkg, "oxygen", &installed, &action );
+    ok( r == ERROR_SUCCESS, "failed to get component state %u\n", r );
+    ok( installed == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", installed );
+    ok( action == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", action );
+
     r = MsiDoAction( hpkg, "CostFinalize");
     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
 
@@ -7839,15 +7859,37 @@ static void test_removefiles(void)
     r = MsiSetComponentState( hpkg, "carbon", INSTALLSTATE_SOURCE );
     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
 
+    installed = action = 0xdeadbeef;
+    r = MsiGetComponentState( hpkg, "oxygen", &installed, &action );
+    ok( r == ERROR_SUCCESS, "failed to get component state %u\n", r );
+    ok( installed == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", installed );
+    ok( action == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", action );
+
+    r = MsiSetComponentState( hpkg, "oxygen", INSTALLSTATE_ABSENT );
+    ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
+
+    installed = action = 0xdeadbeef;
+    r = MsiGetComponentState( hpkg, "oxygen", &installed, &action );
+    ok( r == ERROR_SUCCESS, "failed to get component state %u\n", r );
+    ok( installed == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", installed );
+    ok( action == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", action );
+
     r = MsiDoAction( hpkg, "RemoveFiles");
     ok( r == ERROR_SUCCESS, "remove files failed\n");
 
+    installed = action = 0xdeadbeef;
+    r = MsiGetComponentState( hpkg, "oxygen", &installed, &action );
+    ok( r == ERROR_SUCCESS, "failed to get component state %u\n", r );
+    ok( installed == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", installed );
+    ok( action == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", action );
+
     ok(DeleteFileA("hydrogen.txt"), "Expected hydrogen.txt to exist\n");
     ok(DeleteFileA("lithium.txt"), "Expected lithium.txt to exist\n");    
     ok(DeleteFileA("beryllium.txt"), "Expected beryllium.txt to exist\n");
     ok(DeleteFileA("carbon.txt"), "Expected carbon.txt to exist\n");
     ok(DeleteFileA("helium.txt"), "Expected helium.txt to exist\n");
     ok(DeleteFileA("boron.txt"), "Expected boron.txt to exist\n");
+    ok(DeleteFileA("oxygen.txt"), "Expected oxygen.txt to exist\n");
 
     MsiCloseHandle( hpkg );
     DeleteFileA(msifile);
-- 
1.7.1







More information about the wine-patches mailing list