James Hawkins : msi: Properly locate the published product in MsiConfigureProductEx.
Alexandre Julliard
julliard at winehq.org
Tue Jul 29 07:16:32 CDT 2008
Module: wine
Branch: master
Commit: 9518d7f8c70f71f5e1bb22be5b76971ca604fb65
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9518d7f8c70f71f5e1bb22be5b76971ca604fb65
Author: James Hawkins <jhawkins at codeweavers.com>
Date: Mon Jul 28 18:48:13 2008 -0500
msi: Properly locate the published product in MsiConfigureProductEx.
---
dlls/msi/msi.c | 53 +++++++++++++++++++++++++++++++++++++----------------
1 files changed, 37 insertions(+), 16 deletions(-)
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index f3d6090..a2da999 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -45,6 +45,28 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi);
static const WCHAR installerW[] = {'\\','I','n','s','t','a','l','l','e','r',0};
+/* FIXME: user-managed installs not located */
+static UINT msi_locate_product(LPCWSTR szProduct, MSIINSTALLCONTEXT *context)
+{
+ HKEY hkey = NULL;
+ UINT r;
+
+ *context = MSIINSTALLCONTEXT_NONE;
+
+ r = MSIREG_OpenLocalClassesProductKey(szProduct, &hkey, FALSE);
+ if (r == ERROR_SUCCESS)
+ *context = MSIINSTALLCONTEXT_MACHINE;
+ else
+ {
+ r = MSIREG_OpenUserProductsKey(szProduct, &hkey, FALSE);
+ if (r == ERROR_SUCCESS)
+ *context = MSIINSTALLCONTEXT_USERUNMANAGED;
+ }
+
+ RegCloseKey(hkey);
+ return ERROR_SUCCESS;
+}
+
UINT WINAPI MsiOpenProductA(LPCSTR szProduct, MSIHANDLE *phProduct)
{
UINT r;
@@ -346,6 +368,7 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel,
INSTALLSTATE eInstallState, LPCWSTR szCommandLine)
{
MSIPACKAGE* package = NULL;
+ MSIINSTALLCONTEXT context;
UINT r;
DWORD sz;
WCHAR sourcepath[MAX_PATH];
@@ -367,25 +390,23 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel,
return ERROR_CALL_NOT_IMPLEMENTED;
}
- sz = sizeof(sourcepath);
- MsiSourceListGetInfoW(szProduct, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
- MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath,
- &sz);
+ r = msi_locate_product(szProduct, &context);
+ if (r != ERROR_SUCCESS)
+ return r;
- sz = sizeof(filename);
- MsiSourceListGetInfoW(szProduct, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
- MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEW, filename, &sz);
+ if (context == MSIINSTALLCONTEXT_NONE)
+ return ERROR_UNKNOWN_PRODUCT;
- lstrcatW(sourcepath,filename);
+ sz = sizeof(sourcepath);
+ MsiSourceListGetInfoW(szProduct, NULL, context, MSICODE_PRODUCT,
+ INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath, &sz);
- /*
- * ok 1, we need to find the msi file for this product.
- * 2, find the source dir for the files
- * 3, do the configure/install.
- * 4, cleanupany runonce entry.
- */
+ sz = sizeof(filename);
+ MsiSourceListGetInfoW(szProduct, NULL, context, MSICODE_PRODUCT,
+ INSTALLPROPERTY_PACKAGENAMEW, filename, &sz);
- r = MSI_OpenProductW( szProduct, &package );
+ lstrcatW(sourcepath, filename);
+ r = MSI_OpenPackageW(sourcepath, &package);
if (r != ERROR_SUCCESS)
return r;
@@ -395,7 +416,7 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel,
sz += lstrlenW(szCommandLine);
commandline = msi_alloc(sz * sizeof(WCHAR));
- if (!commandline )
+ if (!commandline)
{
r = ERROR_OUTOFMEMORY;
goto end;
More information about the wine-cvs
mailing list