From c47ecd1ccce25bbe19ac7f76bc18667ad956adf5 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Tue, 30 Nov 2010 15:18:00 +0100 Subject: [PATCH] msi: Always ignore disabled components. --- 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 d64abf5a4f5..6200d9b6c46 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 f6f458fe239..ec8db475376 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 1579a5e40b5..a4705238eb5 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 1f1d8d29bd8..f026d956615 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);