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