winemenubuilder: also extract .lnk icons from file types's open handler (try 2)

Damjan Jovanovic damjan.jov at gmail.com
Tue Jun 8 15:05:04 CDT 2010


Changelog:
* winemenubuilder: also extract .lnk icons from file types's open handler

Try 2 doesn't leak memory.

Damjan Jovanovic
-------------- next part --------------
diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index 276c4e4..3abfc39 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -819,10 +819,11 @@ static int ExtractFromICO(LPCWSTR szFileName, char *szXPMFileName)
 
 static int ExtractFromFileType(LPCWSTR szFileName, char *szXPMFileName)
 {
-    int ret = 1;
+    int ret = 0;
     WCHAR *extension;
     WCHAR *icon = NULL;
     WCHAR *comma;
+    WCHAR *executable = NULL;
     int index = 0;
     char *output_path = NULL;
 
@@ -831,21 +832,30 @@ static int ExtractFromFileType(LPCWSTR szFileName, char *szXPMFileName)
         goto end;
 
     icon = assoc_query(ASSOCSTR_DEFAULTICON, extension, NULL);
-    if (icon == NULL)
-        goto end;
-
-    comma = strrchrW(icon, ',');
-    if (comma)
+    if (icon)
+    {
+        comma = strrchrW(icon, ',');
+        if (comma)
+        {
+            *comma = 0;
+            index = atoiW(comma + 1);
+        }
+        output_path = extract_icon(icon, index, NULL, FALSE);
+        WINE_TRACE("defaulticon %s -> icon %s\n", wine_dbgstr_w(icon), wine_dbgstr_a(output_path));
+    }
+    else
     {
-        *comma = 0;
-        index = atoiW(comma + 1);
+        executable = assoc_query(ASSOCSTR_EXECUTABLE, extension, NULL);
+        if (executable)
+            output_path = extract_icon(executable, 0, NULL, FALSE);
+        WINE_TRACE("executable %s -> icon %s\n", wine_dbgstr_w(executable), wine_dbgstr_a(output_path));
     }
-    output_path = extract_icon(icon, index, NULL, FALSE);
     if (output_path)
-        ret = rename(output_path, szXPMFileName);
+        ret = (rename(output_path, szXPMFileName) == 0);
 
 end:
     HeapFree(GetProcessHeap(), 0, icon);
+    HeapFree(GetProcessHeap(), 0, executable);
     HeapFree(GetProcessHeap(), 0, output_path);
     return ret;
 }


More information about the wine-patches mailing list