Module: wine Branch: master Commit: 2788a95c8eeae8ce9e03762ff9bdf1b7783d88a7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2788a95c8eeae8ce9e03762ff9...
Author: Hans Leidekker hans@codeweavers.com Date: Tue Sep 20 11:31:41 2011 +0200
msi: Support TrueType font files in MsiGetFileVersion.
---
dlls/msi/action.c | 2 +- dlls/msi/files.c | 2 +- dlls/msi/font.c | 11 ++++- dlls/msi/msi.c | 134 ++++++++++++++++++++++++++-------------------------- dlls/msi/msipriv.h | 2 +- 5 files changed, 79 insertions(+), 72 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c index 478addd..d81c9b7 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -2196,7 +2196,7 @@ static UINT calculate_file_cost( MSIPACKAGE *package ) msi_free( file_version ); continue; } - else if ((font_version = font_version_from_file( file->TargetPath ))) + else if ((font_version = msi_font_version_from_file( file->TargetPath ))) { if (msi_compare_font_versions( font_version, file->Version ) < 0) { diff --git a/dlls/msi/files.c b/dlls/msi/files.c index 9aa2098..210e012 100644 --- a/dlls/msi/files.c +++ b/dlls/msi/files.c @@ -103,7 +103,7 @@ static msi_file_state calculate_install_state( MSIPACKAGE *package, MSIFILE *fil msi_free( file_version ); return state; } - else if ((font_version = font_version_from_file( file->TargetPath ))) + else if ((font_version = msi_font_version_from_file( file->TargetPath ))) { TRACE("new %s old %s\n", debugstr_w(file->Version), debugstr_w(font_version));
diff --git a/dlls/msi/font.c b/dlls/msi/font.c index df8b81f..df7b4e7 100644 --- a/dlls/msi/font.c +++ b/dlls/msi/font.c @@ -186,15 +186,22 @@ static WCHAR *font_name_from_file( const WCHAR *filename ) return ret; }
-WCHAR *font_version_from_file( const WCHAR *filename ) +WCHAR *msi_font_version_from_file( const WCHAR *filename ) { + static const WCHAR dotzerodotzeroW[] = {'.','0','.','0',0}; WCHAR *version, *p, *ret = NULL; + int len;
if ((p = version = load_ttf_name_id( filename, NAME_ID_VERSION ))) { while (*p && !isdigitW( *p )) p++; - ret = msi_alloc( (strlenW( p ) + 1) * sizeof(WCHAR) ); + len = strlenW( p ) + strlenW(dotzerodotzeroW) + 1; + ret = msi_alloc( len * sizeof(WCHAR) ); strcpyW( ret, p ); + if ((p = strchrW( p, '.' )) && !(p = strchrW( p + 1, '.' ))) + { + strcatW( ret, dotzerodotzeroW ); + } msi_free( version ); } return ret; diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index 7506338..c1ebe17 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -3017,11 +3017,8 @@ end: return ret; }
-/****************************************************************** - * MsiGetFileVersionW [MSI.@] - */ -UINT WINAPI MsiGetFileVersionW(LPCWSTR szFilePath, LPWSTR lpVersionBuf, - LPDWORD pcchVersionBuf, LPWSTR lpLangBuf, LPDWORD pcchLangBuf) +static UINT get_file_version( const WCHAR *path, WCHAR *verbuf, DWORD *verlen, + WCHAR *langbuf, DWORD *langlen ) { static const WCHAR szVersionResource[] = {'\',0}; static const WCHAR szVersionFormat[] = { @@ -3030,91 +3027,94 @@ UINT WINAPI MsiGetFileVersionW(LPCWSTR szFilePath, LPWSTR lpVersionBuf, '\','V','a','r','F','i','l','e','I','n','f','o','\', 'T','r','a','n','s','l','a','t','i','o','n',0}; static const WCHAR szLangFormat[] = {'%','d',0}; - UINT ret = 0; - DWORD dwVerLen, gle; - LPVOID lpVer = NULL; + UINT ret = ERROR_SUCCESS; + DWORD len, error; + LPVOID version; VS_FIXEDFILEINFO *ffi; USHORT *lang; - UINT puLen; WCHAR tmp[32];
- TRACE("%s %p %d %p %d\n", debugstr_w(szFilePath), - lpVersionBuf, pcchVersionBuf?*pcchVersionBuf:0, - lpLangBuf, pcchLangBuf?*pcchLangBuf:0); - - if ((lpVersionBuf && !pcchVersionBuf) || - (lpLangBuf && !pcchLangBuf)) - return ERROR_INVALID_PARAMETER; - - dwVerLen = GetFileVersionInfoSizeW(szFilePath, NULL); - if( !dwVerLen ) + if (!(len = GetFileVersionInfoSizeW( path, NULL ))) { - gle = GetLastError(); - if (gle == ERROR_BAD_PATHNAME) - return ERROR_FILE_NOT_FOUND; - else if (gle == ERROR_RESOURCE_DATA_NOT_FOUND) - return ERROR_FILE_INVALID; - - return gle; + error = GetLastError(); + if (error == ERROR_BAD_PATHNAME) return ERROR_FILE_NOT_FOUND; + return error; } - - lpVer = msi_alloc(dwVerLen); - if( !lpVer ) + if (!(version = msi_alloc( len ))) return ERROR_OUTOFMEMORY; + if (!GetFileVersionInfoW( path, 0, len, version )) { - ret = ERROR_OUTOFMEMORY; - goto end; + msi_free( version ); + return GetLastError(); } - - if( !GetFileVersionInfoW(szFilePath, 0, dwVerLen, lpVer) ) + if (verlen) { - ret = GetLastError(); - goto end; - } - - if (pcchVersionBuf) - { - if( VerQueryValueW(lpVer, szVersionResource, (LPVOID*)&ffi, &puLen) && - (puLen > 0) ) + if (VerQueryValueW( version, szVersionResource, (LPVOID *)&ffi, &len ) && len > 0) { - wsprintfW(tmp, szVersionFormat, - HIWORD(ffi->dwFileVersionMS), LOWORD(ffi->dwFileVersionMS), - HIWORD(ffi->dwFileVersionLS), LOWORD(ffi->dwFileVersionLS)); - if (lpVersionBuf) lstrcpynW(lpVersionBuf, tmp, *pcchVersionBuf); - - if (strlenW(tmp) >= *pcchVersionBuf) - ret = ERROR_MORE_DATA; - - *pcchVersionBuf = lstrlenW(tmp); + sprintfW( tmp, szVersionFormat, + HIWORD(ffi->dwFileVersionMS), LOWORD(ffi->dwFileVersionMS), + HIWORD(ffi->dwFileVersionLS), LOWORD(ffi->dwFileVersionLS) ); + if (verbuf) lstrcpynW( verbuf, tmp, *verlen ); + len = strlenW( tmp ); + if (len >= *verlen) ret = ERROR_MORE_DATA; + *verlen = len; } else { - if (lpVersionBuf) *lpVersionBuf = 0; - *pcchVersionBuf = 0; + if (verbuf) *verbuf = 0; + *verlen = 0; } } - - if (pcchLangBuf) + if (langlen) { - if (VerQueryValueW(lpVer, szLangResource, (LPVOID*)&lang, &puLen) && - (puLen > 0)) + if (VerQueryValueW( version, szLangResource, (LPVOID *)&lang, &len ) && len > 0) { - wsprintfW(tmp, szLangFormat, *lang); - if (lpLangBuf) lstrcpynW(lpLangBuf, tmp, *pcchLangBuf); - - if (strlenW(tmp) >= *pcchLangBuf) - ret = ERROR_MORE_DATA; - - *pcchLangBuf = lstrlenW(tmp); + sprintfW( tmp, szLangFormat, *lang ); + if (langbuf) lstrcpynW( langbuf, tmp, *langlen ); + len = strlenW( tmp ); + if (len >= *langlen) ret = ERROR_MORE_DATA; + *langlen = len; } else { - if (lpLangBuf) *lpLangBuf = 0; - *pcchLangBuf = 0; + if (langbuf) *langbuf = 0; + *langlen = 0; } } + msi_free( version ); + return ret; +}
-end: - msi_free(lpVer); + +/****************************************************************** + * MsiGetFileVersionW [MSI.@] + */ +UINT WINAPI MsiGetFileVersionW( LPCWSTR path, LPWSTR verbuf, LPDWORD verlen, + LPWSTR langbuf, LPDWORD langlen ) +{ + UINT ret; + + TRACE("%s %p %u %p %u\n", debugstr_w(path), verbuf, verlen ? *verlen : 0, + langbuf, langlen ? *langlen : 0); + + if ((verbuf && !verlen) || (langbuf && !langlen)) + return ERROR_INVALID_PARAMETER; + + ret = get_file_version( path, verbuf, verlen, langbuf, langlen ); + if (ret == ERROR_RESOURCE_DATA_NOT_FOUND) + { + int len; + WCHAR *version = msi_font_version_from_file( path ); + if (!version) return ERROR_FILE_INVALID; + len = strlenW( version ); + if (*verlen > len) + { + strcpyW( verbuf, version ); + ret = ERROR_SUCCESS; + } + else ret = ERROR_MORE_DATA; + *verlen = len; + msi_free( version ); + } return ret; }
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 7fbab61..2c38d66 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -1022,7 +1022,7 @@ extern MSIASSEMBLY *msi_load_assembly(MSIPACKAGE *, MSICOMPONENT *) DECLSPEC_HID extern UINT msi_install_assembly(MSIPACKAGE *, MSICOMPONENT *) DECLSPEC_HIDDEN; extern BOOL msi_init_assembly_caches(MSIPACKAGE *) DECLSPEC_HIDDEN; extern void msi_destroy_assembly_caches(MSIPACKAGE *) DECLSPEC_HIDDEN; -extern WCHAR *font_version_from_file(const WCHAR *) DECLSPEC_HIDDEN; +extern WCHAR *msi_font_version_from_file(const WCHAR *) DECLSPEC_HIDDEN; extern WCHAR **msi_split_string(const WCHAR *, WCHAR) DECLSPEC_HIDDEN;
/* media */