#ifndef __IAGCCollectionImpl_h__
#define __IAGCCollectionImpl_h__
#include "IAGCCommonImpl.h"
#define COM_INTERFACE_ENTRIES_IAGCCollectionImpl() \
COM_INTERFACE_ENTRY(IAGCCollection) \
COM_INTERFACE_ENTRY(IDispatch) \
COM_INTERFACE_ENTRIES_IAGCCommonImpl()
template <class T, class IGC, class ITF, class ITEMIGC, class ITEMITF,
const GUID* plibid, class AGCIGC = IGC, class AGCITF = ITF,
class ITEMAGCIGC = ITEMIGC, class ITEMAGCITF = ITEMITF>
class ATL_NO_VTABLE IAGCCollectionImpl:
public IAGCCommonImpl<T, IGC, ITF, plibid, AGCIGC, AGCITF>
{
public:
typedef IAGCCollectionImpl<T, IGC, ITF, ITEMIGC, ITEMITF, plibid, AGCIGC,
AGCITF, ITEMAGCIGC, ITEMAGCITF> IAGCCollectionImplBase;
public:
STDMETHODIMP get_Count(long* pnCount)
{
assert(GetIGC());
CLEAROUT(pnCount, (long)GetIGC()->n());
return S_OK;
}
STDMETHODIMP get__NewEnum(IUnknown** ppunkEnum)
{
assert(GetIGC());
typedef CComObject<CComEnum<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT,
_Copy<VARIANT> > > CEnum;
CEnum* pEnum = new CEnum;
assert(NULL != pEnum);
long cTotal = GetIGC()->n();
std::vector<CComVariant> vecTemp(cTotal);
for (CComVariant i(0L); V_I4(&i) < cTotal; ++V_I4(&i))
{
CComPtr<ITEMITF> spItem;
RETURN_FAILED(get_Item(&i, &spItem));
vecTemp[V_I4(&i)] = (IDispatch*)spItem;
}
#if _MSC_VER >= 1300
HRESULT hr = pEnum->Init(&(*vecTemp.begin()), &(*vecTemp.end()), NULL, AtlFlagCopy);
#else
HRESULT hr = pEnum->Init(vecTemp.begin(), vecTemp.end(), NULL, AtlFlagCopy);
#endif
if (SUCCEEDED(hr))
hr = pEnum->QueryInterface(IID_IEnumVARIANT, (void**)ppunkEnum);
if (FAILED(hr))
delete pEnum;
return hr;
}
public:
STDMETHODIMP get_Item(VARIANT* pvIndex, ITEMITF** ppItem)
{
CLEAROUT(ppItem, (ITEMITF*)NULL);
CComVariant var;
RETURN_FAILED(VariantChangeType(&var, pvIndex, 0, VT_I4));
long iIndex(V_I4(&var));
assert(GetIGC());
long iMax = GetIGC()->n();
if (0 > iIndex || iIndex >= iMax)
return E_INVALIDARG;
ITEMAGCIGC* pIGC =
Host2Igc<ITEMIGC, ITEMAGCIGC>((*GetIGC())[iIndex]->data());
return GetAGCGlobal()->GetAGCObject(pIGC, __uuidof(ITEMITF),
(void**)ppItem);
}
};
#endif