James Hawkins : msi: Factor out the code to open the features key.
Alexandre Julliard
julliard at winehq.org
Tue Nov 4 07:29:08 CST 2008
Module: wine
Branch: master
Commit: 0c01c586c70b84d5d68a17d2e3004bc5a5bdda34
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0c01c586c70b84d5d68a17d2e3004bc5a5bdda34
Author: James Hawkins <jhawkins at codeweavers.com>
Date: Mon Nov 3 22:16:50 2008 -0600
msi: Factor out the code to open the features key.
---
dlls/msi/action.c | 17 ++++-----
dlls/msi/msi.c | 9 +++--
dlls/msi/msipriv.h | 7 ++--
dlls/msi/registry.c | 97 ++++++++++++++++++--------------------------------
4 files changed, 51 insertions(+), 79 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index fda0059..55e8fd2 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -3841,13 +3841,13 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package)
if (!msi_check_publish(package))
return ERROR_SUCCESS;
+ rc = MSIREG_OpenFeaturesKey(package->ProductCode, package->Context,
+ &hkey, TRUE);
+ if (rc != ERROR_SUCCESS)
+ goto end;
+
if (package->Context == MSIINSTALLCONTEXT_MACHINE)
{
- rc = MSIREG_OpenLocalClassesFeaturesKey(package->ProductCode,
- &hkey, TRUE);
- if (rc != ERROR_SUCCESS)
- goto end;
-
rc = MSIREG_OpenLocalUserDataFeaturesKey(package->ProductCode,
&userdata, TRUE);
if (rc != ERROR_SUCCESS)
@@ -3855,10 +3855,6 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package)
}
else
{
- rc = MSIREG_OpenUserFeaturesKey(package->ProductCode, &hkey, TRUE);
- if (rc != ERROR_SUCCESS)
- goto end;
-
rc = MSIREG_OpenUserDataFeaturesKey(package->ProductCode,
&userdata, TRUE);
if (rc != ERROR_SUCCESS)
@@ -3961,7 +3957,8 @@ static UINT msi_unpublish_feature(MSIPACKAGE *package, MSIFEATURE *feature)
TRACE("unpublishing feature %s\n", debugstr_w(feature->Feature));
- r = MSIREG_OpenUserFeaturesKey(package->ProductCode, &hkey, FALSE);
+ r = MSIREG_OpenFeaturesKey(package->ProductCode, package->Context,
+ &hkey, FALSE);
if (r == ERROR_SUCCESS)
{
RegDeleteValueW(hkey, feature->Feature);
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index b629bc6..91792d4 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -1933,10 +1933,13 @@ INSTALLSTATE WINAPI MsiQueryFeatureStateW(LPCWSTR szProduct, LPCWSTR szFeature)
if (!squash_guid( szProduct, squishProduct ))
return INSTALLSTATE_INVALIDARG;
- if (MSIREG_OpenManagedFeaturesKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS &&
- MSIREG_OpenUserFeaturesKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS)
+ if (MSIREG_OpenFeaturesKey(szProduct, MSIINSTALLCONTEXT_USERMANAGED,
+ &hkey, FALSE) != ERROR_SUCCESS &&
+ MSIREG_OpenFeaturesKey(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED,
+ &hkey, FALSE) != ERROR_SUCCESS)
{
- rc = MSIREG_OpenLocalClassesFeaturesKey(szProduct, &hkey, FALSE);
+ rc = MSIREG_OpenFeaturesKey(szProduct, MSIINSTALLCONTEXT_MACHINE,
+ &hkey, FALSE);
if (rc != ERROR_SUCCESS)
return INSTALLSTATE_UNKNOWN;
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 3aa1a85..b853915 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -766,8 +766,10 @@ extern UINT MSIREG_OpenUninstallKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_DeleteUninstallKey(LPCWSTR szProduct);
extern UINT MSIREG_OpenProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context,
HKEY* key, BOOL create);
+extern UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context,
+ HKEY *key, BOOL create);
extern UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create);
-extern UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
+extern UINT MSIREG_OpenInstallerFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, HKEY *key, BOOL create);
extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create);
extern UINT MSIREG_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create);
@@ -778,7 +780,6 @@ extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, HKEY* key, BOOL cre
extern UINT MSIREG_OpenLocalUserDataProductKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_OpenCurrentUserInstallProps(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_OpenLocalSystemInstallProps(LPCWSTR szProduct, HKEY* key, BOOL create);
-extern UINT MSIREG_OpenUserFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create);
extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_OpenUserUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
@@ -787,8 +788,6 @@ extern UINT MSIREG_DeleteUserProductKey(LPCWSTR szProduct);
extern UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct);
extern UINT MSIREG_OpenLocalSystemProductKey(LPCWSTR szProductCode, HKEY *key, BOOL create);
extern UINT MSIREG_OpenLocalSystemComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create);
-extern UINT MSIREG_OpenLocalClassesFeaturesKey(LPCWSTR szProductCode, HKEY *key, BOOL create);
-extern UINT MSIREG_OpenManagedFeaturesKey(LPCWSTR szProductCode, HKEY *key, BOOL create);
extern UINT MSIREG_OpenLocalUserDataFeaturesKey(LPCWSTR szProduct, HKEY *key, BOOL create);
extern UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct);
extern UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent);
diff --git a/dlls/msi/registry.c b/dlls/msi/registry.c
index 85907eb..f1059f7 100644
--- a/dlls/msi/registry.c
+++ b/dlls/msi/registry.c
@@ -605,25 +605,48 @@ UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create)
return rc;
}
-UINT MSIREG_OpenUserFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create)
+UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context,
+ HKEY *key, BOOL create)
{
- UINT rc;
+ UINT r;
+ LPWSTR usersid;
+ HKEY root = HKEY_LOCAL_MACHINE;
WCHAR squished_pc[GUID_SIZE];
- WCHAR keypath[0x200];
+ WCHAR keypath[MAX_PATH];
- TRACE("%s\n",debugstr_w(szProduct));
- if (!squash_guid(szProduct,squished_pc))
+ TRACE("(%s, %d, %d)\n", debugstr_w(szProduct), context, create);
+
+ if (!squash_guid(szProduct, squished_pc))
return ERROR_FUNCTION_FAILED;
+
TRACE("squished (%s)\n", debugstr_w(squished_pc));
- sprintfW(keypath,szUserFeatures_fmt,squished_pc);
+ if (context == MSIINSTALLCONTEXT_MACHINE)
+ {
+ sprintfW(keypath, szInstaller_LocalClassesFeat_fmt, squished_pc);
+ }
+ else if (context == MSIINSTALLCONTEXT_USERUNMANAGED)
+ {
+ root = HKEY_CURRENT_USER;
+ sprintfW(keypath, szUserFeatures_fmt, squished_pc);
+ }
+ else
+ {
+ r = get_user_sid(&usersid);
+ if (r != ERROR_SUCCESS || !usersid)
+ {
+ ERR("Failed to retrieve user SID: %d\n", r);
+ return r;
+ }
+
+ sprintfW(keypath, szInstaller_LocalManagedFeat_fmt, usersid, squished_pc);
+ LocalFree(usersid);
+ }
if (create)
- rc = RegCreateKeyW(HKEY_CURRENT_USER,keypath,key);
- else
- rc = RegOpenKeyW(HKEY_CURRENT_USER,keypath,key);
+ return RegCreateKeyW(root, keypath, key);
- return rc;
+ return RegOpenKeyW(root, keypath, key);
}
UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct)
@@ -640,7 +663,7 @@ UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct)
return RegDeleteTreeW(HKEY_CURRENT_USER, keypath);
}
-UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create)
+UINT MSIREG_OpenInstallerFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create)
{
UINT rc;
WCHAR squished_pc[GUID_SIZE];
@@ -1108,26 +1131,6 @@ UINT MSIREG_DeleteLocalClassesProductKey(LPCWSTR szProductCode)
return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath);
}
-UINT MSIREG_OpenLocalClassesFeaturesKey(LPCWSTR szProductCode, HKEY *key, BOOL create)
-{
- WCHAR squished_pc[GUID_SIZE];
- WCHAR keypath[0x200];
-
- TRACE("%s\n", debugstr_w(szProductCode));
-
- if (!squash_guid(szProductCode, squished_pc))
- return ERROR_FUNCTION_FAILED;
-
- TRACE("squished (%s)\n", debugstr_w(squished_pc));
-
- sprintfW(keypath, szInstaller_LocalClassesFeat_fmt, squished_pc);
-
- if (create)
- return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
-
- return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
-}
-
UINT MSIREG_DeleteLocalClassesFeaturesKey(LPCWSTR szProductCode)
{
WCHAR squished_pc[GUID_SIZE];
@@ -1145,36 +1148,6 @@ UINT MSIREG_DeleteLocalClassesFeaturesKey(LPCWSTR szProductCode)
return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath);
}
-UINT MSIREG_OpenManagedFeaturesKey(LPCWSTR szProductCode, HKEY *key, BOOL create)
-{
- WCHAR squished_pc[GUID_SIZE];
- WCHAR keypath[0x200];
- LPWSTR usersid;
- UINT r;
-
- TRACE("%s\n", debugstr_w(szProductCode));
-
- if (!squash_guid(szProductCode, squished_pc))
- return ERROR_FUNCTION_FAILED;
-
- TRACE("squished (%s)\n", debugstr_w(squished_pc));
-
- r = get_user_sid(&usersid);
- if (r != ERROR_SUCCESS || !usersid)
- {
- ERR("Failed to retrieve user SID: %d\n", r);
- return r;
- }
-
- sprintfW(keypath, szInstaller_LocalManagedFeat_fmt, usersid, squished_pc);
- LocalFree(usersid);
-
- if (create)
- return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
-
- return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
-}
-
UINT MSIREG_OpenClassesUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY* key, BOOL create)
{
WCHAR squished_pc[GUID_SIZE];
@@ -1381,7 +1354,7 @@ UINT WINAPI MsiEnumFeaturesW(LPCWSTR szProduct, DWORD index,
if( !szProduct )
return ERROR_INVALID_PARAMETER;
- r = MSIREG_OpenFeaturesKey(szProduct,&hkeyProduct,FALSE);
+ r = MSIREG_OpenInstallerFeaturesKey(szProduct,&hkeyProduct,FALSE);
if( r != ERROR_SUCCESS )
return ERROR_NO_MORE_ITEMS;
More information about the wine-cvs
mailing list