Hans Leidekker : msi: Clean up better when removing a product.

Alexandre Julliard julliard at winehq.org
Thu Jan 20 12:41:22 CST 2011


Module: wine
Branch: master
Commit: 701f14801f6fa05ba871bfb0da56d55073133b4d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=701f14801f6fa05ba871bfb0da56d55073133b4d

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Thu Jan 20 09:06:47 2011 +0100

msi: Clean up better when removing a product.

---

 dlls/msi/action.c   |   15 +++++----------
 dlls/msi/msipriv.h  |    1 +
 dlls/msi/registry.c |   15 +++++++++++++++
 3 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 4bd5157..5a97d17 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -5139,21 +5139,16 @@ static UINT msi_unpublish_product(MSIPACKAGE *package, WCHAR *remove)
     MSIREG_DeleteUserDataProductKey(package->ProductCode);
     MSIREG_DeleteUninstallKey(package);
 
-    if (package->Context == MSIINSTALLCONTEXT_MACHINE)
-    {
-        MSIREG_DeleteLocalClassesProductKey(package->ProductCode);
-        MSIREG_DeleteLocalClassesFeaturesKey(package->ProductCode);
-    }
-    else
-    {
-        MSIREG_DeleteUserProductKey(package->ProductCode);
-        MSIREG_DeleteUserFeaturesKey(package->ProductCode);
-    }
+    MSIREG_DeleteLocalClassesProductKey(package->ProductCode);
+    MSIREG_DeleteLocalClassesFeaturesKey(package->ProductCode);
+    MSIREG_DeleteUserProductKey(package->ProductCode);
+    MSIREG_DeleteUserFeaturesKey(package->ProductCode);
 
     upgrade = msi_dup_property(package->db, szUpgradeCode);
     if (upgrade)
     {
         MSIREG_DeleteUserUpgradeCodesKey(upgrade);
+        MSIREG_DeleteClassesUpgradeCodesKey(upgrade);
         msi_free(upgrade);
     }
 
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 47a35b8..b9eb3ea 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -836,6 +836,7 @@ extern UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct);
 extern UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct);
 extern UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid);
 extern UINT MSIREG_DeleteUserUpgradeCodesKey(LPCWSTR szUpgradeCode);
+extern UINT MSIREG_DeleteClassesUpgradeCodesKey(LPCWSTR szUpgradeCode);
 extern UINT MSIREG_OpenClassesUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY* key, BOOL create);
 extern UINT MSIREG_DeleteLocalClassesProductKey(LPCWSTR szProductCode);
 extern UINT MSIREG_DeleteLocalClassesFeaturesKey(LPCWSTR szProductCode);
diff --git a/dlls/msi/registry.c b/dlls/msi/registry.c
index 926c90d..017aa24 100644
--- a/dlls/msi/registry.c
+++ b/dlls/msi/registry.c
@@ -1182,6 +1182,21 @@ UINT MSIREG_OpenClassesUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY* key, BOOL cr
     return RegOpenKeyW(HKEY_CLASSES_ROOT, keypath, key);
 }
 
+UINT MSIREG_DeleteClassesUpgradeCodesKey(LPCWSTR szUpgradeCode)
+{
+    WCHAR squished_pc[GUID_SIZE];
+    WCHAR keypath[0x200];
+
+    TRACE("%s\n", debugstr_w(szUpgradeCode));
+    if (!squash_guid(szUpgradeCode, squished_pc))
+        return ERROR_FUNCTION_FAILED;
+    TRACE("squished (%s)\n", debugstr_w(squished_pc));
+
+    sprintfW(keypath, szInstaller_ClassesUpgrade_fmt, squished_pc);
+
+    return RegDeleteTreeW(HKEY_CLASSES_ROOT, keypath);
+}
+
 /*************************************************************************
  *  MsiDecomposeDescriptorW   [MSI.@]
  *




More information about the wine-cvs mailing list