msi: Don't overwrite a file that has a greater or equal version to the source file.

This commit is contained in:
James Hawkins 2008-06-23 23:41:22 -05:00 committed by Alexandre Julliard
parent 1e942d6b1f
commit 89a8cfdb53
1 changed files with 25 additions and 18 deletions

View File

@ -459,6 +459,24 @@ done:
return ret; return ret;
} }
/* compares the version of a file read from the filesystem and
* the version specified in the File table
*/
static int msi_compare_file_version(MSIFILE *file)
{
WCHAR version[MAX_PATH];
DWORD size;
UINT r;
size = MAX_PATH;
version[0] = '\0';
r = MsiGetFileVersionW(file->TargetPath, version, &size, NULL, NULL);
if (r != ERROR_SUCCESS)
return 0;
return lstrcmpW(version, file->Version);
}
void msi_free_media_info( MSIMEDIAINFO *mi ) void msi_free_media_info( MSIMEDIAINFO *mi )
{ {
msi_free( mi->disk_prompt ); msi_free( mi->disk_prompt );
@ -802,6 +820,13 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
continue; continue;
} }
if (MsiGetFileVersionW(file->TargetPath, NULL, NULL, NULL, NULL) == ERROR_SUCCESS &&
msi_compare_file_version(file) >= 0)
{
TRACE("Destination file version greater, not overwriting\n");
continue;
}
if (file->Sequence > mi->last_sequence || mi->is_continuous || if (file->Sequence > mi->last_sequence || mi->is_continuous ||
(file->IsCompressed && !mi->is_extracted)) (file->IsCompressed && !mi->is_extracted))
{ {
@ -972,24 +997,6 @@ UINT ACTION_DuplicateFiles(MSIPACKAGE *package)
return rc; return rc;
} }
/* compares the version of a file read from the filesystem and
* the version specified in the File table
*/
static int msi_compare_file_version( MSIFILE *file )
{
WCHAR version[MAX_PATH];
DWORD size;
UINT r;
size = MAX_PATH;
version[0] = '\0';
r = MsiGetFileVersionW( file->TargetPath, version, &size, NULL, NULL );
if ( r != ERROR_SUCCESS )
return 0;
return lstrcmpW( version, file->Version );
}
UINT ACTION_RemoveFiles( MSIPACKAGE *package ) UINT ACTION_RemoveFiles( MSIPACKAGE *package )
{ {
MSIFILE *file; MSIFILE *file;