Commit 808f3158 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msi: Improve installation with no argument of already installed product.

parent c41b8ce5
...@@ -1740,7 +1740,7 @@ static BOOL process_overrides( MSIPACKAGE *package, int level ) ...@@ -1740,7 +1740,7 @@ static BOOL process_overrides( MSIPACKAGE *package, int level )
ret |= process_state_property( package, level, szReinstall, INSTALLSTATE_UNKNOWN ); ret |= process_state_property( package, level, szReinstall, INSTALLSTATE_UNKNOWN );
ret |= process_state_property( package, level, szAdvertise, INSTALLSTATE_ADVERTISED ); ret |= process_state_property( package, level, szAdvertise, INSTALLSTATE_ADVERTISED );
if (ret && !package->full_reinstall) if (ret)
msi_set_property( package->db, szPreselected, szOne, -1 ); msi_set_property( package->db, szPreselected, szOne, -1 );
return ret; return ret;
...@@ -1795,7 +1795,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) ...@@ -1795,7 +1795,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
level = msi_get_property_int(package->db, szInstallLevel, 1); level = msi_get_property_int(package->db, szInstallLevel, 1);
if (!msi_get_property_int( package->db, szPreselected, 0 )) if (msi_get_property_int( package->db, szPreselected, 0 ))
{ {
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
{ {
...@@ -1803,24 +1803,18 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) ...@@ -1803,24 +1803,18 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
if (feature->ActionRequest == INSTALLSTATE_UNKNOWN) if (feature->ActionRequest == INSTALLSTATE_UNKNOWN)
{ {
if (feature->Attributes & msidbFeatureAttributesFavorSource) if (feature->Installed == INSTALLSTATE_ABSENT)
{
feature->Action = INSTALLSTATE_SOURCE;
feature->ActionRequest = INSTALLSTATE_SOURCE;
}
else if (feature->Attributes & msidbFeatureAttributesFavorAdvertise)
{ {
feature->Action = INSTALLSTATE_ADVERTISED; feature->Action = INSTALLSTATE_UNKNOWN;
feature->ActionRequest = INSTALLSTATE_ADVERTISED; feature->ActionRequest = INSTALLSTATE_UNKNOWN;
} }
else else
{ {
feature->Action = INSTALLSTATE_LOCAL; feature->Action = feature->Installed;
feature->ActionRequest = INSTALLSTATE_LOCAL; feature->ActionRequest = feature->Installed;
} }
} }
} }
/* disable child features of unselected parent or follow parent */
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
{ {
if (feature->Feature_Parent) continue; if (feature->Feature_Parent) continue;
...@@ -1828,7 +1822,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) ...@@ -1828,7 +1822,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
follow_parent( feature ); follow_parent( feature );
} }
} }
else /* preselected */ else if (!msi_get_property_int( package->db, szInstalled, 0 ))
{ {
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
{ {
...@@ -1836,18 +1830,24 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) ...@@ -1836,18 +1830,24 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
if (feature->ActionRequest == INSTALLSTATE_UNKNOWN) if (feature->ActionRequest == INSTALLSTATE_UNKNOWN)
{ {
if (feature->Installed == INSTALLSTATE_ABSENT) if (feature->Attributes & msidbFeatureAttributesFavorSource)
{ {
feature->Action = INSTALLSTATE_UNKNOWN; feature->Action = INSTALLSTATE_SOURCE;
feature->ActionRequest = INSTALLSTATE_UNKNOWN; feature->ActionRequest = INSTALLSTATE_SOURCE;
}
else if (feature->Attributes & msidbFeatureAttributesFavorAdvertise)
{
feature->Action = INSTALLSTATE_ADVERTISED;
feature->ActionRequest = INSTALLSTATE_ADVERTISED;
} }
else else
{ {
feature->Action = feature->Installed; feature->Action = INSTALLSTATE_LOCAL;
feature->ActionRequest = feature->Installed; feature->ActionRequest = INSTALLSTATE_LOCAL;
} }
} }
} }
/* disable child features of unselected parent or follow parent */
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
{ {
if (feature->Feature_Parent) continue; if (feature->Feature_Parent) continue;
...@@ -1903,6 +1903,14 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) ...@@ -1903,6 +1903,14 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
else else
component->hasLocalFeature = 1; component->hasLocalFeature = 1;
break; break;
case INSTALLSTATE_UNKNOWN:
if (feature->Installed == INSTALLSTATE_ADVERTISED)
component->hasAdvertisedFeature = 1;
if (feature->Installed == INSTALLSTATE_SOURCE)
component->hasSourceFeature = 1;
if (feature->Installed == INSTALLSTATE_LOCAL)
component->hasLocalFeature = 1;
break;
default: default:
break; break;
} }
...@@ -7965,7 +7973,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, ...@@ -7965,7 +7973,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
{ {
static const WCHAR szDisableRollback[] = {'D','I','S','A','B','L','E','R','O','L','L','B','A','C','K',0}; 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 szAction[] = {'A','C','T','I','O','N',0};
WCHAR *reinstall, *remove, *patch, *productcode, *action; WCHAR *reinstall = NULL, *productcode, *action;
UINT rc; UINT rc;
DWORD len = 0; DWORD len = 0;
...@@ -8012,15 +8020,6 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, ...@@ -8012,15 +8020,6 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
msi_apply_transforms( package ); msi_apply_transforms( package );
msi_apply_patches( package ); msi_apply_patches( package );
patch = msi_dup_property( package->db, szPatch );
remove = msi_dup_property( package->db, szRemove );
reinstall = msi_dup_property( package->db, szReinstall );
if (msi_get_property_int( package->db, szInstalled, 0 ) && !remove && !reinstall && !patch)
{
TRACE("setting REINSTALL property to ALL\n");
msi_set_property( package->db, szReinstall, szAll, -1 );
package->full_reinstall = 1;
}
if (msi_get_property( package->db, szAction, NULL, &len )) if (msi_get_property( package->db, szAction, NULL, &len ))
msi_set_property( package->db, szAction, szINSTALL, -1 ); msi_set_property( package->db, szAction, szINSTALL, -1 );
action = msi_dup_property( package->db, szAction ); action = msi_dup_property( package->db, szAction );
...@@ -8067,14 +8066,12 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, ...@@ -8067,14 +8066,12 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
/* finish up running custom actions */ /* finish up running custom actions */
ACTION_FinishCustomActions(package); ACTION_FinishCustomActions(package);
if (package->need_rollback && !reinstall) if (package->need_rollback && !(reinstall = msi_dup_property( package->db, szReinstall )))
{ {
WARN("installation failed, running rollback script\n"); WARN("installation failed, running rollback script\n");
execute_script( package, SCRIPT_ROLLBACK ); execute_script( package, SCRIPT_ROLLBACK );
} }
msi_free( reinstall ); msi_free( reinstall );
msi_free( remove );
msi_free( patch );
msi_free( action ); msi_free( action );
if (rc == ERROR_SUCCESS && package->need_reboot_at_end) if (rc == ERROR_SUCCESS && package->need_reboot_at_end)
......
...@@ -445,7 +445,6 @@ typedef struct tagMSIPACKAGE ...@@ -445,7 +445,6 @@ typedef struct tagMSIPACKAGE
unsigned char need_reboot_at_end : 1; unsigned char need_reboot_at_end : 1;
unsigned char need_reboot_now : 1; unsigned char need_reboot_now : 1;
unsigned char need_rollback : 1; unsigned char need_rollback : 1;
unsigned char full_reinstall : 1;
} MSIPACKAGE; } MSIPACKAGE;
typedef struct tagMSIPREVIEW typedef struct tagMSIPREVIEW
......
...@@ -3576,7 +3576,7 @@ static void test_states(void) ...@@ -3576,7 +3576,7 @@ static void test_states(void)
test_component_states( __LINE__, hpkg, "phi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE ); test_component_states( __LINE__, hpkg, "phi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE );
test_component_states( __LINE__, hpkg, "chi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE ); test_component_states( __LINE__, hpkg, "chi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE );
test_component_states( __LINE__, hpkg, "psi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE ); test_component_states( __LINE__, hpkg, "psi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE );
test_component_states( __LINE__, hpkg, "upsilon", ERROR_SUCCESS, INSTALLSTATE_LOCAL, INSTALLSTATE_LOCAL, TRUE ); test_component_states( __LINE__, hpkg, "upsilon", ERROR_SUCCESS, INSTALLSTATE_LOCAL, INSTALLSTATE_LOCAL, FALSE );
MsiCloseHandle(hpkg); MsiCloseHandle(hpkg);
...@@ -3652,7 +3652,7 @@ static void test_states(void) ...@@ -3652,7 +3652,7 @@ static void test_states(void)
test_component_states( __LINE__, hpkg, "phi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE ); test_component_states( __LINE__, hpkg, "phi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE );
test_component_states( __LINE__, hpkg, "chi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE ); test_component_states( __LINE__, hpkg, "chi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE );
test_component_states( __LINE__, hpkg, "psi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE ); test_component_states( __LINE__, hpkg, "psi", ERROR_SUCCESS, INSTALLSTATE_SOURCE, INSTALLSTATE_UNKNOWN, FALSE );
test_component_states( __LINE__, hpkg, "upsilon", ERROR_SUCCESS, INSTALLSTATE_LOCAL, INSTALLSTATE_LOCAL, TRUE ); test_component_states( __LINE__, hpkg, "upsilon", ERROR_SUCCESS, INSTALLSTATE_LOCAL, INSTALLSTATE_LOCAL, FALSE );
MsiCloseHandle(hpkg); MsiCloseHandle(hpkg);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment