WindowsXP-SP1/shell/shell32/drivxicon.cpp

123 lines
3.0 KiB
C++

#include "shellprv.h"
#pragma hdrstop
#include "pidl.h"
#include "ids.h"
#include "drives.h"
#include "mtpt.h"
#include "shitemid.h"
#include "xiconwrap.h"
#include "hwcmmn.h"
// From drivfldr.cpp
int _GetSHID(int iDrive);
class CDrvExtIconBase : public CExtractIconBase
{
public:
HRESULT _GetIconLocationW(UINT uFlags, LPWSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags);
HRESULT _ExtractW(LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize);
HRESULT _Init(LPCWSTR pszDrive)
{
_pszDrive = StrDup(pszDrive);
return _pszDrive ? S_OK : E_OUTOFMEMORY;
}
CDrvExtIconBase() : CExtractIconBase(), _pszDrive(NULL) {}
protected:
~CDrvExtIconBase();
private:
LPWSTR _pszDrive;
};
CDrvExtIconBase::~CDrvExtIconBase()
{
LocalFree((HLOCAL)_pszDrive); // accepts NULL
}
STDAPI SHCreateDrvExtIcon(LPCWSTR pszDrive, REFIID riid, void **ppv)
{
HRESULT hr;
CDrvExtIconBase* pdeib = new CDrvExtIconBase();
if (pdeib)
{
hr = pdeib->_Init(pszDrive);
if (SUCCEEDED(hr))
hr = pdeib->QueryInterface(riid, ppv);
pdeib->Release();
}
else
{
hr = E_OUTOFMEMORY;
}
return hr;
}
HRESULT CDrvExtIconBase::_GetIconLocationW(UINT uFlags, LPWSTR pszIconFile,
UINT cchMax, int *piIndex, UINT *pwFlags)
{
HRESULT hr = S_OK;
pszIconFile[0] = 0;
if (uFlags & GIL_DEFAULTICON)
{
*piIndex = CMountPoint::GetSuperPlainDriveIcon(_pszDrive,
GetDriveType(_pszDrive));
lstrcpyn(pszIconFile, TEXT("shell32.dll"), cchMax);
*pwFlags = GIL_PERCLASS;
// Make sure our default icon makes it to the cache
Shell_GetCachedImageIndex(c_szShell32Dll, *piIndex, *pwFlags);
}
else
{
if (!(uFlags & GIL_ASYNC))
{
CMountPoint* pmtpt = CMountPoint::GetMountPoint(_pszDrive);
if (pmtpt)
{
*piIndex = pmtpt->GetIcon(pszIconFile, cchMax);
if (!*pszIconFile)
{
GetModuleFileName(HINST_THISDLL, pszIconFile, cchMax);
}
pmtpt->StoreIconForUpdateImage(Shell_GetCachedImageIndex(
pszIconFile, *piIndex, 0));
pmtpt->Release();
}
else
{
*piIndex = CMountPoint::GetSuperPlainDriveIcon(_pszDrive,
GetDriveType(_pszDrive));
lstrcpyn(pszIconFile, TEXT("shell32.dll"), cchMax);
}
*pwFlags = GIL_PERCLASS;
}
else
{
hr = E_PENDING;
}
}
return hr;
}
HRESULT CDrvExtIconBase::_ExtractW(LPCWSTR pszFile, UINT nIconIndex,
HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
{
return SHDefExtractIcon(pszFile, nIconIndex, GIL_PERCLASS, phiconLarge,
phiconSmall, nIconSize);
}