[PATCH 2/4] msi: Re-publish product if previous installation with different package is detected
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com> --- dlls/msi/action.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 7 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c index 74917afdd1..ba351b45bc 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -4473,6 +4473,7 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package) UINT rc; HKEY hukey = NULL, hudkey = NULL; MSIRECORD *uirow; + BOOL republish = FALSE;
if (!list_empty(&package->patches)) { @@ -4481,14 +4482,65 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package) goto end; }
- /* FIXME: also need to publish if the product is in advertise mode */ - if (!msi_check_publish(package)) - return ERROR_SUCCESS; - rc = MSIREG_OpenProductKey(package->ProductCode, NULL, package->Context, - &hukey, TRUE); - if (rc != ERROR_SUCCESS) - goto end; + &hukey, FALSE); + if (rc == ERROR_SUCCESS) + { + WCHAR *package_code; + + package_code = msi_reg_get_val_str(hukey, INSTALLPROPERTY_PACKAGECODEW); + if (package_code) + { + WCHAR guid[MAX_PATH], packed[SQUASHED_GUID_SIZE], *p; + MSIHANDLE hdb, suminfo; + DWORD size; + + hdb = alloc_msihandle(&package->db->hdr); + if (!hdb) + { + RegCloseKey(hukey); + return ERROR_NOT_ENOUGH_MEMORY; + } + + rc = MsiGetSummaryInformationW(hdb, NULL, 0, &suminfo); + MsiCloseHandle(hdb); + if (rc == ERROR_SUCCESS) + { + size = sizeof(guid); + rc = MsiSummaryInfoGetPropertyW(suminfo, PID_REVNUMBER, NULL, NULL, NULL, guid, &size); + MsiCloseHandle(suminfo); + } + if (rc == ERROR_SUCCESS) + { + p = strchrW(guid, ';'); + if (p) *p = 0; + squash_guid(guid, packed);
This duplicates code to retrieve the package code in msi_publish_product_properties. You could use get_package_code from package.c, which avoids creating a handle.
participants (2)
-
Hans Leidekker -
Piotr Caban