James Hawkins : msi: Also check the LocalPackage install property when searching for the product package .
Alexandre Julliard
julliard at winehq.org
Mon Aug 18 10:46:36 CDT 2008
Module: wine
Branch: master
Commit: 6e63953b4c8c0f50a102d7ea4847352a6aedc346
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6e63953b4c8c0f50a102d7ea4847352a6aedc346
Author: James Hawkins <jhawkins at codeweavers.com>
Date: Tue Aug 5 10:28:27 2008 -0500
msi: Also check the LocalPackage install property when searching for the product package.
---
dlls/msi/msi.c | 59 +++++++++++++++++++++++++++++++++++++--------
dlls/msi/tests/install.c | 16 ++++--------
2 files changed, 53 insertions(+), 22 deletions(-)
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index c5dd57d..9055c59 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -372,6 +372,53 @@ done:
return r;
}
+static UINT msi_open_package(LPCWSTR product, MSIINSTALLCONTEXT context,
+ MSIPACKAGE **package)
+{
+ UINT r;
+ DWORD sz;
+ HKEY props;
+ LPWSTR localpack;
+ WCHAR sourcepath[MAX_PATH];
+ WCHAR filename[MAX_PATH];
+
+ static const WCHAR szLocalPackage[] = {
+ 'L','o','c','a','l','P','a','c','k','a','g','e',0};
+
+ if (context == MSIINSTALLCONTEXT_MACHINE)
+ r = MSIREG_OpenLocalSystemInstallProps(product, &props, FALSE);
+ else
+ r = MSIREG_OpenCurrentUserInstallProps(product, &props, FALSE);
+
+ if (r != ERROR_SUCCESS)
+ return ERROR_BAD_CONFIGURATION;
+
+ localpack = msi_reg_get_val_str(props, szLocalPackage);
+ if (localpack)
+ {
+ lstrcpyW(sourcepath, localpack);
+ msi_free(localpack);
+ }
+
+ if (!localpack || GetFileAttributesW(sourcepath) == INVALID_FILE_ATTRIBUTES)
+ {
+ sz = sizeof(sourcepath);
+ MsiSourceListGetInfoW(product, NULL, context, MSICODE_PRODUCT,
+ INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath, &sz);
+
+ sz = sizeof(filename);
+ MsiSourceListGetInfoW(product, NULL, context, MSICODE_PRODUCT,
+ INSTALLPROPERTY_PACKAGENAMEW, filename, &sz);
+
+ lstrcatW(sourcepath, filename);
+ }
+
+ if (GetFileAttributesW(sourcepath) == INVALID_FILE_ATTRIBUTES)
+ return ERROR_INSTALL_SOURCE_ABSENT;
+
+ return MSI_OpenPackageW(sourcepath, package);
+}
+
UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel,
INSTALLSTATE eInstallState, LPCWSTR szCommandLine)
{
@@ -380,7 +427,6 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel,
UINT r;
DWORD sz;
WCHAR sourcepath[MAX_PATH];
- WCHAR filename[MAX_PATH];
LPWSTR commandline;
static const WCHAR szInstalled[] = {
@@ -407,16 +453,7 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel,
if (r != ERROR_SUCCESS)
return r;
- sz = sizeof(sourcepath);
- MsiSourceListGetInfoW(szProduct, NULL, context, MSICODE_PRODUCT,
- INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath, &sz);
-
- sz = sizeof(filename);
- MsiSourceListGetInfoW(szProduct, NULL, context, MSICODE_PRODUCT,
- INSTALLPROPERTY_PACKAGENAMEW, filename, &sz);
-
- lstrcatW(sourcepath, filename);
- r = MSI_OpenPackageW(sourcepath, &package);
+ r = msi_open_package(szProduct, context, &package);
if (r != ERROR_SUCCESS)
return r;
diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c
index cf65abe..6f15720 100644
--- a/dlls/msi/tests/install.c
+++ b/dlls/msi/tests/install.c
@@ -5118,9 +5118,9 @@ static void test_MsiConfigureProductEx(void)
r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT,
"PROPVAR=42");
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
todo_wine
{
- ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
@@ -5154,11 +5154,8 @@ static void test_MsiConfigureProductEx(void)
r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT,
"PROPVAR=42");
- todo_wine
- {
- ok(r == ERROR_INSTALL_SOURCE_ABSENT,
- "Expected ERROR_INSTALL_SOURCE_ABSENT, got %d\n", r);
- }
+ ok(r == ERROR_INSTALL_SOURCE_ABSENT,
+ "Expected ERROR_INSTALL_SOURCE_ABSENT, got %d\n", r);
ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
ok(pf_exists("msitest\\helium"), "File not installed\n");
ok(pf_exists("msitest\\lithium"), "File not installed\n");
@@ -5219,11 +5216,8 @@ static void test_MsiConfigureProductEx(void)
r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT,
"PROPVAR=42");
- todo_wine
- {
- ok(r == ERROR_INSTALL_SOURCE_ABSENT,
- "Expected ERROR_INSTALL_SOURCE_ABSENT, got %d\n", r);
- }
+ ok(r == ERROR_INSTALL_SOURCE_ABSENT,
+ "Expected ERROR_INSTALL_SOURCE_ABSENT, got %d\n", r);
ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
ok(pf_exists("msitest\\helium"), "File not installed\n");
ok(pf_exists("msitest\\lithium"), "File not installed\n");
More information about the wine-cvs
mailing list