Shell: Cleanup Custom Icons
Robert Shearman
rob at codeweavers.com
Tue Sep 28 06:39:33 CDT 2004
Hi,
This patch uses the new function introduced in the custom folders patch
to significantly reduce the size and complexity of the custom icons code.
Rob
Changelog:
Simplify getting custom icons for a folder by utilising the new
SHELL32_GetCustomFolderAttribute function.
-------------- next part --------------
Index: wine/dlls/shell32/folders.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/folders.c,v
retrieving revision 1.50
diff -u -p -r1.50 folders.c
--- wine/dlls/shell32/folders.c 9 Sep 2004 20:17:08 -0000 1.50
+++ wine/dlls/shell32/folders.c 26 Sep 2004 13:24:24 -0000
@@ -27,6 +27,7 @@
#include "windef.h"
#include "winbase.h"
+#include "winerror.h"
#include "objbase.h"
#include "undocshell.h"
#include "shlguid.h"
@@ -34,10 +35,11 @@
#include "shlwapi.h"
#include "wine/debug.h"
-#include "winerror.h"
+#include "wine/unicode.h"
#include "pidl.h"
#include "shell32_main.h"
+#include "shfldr.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell);
@@ -156,64 +158,36 @@ static HRESULT getIconLocationForFolder(
LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags)
{
IExtractIconWImpl *This = (IExtractIconWImpl *)iface;
-
- WCHAR path[MAX_PATH];
- BOOL found = FALSE;
DWORD dwNr;
+ WCHAR wszPath[MAX_PATH];
+ WCHAR wszCLSIDValue[CHARS_IN_GUID];
+ static const WCHAR shellClassInfo[] = { '.','S','h','e','l','l','C','l','a','s','s','I','n','f','o',0 };
+ static const WCHAR iconFile[] = { 'I','c','o','n','F','i','l','e',0 };
+ static const WCHAR clsid[] = { 'C','L','S','I','D',0 };
+ static const WCHAR clsid2[] = { 'C','L','S','I','D','2',0 };
+ static const WCHAR iconIndex[] = { 'I','c','o','n','I','n','d','e','x',0 };
- if (SUCCEEDED(SHGetPathFromIDListW(This->pidl, path)))
+ if (SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, iconFile,
+ wszPath, MAX_PATH))
+ {
+ WCHAR wszIconIndex[10];
+ SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, iconIndex,
+ wszIconIndex, 10);
+ *piIndex = atoiW(wszIconIndex);
+ }
+ else if (SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, clsid,
+ wszCLSIDValue, CHARS_IN_GUID) &&
+ HCR_GetDefaultIconW(wszCLSIDValue, szIconFile, cchMax, &dwNr))
+ {
+ *piIndex = dwNr;
+ }
+ else if (SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, clsid2,
+ wszCLSIDValue, CHARS_IN_GUID) &&
+ HCR_GetDefaultIconW(wszCLSIDValue, szIconFile, cchMax, &dwNr))
{
- static const WCHAR desktopIni[] = { 'D','e','s','k','t','o','p','.',
- 'i','n','i',0 };
- HANDLE hFile;
-
- PathAppendW(path, desktopIni);
- if ((hFile = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, NULL,
- OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE)
- {
- static const WCHAR shellClassInfo[] = { '.','S','h','e','l','l',
- 'C','l','a','s','s','I','n','f','o',0 };
- static const WCHAR iconFile[] =
- { 'I','c','o','n','F','i','l','e',0 };
- static const WCHAR clsid[] = { 'C','L','S','I','D',0 };
- static const WCHAR clsid2[] = { 'C','L','S','I','D','2',0 };
- static const WCHAR defStr[] = { 0 };
- WCHAR clsidStr[39];
-
- CloseHandle(hFile);
- if (GetPrivateProfileStringW(shellClassInfo, iconFile, defStr,
- szIconFile, cchMax, path) && strlenW(szIconFile))
- {
- static const WCHAR iconIndex[] = { 'I','c','o','n',
- 'I','n','d','e','x',0 };
-
- found = TRUE;
- *piIndex = (int)GetPrivateProfileIntW(shellClassInfo, iconIndex,
- 0, path);
- }
- else if (GetPrivateProfileStringW(shellClassInfo, clsid, defStr,
- clsidStr, sizeof(clsidStr) / sizeof(WCHAR), path) &&
- strlenW(clsidStr))
- {
- if (HCR_GetDefaultIconW(clsidStr, szIconFile, cchMax, &dwNr))
- {
- *piIndex = dwNr;
- found = TRUE;
- }
- }
- else if (GetPrivateProfileStringW(shellClassInfo, clsid2, defStr,
- clsidStr, sizeof(clsidStr) / sizeof(WCHAR), path) &&
- strlenW(clsidStr))
- {
- if (HCR_GetDefaultIconW(clsidStr, szIconFile, cchMax, &dwNr))
- {
- *piIndex = dwNr;
- found = TRUE;
- }
- }
- }
+ *piIndex = dwNr;
}
- if (!found)
+ else
{
static const WCHAR folder[] = { 'F','o','l','d','e','r',0 };
More information about the wine-patches
mailing list