windows-nt/Source/XPSP1/NT/shell/shdocvw/hist/chcommon.h
2020-09-26 16:20:57 +08:00

254 lines
8 KiB
C++

#ifndef CHCOMMON_H__
#define CHCOMMON_H__
#ifdef __cplusplus
HRESULT _GetShortcut(LPCTSTR pszUrl, REFIID riid, void **ppv);
HRESULT AlignPidl(LPCITEMIDLIST* ppidl, BOOL* pfRealigned);
HRESULT AlignPidlArray(LPCITEMIDLIST* apidl, int cidl, LPCITEMIDLIST** papidl,
BOOL* pfRealigned);
void FreeRealignedPidlArray(LPCITEMIDLIST* apidl, int cidl);
void inline FreeRealignedPidl(LPCITEMIDLIST pidl)
{
ILFree((LPITEMIDLIST)pidl);
}
UINT MergeMenuHierarchy(HMENU hmenuDst, HMENU hmenuSrc, UINT idcMin, UINT idcMax);
void ResizeStatusBar(HWND hwnd, BOOL fInit);
HRESULT _ArrangeFolder(HWND hwnd, UINT uID);
BOOL _TitleIsGood(LPCWSTR psz);
//////////////////////////////////////////////////////////////////////
// StrHash -- A generic string hasher
// Stores (char*, void*) pairs
// Marc Miller (t-marcmi), 1998
/*
* TODO:
* provide a way to update/delete entries
* provice a way to specify a beginning table size
* provide a way to pass in a destructor function
* for void* values
*/
class StrHash {
public:
StrHash(int fCaseInsensitive = 0);
~StrHash();
void* insertUnique(LPCTSTR pszKey, int fCopy, void* pvVal);
void* retrieve(LPCTSTR pszKey);
#ifdef DEBUG
void _RemoveHashNodesFromMemList();
void _AddHashNodesFromMemList();
#endif // DEBUG
protected:
class StrHashNode {
friend class StrHash;
protected:
LPCTSTR pszKey;
void* pvVal;
int fCopy;
StrHashNode* next;
public:
StrHashNode(LPCTSTR psz, void* pv, int fCopy, StrHashNode* next);
~StrHashNode();
};
// possible hash-table sizes, chosen from primes not close to powers of 2
static const unsigned int sc_auPrimes[];
static const unsigned int c_uNumPrimes;
static const unsigned int c_uFirstPrime;
static const unsigned int c_uMaxLoadFactor; // scaled by USHORT_MAX
unsigned int nCurPrime; // current index into sc_auPrimes
unsigned int nBuckets;
unsigned int nElements;
StrHashNode** ppshnHashChain;
int _fCaseInsensitive;
unsigned int _hashValue(LPCTSTR, unsigned int);
StrHashNode* _findKey(LPCTSTR pszStr, unsigned int ubucketNum);
unsigned int _loadFactor();
int _prepareForInsert();
private:
// empty private copy constructor to prevent copying
StrHash(const StrHash& strHash) { }
// empty private assignment constructor to prevent assignment
StrHash& operator=(const StrHash& strHash) { return *this; }
};
//////////////////////////////////////////////////////////////////////
/// OrderedList
class OrderedList {
public:
class Element {
public:
friend class OrderedList;
virtual int compareWith(Element *pelt) = 0;
virtual ~Element() { }
private:
Element* next;
};
OrderedList(unsigned int uSize);
~OrderedList();
#if DEBUG
void _RemoveElementsFromMemlist();
void _AddElementsToMemlist();
#endif //DEBUg
void insert(Element *pelt);
Element *removeFirst();
Element *peek() { return peltHead; }
protected:
Element *peltHead; // points to smallest in list
unsigned int uSize;
unsigned int uCount;
public:
// variable access functions
unsigned int count() { return uCount; }
BOOL full() { return (uSize && (uCount >= uSize)); }
private:
OrderedList(const OrderedList& ol) { }
OrderedList& operator=(const OrderedList& ol) { return *this; }
};
class CDetailsOfFolder : public IShellDetails
{
public:
CDetailsOfFolder(HWND hwnd, IShellFolder2 *psf) : _cRef(1), _psf(psf), _hwnd(hwnd)
{
_psf->AddRef();
}
// *** IUnknown methods ***
STDMETHOD(QueryInterface)(REFIID riid, void ** ppv);
STDMETHOD_(ULONG,AddRef)();
STDMETHOD_(ULONG,Release)();
// IShellDetails
STDMETHOD(GetDetailsOf)(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *pdi);
STDMETHOD(ColumnClick)(UINT iColumn);
private:
virtual ~CDetailsOfFolder() { _psf->Release(); }
LONG _cRef;
IShellFolder2 *_psf;
HWND _hwnd;
};
class CFolderArrangeMenu : public IContextMenu
{
public:
CFolderArrangeMenu(UINT idMenu) : _cRef(1), _idMenu(idMenu)
{
}
// IUnknown
STDMETHOD(QueryInterface)(REFIID riid, void ** ppv);
STDMETHOD_(ULONG,AddRef)();
STDMETHOD_(ULONG,Release)();
// IContextMenu
STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst,
UINT idCmdLast, UINT uFlags);
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType,UINT *pwReserved,
LPSTR pszName, UINT cchMax);
private:
virtual ~CFolderArrangeMenu() { }
LONG _cRef;
UINT _idMenu;
};
////////////////////////////////////////////////////////////////////////////
//
// CBaseItem Object
//
////////////////////////////////////////////////////////////////////////////
class CBaseItem :
public IContextMenu,
public IDataObject,
public IExtractIconA,
public IExtractIconW,
public IQueryInfo
{
public:
CBaseItem();
HRESULT Initialize(HWND hwnd, UINT cidl, LPCITEMIDLIST *ppidl);
// IUnknown Methods
STDMETHODIMP QueryInterface(REFIID,void **);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// IContextMenu Methods
// STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst,
// UINT idCmdLast, UINT uFlags);
// STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType,UINT *pwReserved,
LPSTR pszName, UINT cchMax);
// IQueryInfo Methods
// STDMETHODIMP GetInfoTip(DWORD dwFlags, WCHAR **ppwszTip);
STDMETHODIMP GetInfoFlags(DWORD *pdwFlags);
// IExtractIconA Methods
STDMETHODIMP GetIconLocation(UINT uFlags, LPSTR pszIconFile, UINT ucchMax, PINT pniIcon, PUINT puFlags) = 0;
STDMETHODIMP Extract(LPCSTR pcszFile, UINT uIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT ucIconSize);
// IExtractIconW Methods
STDMETHODIMP GetIconLocation(UINT uFlags, LPWSTR pwzIconFile, UINT ucchMax, PINT pniIcon, PUINT puFlags);
STDMETHODIMP Extract(LPCWSTR pcwzFile, UINT uIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT ucIconSize);
// IDataObject Methods...
// STDMETHODIMP GetData(LPFORMATETC pFEIn, LPSTGMEDIUM pSTM);
STDMETHODIMP GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
// STDMETHODIMP QueryGetData(LPFORMATETC pFE);
STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC pFEIn, LPFORMATETC pFEOut);
STDMETHODIMP SetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM, BOOL fRelease);
// STDMETHODIMP EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC *ppEnum);
STDMETHODIMP DAdvise(LPFORMATETC pFE, DWORD grfAdv, LPADVISESINK pAdvSink,
DWORD *pdwConnection);
STDMETHODIMP DUnadvise(DWORD dwConnection);
STDMETHODIMP EnumDAdvise(LPENUMSTATDATA *ppEnum);
// IDataObject helper functions
HRESULT _CreateHTEXT(STGMEDIUM *pmedium);
HRESULT _CreateUnicodeTEXT(STGMEDIUM *pmedium);
HRESULT _CreateFileDescriptorA(STGMEDIUM *pSTM);
HRESULT _CreateFileContents(STGMEDIUM *pSTM, LONG lindex);
HRESULT _CreateURL(STGMEDIUM *pSTM);
HRESULT _CreatePrefDropEffect(STGMEDIUM *pSTM);
protected:
virtual ~CBaseItem();
virtual LPCTSTR _GetUrl(int nIndex) = 0;
virtual LPCTSTR _PidlToSourceUrl(LPCITEMIDLIST pidl) = 0;
virtual UNALIGNED const TCHAR* _GetURLTitle(LPCITEMIDLIST pcei) = 0;
LPCTSTR _GetDisplayUrlForPidl(LPCITEMIDLIST pidl, LPTSTR pszDisplayUrl, DWORD dwDisplayUrl);
HRESULT _AddToFavorites(int nIndex);
LONG _cRef; // reference count
UINT _cItems; // number of items we represent
LPCITEMIDLIST* _ppidl; // variable size array of items
HWND _hwndOwner;
};
#endif // __cplusplus
#endif