Author: gadamopoulos
Date: Sun May  1 19:54:23 2016
New Revision: 71227

URL: http://svn.reactos.org/svn/reactos?rev=71227&view=rev
Log:
[SHELL32]
- Remove IExtractIconA_Constructor and rename IExtractIconW_Constructor to 
GenericExtractIcon_CreateInstance which will handle both A and W.
- Make GenericExtractIcon_CreateInstance accept a pointer to a IShellFolder and 
a simple pidl.
- Avoid using SHGetPathFromIDListW. Use ILGetDisplayNameExW instead. May make 
loading icons for folders and exe files slightly faster as it does fewer I/O 
and less allocations.

Modified:
    trunk/reactos/dll/win32/shell32/folders.cpp
    trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp
    trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp
    trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp
    trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp
    trunk/reactos/dll/win32/shell32/wine/shell32_main.h

Modified: trunk/reactos/dll/win32/shell32/folders.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders.cpp?rev=71227&r1=71226&r2=71227&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders.cpp [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/folders.cpp [iso-8859-1] Sun May  1 
19:54:23 2016
@@ -24,7 +24,7 @@
 DWORD NumIconOverlayHandlers = 0;
 IShellIconOverlayIdentifier ** Handlers = NULL;
 
-static HRESULT getIconLocationForFolder(LPCITEMIDLIST pidl, UINT uFlags,
+static HRESULT getIconLocationForFolder(IShellFolder * psf, LPCITEMIDLIST 
pidl, UINT uFlags,
                                         LPWSTR szIconFile, UINT cchMax, int 
*piIndex, UINT *pwFlags)
 {
     static const WCHAR shellClassInfo[] = { '.', 'S', 'h', 'e', 'l', 'l', 'C', 
'l', 'a', 's', 's', 'I', 'n', 'f', 'o', 0 };
@@ -39,7 +39,7 @@
     {
         WCHAR wszFolderPath[MAX_PATH];
 
-        if (!SHGetPathFromIDListW(pidl, wszFolderPath))
+        if (!ILGetDisplayNameExW(psf, pidl, wszFolderPath, 0))
             return FALSE;
 
         PathAppendW(wszFolderPath, wszDesktopIni);
@@ -192,28 +192,20 @@
         return FALSE;
 }
 
-/**************************************************************************
-*  IExtractIconW_Constructor
-*/
-IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl)
+HRESULT GenericExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST 
pidl, REFIID iid, LPVOID * ppvOut)
 {
     CComPtr<IDefaultExtractIconInit>    initIcon;
-    CComPtr<IExtractIconW> extractIcon;
     GUID const * riid;
     int icon_idx;
     UINT flags;
     CHAR sTemp[MAX_PATH];
     WCHAR wTemp[MAX_PATH];
-    LPITEMIDLIST pSimplePidl = ILFindLastID(pidl);
+    LPCITEMIDLIST pSimplePidl = pidl;
     HRESULT hr;
 
     hr = 
SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit,&initIcon));
     if (FAILED(hr))
