Francois Gouget : winemenubuilder: Use the same icon name on Mac OS X as on Unix.

Alexandre Julliard julliard at winehq.org
Fri Nov 2 15:52:01 CDT 2012


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

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Thu Nov  1 23:20:13 2012 +0100

winemenubuilder: Use the same icon name on Mac OS X as on Unix.

---

 programs/winemenubuilder/winemenubuilder.c |   82 ++++++++++++----------------
 1 files changed, 36 insertions(+), 46 deletions(-)

diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index 96ec29d..8c941e2 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -199,7 +199,6 @@ static WCHAR* assoc_query(ASSOCSTR assocStr, LPCWSTR name, LPCWSTR extra);
 static HRESULT open_icon(LPCWSTR filename, int index, BOOL bWait, IStream **ppStream);
 
 /* Utility routines */
-#ifndef __APPLE__
 static unsigned short crc16(const char* string)
 {
     unsigned short crc = 0;
@@ -218,7 +217,6 @@ static unsigned short crc16(const char* string)
     }
     return crc;
 }
-#endif
 
 static char *strdupA( const char *str )
 {
@@ -1069,6 +1067,35 @@ static HRESULT open_icon(LPCWSTR filename, int index, BOOL bWait, IStream **ppSt
     return hr;
 }
 
+static char* compute_native_identifier(int exeIndex, LPCWSTR icoPathW)
+{
+    char* nativeIdentifier;
+    char *icoPathA;
+    unsigned short crc;
+    char *basename, *ext;
+
+    icoPathA = wchars_to_utf8_chars(icoPathW);
+    if (icoPathA == NULL)
+        return NULL;
+
+    crc = crc16(icoPathA);
+    basename = strrchr(icoPathA, '\\');
+    if (basename == NULL)
+        basename = icoPathA;
+    else
+    {
+        *basename = 0;
+        basename++;
+    }
+    ext = strrchr(basename, '.');
+    if (ext)
+        *ext = 0;
+
+    nativeIdentifier = heap_printf("%04X_%s.%d", crc, basename, exeIndex);
+    HeapFree(GetProcessHeap(), 0, icoPathA);
+    return nativeIdentifier;
+}
+
 #ifdef __APPLE__
 #define ICNS_SLOTS 6
 
@@ -1102,9 +1129,6 @@ static HRESULT platform_write_icon(IStream *icoStream, int exeIndex, LPCWSTR ico
     } best[ICNS_SLOTS];
     int indexes[ICNS_SLOTS];
     int i;
-    GUID guid;
-    WCHAR *guidStrW = NULL;
-    char *guidStrA = NULL;
     char *icnsPath = NULL;
     LARGE_INTEGER zero;
     HRESULT hr;
@@ -1165,26 +1189,16 @@ static HRESULT platform_write_icon(IStream *icoStream, int exeIndex, LPCWSTR ico
         }
     }
 
-    hr = CoCreateGuid(&guid);
-    if (FAILED(hr))
-    {
-        WINE_WARN("CoCreateGuid failed, error 0x%08X\n", hr);
-        goto end;
-    }
-    hr = StringFromCLSID(&guid, &guidStrW);
-    if (FAILED(hr))
-    {
-        WINE_WARN("StringFromCLSID failed, error 0x%08X\n", hr);
-        goto end;
-    }
-    guidStrA = wchars_to_utf8_chars(guidStrW);
-    if (guidStrA == NULL)
+    if (destFilename)
+        *nativeIdentifier = heap_printf("%s", destFilename);
+    else
+        *nativeIdentifier = compute_native_identifier(exeIndex, icoPathW);
+    if (*nativeIdentifier == NULL)
     {
         hr = E_OUTOFMEMORY;
-        WINE_WARN("out of memory converting GUID string\n");
         goto end;
     }
-    icnsPath = heap_printf("/tmp/%s.icns", guidStrA);
+    icnsPath = heap_printf("/tmp/%s.icns", *nativeIdentifier);
     if (icnsPath == NULL)
     {
         hr = E_OUTOFMEMORY;
@@ -1209,8 +1223,6 @@ static HRESULT platform_write_icon(IStream *icoStream, int exeIndex, LPCWSTR ico
 
 end:
     HeapFree(GetProcessHeap(), 0, iconDirEntries);
-    CoTaskMemFree(guidStrW);
-    HeapFree(GetProcessHeap(), 0, guidStrA);
     if (SUCCEEDED(hr))
         *nativeIdentifier = icnsPath;
     else
@@ -1244,10 +1256,7 @@ static HRESULT platform_write_icon(IStream *icoStream, int exeIndex, LPCWSTR ico
     ICONDIRENTRY *iconDirEntries = NULL;
     int numEntries;
     int i;
-    char *icoPathA = NULL;
     char *iconsDir = NULL;
-    unsigned short crc;
-    char *p, *q;
     HRESULT hr = S_OK;
     LARGE_INTEGER zero;
 
@@ -1255,28 +1264,10 @@ static HRESULT platform_write_icon(IStream *icoStream, int exeIndex, LPCWSTR ico
     if (FAILED(hr))
         goto end;
 
-    icoPathA = wchars_to_utf8_chars(icoPathW);
-    if (icoPathA == NULL)
-    {
-        hr = E_OUTOFMEMORY;
-        goto end;
-    }
-    crc = crc16(icoPathA);
-    p = strrchr(icoPathA, '\\');
-    if (p == NULL)
-        p = icoPathA;
-    else
-    {
-        *p = 0;
-        p++;
-    }
-    q = strrchr(p, '.');
-    if (q)
-        *q = 0;
     if (destFilename)
         *nativeIdentifier = heap_printf("%s", destFilename);
     else
-        *nativeIdentifier = heap_printf("%04X_%s.%d", crc, p, exeIndex);
+        *nativeIdentifier = compute_native_identifier(exeIndex, icoPathW);
     if (*nativeIdentifier == NULL)
     {
         hr = E_OUTOFMEMORY;
@@ -1353,7 +1344,6 @@ static HRESULT platform_write_icon(IStream *icoStream, int exeIndex, LPCWSTR ico
 
 end:
     HeapFree(GetProcessHeap(), 0, iconDirEntries);
-    HeapFree(GetProcessHeap(), 0, icoPathA);
     HeapFree(GetProcessHeap(), 0, iconsDir);
     return hr;
 }




More information about the wine-cvs mailing list