msi: Split code to get a file's verion into a separate comment.
This commit is contained in:
parent
8939587b19
commit
d1723de566
|
@ -1957,6 +1957,39 @@ static UINT ITERATE_CostFinalizeConditions(MSIRECORD *row, LPVOID param)
|
||||||
return ERROR_SUCCESS;
|
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.
|
* 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
|
* 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;
|
MSIFILE *file;
|
||||||
UINT rc;
|
UINT rc;
|
||||||
MSIQUERY * view;
|
MSIQUERY * view;
|
||||||
LPWSTR level;
|
LPWSTR level, file_version;
|
||||||
|
|
||||||
if ( 1 == msi_get_property_int( package, szCosting, 0 ) )
|
if ( 1 == msi_get_property_int( package, szCosting, 0 ) )
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
|
@ -2030,42 +2063,20 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
|
||||||
continue;
|
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),
|
TRACE("new %s old %s\n", debugstr_w(file->Version),
|
||||||
debugstr_w(filever));
|
debugstr_w(file_version));
|
||||||
if (strcmpiW(filever,file->Version)<0)
|
/* FIXME: seems like a bad way to compare version numbers */
|
||||||
|
if (lstrcmpiW(file_version, file->Version)<0)
|
||||||
{
|
{
|
||||||
file->state = msifs_overwrite;
|
file->state = msifs_overwrite;
|
||||||
/* FIXME: cost should be diff in size */
|
|
||||||
comp->Cost += file->FileSize;
|
comp->Cost += file->FileSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
file->state = msifs_present;
|
file->state = msifs_present;
|
||||||
msi_free(version);
|
msi_free( file_version );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
file->state = msifs_present;
|
file->state = msifs_present;
|
||||||
|
|
Loading…
Reference in New Issue