msi: Only perform the media check if the label of the disk entry differs from the last.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=40433
Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hans Leidekker 2019-01-07 08:55:15 +01:00 committed by Alexandre Julliard
parent a853bb6d0a
commit 85fea53af8
2 changed files with 18 additions and 9 deletions

View File

@ -664,6 +664,7 @@ void msi_free_media_info(MSIMEDIAINFO *mi)
msi_free(mi->disk_prompt); msi_free(mi->disk_prompt);
msi_free(mi->cabinet); msi_free(mi->cabinet);
msi_free(mi->volume_label); msi_free(mi->volume_label);
msi_free(mi->last_volume);
msi_free(mi); msi_free(mi);
} }
@ -898,20 +899,27 @@ UINT ready_media( MSIPACKAGE *package, BOOL compressed, MSIMEDIAINFO *mi )
} }
} }
/* check volume matches, change media if not */ /* check volume matches, change media if not */
if (mi->volume_label && mi->disk_id > 1) if (mi->volume_label)
{ {
WCHAR *source = msi_dup_property( package->db, szSourceDir ); /* assume first volume is in the drive */
BOOL match = source_matches_volume( mi, source ); if (mi->last_volume && strcmpiW( mi->last_volume, mi->volume_label ))
msi_free( source );
if (!match && (mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE))
{ {
if ((rc = msi_change_media( package, mi )) != ERROR_SUCCESS) WCHAR *source = msi_dup_property( package->db, szSourceDir );
BOOL match = source_matches_volume( mi, source );
msi_free( source );
if (!match && (mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE))
{ {
msi_free( cabinet_file ); if ((rc = msi_change_media( package, mi )) != ERROR_SUCCESS)
return rc; {
msi_free( cabinet_file );
return rc;
}
} }
} }
msi_free(mi->last_volume);
mi->last_volume = strdupW(mi->volume_label);
} }
if (mi->cabinet) if (mi->cabinet)
{ {

View File

@ -173,6 +173,7 @@ typedef struct tagMSIMEDIAINFO
LPWSTR disk_prompt; LPWSTR disk_prompt;
LPWSTR cabinet; LPWSTR cabinet;
LPWSTR volume_label; LPWSTR volume_label;
LPWSTR last_volume;
BOOL is_continuous; BOOL is_continuous;
BOOL is_extracted; BOOL is_extracted;
WCHAR sourcedir[MAX_PATH]; WCHAR sourcedir[MAX_PATH];