-        return NULL;
-
-    hr = initIcon->QueryInterface(IID_PPV_ARG(IExtractIconW,&extractIcon));
-    if (FAILED(hr))
-        return NULL;
+        return hr;
 
     if (_ILIsDesktop(pSimplePidl))
     {
@@ -321,7 +313,7 @@
 
     else if (_ILIsFolder (pSimplePidl))
     {
-        if (SUCCEEDED(getIconLocationForFolder(
+        if (SUCCEEDED(getIconLocationForFolder(psf, 
                           pidl, 0, wTemp, MAX_PATH,
                           &icon_idx,
                           &flags)))
@@ -332,21 +324,21 @@
             //        the following line removed.
             initIcon->SetShortcutIcon(wTemp, icon_idx);
         }
-        if (SUCCEEDED(getIconLocationForFolder(
+        if (SUCCEEDED(getIconLocationForFolder(psf, 
                           pidl, GIL_DEFAULTICON, wTemp, MAX_PATH,
                           &icon_idx,
                           &flags)))
         {
             initIcon->SetDefaultIcon(wTemp, icon_idx);
         }
-        // if (SUCCEEDED(getIconLocationForFolder(
+        // if (SUCCEEDED(getIconLocationForFolder(psf, 
         //                   pidl, GIL_FORSHORTCUT, wTemp, MAX_PATH,
         //                   &icon_idx,
         //                   &flags)))
         // {
         //     initIcon->SetShortcutIcon(wTemp, icon_idx);
         // }
-        if (SUCCEEDED(getIconLocationForFolder(
+        if (SUCCEEDED(getIconLocationForFolder(psf, 
                           pidl, GIL_OPENICON, wTemp, MAX_PATH,
                           &icon_idx,
                           &flags)))
@@ -365,7 +357,7 @@
             {
                 if (!lstrcmpA("%1", sTemp)) /* icon is in the file */
                 {
-                    SHGetPathFromIDListW(pidl, wTemp);
+                    ILGetDisplayNameExW(psf, pidl, wTemp, 0);
                     icon_idx = 0;
                 }
                 else
@@ -383,7 +375,7 @@
 
                 if (SUCCEEDED(SHGetDesktopFolder(&dsf)))
                 {
-                    HRESULT hr = dsf->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*) 
&pidl, IID_NULL_PPV_ARG(IShellLinkW, &psl));
+                    HRESULT hr = dsf->GetUIObjectOf(NULL, 1, &pidl, 
IID_NULL_PPV_ARG(IShellLinkW, &psl));
 
                     if (SUCCEEDED(hr))
                     {
@@ -404,24 +396,5 @@
             initIcon->SetNormalIcon(wTemp, icon_idx);
     }
 
-    return extractIcon.Detach();
+    return initIcon->QueryInterface(iid, ppvOut);
 }
-
-/**************************************************************************
-*  IExtractIconA_Constructor
-*/
-IExtractIconA* IExtractIconA_Constructor(LPCITEMIDLIST pidl)
-{
-    CComPtr<IExtractIconW> extractIconW;
-    CComPtr<IExtractIconA> extractIconA;
-    HRESULT hr;
-
-    extractIconW = IExtractIconW_Constructor(pidl);
-    if (!extractIconW)
-        return NULL;
-
-    hr = extractIconW->QueryInterface(IID_PPV_ARG(IExtractIconA, 
&extractIconA));
-    if (FAILED(hr))
-        return NULL;
-    return extractIconA.Detach();
-}

Modified: trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp?rev=71227&r1=71226&r2=71227&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp     
[iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp     
[iso-8859-1] Sun May  1 19:54:23 2016
@@ -125,19 +125,12 @@
     return NULL;
 }
 
-HRESULT CCPLExtractIcon_CreateInstance(LPCITEMIDLIST pidlRoot, LPCITEMIDLIST 
pidl, REFIID riid, LPVOID * ppvOut)
+HRESULT CCPLExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl, 
REFIID riid, LPVOID * ppvOut)
 {
     PIDLCPanelStruct *pData = _ILGetCPanelPointer(pidl);
     if (!pData)
     {
-        LPITEMIDLIST pidlComplete = ILCombine(pidlRoot, pidl);
-        if (!pidlComplete)
-            return E_OUTOFMEMORY;
-
-        *ppvOut = IExtractIconW_Constructor(pidlComplete);
-
-        SHFree(pidlComplete);
-        return *ppvOut ? S_OK : E_FAIL;
+        return GenericExtractIcon_CreateInstance(psf, pidl, riid, ppvOut);
     }
 
     CComPtr<IDefaultExtractIconInit> initIcon;
@@ -508,7 +501,7 @@
         } else if (IsEqualIID(riid, IID_IDataObject) && (cidl >= 1)) {
             hr = IDataObject_Constructor(hwndOwner, pidlRoot, apidl, cidl, 
(IDataObject **)&pObj);
         } else if ((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, 
IID_IExtractIconW)) && (cidl == 1)) {
-            hr = CCPLExtractIcon_CreateInstance(pidlRoot, apidl[0], riid, 
&pObj);
+            hr = CCPLExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
 
         } else if ((IsEqualIID(riid, IID_IShellLinkW) || IsEqualIID(riid, 
IID_IShellLinkA))
                    && (cidl == 1)) {

Modified: trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp?rev=71227&r1=71226&r2=71227&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp  [iso-8859-1] 
(original)
+++ trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp  [iso-8859-1] 
Sun May  1 19:54:23 2016
@@ -590,7 +590,7 @@
     LPVOID *ppvOut)
 {
     LPITEMIDLIST pidl;
-    IUnknown *pObj = NULL;
+    LPVOID pObj = NULL;
     HRESULT hr = E_INVALIDARG;
 
     TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
@@ -609,19 +609,9 @@
     {
         hr = IDataObject_Constructor( hwndOwner, pidlRoot, apidl, cidl, 
(IDataObject **)&pObj);
     }
-    else if (IsEqualIID (riid, IID_IExtractIconA) && (cidl == 1))
-    {
-        pidl = ILCombine (pidlRoot, apidl[0]);
-        pObj = IExtractIconA_Constructor (pidl);
-        SHFree (pidl);
-        hr = S_OK;
-    }
-    else if (IsEqualIID (riid, IID_IExtractIconW) && (cidl == 1))
-    {
-        pidl = ILCombine (pidlRoot, apidl[0]);
-        pObj = IExtractIconW_Constructor (pidl);
-        SHFree (pidl);
-        hr = S_OK;
+    else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, 
IID_IExtractIconW)) && (cidl == 1))
+    {
+        hr = GenericExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
     }
     else if (IsEqualIID (riid, IID_IDropTarget))
     {

Modified: trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp?rev=71227&r1=71226&r2=71227&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp   [iso-8859-1] 
(original)
+++ trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp   [iso-8859-1] 
Sun May  1 19:54:23 2016
@@ -436,7 +436,7 @@
     REFIID riid, UINT *prgfInOut, LPVOID *ppvOut)
 {
     LPITEMIDLIST pidl;
-    IUnknown *pObj = NULL;
+    LPVOID pObj = NULL;
     HRESULT hr = E_INVALIDARG;
 
     TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
@@ -456,19 +456,9 @@
         hr = IDataObject_Constructor (hwndOwner,
                                       pidlRoot, apidl, cidl, (IDataObject 
**)&pObj);
     }
-    else if (IsEqualIID (riid, IID_IExtractIconA) && (cidl == 1))
-    {
-        pidl = ILCombine (pidlRoot, apidl[0]);
-        pObj = IExtractIconA_Constructor (pidl);
-        SHFree (pidl);
-        hr = S_OK;
-    }
-    else if (IsEqualIID (riid, IID_IExtractIconW) && (cidl == 1))
-    {
-        pidl = ILCombine (pidlRoot, apidl[0]);
-        pObj = IExtractIconW_Constructor (pidl);
-        SHFree (pidl);
-        hr = S_OK;
+    else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, 
IID_IExtractIconW)) && (cidl == 1))
+    {
+        hr = GenericExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
     }
     else if (IsEqualIID (riid, IID_IDropTarget) && (cidl >= 1))
     {

Modified: trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp?rev=71227&r1=71226&r2=71227&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp       [iso-8859-1] 
(original)
+++ trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp       [iso-8859-1] 
Sun May  1 19:54:23 2016
@@ -488,7 +488,7 @@
                                         LPVOID * ppvOut)
 {
     LPITEMIDLIST pidl;
-    IUnknown *pObj = NULL;
+    LPVOID pObj = NULL;
     HRESULT hr = E_INVALIDARG;
 
     TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
@@ -515,19 +515,9 @@
                 hr = IDataObject_Constructor (hwndOwner, pidlRoot, 
(LPCITEMIDLIST*)&pidlRoot, 1, (IDataObject **)&pObj);
             }
         }
-        else if (IsEqualIID (riid, IID_IExtractIconA) && (cidl == 1))
-        {
-            pidl = ILCombine (pidlRoot, apidl[0]);
-            pObj = IExtractIconA_Constructor (pidl);
-            SHFree (pidl);
-            hr = S_OK;
-        }
-        else if (IsEqualIID (riid, IID_IExtractIconW) && (cidl == 1))
-        {
-            pidl = ILCombine (pidlRoot, apidl[0]);
-            pObj = IExtractIconW_Constructor (pidl);
-            SHFree (pidl);
-            hr = S_OK;
+        else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, 
IID_IExtractIconW)) && (cidl == 1))
+        {
+            hr = GenericExtractIcon_CreateInstance(this, apidl[0], riid, 
&pObj);
         }
         else if (IsEqualIID (riid, IID_IDropTarget))
         {

Modified: trunk/reactos/dll/win32/shell32/wine/shell32_main.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/wine/shell32_main.h?rev=71227&r1=71226&r2=71227&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/wine/shell32_main.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/wine/shell32_main.h [iso-8859-1] Sun May  1 
19:54:23 2016
@@ -79,8 +79,7 @@
 HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT 
nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) 
DECLSPEC_HIDDEN;
 HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT 
nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) 
DECLSPEC_HIDDEN;
 
-LPEXTRACTICONA IExtractIconA_Constructor(LPCITEMIDLIST) DECLSPEC_HIDDEN;
-LPEXTRACTICONW IExtractIconW_Constructor(LPCITEMIDLIST) DECLSPEC_HIDDEN;
+HRESULT GenericExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST 
pidl, REFIID iid, LPVOID * ppvOut);
 
 /* initialisation for FORMATETC */
 #define InitFormatEtc(fe, cf, med) \


Reply via email to