Hans Leidekker : msi: Remove icons when the product is uninstalled.

Alexandre Julliard julliard at winehq.org
Tue Aug 23 12:45:08 CDT 2011


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Tue Aug 23 14:42:27 2011 +0200

msi: Remove icons when the product is uninstalled.

---

 dlls/msi/action.c        |   41 +++++++++++++++++++++++++++++++++++++++++
 dlls/msi/tests/install.c |    2 ++
 2 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 71f4f6a..d008777 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -4896,6 +4896,45 @@ static UINT ACTION_InstallExecute(MSIPACKAGE *package)
     return execute_script(package,INSTALL_SCRIPT);
 }
 
+static UINT ITERATE_UnpublishIcon( MSIRECORD *row, LPVOID param )
+{
+    MSIPACKAGE *package = param;
+    const WCHAR *icon = MSI_RecordGetString( row, 1 );
+    WCHAR *p, *icon_path;
+
+    if (!icon) return ERROR_SUCCESS;
+    if ((icon_path = msi_build_icon_path( package, icon )))
+    {
+        TRACE("removing icon file %s\n", debugstr_w(icon_path));
+        DeleteFileW( icon_path );
+        if ((p = strrchrW( icon_path, '\\' )))
+        {
+            *p = 0;
+            RemoveDirectoryW( icon_path );
+        }
+        msi_free( icon_path );
+    }
+    return ERROR_SUCCESS;
+}
+
+static UINT msi_unpublish_icons( MSIPACKAGE *package )
+{
+    static const WCHAR query[]= {
+        'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','I','c','o','n','`',0};
+    MSIQUERY *view;
+    UINT r;
+
+    r = MSI_DatabaseOpenViewW( package->db, query, &view );
+    if (r == ERROR_SUCCESS)
+    {
+        r = MSI_IterateRecords( view, NULL, ITERATE_UnpublishIcon, package );
+        msiobj_release( &view->hdr );
+        if (r != ERROR_SUCCESS)
+            return r;
+    }
+    return ERROR_SUCCESS;
+}
+
 static UINT msi_unpublish_product( MSIPACKAGE *package, const WCHAR *remove )
 {
     static const WCHAR szUpgradeCode[] = {'U','p','g','r','a','d','e','C','o','d','e',0};
@@ -4948,6 +4987,8 @@ static UINT msi_unpublish_product( MSIPACKAGE *package, const WCHAR *remove )
     }
     TRACE("removing local package %s\n", debugstr_w(package->localfile));
     package->delete_on_close = TRUE;
+
+    msi_unpublish_icons( package );
     return ERROR_SUCCESS;
 }
 
diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c
index 1c550ae..a870353 100644
--- a/dlls/msi/tests/install.c
+++ b/dlls/msi/tests/install.c
@@ -5980,6 +5980,7 @@ static void test_icon_table(void)
 
     res = MsiInstallProductA(msifile, "REMOVE=ALL");
     ok(res == ERROR_SUCCESS, "Failed to uninstall per-user\n");
+    ok(!file_exists(path), "Per-user icon file not removed (%s)\n", path);
 
     /* system-wide */
     res = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1 ALLUSERS=1");
@@ -5994,6 +5995,7 @@ static void test_icon_table(void)
 
     res = MsiInstallProductA(msifile, "REMOVE=ALL");
     ok(res == ERROR_SUCCESS, "Failed to uninstall system-wide\n");
+    ok(!file_exists(path), "System-wide icon file not removed (%s)\n", path);
 
     delete_pfmsitest_files();
     DeleteFile(msifile);




More information about the wine-cvs mailing list