Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

268 lines
6.5 KiB

///////////////////////////////////////////////////////////////////////////////
/* 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;
}