5 #include "EnumFormatEtc.h"
\r
8 class CEnumFormatEtc :
\r
9 public IEnumFORMATETC,
\r
10 public CMyUnknownImp
\r
13 MY_UNKNOWN_IMP1_MT(IEnumFORMATETC)
\r
15 STDMETHOD(Next)(ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched);
\r
16 STDMETHOD(Skip)(ULONG celt);
\r
17 STDMETHOD(Reset)(void);
\r
18 STDMETHOD(Clone)(IEnumFORMATETC **ppEnumFormatEtc);
\r
20 CEnumFormatEtc(const FORMATETC *pFormatEtc, ULONG numFormats);
\r
26 FORMATETC *m_Formats;
\r
30 static void DeepCopyFormatEtc(FORMATETC *dest, const FORMATETC *src)
\r
35 dest->ptd = (DVTARGETDEVICE*)CoTaskMemAlloc(sizeof(DVTARGETDEVICE));
\r
36 *(dest->ptd) = *(src->ptd);
\r
40 CEnumFormatEtc::CEnumFormatEtc(const FORMATETC *pFormatEtc, ULONG numFormats)
\r
45 m_Formats = new FORMATETC[numFormats];
\r
48 m_NumFormats = numFormats;
\r
49 for(ULONG i = 0; i < numFormats; i++)
\r
50 DeepCopyFormatEtc(&m_Formats[i], &pFormatEtc[i]);
\r
54 CEnumFormatEtc::~CEnumFormatEtc()
\r
58 for(ULONG i = 0; i < m_NumFormats; i++)
\r
59 if(m_Formats[i].ptd)
\r
60 CoTaskMemFree(m_Formats[i].ptd);
\r
65 STDMETHODIMP CEnumFormatEtc::Next(ULONG celt, FORMATETC *pFormatEtc, ULONG *pceltFetched)
\r
68 if(celt == 0 || pFormatEtc == 0)
\r
69 return E_INVALIDARG;
\r
70 while(m_Index < m_NumFormats && copied < celt)
\r
72 DeepCopyFormatEtc(&pFormatEtc[copied], &m_Formats[m_Index]);
\r
76 if(pceltFetched != 0)
\r
77 *pceltFetched = copied;
\r
78 return (copied == celt) ? S_OK : S_FALSE;
\r
81 STDMETHODIMP CEnumFormatEtc::Skip(ULONG celt)
\r
84 return (m_Index <= m_NumFormats) ? S_OK : S_FALSE;
\r
87 STDMETHODIMP CEnumFormatEtc::Reset(void)
\r
93 STDMETHODIMP CEnumFormatEtc::Clone(IEnumFORMATETC ** ppEnumFormatEtc)
\r
95 HRESULT hResult = CreateEnumFormatEtc(m_NumFormats, m_Formats, ppEnumFormatEtc);
\r
97 ((CEnumFormatEtc *)*ppEnumFormatEtc)->m_Index = m_Index;
\r
101 // replacement for SHCreateStdEnumFmtEtc
\r
102 HRESULT CreateEnumFormatEtc(UINT numFormats, const FORMATETC *formats, IEnumFORMATETC **enumFormat)
\r
104 if(numFormats == 0 || formats == 0 || enumFormat == 0)
\r
105 return E_INVALIDARG;
\r
106 *enumFormat = new CEnumFormatEtc(formats, numFormats);
\r
107 return (*enumFormat) ? S_OK : E_OUTOFMEMORY;
\r