Hans Leidekker : msi: Support TrueType font files in MsiGetFileVersion.

Alexandre Julliard julliard at winehq.org
Tue Sep 20 13:08:35 CDT 2011


Module: wine
Branch: master
Commit: 2788a95c8eeae8ce9e03762ff9bdf1b7783d88a7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2788a95c8eeae8ce9e03762ff9bdf1b7783d88a7

Author: Hans Leidekker <hans at 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 */




More information about the wine-cvs mailing list