[SHELL32]

- Get rid of CPrintersExtractIconW and add CPrintersExtractIconW_CreateInstane which creates and initializes CExtractIcon.
- Also add CNetFolderExtractIcon_CreateInstance and CRecyclerExtractIcon_CreateInstance.

svn path=/trunk/; revision=71217
This commit is contained in:
Giannis Adamopoulos 2016-04-30 15:30:59 +00:00
parent c1a1365490
commit 8ee72aa102
3 changed files with 47 additions and 171 deletions

View file

@ -47,6 +47,18 @@ LPITEMIDLIST ILCreateFromNetworkPlaceW(LPCWSTR lpNetworkPlace)
* 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::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))
{

View file

@ -27,35 +27,6 @@
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},
{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<IDefaultExtractIconInit> 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<CPrintersExtractIconW>(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;

View file

@ -63,6 +63,19 @@ static const columninfo RecycleBinColumns[] =
* 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::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;
}