|
|
///////////////////////////////////////////////////////////////////////////////
/* File: format.cpp
Description: Implementation for class EnumFORMATETC. Moved from original location in dataobj.cpp (deleted from project).
Revision History:
Date Description Programmer -------- --------------------------------------------------- ---------- 05/28/97 Initial creation. BrianAu */ ///////////////////////////////////////////////////////////////////////////////
#include "pch.h"
#pragma hdrstop
#include "format.h"
EnumFORMATETC::EnumFORMATETC( UINT cFormats, LPFORMATETC prgFormats ) : m_cRef(0), m_cFormats(0), m_iCurrent(0), m_prgFormats(NULL) { DBGTRACE((DM_DRAGDROP, DL_HIGH, TEXT("EnumFORMATETC::EnumFORMATETC"))); DBGPRINT((DM_DRAGDROP, DL_HIGH, TEXT("\tthis = 0x%08X"), this));
m_prgFormats = new FORMATETC[m_cFormats = cFormats];
for (UINT i = 0; i < m_cFormats; i++) { m_prgFormats[i] = prgFormats[i]; } }
EnumFORMATETC::EnumFORMATETC( const EnumFORMATETC& ef ) : m_cRef(0), m_cFormats(ef.m_cFormats), m_iCurrent(0), m_prgFormats(NULL) { DBGTRACE((DM_DRAGDROP, DL_HIGH, TEXT("EnumFORMATETC::EnumFORMATETC (Copy)"))); DBGPRINT((DM_DRAGDROP, DL_HIGH, TEXT("\tthis = 0x%08X"), this));
m_prgFormats = new FORMATETC[m_cFormats];
for (UINT i = 0; i < m_cFormats; i++) { m_prgFormats[i] = ef.m_prgFormats[i]; } }
EnumFORMATETC::~EnumFORMATETC( VOID ) { DBGTRACE((DM_DRAGDROP, DL_HIGH, TEXT("EnumFORMATETC::~EnumFORMATETC"))); DBGPRINT((DM_DRAGDROP, DL_HIGH, TEXT("\tthis = 0x%08X"), this)); if (NULL != m_prgFormats) delete[] m_prgFormats; }
///////////////////////////////////////////////////////////////////////////////
/* Function: EnumFORMATETC::QueryInterface
Description: Returns an interface pointer to the object's IUnknown or IEnumFORMATETC interface. Only IID_IUnknown and IID_IEnumFORMATETC are recognized. The object referenced by the returned interface pointer is uninitialized. The recipient of the pointer must call Initialize() before the object is usable.
Arguments: riid - Reference to requested interface ID.
ppvOut - Address of interface pointer variable to accept interface ptr.
Returns: NO_ERROR - Success. E_NOINTERFACE - Requested interface not supported. E_INVALIDARG - ppvOut argument was NULL.
Revision History:
Date Description Programmer -------- --------------------------------------------------- ---------- 09/25/96 Initial creation. BrianAu */ ///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP EnumFORMATETC::QueryInterface( REFIID riid, LPVOID *ppvOut ) { HRESULT hResult = E_NOINTERFACE;
if (NULL == ppvOut) return E_INVALIDARG;
*ppvOut = NULL;
if (IID_IUnknown == riid || IID_IEnumFORMATETC == riid) { *ppvOut = this; ((LPUNKNOWN)*ppvOut)->AddRef(); hResult = NOERROR; }
return hResult; }
///////////////////////////////////////////////////////////////////////////////
/* Function: EnumFORMATETC::AddRef
Description: Increments object reference count.
Arguments: None.
Returns: New reference count value.
Revision History:
Date Description Programmer -------- --------------------------------------------------- ---------- 09/25/96 Initial creation. BrianAu */ ///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) EnumFORMATETC::AddRef( VOID ) { ULONG ulReturn = m_cRef + 1;
DBGPRINT((DM_COM, DL_HIGH, TEXT("EnumFORMATETC::AddRef, 0x%08X %d -> %d\n"), this, ulReturn - 1, ulReturn));
InterlockedIncrement(&m_cRef);
return ulReturn; }
///////////////////////////////////////////////////////////////////////////////
/* Function: EnumFORMATETC::Release
Description: Decrements object reference count. If count drops to 0, object is deleted.
Arguments: None.
Returns: New reference count value.
Revision History:
Date Description Programmer -------- --------------------------------------------------- ---------- 09/25/96 Initial creation. BrianAu */ ///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) EnumFORMATETC::Release( VOID ) { ULONG ulReturn = m_cRef - 1;
DBGPRINT((DM_COM, DL_HIGH, TEXT("EnumFORMATETC::Release, 0x%08X %d -> %d\n"), this, ulReturn + 1, ulReturn));
if (InterlockedDecrement(&m_cRef) == 0) { delete this; ulReturn = 0; } return ulReturn; }
STDMETHODIMP EnumFORMATETC::Next( DWORD cFormats, LPFORMATETC pFormats, LPDWORD pcReturned ) { HRESULT hResult = S_OK;
DBGPRINT((DM_DRAGDROP, DL_MID, TEXT("EnumFORMATETC::Next %d"), cFormats)); DWORD iFormats = 0; if (NULL == pFormats) return E_INVALIDARG;
while(cFormats-- > 0) { if (m_iCurrent < m_cFormats) { *(pFormats + iFormats++) = m_prgFormats[m_iCurrent++]; } else { hResult = S_FALSE; break; } }
if (NULL != pcReturned) *pcReturned = iFormats;
return hResult; }
STDMETHODIMP EnumFORMATETC::Skip( DWORD cFormats ) { DBGPRINT((DM_DRAGDROP, DL_MID, TEXT("EnumFORMATETC::Skip %d"), cFormats)); while((cFormats-- > 0) && (m_iCurrent < m_cFormats)) m_iCurrent++;
return cFormats == 0 ? S_OK : S_FALSE; }
STDMETHODIMP EnumFORMATETC::Reset( VOID ) { DBGPRINT((DM_DRAGDROP, DL_MID, TEXT("EnumFORMATETC::Reset"))); m_iCurrent = 0; return S_OK; }
STDMETHODIMP EnumFORMATETC::Clone( IEnumFORMATETC **ppvOut ) { HRESULT hResult = NO_ERROR; try { EnumFORMATETC *pNew = new EnumFORMATETC(*this);
DBGPRINT((DM_DRAGDROP, DL_MID, TEXT("EnumFORMATETC::Clone"))); hResult = pNew->QueryInterface(IID_IEnumFORMATETC, (LPVOID *)ppvOut); } catch(CAllocException& e) { hResult = E_OUTOFMEMORY; }
return hResult; }
|