msi: Split code to get a file's verion into a separate comment.

This commit is contained in:
Mike McCormack 2006-10-24 17:37:26 +09:00 committed by Alexandre Julliard
parent 8939587b19
commit d1723de566
1 changed files with 44 additions and 33 deletions

View File

@ -1957,6 +1957,39 @@ static UINT ITERATE_CostFinalizeConditions(MSIRECORD *row, LPVOID param)
return ERROR_SUCCESS;
}
LPWSTR msi_get_disk_file_version( LPCWSTR filename )
{
static const WCHAR name_fmt[] =
{'%','u','.','%','u','.','%','u','.','%','u',0};
static WCHAR name[] = {'\\',0};
VS_FIXEDFILEINFO *lpVer;
WCHAR filever[0x100];
LPVOID version;
DWORD versize;
DWORD handle;
UINT sz;
TRACE("%s\n", debugstr_w(filename));
versize = GetFileVersionInfoSizeW( filename, &handle );
if (!versize)
return NULL;
version = msi_alloc( versize );
GetFileVersionInfoW( filename, 0, versize, version );
VerQueryValueW( version, name, (LPVOID*)&lpVer, &sz );
msi_free( version );
sprintfW( filever, name_fmt,
HIWORD(lpVer->dwFileVersionMS),
LOWORD(lpVer->dwFileVersionMS),
HIWORD(lpVer->dwFileVersionLS),
LOWORD(lpVer->dwFileVersionLS));
return strdupW( filever );
}
/*
* A lot is done in this function aside from just the costing.
* The costing needs to be implemented at some point but for now I am going
@ -1980,7 +2013,7 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
MSIFILE *file;
UINT rc;
MSIQUERY * view;
LPWSTR level;
LPWSTR level, file_version;
if ( 1 == msi_get_property_int( package, szCosting, 0 ) )
return ERROR_SUCCESS;
@ -2030,42 +2063,20 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
continue;
}
if (file->Version)
if (file->Version &&
(file_version = msi_get_disk_file_version( file->TargetPath )))
{
DWORD handle;
DWORD versize;
UINT sz;
LPVOID version;
static WCHAR name[] = {'\\',0};
static const WCHAR name_fmt[] =
{'%','u','.','%','u','.','%','u','.','%','u',0};
WCHAR filever[0x100];
VS_FIXEDFILEINFO *lpVer;
TRACE("Version comparison..\n");
versize = GetFileVersionInfoSizeW(file->TargetPath,&handle);
version = msi_alloc(versize);
GetFileVersionInfoW(file->TargetPath, 0, versize, version);
VerQueryValueW(version, name, (LPVOID*)&lpVer, &sz);
sprintfW(filever,name_fmt,
HIWORD(lpVer->dwFileVersionMS),
LOWORD(lpVer->dwFileVersionMS),
HIWORD(lpVer->dwFileVersionLS),
LOWORD(lpVer->dwFileVersionLS));
TRACE("new %s old %s\n", debugstr_w(file->Version),
debugstr_w(filever));
if (strcmpiW(filever,file->Version)<0)
debugstr_w(file_version));
/* FIXME: seems like a bad way to compare version numbers */
if (lstrcmpiW(file_version, file->Version)<0)
{
file->state = msifs_overwrite;
/* FIXME: cost should be diff in size */
comp->Cost += file->FileSize;
}
else
file->state = msifs_present;
msi_free(version);
msi_free( file_version );
}
else
file->state = msifs_present;