From ad4f747fa68fe185854e6fbbc6f0fec62e762e06 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 23 Dec 2011 13:53:34 +0100 Subject: [PATCH] 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 c6282f78e85..f755d929627 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 9162c3b6ab3..f8ed27e5a16 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 2ebac3134e1..619cfcba03e 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; -- 2.11.4.GIT