Windows2003-3790/inetcore/outlookexpress/msoert/voidlist.h
2020-09-30 16:53:55 +02:00

74 lines
2.1 KiB
C++

#ifndef __VOIDLIST_H
#define __VOIDLIST_H
#include "listintr.h"
struct CNode;
class CVoidPtrList : public IVoidPtrList
{
private:
enum
{
HANDLE_START = 0x00000001,
HANDLE_END = 0xffffffff
};
CNode *m_pEnds[2]; // Head and tail
DWORD m_cCount;
DWORD_PTR m_dwCookie;
LONG m_cRefCount;
IVPL_COMPAREFUNCTYPE m_pCompareFunc;
IVPL_FREEITEMFUNCTYPE m_pFreeItemFunc;
CRITICAL_SECTION m_rCritSect;
bool m_fInited;
void SortedAddItem(CNode *pNode);
void NonSortedAddItem(CNode *pNode);
CNode* GetHead() {return m_pEnds[LD_FORWARD];}
CNode* GetTail() {return m_pEnds[LD_REVERSE];}
void SetHead(CNode* pNode) {m_pEnds[LD_FORWARD] = pNode;}
void SetTail(CNode* pNode) {m_pEnds[LD_REVERSE] = pNode;}
CNode* FindItem(DWORD dwHandle);
DWORD GetNewHandle();
public:
CVoidPtrList();
~CVoidPtrList();
// IUnknown members
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj) { return E_NOTIMPL;}
virtual STDMETHODIMP_(ULONG) AddRef(void);
virtual STDMETHODIMP_(ULONG) Release(void);
// IVoidPtrList members
virtual HRESULT STDMETHODCALLTYPE Init(
IVPL_COMPAREFUNCTYPE pCompareFunc,
DWORD_PTR dwCookie,
IVPL_FREEITEMFUNCTYPE pFreeItemFunc,
DWORD dwInitSize);
virtual HRESULT STDMETHODCALLTYPE GetCount(DWORD *pdwCount) {
*pdwCount = m_cCount; return S_OK;}
virtual HRESULT STDMETHODCALLTYPE ClearList(void);
virtual HRESULT STDMETHODCALLTYPE AddItem(LPVOID ptr, DWORD *pdwHandle);
virtual HRESULT STDMETHODCALLTYPE RemoveItem(DWORD dwHandle);
virtual HRESULT STDMETHODCALLTYPE GetNext(
LISTDIRECTION bDirection,
LPVOID *pptr,
DWORD *pdwHandle);
virtual HRESULT STDMETHODCALLTYPE SkipNext(LISTDIRECTION bDirection, DWORD *pdwHandle);
virtual HRESULT STDMETHODCALLTYPE Resort(void);
static HRESULT CreateInstance(CVoidPtrList** ppList);
};
#endif