[1/2] msi: Handle more than one patch per file.

Hans Leidekker hans at codeweavers.com
Wed Feb 27 05:30:37 CST 2013


---
 dlls/msi/action.c  |   12 ------------
 dlls/msi/files.c   |   19 +++++++++++++------
 dlls/msi/msipriv.h |    1 -
 3 files changed, 13 insertions(+), 19 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index d48ecdd..827a0c8 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -684,18 +684,6 @@ MSIFILE *msi_get_loaded_file( MSIPACKAGE *package, const WCHAR *key )
     return NULL;
 }
 
-MSIFILEPATCH *msi_get_loaded_filepatch( MSIPACKAGE *package, const WCHAR *key )
-{
-    MSIFILEPATCH *patch;
-
-    /* FIXME: There might be more than one patch */
-    LIST_FOR_EACH_ENTRY( patch, &package->filepatches, MSIFILEPATCH, entry )
-    {
-        if (!strcmpW( key, patch->File->File )) return patch;
-    }
-    return NULL;
-}
-
 MSIFOLDER *msi_get_loaded_folder( MSIPACKAGE *package, const WCHAR *dir )
 {
     MSIFOLDER *folder;
diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 7202fb6..96584df 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -443,6 +443,17 @@ static void unload_mspatch(void)
     FreeLibrary(hmspatcha);
 }
 
+static MSIFILEPATCH *get_next_filepatch( MSIPACKAGE *package, const WCHAR *key )
+{
+    MSIFILEPATCH *patch;
+
+    LIST_FOR_EACH_ENTRY( patch, &package->filepatches, MSIFILEPATCH, entry )
+    {
+        if (!patch->IsApplied && !strcmpW( key, patch->File->File )) return patch;
+    }
+    return NULL;
+}
+
 static BOOL patchfiles_cb(MSIPACKAGE *package, LPCWSTR file, DWORD action,
                           LPWSTR *path, DWORD *attrs, PVOID user)
 {
@@ -455,12 +466,8 @@ static BOOL patchfiles_cb(MSIPACKAGE *package, LPCWSTR file, DWORD action,
         if (temp_folder[0] == '\0')
             GetTempPathW(MAX_PATH, temp_folder);
 
-        p = msi_get_loaded_filepatch(package, file);
-        if (!p)
-        {
-            TRACE("unknown file in cabinet (%s)\n", debugstr_w(file));
-            return FALSE;
-        }
+        if (!(p = get_next_filepatch(package, file))) return FALSE;
+
         GetTempFileNameW(temp_folder, NULL, 0, patch_path);
 
         *path = strdupW(patch_path);
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index c477405..018f405 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -1018,7 +1018,6 @@ extern void msi_reset_folders( MSIPACKAGE *package, BOOL source ) DECLSPEC_HIDDE
 extern MSICOMPONENT *msi_get_loaded_component(MSIPACKAGE *package, const WCHAR *Component) DECLSPEC_HIDDEN;
 extern MSIFEATURE *msi_get_loaded_feature(MSIPACKAGE *package, const WCHAR *Feature) DECLSPEC_HIDDEN;
 extern MSIFILE *msi_get_loaded_file(MSIPACKAGE *package, const WCHAR *file) DECLSPEC_HIDDEN;
-extern MSIFILEPATCH *msi_get_loaded_filepatch(MSIPACKAGE* package, const WCHAR *key) DECLSPEC_HIDDEN;
 extern MSIFOLDER *msi_get_loaded_folder(MSIPACKAGE *package, const WCHAR *dir) DECLSPEC_HIDDEN;
 extern int msi_track_tempfile(MSIPACKAGE *package, const WCHAR *path) DECLSPEC_HIDDEN;
 extern void msi_free_action_script(MSIPACKAGE *package, UINT script) DECLSPEC_HIDDEN;
-- 
1.7.10.4







More information about the wine-patches mailing list