Mike McCormack : msi: Split code to get a file'
s verion into a separate comment.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Oct 24 04:55:32 CDT 2006
Module: wine
Branch: master
Commit: d1723de5661a502c847d6d05ef9512ec622ee113
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d1723de5661a502c847d6d05ef9512ec622ee113
Author: Mike McCormack <mike at codeweavers.com>
Date: Tue Oct 24 17:37:26 2006 +0900
msi: Split code to get a file's verion into a separate comment.
---
dlls/msi/action.c | 77 ++++++++++++++++++++++++++++++----------------------
1 files changed, 44 insertions(+), 33 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 66504e8..84275f9 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -1957,7 +1957,40 @@ static UINT ITERATE_CostFinalizeConditio
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
* to focus on the directory building
@@ -1980,11 +2013,11 @@ static UINT ACTION_CostFinalize(MSIPACKA
MSIFILE *file;
UINT rc;
MSIQUERY * view;
- LPWSTR level;
+ LPWSTR level, file_version;
if ( 1 == msi_get_property_int( package, szCosting, 0 ) )
return ERROR_SUCCESS;
-
+
TRACE("Building Directory properties\n");
rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
@@ -2014,14 +2047,14 @@ static UINT ACTION_CostFinalize(MSIPACKA
msi_free(file->TargetPath);
TRACE("file %s is named %s\n",
- debugstr_w(file->File),debugstr_w(file->FileName));
+ debugstr_w(file->File), debugstr_w(file->FileName));
file->TargetPath = build_directory_name(2, p, file->FileName);
msi_free(p);
TRACE("file %s resolves to %s\n",
- debugstr_w(file->File),debugstr_w(file->TargetPath));
+ debugstr_w(file->File), debugstr_w(file->TargetPath));
if (GetFileAttributesW(file->TargetPath) == INVALID_FILE_ATTRIBUTES)
{
@@ -2030,42 +2063,20 @@ static UINT ACTION_CostFinalize(MSIPACKA
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;
More information about the wine-cvs
mailing list