diff --git a/reactos/dll/win32/shell32/folders/CNetFolder.cpp b/reactos/dll/win32/shell32/folders/CNetFolder.cpp index 48871f1941d..266bc54d7fc 100644 --- a/reactos/dll/win32/shell32/folders/CNetFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CNetFolder.cpp @@ -47,6 +47,18 @@ LPITEMIDLIST ILCreateFromNetworkPlaceW(LPCWSTR lpNetworkPlace) * IShellFolder implementation */ +HRESULT CNetFolderExtractIcon_CreateInstance(LPCITEMIDLIST pidl, REFIID riid, LPVOID * ppvOut) +{ + CComPtr 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::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apid 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 @@ HRESULT WINAPI CNetFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CH hr = IDataObject_Constructor (hwndOwner, pidlRoot, apidl, cidl, &pDo); pObj = pDo; } - else if (IsEqualIID(riid, IID_IExtractIconA) && (cidl == 1)) + else if ((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && (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; + hr = CNetFolderExtractIcon_CreateInstance(apidl[0], riid, &pObj); } else if (IsEqualIID(riid, IID_IDropTarget) && (cidl >= 1)) { diff --git a/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp b/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp index 6412715bedb..14b483390d0 100644 --- a/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp @@ -27,35 +27,6 @@ WINE_DEFAULT_DEBUG_CHANNEL (shell); -/*********************************************************************** - * Printers_IExtractIconW implementation - */ -class CPrintersExtractIconW : - public CComObjectRootEx, - 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}, {IDS_SHV_COLUMN_DOCUMENTS , SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, @@ -72,123 +43,24 @@ static shvheader PrinterSFHeader[] = { #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 + * CPrintersExtractIconW_CreateInstane * - * mapping filetype to icon + * There is no CPrintersExtractIconW. We just initialize CExtractIcon properly to do our job. */ -HRESULT WINAPI CPrintersExtractIconW::GetIconLocation(UINT uFlags, /* GIL_ flags */ - LPWSTR szIconFile, - UINT cchMax, - int *piIndex, - UINT *pwFlags) /* returned GIL_ flags */ +HRESULT WINAPI CPrintersExtractIconW_CreateInstane(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv) { - TRACE("(%p) (flags=%u %p %u %p %p)\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags); + CComPtr initIcon; + HRESULT hr = SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit,&initIcon)); + if (FAILED(hr)) + return NULL; - if (pwFlags) - *pwFlags = 0; + /* FIXME: other icons for default, network, print to file */ + initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_PRINTERS_FOLDER); - 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(pidl, riid, ppv); + return initIcon->QueryInterface(riid,ppv); } /*********************************************************************** @@ -462,7 +334,7 @@ HRESULT WINAPI CPrinterFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY 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 @@ HRESULT WINAPI CPrinterFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMI *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; diff --git a/reactos/dll/win32/shell32/folders/CRecycleBin.cpp b/reactos/dll/win32/shell32/folders/CRecycleBin.cpp index b11dae4e823..d532dcf3a44 100644 --- a/reactos/dll/win32/shell32/folders/CRecycleBin.cpp +++ b/reactos/dll/win32/shell32/folders/CRecycleBin.cpp @@ -63,6 +63,19 @@ static const columninfo RecycleBinColumns[] = * Recycle Bin folder */ +HRESULT CRecyclerExtractIcon_CreateInstance(LPCITEMIDLIST pidl, REFIID riid, LPVOID * ppvOut) +{ + CComPtr 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::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY api 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 @@ HRESULT WINAPI CRecycleBin::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_C hr = QueryInterface(IID_PPV_ARG(IDropTarget, &pDt)); pObj = pDt; } - else if(IsEqualIID(riid, IID_IExtractIconA) && (cidl == 1)) + else if((IsEqualIID(riid, IID_IExtractIconA) || 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 = 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; + hr = CRecyclerExtractIcon_CreateInstance(apidl[0], riid, &pObj); } else hr = E_NOINTERFACE; @@ -686,8 +687,10 @@ HRESULT WINAPI CRecycleBin::EnumSearches(IEnumExtraSearch **ppEnum) 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; }