Mike McCormack : msi: Read from the registry,
not the database in MsiGetProductInfo.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 14 10:50:48 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: cd5bac0b3df39da5068adfd2daae554d7483d40e
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=cd5bac0b3df39da5068adfd2daae554d7483d40e
Author: Mike McCormack <mike at codeweavers.com>
Date: Fri Jul 14 15:20:44 2006 +0900
msi: Read from the registry, not the database in MsiGetProductInfo.
---
dlls/msi/msi.c | 125 ++++++++++++++++++++++++++++++++------------------------
1 files changed, 72 insertions(+), 53 deletions(-)
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index 81c531b..bb30415 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -512,95 +512,114 @@ end:
UINT WINAPI MsiGetProductInfoW(LPCWSTR szProduct, LPCWSTR szAttribute,
LPWSTR szBuffer, DWORD *pcchValueBuf)
{
- MSIHANDLE hProduct;
UINT r;
- static const WCHAR szProductVersion[] =
- {'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0};
- static const WCHAR szProductLanguage[] =
- {'P','r','o','d','u','c','t','L','a','n','g','u','a','g','e',0};
+ HKEY hkey;
+ LPWSTR val = NULL;
FIXME("%s %s %p %p\n",debugstr_w(szProduct), debugstr_w(szAttribute),
szBuffer, pcchValueBuf);
+ /*
+ * FIXME:
+ *
+ * We should use msi_strcpy_to_awstring to return strings.
+ *
+ * The values seem scattered/dupicated in the registry. Is there a system?
+ */
+
if (NULL != szBuffer && NULL == pcchValueBuf)
return ERROR_INVALID_PARAMETER;
if (NULL == szProduct || NULL == szAttribute)
return ERROR_INVALID_PARAMETER;
/* check for special properties */
- if (strcmpW(szAttribute, INSTALLPROPERTY_PACKAGECODEW)==0)
+ if (!lstrcmpW(szAttribute, INSTALLPROPERTY_PACKAGECODEW))
{
- HKEY hkey;
- WCHAR squished[GUID_SIZE];
- WCHAR package[200];
- DWORD sz = sizeof(squished);
+ LPWSTR regval;
+ WCHAR packagecode[35];
r = MSIREG_OpenUserProductsKey(szProduct, &hkey, FALSE);
if (r != ERROR_SUCCESS)
return ERROR_UNKNOWN_PRODUCT;
- r = RegQueryValueExW(hkey, INSTALLPROPERTY_PACKAGECODEW, NULL, NULL,
- (LPBYTE)squished, &sz);
- if (r != ERROR_SUCCESS)
+ regval = msi_reg_get_val_str( hkey, szAttribute );
+ if (regval)
{
- RegCloseKey(hkey);
- return ERROR_UNKNOWN_PRODUCT;
+ if (unsquash_guid(regval, packagecode))
+ val = strdupW(packagecode);
+ msi_free(regval);
}
- unsquash_guid(squished, package);
- *pcchValueBuf = strlenW(package);
- if (strlenW(package) > *pcchValueBuf)
- {
- RegCloseKey(hkey);
- return ERROR_MORE_DATA;
- }
- else
- strcpyW(szBuffer, package);
-
RegCloseKey(hkey);
- r = ERROR_SUCCESS;
}
- else if (strcmpW(szAttribute, INSTALLPROPERTY_VERSIONSTRINGW)==0)
+ else if (!lstrcmpW(szAttribute, INSTALLPROPERTY_ASSIGNMENTTYPEW))
{
- r = MsiOpenProductW(szProduct, &hProduct);
- if (ERROR_SUCCESS != r)
- return r;
-
- r = MsiGetPropertyW(hProduct, szProductVersion, szBuffer, pcchValueBuf);
- MsiCloseHandle(hProduct);
+ static const WCHAR one[] = { '1',0 };
+ /*
+ * FIXME: should be in the Product key (user or system?)
+ * but isn't written yet...
+ */
+ val = strdupW( one );
}
- else if (strcmpW(szAttribute, INSTALLPROPERTY_ASSIGNMENTTYPEW)==0)
+ else if (!lstrcmpW(szAttribute, INSTALLPROPERTY_LANGUAGEW) ||
+ !lstrcmpW(szAttribute, INSTALLPROPERTY_VERSIONW))
{
- FIXME("0 (zero) if advertised or per user , 1(one) if per machine.\n");
- if (szBuffer)
+ static const WCHAR fmt[] = { '%','u',0 };
+ WCHAR szVal[16];
+ DWORD regval;
+
+ r = MSIREG_OpenUninstallKey(szProduct, &hkey, FALSE);
+ if (r != ERROR_SUCCESS)
+ return ERROR_UNKNOWN_PRODUCT;
+
+ if (msi_reg_get_val_dword( hkey, szAttribute, ®val))
{
- szBuffer[0] = '1';
- szBuffer[1] = 0;
+ sprintfW(szVal, fmt, regval);
+ val = strdupW( szVal );
}
- if (pcchValueBuf)
- *pcchValueBuf = 1;
- r = ERROR_SUCCESS;
+
+ RegCloseKey(hkey);
}
- else if (strcmpW(szAttribute, INSTALLPROPERTY_LANGUAGEW)==0)
+ else if (!lstrcmpW(szAttribute, INSTALLPROPERTY_PRODUCTNAMEW))
{
- r = MsiOpenProductW(szProduct, &hProduct);
- if (ERROR_SUCCESS != r)
- return r;
+ r = MSIREG_OpenUserProductsKey(szProduct, &hkey, FALSE);
+ if (r != ERROR_SUCCESS)
+ return ERROR_UNKNOWN_PRODUCT;
+
+ val = msi_reg_get_val_str( hkey, szAttribute );
- r = MsiGetPropertyW(hProduct, szProductLanguage, szBuffer, pcchValueBuf);
- MsiCloseHandle(hProduct);
+ RegCloseKey(hkey);
}
else
{
- r = MsiOpenProductW(szProduct, &hProduct);
- if (ERROR_SUCCESS != r)
- return r;
+ static const WCHAR szDisplayVersion[] = {
+ 'D','i','s','p','l','a','y','V','e','r','s','i','o','n',0 };
+
+ if (!lstrcmpW(szAttribute, INSTALLPROPERTY_VERSIONSTRINGW))
+ szAttribute = szDisplayVersion;
+
+ r = MSIREG_OpenUninstallKey(szProduct, &hkey, FALSE);
+ if (r != ERROR_SUCCESS)
+ return ERROR_UNKNOWN_PRODUCT;
+
+ val = msi_reg_get_val_str( hkey, szAttribute );
- r = MsiGetPropertyW(hProduct, szAttribute, szBuffer, pcchValueBuf);
- MsiCloseHandle(hProduct);
+ RegCloseKey(hkey);
}
- return r;
+ TRACE("returning %s\n", debugstr_w(val));
+
+ if (!val)
+ return ERROR_UNKNOWN_PROPERTY;
+
+ if (lstrlenW(val) > *pcchValueBuf)
+ return ERROR_MORE_DATA;
+
+ lstrcpyW(szBuffer, val);
+
+ HeapFree(GetProcessHeap(), 0, val);
+
+ return ERROR_SUCCESS;
}
UINT WINAPI MsiEnableLogA(DWORD dwLogMode, LPCSTR szLogFile, DWORD attributes)
More information about the wine-cvs
mailing list