Piotr Caban : msi: Improve installation with no argument of already installed product.
Alexandre Julliard
julliard at winehq.org
Tue Oct 24 02:40:04 CDT 2017
Module: wine
Branch: master
Commit: 808f3158bbcf229d6eb935a7afe7291e9152ce1a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=808f3158bbcf229d6eb935a7afe7291e9152ce1a
Author: Piotr Caban <piotr at codeweavers.com>
Date: Fri Oct 20 22:18:41 2017 +0200
msi: Improve installation with no argument of already installed product.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msi/action.c | 61 +++++++++++++++++++++++-------------------------
dlls/msi/msipriv.h | 1 -
dlls/msi/tests/package.c | 4 ++--
3 files changed, 31 insertions(+), 35 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 217d1dc..2f065da 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -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, szAdvertise, INSTALLSTATE_ADVERTISED );
- if (ret && !package->full_reinstall)
+ if (ret)
msi_set_property( package->db, szPreselected, szOne, -1 );
return ret;
@@ -1795,7 +1795,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
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 )
{
@@ -1803,24 +1803,18 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
if (feature->ActionRequest == INSTALLSTATE_UNKNOWN)
{
- if (feature->Attributes & msidbFeatureAttributesFavorSource)
- {
- feature->Action = INSTALLSTATE_SOURCE;
- feature->ActionRequest = INSTALLSTATE_SOURCE;
- }
- else if (feature->Attributes & msidbFeatureAttributesFavorAdvertise)
+ if (feature->Installed == INSTALLSTATE_ABSENT)
{
- feature->Action = INSTALLSTATE_ADVERTISED;
- feature->ActionRequest = INSTALLSTATE_ADVERTISED;
+ feature->Action = INSTALLSTATE_UNKNOWN;
+ feature->ActionRequest = INSTALLSTATE_UNKNOWN;
}
else
{
- feature->Action = INSTALLSTATE_LOCAL;
- feature->ActionRequest = INSTALLSTATE_LOCAL;
+ feature->Action = feature->Installed;
+ feature->ActionRequest = feature->Installed;
}
}
}
- /* disable child features of unselected parent or follow parent */
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
{
if (feature->Feature_Parent) continue;
@@ -1828,7 +1822,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
follow_parent( feature );
}
}
- else /* preselected */
+ else if (!msi_get_property_int( package->db, szInstalled, 0 ))
{
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
{
@@ -1836,18 +1830,24 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
if (feature->ActionRequest == INSTALLSTATE_UNKNOWN)
{
- if (feature->Installed == INSTALLSTATE_ABSENT)
+ if (feature->Attributes & msidbFeatureAttributesFavorSource)
{
- feature->Action = INSTALLSTATE_UNKNOWN;
- feature->ActionRequest = INSTALLSTATE_UNKNOWN;
+ feature->Action = INSTALLSTATE_SOURCE;
+ feature->ActionRequest = INSTALLSTATE_SOURCE;
+ }
+ else if (feature->Attributes & msidbFeatureAttributesFavorAdvertise)
+ {
+ feature->Action = INSTALLSTATE_ADVERTISED;
+ feature->ActionRequest = INSTALLSTATE_ADVERTISED;
}
else
{
- feature->Action = feature->Installed;
- feature->ActionRequest = feature->Installed;
+ feature->Action = INSTALLSTATE_LOCAL;
+ feature->ActionRequest = INSTALLSTATE_LOCAL;
}
}
}
+ /* disable child features of unselected parent or follow parent */
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
{
if (feature->Feature_Parent) continue;
@@ -1903,6 +1903,14 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
else
component->hasLocalFeature = 1;
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:
break;
}
@@ -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 szAction[] = {'A','C','T','I','O','N',0};
- WCHAR *reinstall, *remove, *patch, *productcode, *action;
+ WCHAR *reinstall = NULL, *productcode, *action;
UINT rc;
DWORD len = 0;
@@ -8012,15 +8020,6 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
msi_apply_transforms( 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 ))
msi_set_property( package->db, szAction, szINSTALL, -1 );
action = msi_dup_property( package->db, szAction );
@@ -8067,14 +8066,12 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
/* finish up running custom actions */
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");
execute_script( package, SCRIPT_ROLLBACK );
}
msi_free( reinstall );
- msi_free( remove );
- msi_free( patch );
msi_free( action );
if (rc == ERROR_SUCCESS && package->need_reboot_at_end)
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 3f7387b..25c346b 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -445,7 +445,6 @@ typedef struct tagMSIPACKAGE
unsigned char need_reboot_at_end : 1;
unsigned char need_reboot_now : 1;
unsigned char need_rollback : 1;
- unsigned char full_reinstall : 1;
} MSIPACKAGE;
typedef struct tagMSIPREVIEW
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 0dafd7c..ab3bb15 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -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, "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, "upsilon", ERROR_SUCCESS, INSTALLSTATE_LOCAL, INSTALLSTATE_LOCAL, TRUE );
+ test_component_states( __LINE__, hpkg, "upsilon", ERROR_SUCCESS, INSTALLSTATE_LOCAL, INSTALLSTATE_LOCAL, FALSE );
MsiCloseHandle(hpkg);
@@ -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, "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, "upsilon", ERROR_SUCCESS, INSTALLSTATE_LOCAL, INSTALLSTATE_LOCAL, TRUE );
+ test_component_states( __LINE__, hpkg, "upsilon", ERROR_SUCCESS, INSTALLSTATE_LOCAL, INSTALLSTATE_LOCAL, FALSE );
MsiCloseHandle(hpkg);
More information about the wine-cvs
mailing list