Hans Leidekker : msi: Fix changing media for normal files.

Alexandre Julliard julliard at winehq.org
Fri Dec 23 13:03:22 CST 2011


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Dec 23 13:53:34 2011 +0100

msi: Fix changing media for normal files.

---

 dlls/msi/files.c   |    4 +-
 dlls/msi/media.c   |   94 ++++++++++++++++++++++++----------------------------
 dlls/msi/msipriv.h |    2 +-
 3 files changed, 46 insertions(+), 54 deletions(-)

diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index c6282f7..f755d92 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -331,7 +331,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
         if (!file->Component->Enabled) continue;
 
         if (file->state != msifs_hashmatch &&
-            (rc = ready_media( package, file->Sequence, file->IsCompressed, mi )))
+            (rc = ready_media( package, file->IsCompressed, mi )))
         {
             ERR("Failed to ready media for %s\n", debugstr_w(file->File));
             goto done;
@@ -512,7 +512,7 @@ UINT ACTION_PatchFiles( MSIPACKAGE *package )
         {
             MSICABDATA data;
 
-            rc = ready_media( package, patch->Sequence, TRUE, mi );
+            rc = ready_media( package, TRUE, mi );
             if (rc != ERROR_SUCCESS)
             {
                 ERR("Failed to ready media for %s\n", debugstr_w(file->File));
diff --git a/dlls/msi/media.c b/dlls/msi/media.c
index 9162c3b..f8ed27e 100644
--- a/dlls/msi/media.c
+++ b/dlls/msi/media.c
@@ -838,79 +838,71 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
     return ERROR_FUNCTION_FAILED;
 }
 
-UINT ready_media(MSIPACKAGE *package, UINT Sequence, BOOL IsCompressed, MSIMEDIAINFO *mi)
+UINT ready_media( MSIPACKAGE *package, BOOL compressed, MSIMEDIAINFO *mi )
 {
-    UINT rc = ERROR_SUCCESS;
-    WCHAR *cabinet_file;
+    UINT rc;
+    WCHAR *cabinet_file = NULL;
 
     /* media info for continuous cabinet is already loaded */
-    if (mi->is_continuous)
-        return ERROR_SUCCESS;
-
-    /* cabinet is internal, no checks needed */
-    if (!mi->cabinet || mi->cabinet[0] == '#')
-        return ERROR_SUCCESS;
-
-    cabinet_file = get_cabinet_filename(mi);
+    if (mi->is_continuous) return ERROR_SUCCESS;
 
-    /* package should be downloaded */
-    if (IsCompressed &&
-        GetFileAttributesW(cabinet_file) == INVALID_FILE_ATTRIBUTES &&
-        package->BaseURL && UrlIsW(package->BaseURL, URLIS_URL))
+    if (mi->cabinet)
     {
-        WCHAR temppath[MAX_PATH], *p;
+        /* cabinet is internal, no checks needed */
+        if (mi->cabinet[0] == '#') return ERROR_SUCCESS;
 
-        rc = msi_download_file(cabinet_file, temppath);
-        if (rc != ERROR_SUCCESS)
+        if (!(cabinet_file = get_cabinet_filename( mi ))) return ERROR_OUTOFMEMORY;
+
+        /* package should be downloaded */
+        if (compressed && GetFileAttributesW( cabinet_file ) == INVALID_FILE_ATTRIBUTES &&
+            package->BaseURL && UrlIsW( package->BaseURL, URLIS_URL ))
         {
-            ERR("Failed to download %s (%u)\n", debugstr_w(cabinet_file), rc);
-            msi_free(cabinet_file);
-            return rc;
-        }
-        if ((p = strrchrW(temppath, '\\'))) *p = 0;
-        strcpyW(mi->sourcedir, temppath);
-        PathAddBackslashW(mi->sourcedir);
-        msi_free(mi->cabinet);
-        mi->cabinet = strdupW(p + 1);
+            WCHAR temppath[MAX_PATH], *p;
 
-        msi_free(cabinet_file);
-        return ERROR_SUCCESS;
+            if ((rc = msi_download_file( cabinet_file, temppath )) != ERROR_SUCCESS)
+            {
+                ERR("failed to download %s (%u)\n", debugstr_w(cabinet_file), rc);
+                msi_free( cabinet_file );
+                return rc;
+            }
+            if ((p = strrchrW( temppath, '\\' ))) *p = 0;
+            strcpyW( mi->sourcedir, temppath );
+            PathAddBackslashW( mi->sourcedir );
+            msi_free( mi->cabinet );
+            mi->cabinet = strdupW( p + 1 );
+            msi_free( cabinet_file );
+            return ERROR_SUCCESS;
+        }
     }
-
     /* check volume matches, change media if not */
-    if (mi->volume_label && mi->disk_id > 1 &&
-        strcmpW( mi->first_volume, mi->volume_label ))
+    if (mi->volume_label && mi->disk_id > 1 && strcmpW( mi->first_volume, mi->volume_label ))
     {
-        LPWSTR source = msi_dup_property(package->db, szSourceDir);
-        BOOL matches;
-
-        matches = source_matches_volume(mi, source);
-        msi_free(source);
+        WCHAR *source = msi_dup_property( package->db, szSourceDir );
+        BOOL match = source_matches_volume( mi, source );
+        msi_free( source );
 
-        if ((mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE) && !matches)
+        if (!match && (mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE))
         {
-            rc = msi_change_media(package, mi);
-            if (rc != ERROR_SUCCESS)
+            if ((rc = msi_change_media( package, mi )) != ERROR_SUCCESS)
             {
-                msi_free(cabinet_file);
+                msi_free( cabinet_file );
                 return rc;
             }
         }
     }
-
-    if (IsCompressed &&
-        GetFileAttributesW(cabinet_file) == INVALID_FILE_ATTRIBUTES)
+    if (mi->cabinet)
     {
-        rc = find_published_source(package, mi);
-        if (rc != ERROR_SUCCESS)
+        if (compressed && GetFileAttributesW( cabinet_file ) == INVALID_FILE_ATTRIBUTES)
         {
-            ERR("Cabinet not found: %s\n", debugstr_w(cabinet_file));
-            msi_free(cabinet_file);
-            return ERROR_INSTALL_FAILURE;
+            if ((rc = find_published_source( package, mi )) != ERROR_SUCCESS)
+            {
+                ERR("cabinet not found: %s\n", debugstr_w(cabinet_file));
+                msi_free( cabinet_file );
+                return ERROR_INSTALL_FAILURE;
+            }
         }
     }
-
-    msi_free(cabinet_file);
+    msi_free( cabinet_file );
     return ERROR_SUCCESS;
 }
 
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 2ebac31..619cfcb 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -1041,7 +1041,7 @@ typedef struct
     PVOID user;
 } MSICABDATA;
 
-extern UINT ready_media(MSIPACKAGE *package, UINT Sequence, BOOL IsCompressed, MSIMEDIAINFO *mi) DECLSPEC_HIDDEN;
+extern UINT ready_media(MSIPACKAGE *package, BOOL compressed, MSIMEDIAINFO *mi) DECLSPEC_HIDDEN;
 extern UINT msi_load_media_info(MSIPACKAGE *package, UINT Sequence, MSIMEDIAINFO *mi) DECLSPEC_HIDDEN;
 extern void msi_free_media_info(MSIMEDIAINFO *mi) DECLSPEC_HIDDEN;
 extern BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list