Author: jgardou
Date: Tue Oct 16 14:28:08 2012
New Revision: 57567
URL:
http://svn.reactos.org/svn/reactos?rev=57567&view=rev
Log:
[SHELL32]
- Beautify some code, plug icons leak and improve error handling
Modified:
trunk/reactos/dll/win32/shell32/iconcache.cpp
Modified: trunk/reactos/dll/win32/shell32/iconcache.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/iconcach…
==============================================================================
--- trunk/reactos/dll/win32/shell32/iconcache.cpp [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/iconcache.cpp [iso-8859-1] Tue Oct 16 14:28:08 2012
@@ -367,6 +367,7 @@
LeaveCriticalSection(&SHELL32_SicCS);
return ret;
}
+
/*****************************************************************************
* SIC_Initialize [internal]
*/
@@ -378,6 +379,7 @@
HDC hDC;
INT bpp;
DWORD ilMask;
+ BOOL result = FALSE;
TRACE("Entered SIC_Initialize\n");
@@ -397,11 +399,11 @@
if (!hDC)
{
ERR("Failed to create information context (error %d)\n",
GetLastError());
- return FALSE;
+ goto end;
}
bpp = GetDeviceCaps(hDC, BITSPIXEL);
- ReleaseDC(NULL, hDC);
+ DeleteDC(hDC);
if (bpp <= 4)
ilMask = ILC_COLOR4;
@@ -428,61 +430,83 @@
ilMask,
100,
100);
+ if (!ShellSmallIconList)
+ {
+ ERR("Failed to create the small icon list.\n");
+ goto end;
+ }
ShellBigIconList = ImageList_Create(cx_large,
cy_large,
ilMask,
100,
100);
- if (ShellSmallIconList)
- {
- /* Load the document icon, which is used as the default if an icon isn't
found. */
- hSm = (HICON)LoadImageW(shell32_hInstance,
- MAKEINTRESOURCEW(IDI_SHELL_DOCUMENT),
- IMAGE_ICON,
- cx_small,
- cy_small,
- LR_SHARED | LR_DEFAULTCOLOR);
- if (!hSm)
- {
- ERR("Failed to load IDI_SHELL_DOCUMENT icon1!\n");
- return FALSE;
- }
- }
- else
- {
- ERR("Failed to load ShellSmallIconList\n");
- return FALSE;
- }
-
- if (ShellBigIconList)
- {
- hLg = (HICON)LoadImageW(shell32_hInstance,
- MAKEINTRESOURCEW(IDI_SHELL_DOCUMENT),
- IMAGE_ICON,
- cx_large,
- cy_large,
- LR_SHARED | LR_DEFAULTCOLOR);
- if (!hLg)
- {
- ERR("Failed to load IDI_SHELL_DOCUMENT icon2!\n");
- DestroyIcon(hSm);
- return FALSE;
- }
- }
- else
- {
- ERR("Failed to load ShellBigIconList\n");
- return FALSE;
- }
-
- SIC_IconAppend(swShell32Name, IDI_SHELL_DOCUMENT-1, hSm, hLg, 0);
- SIC_IconAppend(swShell32Name, -IDI_SHELL_DOCUMENT, hSm, hLg, 0);
+ if (!ShellBigIconList)
+ {
+ ERR("Failed to create the big icon list.\n");
+ goto end;
+ }
+
+ /* Load the document icon, which is used as the default if an icon isn't found.
*/
+ hSm = (HICON)LoadImageW(shell32_hInstance,
+ MAKEINTRESOURCEW(IDI_SHELL_DOCUMENT),
+ IMAGE_ICON,
+ cx_small,
+ cy_small,
+ LR_SHARED | LR_DEFAULTCOLOR);
+ if (!hSm)
+ {
+ ERR("Failed to load small IDI_SHELL_DOCUMENT icon!\n");
+ goto end;
+ }
+
+ hLg = (HICON)LoadImageW(shell32_hInstance,
+ MAKEINTRESOURCEW(IDI_SHELL_DOCUMENT),
+ IMAGE_ICON,
+ cx_large,
+ cy_large,
+ LR_SHARED | LR_DEFAULTCOLOR);
+ if (!hLg)
+ {
+ ERR("Failed to load large IDI_SHELL_DOCUMENT icon!\n");
+ goto end;
+ }
+
+ if(SIC_IconAppend(swShell32Name, IDI_SHELL_DOCUMENT-1, hSm, hLg, 0) ==
INVALID_INDEX)
+ {
+ ERR("Failed to add IDI_SHELL_DOCUMENT icon to cache.\n");
+ goto end;
+ }
+ if(SIC_IconAppend(swShell32Name, -IDI_SHELL_DOCUMENT, hSm, hLg, 0) == INVALID_INDEX)
+ {
+ ERR("Failed to add IDI_SHELL_DOCUMENT icon to cache.\n");
+ goto end;
+ }
+
+ /* Everything went fine */
+ result = TRUE;
+
+end:
+ /* The image list keeps a copy of the icons, we must destroy them */
+ if(hSm) DestroyIcon(hSm);
+ if(hLg) DestroyIcon(hLg);
+
+ /* Clean everything if something went wrong */
+ if(!result)
+ {
+ if(sic_hdpa) DPA_Destroy(sic_hdpa);
+ if(ShellSmallIconList) ImageList_Destroy(ShellSmallIconList);
+ if(ShellBigIconList) ImageList_Destroy(ShellSmallIconList);
+ sic_hdpa = NULL;
+ ShellSmallIconList = NULL;
+ ShellBigIconList = NULL;
+ }
TRACE("hIconSmall=%p hIconBig=%p\n",ShellSmallIconList, ShellBigIconList);
- return TRUE;
-}
+ return result;
+}
+
/*************************************************************************
* SIC_Destroy
*