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.
206 lines
4.1 KiB
206 lines
4.1 KiB
/*
|
|
* EnumConns.cxx
|
|
*
|
|
* CEnumConnections - class to implement IEnumConnections
|
|
*
|
|
* Copyright (C) 2001 Microsoft Corporation. All rights reserved.
|
|
*
|
|
*/
|
|
|
|
#include <wininetp.h>
|
|
#include "EnumConns.hxx"
|
|
|
|
CEnumConnections::CEnumConnections()
|
|
: m_ulRefCount(1), m_dwTotal(0), m_dwCurrentIndex(0), m_arrCD(NULL)
|
|
{
|
|
}
|
|
|
|
CEnumConnections::~CEnumConnections()
|
|
{
|
|
ReleaseCDs();
|
|
}
|
|
|
|
STDMETHODIMP CEnumConnections::Init(CONNECTDATA* parrCP, DWORD cCount, DWORD cCurPos)
|
|
{
|
|
if (parrCP == NULL && cCount != 0)
|
|
return E_POINTER;
|
|
|
|
ReleaseCDs();
|
|
|
|
m_dwTotal = cCount;
|
|
m_dwCurrentIndex = cCurPos;
|
|
if (cCount)
|
|
{
|
|
m_arrCD = new CONNECTDATA[m_dwTotal];
|
|
if (m_arrCD)
|
|
{
|
|
for (DWORD i = 0; i < m_dwTotal; ++i)
|
|
{
|
|
m_arrCD[i] = parrCP[i];
|
|
m_arrCD[i].pUnk->AddRef();
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
else
|
|
return S_OK;
|
|
}
|
|
|
|
void CEnumConnections::ReleaseCDs()
|
|
{
|
|
if (m_arrCD)
|
|
{
|
|
for (DWORD i = 0; i < m_dwTotal; ++i)
|
|
m_arrCD[i].pUnk->Release();
|
|
delete[] m_arrCD;
|
|
m_arrCD = NULL;
|
|
}
|
|
}
|
|
|
|
//
|
|
// IUnknown QueryInterface
|
|
//
|
|
STDMETHODIMP CEnumConnections::QueryInterface(REFIID riid, void ** ppvObject)
|
|
{
|
|
HRESULT hr = NOERROR;
|
|
|
|
if (ppvObject == NULL)
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
else if (riid == IID_IUnknown)
|
|
{
|
|
*ppvObject = static_cast<IUnknown*>(this);
|
|
AddRef();
|
|
}
|
|
else if (riid == IID_IEnumConnections)
|
|
{
|
|
*ppvObject = static_cast<IEnumConnections*>(this);
|
|
AddRef();
|
|
}
|
|
else
|
|
hr = E_NOINTERFACE;
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// IUnknown AddRef
|
|
//
|
|
ULONG CEnumConnections::AddRef()
|
|
{
|
|
return ++m_ulRefCount;
|
|
}
|
|
|
|
//
|
|
// IUnknown Release
|
|
//
|
|
ULONG CEnumConnections::Release()
|
|
{
|
|
if (--m_ulRefCount == 0)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
else
|
|
return m_ulRefCount;
|
|
}
|
|
|
|
//
|
|
// IEnumConnectionPoints Next
|
|
//
|
|
STDMETHODIMP CEnumConnections::Next(
|
|
ULONG cConnections, //[in]Number of IConnectionPoint values
|
|
// returned in rgpcn array
|
|
CONNECTDATA* rgpcd, //[out]Array to receive enumerated connection
|
|
// points
|
|
ULONG *pcFetched //[out]Pointer to the actual number of
|
|
// connection points returned in rgpcn array
|
|
)
|
|
{
|
|
if (m_arrCD == NULL && m_dwTotal != 0)
|
|
return E_UNEXPECTED;
|
|
|
|
if (pcFetched == NULL && cConnections > 1)
|
|
return E_POINTER;
|
|
|
|
DWORD dwFetched = 0;
|
|
if (pcFetched)
|
|
*pcFetched = 0;
|
|
else
|
|
pcFetched = &dwFetched;
|
|
|
|
if (cConnections == 0)
|
|
return S_OK;
|
|
|
|
if (rgpcd == 0)
|
|
return E_POINTER;
|
|
|
|
|
|
for (DWORD i = m_dwCurrentIndex; i < m_dwTotal; ++i)
|
|
{
|
|
*rgpcd = m_arrCD[i];
|
|
m_arrCD[i].pUnk->AddRef();
|
|
++rgpcd;
|
|
++(*pcFetched);
|
|
if (*pcFetched == cConnections)
|
|
return S_OK;
|
|
}
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
//
|
|
// IEnumConnectionPoints Skip
|
|
//
|
|
STDMETHODIMP CEnumConnections::Skip(ULONG cConnections)
|
|
{
|
|
m_dwCurrentIndex += cConnections;
|
|
|
|
if (m_dwCurrentIndex <= m_dwTotal)
|
|
return S_OK;
|
|
else
|
|
return S_FALSE;
|
|
}
|
|
|
|
//
|
|
// IEnumConnectionPoints Reset
|
|
//
|
|
STDMETHODIMP CEnumConnections::Reset()
|
|
{
|
|
m_dwCurrentIndex = 0;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// IEnumConnectionPoints Clone
|
|
//
|
|
STDMETHODIMP CEnumConnections::Clone(IEnumConnections** ppEnum)
|
|
{
|
|
if (m_arrCD == NULL && m_dwTotal != 0)
|
|
return E_UNEXPECTED;
|
|
|
|
if (ppEnum == NULL)
|
|
return E_POINTER;
|
|
|
|
*ppEnum = NULL;
|
|
|
|
CEnumConnections* pNew = new CEnumConnections();
|
|
|
|
if (pNew)
|
|
{
|
|
HRESULT hr = pNew->Init(m_arrCD, m_dwTotal, m_dwCurrentIndex);
|
|
if ( SUCCEEDED(hr) )
|
|
*ppEnum = static_cast<IEnumConnections*>(pNew);
|
|
else
|
|
delete pNew;
|
|
|
|
return hr;
|
|
}
|
|
else
|
|
return E_OUTOFMEMORY;
|
|
}
|