212 lines
4.5 KiB
C++
212 lines
4.5 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1999 - 1999
|
|
//
|
|
// File: objfmts.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "objfmts.h"
|
|
|
|
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Members: IEnumFORMATETC methods
|
|
//____________________________________________________________________________
|
|
|
|
STDMETHODIMP
|
|
CObjFormats::Next(
|
|
ULONG celt,
|
|
FORMATETC *rgelt,
|
|
ULONG *pceltFethed)
|
|
{
|
|
UINT cfetch = 0;
|
|
HRESULT hr = S_FALSE; // assume less numbers
|
|
|
|
if (m_iFmt < m_cFmt)
|
|
{
|
|
cfetch = m_cFmt - m_iFmt;
|
|
|
|
if (cfetch >= celt)
|
|
{
|
|
cfetch = celt;
|
|
hr = S_OK;
|
|
}
|
|
|
|
CopyMemory(rgelt, &m_aFmt[m_iFmt], cfetch * sizeof(FORMATETC));
|
|
m_iFmt += cfetch;
|
|
}
|
|
|
|
if (pceltFethed)
|
|
{
|
|
*pceltFethed = cfetch;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CObjFormats::Skip(
|
|
ULONG celt)
|
|
{
|
|
m_iFmt += celt;
|
|
|
|
if (m_iFmt > m_cFmt)
|
|
{
|
|
m_iFmt = m_cFmt;
|
|
return S_FALSE;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CObjFormats::Reset()
|
|
{
|
|
m_iFmt = 0;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CObjFormats::Clone(
|
|
IEnumFORMATETC ** ppenum)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Function: Function to obtain the IEnumFORMATETC interface.
|
|
//____________________________________________________________________________
|
|
|
|
HRESULT
|
|
GetObjFormats(
|
|
UINT cfmt,
|
|
FORMATETC * afmt,
|
|
LPVOID * ppvObj)
|
|
{
|
|
ASSERT(ppvObj != NULL);
|
|
ASSERT(afmt != NULL);
|
|
|
|
FORMATETC * pFmt = new FORMATETC[cfmt];
|
|
|
|
if (pFmt == NULL)
|
|
return E_OUTOFMEMORY;
|
|
|
|
CopyMemory(pFmt, afmt, cfmt * sizeof(FORMATETC));
|
|
|
|
CComObject<CObjFormats>* pObjFormats;
|
|
CComObject<CObjFormats>::CreateInstance(&pObjFormats);
|
|
|
|
if (pObjFormats == NULL)
|
|
{
|
|
delete [] pFmt;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
pObjFormats->Init(cfmt, pFmt);
|
|
|
|
return pObjFormats->QueryInterface(IID_IEnumFORMATETC,
|
|
reinterpret_cast<void**>(ppvObj));
|
|
}
|
|
|
|
|
|
|
|
//////////....................................................//////////////
|
|
//////////....................................................//////////////
|
|
//////////....................................................//////////////
|
|
//////////....................................................//////////////
|
|
//////////....................................................//////////////
|
|
//////////....................................................//////////////
|
|
//////////....................................................//////////////
|
|
//////////....................................................//////////////
|
|
|
|
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Members: CObjFormatsEx::IEnumFORMATETC methods
|
|
//____________________________________________________________________________
|
|
|
|
STDMETHODIMP
|
|
CObjFormatsEx::Next(
|
|
ULONG celt,
|
|
FORMATETC *rgelt,
|
|
ULONG *pceltFethed)
|
|
{
|
|
if (m_iCur == 1)
|
|
return m_rgspEnums[1]->Next(celt, rgelt, pceltFethed);
|
|
|
|
ULONG celtFethed1 = 0;
|
|
HRESULT hr = m_rgspEnums[0]->Next(celt, rgelt, &celtFethed1);
|
|
if (hr == S_OK)
|
|
return S_OK;
|
|
|
|
ULONG celt2 = celt - celtFethed1;
|
|
ULONG celtFethed2 = 0;
|
|
|
|
m_iCur = 1;
|
|
hr = m_rgspEnums[1]->Next(celt2, &rgelt[celtFethed1], &celtFethed2);
|
|
if (pceltFethed)
|
|
*pceltFethed = celtFethed1 + celtFethed2;
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CObjFormatsEx::Skip(
|
|
ULONG celt)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CObjFormatsEx::Reset()
|
|
{
|
|
m_iCur = 0;
|
|
m_rgspEnums[0]->Reset();
|
|
m_rgspEnums[1]->Reset();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CObjFormatsEx::Clone(
|
|
IEnumFORMATETC ** ppenum)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
|
|
HRESULT
|
|
GetObjFormatsEx(
|
|
IEnumFORMATETC* pEnum1,
|
|
IEnumFORMATETC* pEnum2,
|
|
IEnumFORMATETC** ppEnumOut)
|
|
{
|
|
ASSERT(pEnum1 != NULL);
|
|
ASSERT(pEnum2 != NULL);
|
|
ASSERT(ppEnumOut != NULL);
|
|
if (!pEnum1 || !pEnum2 || !ppEnumOut)
|
|
return E_INVALIDARG;
|
|
|
|
|
|
CComObject<CObjFormatsEx>* pObj;
|
|
CComObject<CObjFormatsEx>::CreateInstance(&pObj);
|
|
|
|
if (pObj == NULL)
|
|
return E_OUTOFMEMORY;
|
|
|
|
pObj->Init(pEnum1, pEnum2);
|
|
|
|
return pObj->QueryInterface(IID_IEnumFORMATETC,
|
|
reinterpret_cast<void**>(ppEnumOut));
|
|
}
|
|
|