Hans Leidekker : msi: Remove local patch packages when the product is removed.

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


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

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

msi: Remove local patch packages when the product is removed.

---

 dlls/msi/action.c  |    5 +++++
 dlls/msi/msipriv.h |    3 +++
 dlls/msi/package.c |   24 ++++++++++++------------
 dlls/msi/patch.c   |   31 +++++++++++++++++++++----------
 4 files changed, 41 insertions(+), 22 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 2c9c989..bea3052 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -4938,6 +4938,11 @@ static UINT msi_unpublish_product( MSIPACKAGE *package, const WCHAR *remove )
     LIST_FOR_EACH_ENTRY(patch, &package->patches, MSIPATCHINFO, entry)
     {
         MSIREG_DeleteUserDataPatchKey(patch->patchcode, package->Context);
+        if (!strcmpW( package->ProductCode, patch->products ))
+        {
+            TRACE("removing local patch package %s\n", debugstr_w(patch->localfile));
+            patch->delete_on_close = TRUE;
+        }
         /* FIXME: remove local patch package if this is the last product */
     }
     TRACE("removing local package %s\n", debugstr_w(package->localfile));
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 7fb2d65..2524752 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -170,10 +170,12 @@ typedef struct tagMSIPATCHINFO
 {
     struct list entry;
     LPWSTR patchcode;
+    LPWSTR products;
     LPWSTR transforms;
     LPWSTR filename;
     LPWSTR localfile;
     MSIPATCHSTATE state;
+    BOOL delete_on_close;
 } MSIPATCHINFO;
 
 typedef struct tagMSIBINARY
@@ -770,6 +772,7 @@ extern UINT msi_apply_transforms( MSIPACKAGE *package ) DECLSPEC_HIDDEN;
 extern UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si ) DECLSPEC_HIDDEN;
 extern UINT msi_apply_patches( MSIPACKAGE *package ) DECLSPEC_HIDDEN;
 extern UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code ) DECLSPEC_HIDDEN;
+extern void msi_free_patchinfo( MSIPATCHINFO *patch ) DECLSPEC_HIDDEN;
 
 /* action internals */
 extern UINT MSI_InstallPackage( MSIPACKAGE *, LPCWSTR, LPCWSTR ) DECLSPEC_HIDDEN;
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index c9cbad1..e635886 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -293,18 +293,6 @@ static void free_package_structures( MSIPACKAGE *package )
         msi_free( package->script );
     }
 
-    LIST_FOR_EACH_SAFE( item, cursor, &package->patches )
-    {
-        MSIPATCHINFO *patch = LIST_ENTRY( item, MSIPATCHINFO, entry );
-
-        list_remove( &patch->entry );
-        msi_free( patch->patchcode );
-        msi_free( patch->transforms );
-        msi_free( patch->localfile );
-        msi_free( patch->filename );
-        msi_free( patch );
-    }
-
     LIST_FOR_EACH_SAFE( item, cursor, &package->binaries )
     {
         MSIBINARY *binary = LIST_ENTRY( item, MSIBINARY, entry );
@@ -329,6 +317,18 @@ static void free_package_structures( MSIPACKAGE *package )
         msi_free( cab );
     }
 
+    LIST_FOR_EACH_SAFE( item, cursor, &package->patches )
+    {
+        MSIPATCHINFO *patch = LIST_ENTRY( item, MSIPATCHINFO, entry );
+
+        list_remove( &patch->entry );
+        if (patch->delete_on_close && !DeleteFileW( patch->localfile ))
+        {
+            ERR("failed to delete %s (%u)\n", debugstr_w(patch->localfile), GetLastError());
+        }
+        msi_free_patchinfo( patch );
+    }
+
     msi_free( package->BaseURL );
     msi_free( package->PackagePath );
     msi_free( package->ProductCode );
diff --git a/dlls/msi/patch.c b/dlls/msi/patch.c
index c2660ad..4801872 100644
--- a/dlls/msi/patch.c
+++ b/dlls/msi/patch.c
@@ -184,10 +184,16 @@ static UINT msi_parse_patch_summary( MSISUMMARYINFO *si, MSIPATCHINFO **patch )
         p[1] = 0;
     }
     TRACE("patch code %s\n", debugstr_w(pi->patchcode));
-
+    if (!(pi->products = msi_suminfo_dup_string( si, PID_TEMPLATE )))
+    {
+        msi_free( pi->patchcode );
+        msi_free( pi );
+        return ERROR_OUTOFMEMORY;
+    }
     if (!(pi->transforms = msi_suminfo_dup_string( si, PID_LASTAUTHOR )))
     {
         msi_free( pi->patchcode );
+        msi_free( pi->products );
         msi_free( pi );
         return ERROR_OUTOFMEMORY;
     }
@@ -597,6 +603,16 @@ static UINT msi_apply_patch_db( MSIPACKAGE *package, MSIDATABASE *patch_db, MSIP
     return ERROR_SUCCESS;
 }
 
+void msi_free_patchinfo( MSIPATCHINFO *patch )
+{
+    msi_free( patch->patchcode );
+    msi_free( patch->products );
+    msi_free( patch->transforms );
+    msi_free( patch->filename );
+    msi_free( patch->localfile );
+    msi_free( patch );
+}
+
 static UINT msi_apply_patch_package( MSIPACKAGE *package, const WCHAR *file )
 {
     static const WCHAR dotmsp[] = {'.','m','s','p',0};
@@ -646,11 +662,8 @@ done:
     msiobj_release( &patch_db->hdr );
     if (patch && r != ERROR_SUCCESS)
     {
-        msi_free( patch->patchcode );
-        msi_free( patch->transforms );
-        msi_free( patch->filename );
-        msi_free( patch->localfile );
-        msi_free( patch );
+        DeleteFileW( patch->localfile );
+        msi_free_patchinfo( patch );
     }
     return r;
 }
@@ -756,6 +769,7 @@ UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code )
     if (!patch_info->localfile)
     {
         msiobj_release( &patch_db->hdr );
+        msi_free_patchinfo( patch_info );
         return ERROR_OUTOFMEMORY;
     }
     r = msi_apply_patch_db( package, patch_db, patch_info );
@@ -763,10 +777,7 @@ UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code )
     if (r != ERROR_SUCCESS)
     {
         ERR("failed to apply patch %u\n", r);
-        msi_free( patch_info->patchcode );
-        msi_free( patch_info->transforms );
-        msi_free( patch_info->localfile );
-        msi_free( patch_info );
+        msi_free_patchinfo( patch_info );
     }
     return r;
 }




More information about the wine-cvs mailing list