Author: gadamopoulos Date: Sat Apr 30 15:30:59 2016 New Revision: 71217
URL: http://svn.reactos.org/svn/reactos?rev=71217&view=rev Log: [SHELL32] - Get rid of CPrintersExtractIconW and add CPrintersExtractIconW_CreateInstane which creates and initializes CExtractIcon. - Also add CNetFolderExtractIcon_CreateInstance and CRecyclerExtractIcon_CreateInstance.
Modified: trunk/reactos/dll/win32/shell32/folders/CNetFolder.cpp trunk/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp trunk/reactos/dll/win32/shell32/folders/CRecycleBin.cpp
Modified: trunk/reactos/dll/win32/shell32/folders/CNetFolder.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/C... ============================================================================== --- trunk/reactos/dll/win32/shell32/folders/CNetFolder.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/folders/CNetFolder.cpp [iso-8859-1] Sat Apr 30 15:30:59 2016 @@ -47,6 +47,18 @@ * IShellFolder implementation */
+HRESULT CNetFolderExtractIcon_CreateInstance(LPCITEMIDLIST pidl, REFIID riid, LPVOID * ppvOut) +{ + CComPtr<IDefaultExtractIconInit> initIcon; + HRESULT hr = SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit, &initIcon)); + if (FAILED(hr)) + return NULL; + + initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_NETWORK_FOLDER); + + return initIcon->QueryInterface(riid, ppvOut); +} + class CNetFolderEnum : public CEnumIDListBase { @@ -403,8 +415,7 @@ HRESULT WINAPI CNetFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, 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, @@ -427,19 +438,9 @@ hr = IDataObject_Constructor (hwndOwner, pidlRoot, apidl, cidl, &pDo); pObj = pDo; } - 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 = CNetFolderExtractIcon_CreateInstance(apidl[0], riid, &pObj); } else if (IsEqualIID(riid, IID_IDropTarget) && (cidl >= 1)) {
Modified: trunk/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/C... ============================================================================== --- trunk/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp [iso-8859-1] Sat Apr 30 15:30:59 2016 @@ -26,35 +26,6 @@ #include <winspool.h>
WINE_DEFAULT_DEBUG_CHANNEL (shell); - -/*********************************************************************** - * Printers_IExtractIconW implementation - */ -class CPrintersExtractIconW : - public CComObjectRootEx<CComMultiThreadModelNoCS>, - public IExtractIconW, - public IExtractIconA -{ - private: - LPITEMIDLIST pidl; - public: - CPrintersExtractIconW(); - ~CPrintersExtractIconW(); - HRESULT WINAPI Initialize(LPCITEMIDLIST pidl); - - // IExtractIconW - virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags); - virtual HRESULT STDMETHODCALLTYPE Extract(LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); - - // IExtractIconA - virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, LPSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags); - virtual HRESULT STDMETHODCALLTYPE Extract(LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); - - BEGIN_COM_MAP(CPrintersExtractIconW) - COM_INTERFACE_ENTRY_IID(IID_IExtractIconW, IExtractIconW) - COM_INTERFACE_ENTRY_IID(IID_IExtractIconA, IExtractIconA) - END_COM_MAP() -};
static shvheader PrinterSFHeader[] = { {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, @@ -72,123 +43,24 @@ #define COLUMN_LOCATION 4 #define COLUMN_MODEL 5
- #define PrinterSHELLVIEWCOLUMNS (6)
-CPrintersExtractIconW::CPrintersExtractIconW() -{ - pidl = NULL; -} - -CPrintersExtractIconW::~CPrintersExtractIconW() -{ - TRACE(" destroying IExtractIcon(%p)\n", this); - SHFree(pidl); -} - -HRESULT WINAPI CPrintersExtractIconW::Initialize(LPCITEMIDLIST pidl) -{ - pidl = ILClone(pidl); - - pdump(pidl); - return S_OK; -} - -/************************************************************************** - * CPrintersExtractIconW::GetIconLocation - * - * mapping filetype to icon - */ -HRESULT WINAPI CPrintersExtractIconW::GetIconLocation(UINT uFlags, /* GIL_ flags */ - LPWSTR szIconFile, - UINT cchMax, - int *piIndex, - UINT *pwFlags) /* returned GIL_ flags */ -{ - TRACE("(%p) (flags=%u %p %u %p %p)\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags); - - if (pwFlags) - *pwFlags = 0; - - lstrcpynW(szIconFile, swShell32Name, cchMax); - *piIndex = -IDI_SHELL_PRINTERS_FOLDER; /* FIXME: other icons for default, network, print to file */ - - TRACE("-- %s %x\n", debugstr_w(szIconFile), *piIndex); - return S_OK; -} - -/************************************************************************** - * CPrintersExtractIconW::Extract - */ -HRESULT WINAPI CPrintersExtractIconW::Extract(LPCWSTR pszFile, - UINT nIconIndex, HICON *phiconLarge, - HICON *phiconSmall, UINT nIconSize) -{ - int index; - HIMAGELIST big_icons, small_icons; - - FIXME("(%p) (file=%p index=%d %p %p size=%x) semi-stub\n", this, debugstr_w(pszFile), - (signed)nIconIndex, phiconLarge, phiconSmall, nIconSize); - - index = SIC_GetIconIndex(pszFile, nIconIndex, 0); - - Shell_GetImageLists(&big_icons, &small_icons); - - if (phiconLarge) - *phiconLarge = ImageList_GetIcon(big_icons, index, ILD_TRANSPARENT); - - if (phiconSmall) - *phiconSmall = ImageList_GetIcon(small_icons, index, ILD_TRANSPARENT); - - return S_OK; -} - -/************************************************************************** - * CPrintersExtractIconW::GetIconLocation - */ -HRESULT WINAPI CPrintersExtractIconW::GetIconLocation(UINT uFlags, - LPSTR szIconFile, - UINT cchMax, - int * piIndex, - UINT * pwFlags) -{ - HRESULT ret; - LPWSTR lpwstrFile = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, cchMax * sizeof(WCHAR)); - - TRACE("(%p) (flags=%u %p %u %p %p)\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags); - - ret = GetIconLocation(uFlags, lpwstrFile, cchMax, piIndex, pwFlags); - WideCharToMultiByte(CP_ACP, 0, lpwstrFile, -1, szIconFile, cchMax, NULL, NULL); - HeapFree(GetProcessHeap(), 0, lpwstrFile); - - TRACE("-- %s %x\n", szIconFile, *piIndex); - return ret; -} -/************************************************************************** - * CPrintersExtractIconW::Extract - */ -HRESULT WINAPI CPrintersExtractIconW::Extract(LPCSTR pszFile, - UINT nIconIndex, HICON *phiconLarge, - HICON *phiconSmall, UINT nIconSize) -{ - HRESULT ret; - INT len = MultiByteToWideChar(CP_ACP, 0, pszFile, -1, NULL, 0); - LPWSTR lpwstrFile = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); - - TRACE("(%p) (file=%p index=%u %p %p size=%u)\n", this, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize); - - MultiByteToWideChar(CP_ACP, 0, pszFile, -1, lpwstrFile, len); - ret = Extract(lpwstrFile, nIconIndex, phiconLarge, phiconSmall, nIconSize); - HeapFree(GetProcessHeap(), 0, lpwstrFile); - return ret; -} - -/************************************************************************** - * IExtractIcon_Constructor - */ -static HRESULT WINAPI IEI_Printers_Constructor(LPCITEMIDLIST pidl, REFIID riid, IUnknown **ppv) -{ - return ShellObjectCreatorInit<CPrintersExtractIconW>(pidl, riid, ppv); +/************************************************************************** + * CPrintersExtractIconW_CreateInstane + * + * There is no CPrintersExtractIconW. We just initialize CExtractIcon properly to do our job. + */ +HRESULT WINAPI CPrintersExtractIconW_CreateInstane(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv) +{ + CComPtr<IDefaultExtractIconInit> initIcon; + HRESULT hr = SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit,&initIcon)); + if (FAILED(hr)) + return NULL; + + /* FIXME: other icons for default, network, print to file */ + initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_PRINTERS_FOLDER); + + return initIcon->QueryInterface(riid,ppv); }
/*********************************************************************** @@ -462,7 +334,7 @@ HRESULT WINAPI CPrinterFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { - IUnknown *pObj = NULL; + LPVOID pObj = NULL; HRESULT hr = E_INVALIDARG;
TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", @@ -474,7 +346,7 @@ *ppvOut = NULL;
if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && cidl == 1) - hr = IEI_Printers_Constructor(apidl[0], riid, &pObj); + hr = CPrintersExtractIconW_CreateInstane(apidl[0], riid, &pObj); else hr = E_NOINTERFACE;
Modified: trunk/reactos/dll/win32/shell32/folders/CRecycleBin.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/C... ============================================================================== --- trunk/reactos/dll/win32/shell32/folders/CRecycleBin.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/folders/CRecycleBin.cpp [iso-8859-1] Sat Apr 30 15:30:59 2016 @@ -62,6 +62,19 @@ /* * Recycle Bin folder */ + +HRESULT CRecyclerExtractIcon_CreateInstance(LPCITEMIDLIST pidl, REFIID riid, LPVOID * ppvOut) +{ + CComPtr<IDefaultExtractIconInit> initIcon; + HRESULT hr = SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit, &initIcon)); + if (FAILED(hr)) + return NULL; + + /* FIXME: This is completely unimplemented */ + initIcon->SetNormalIcon(swShell32Name, 0); + + return initIcon->QueryInterface(riid, ppvOut); +}
class CRecycleBinEnum : public CEnumIDListBase @@ -571,7 +584,7 @@ HRESULT WINAPI CRecycleBin::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, void **ppv) { - IUnknown *pObj = NULL; + LPVOID pObj = NULL; HRESULT hr = E_INVALIDARG;
TRACE ("(%p)->(%p,%u,apidl=%p, %p %p)\n", this, @@ -592,21 +605,9 @@ hr = QueryInterface(IID_PPV_ARG(IDropTarget, &pDt)); pObj = pDt; } - else if(IsEqualIID(riid, IID_IExtractIconA) && (cidl == 1)) - { - // FIXME: This is not correct, it does not show the right icons - LPITEMIDLIST pidlItem = ILCombine(pidl, apidl[0]); - pObj = IExtractIconA_Constructor(pidlItem); - SHFree(pidlItem); - hr = S_OK; - } - else if (IsEqualIID(riid, IID_IExtractIconW) && (cidl == 1)) - { - // FIXME: This is not correct, it does not show the right icons - LPITEMIDLIST pidlItem = ILCombine(pidl, apidl[0]); - pObj = IExtractIconW_Constructor(pidlItem); - SHFree(pidlItem); - hr = S_OK; + else if((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && (cidl == 1)) + { + hr = CRecyclerExtractIcon_CreateInstance(apidl[0], riid, &pObj); } else hr = E_NOINTERFACE; @@ -686,8 +687,10 @@ HRESULT WINAPI CRecycleBin::GetDefaultColumn(DWORD dwReserved, ULONG *pSort, ULONG *pDisplay) { TRACE("(%p, %x, %p, %p)\n", this, (unsigned int)dwReserved, pSort, pDisplay); - *pSort = 0; - *pDisplay = 0; + if (pSort) + *pSort = 0; + if (pDisplay) + *pDisplay = 0; return S_OK; }