James Hawkins : msi: Check the volume name when changing media.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed May 9 07:43:08 CDT 2007
Module: wine
Branch: master
Commit: 6eb7eadffa5e9863722058325c0977142cd9af49
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6eb7eadffa5e9863722058325c0977142cd9af49
Author: James Hawkins <truiken at gmail.com>
Date: Wed May 9 02:04:10 2007 -0500
msi: Check the volume name when changing media.
---
dlls/msi/files.c | 46 ++++++++++++++++++++++++++++++++++++++++------
1 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 9b9c324..2aeefd3 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -68,10 +68,25 @@ struct media_info {
WCHAR source[MAX_PATH];
};
+static BOOL source_matches_volume(struct media_info *mi, LPWSTR source_root)
+{
+ WCHAR volume_name[MAX_PATH + 1];
+
+ if (!GetVolumeInformationW(source_root, volume_name, MAX_PATH + 1,
+ NULL, NULL, NULL, NULL, 0))
+ {
+ ERR("Failed to get volume information\n");
+ return FALSE;
+ }
+
+ return !lstrcmpW(mi->volume_label, volume_name);
+}
+
static UINT msi_change_media( MSIPACKAGE *package, struct media_info *mi )
{
LPSTR msg;
LPWSTR error, error_dialog;
+ LPWSTR source_dir;
UINT r = ERROR_SUCCESS;
static const WCHAR szUILevel[] = {'U','I','L','e','v','e','l',0};
@@ -82,8 +97,11 @@ static UINT msi_change_media( MSIPACKAGE *package, struct media_info *mi )
error = generate_error_string( package, 1302, 1, mi->disk_prompt );
error_dialog = msi_dup_property( package, error_prop );
+ source_dir = msi_dup_property( package, cszSourceDir );
+ PathStripToRootW(source_dir);
- while ( r == ERROR_SUCCESS && GetFileAttributesW( mi->source ) == INVALID_FILE_ATTRIBUTES )
+ while ( r == ERROR_SUCCESS &&
+ !source_matches_volume(mi, source_dir) )
{
r = msi_spawn_error_dialog( package, error_dialog, error );
@@ -97,6 +115,7 @@ static UINT msi_change_media( MSIPACKAGE *package, struct media_info *mi )
msi_free( error );
msi_free( error_dialog );
+ msi_free( source_dir );
return r;
}
@@ -572,8 +591,9 @@ static UINT load_media_info(MSIPACKAGE *package, MSIFILE *file, struct media_inf
static UINT ready_media(MSIPACKAGE *package, MSIFILE *file, struct media_info *mi)
{
- UINT rc = ERROR_SUCCESS;
- BOOL found = FALSE;
+ UINT rc = ERROR_SUCCESS, type;
+ BOOL found = TRUE;
+ LPWSTR source_dir;
/* media info for continuous cabinet is already loaded */
if (mi->is_continuous)
@@ -586,9 +606,23 @@ static UINT ready_media(MSIPACKAGE *package, MSIFILE *file, struct media_info *m
return ERROR_FUNCTION_FAILED;
}
+ if (mi->volume_label)
+ {
+ source_dir = msi_dup_property(package, cszSourceDir);
+ PathStripToRootW(source_dir);
+ type = GetDriveTypeW(source_dir);
+
+ if (type == DRIVE_CDROM || type == DRIVE_REMOVABLE)
+ found = source_matches_volume(mi, source_dir);
+
+ msi_free(source_dir);
+ }
+
if (file->IsCompressed &&
GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
{
+ found = FALSE;
+
if (package->BaseURL && UrlIsW(package->BaseURL, URLIS_URL))
{
rc = download_remote_cabinet(package, mi);
@@ -598,11 +632,11 @@ static UINT ready_media(MSIPACKAGE *package, MSIFILE *file, struct media_info *m
found = TRUE;
}
}
-
- if (!found)
- rc = msi_change_media(package, mi);
}
+ if (!found)
+ rc = msi_change_media(package, mi);
+
return rc;
}
More information about the wine-cvs
mailing list