Leaked source code of windows server 2003
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.
 
 
 
 
 
 

148 lines
3.3 KiB

//Implementation of CAuthMethods class
#include "stdafx.h"
#include "Pop3Auth.h"
#include "AuthMethodsEnum.h"
#include <pop3regkeys.h>
CAuthMethodsEnum::CAuthMethodsEnum()
{
m_pAuthVector=NULL;
m_ulCurrentMethod=0;
}
CAuthMethodsEnum::~CAuthMethodsEnum()
{
}
/////////////////////////////////////////////////////////////////////////////
// IEnumVARIANT
STDMETHODIMP CAuthMethodsEnum::Next( /* [in] */ ULONG celt, /* [length_is][size_is][out] */ VARIANT __RPC_FAR *rgVar, /* [out] */ ULONG __RPC_FAR *pCeltFetched)
{
if ( NULL == rgVar || ( 1 != celt && NULL == pCeltFetched ))
return E_POINTER;
if ( NULL == m_pAuthVector )
{
return E_FAIL;
}
if( celt == 0 )
{
return E_INVALIDARG;
}
VARIANT vResult;
VariantInit(&vResult);
HRESULT hr=E_FAIL;
while(m_ulCurrentMethod < m_pAuthVector->size() )
{
if( ! ((*m_pAuthVector)[m_ulCurrentMethod]->bIsValid) )
{
m_ulCurrentMethod++;
}
}
if(m_ulCurrentMethod < m_pAuthVector->size())
{
V_VT( &vResult ) = VT_DISPATCH;
hr=((*m_pAuthVector)[m_ulCurrentMethod])->pIAuthMethod->
QueryInterface(IID_IDispatch,reinterpret_cast<void**>( &V_DISPATCH( &vResult ) ) );
if(SUCCEEDED(hr))
{
hr=VariantCopy(rgVar, &vResult);
if(SUCCEEDED(hr))
{
if(pCeltFetched)
{
*pCeltFetched=1;
}
if(celt > 1)
{
hr=S_FALSE;
}
m_ulCurrentMethod++;
}
else
{
VariantClear(&vResult);
}
}
}
return hr;
}
STDMETHODIMP CAuthMethodsEnum::Skip(ULONG celt)
{
HRESULT hr = S_OK;
ULONG ulSize;
if(m_pAuthVector != NULL)
{
ulSize=m_pAuthVector->size();
if(ulSize < celt + m_ulCurrentMethod )
{
m_ulCurrentMethod+=celt;
}
else
{
m_ulCurrentMethod=ulSize;
}
}
return hr;
}
STDMETHODIMP CAuthMethodsEnum::Reset(void)
{
m_ulCurrentMethod=0;
return S_OK;
}
STDMETHODIMP CAuthMethodsEnum::Clone( /* [out] */ IEnumVARIANT __RPC_FAR *__RPC_FAR *ppEnum)
{
if ( NULL == ppEnum )
{
return E_POINTER;
}
if ( NULL == m_pAuthVector)
{
return E_FAIL;
}
HRESULT hr=S_OK;
CComObject<CAuthMethodsEnum> *pAuthEnum;
*ppEnum=NULL;
hr = CComObject<CAuthMethodsEnum>::CreateInstance(&pAuthEnum); // Reference count still 0
if(SUCCEEDED(hr))
{
hr=pAuthEnum->Init(m_pAuthVector);
if(SUCCEEDED(hr))
{
hr=pAuthEnum->QueryInterface(IID_IEnumVARIANT,(void **)(ppEnum) );
if(FAILED(hr))
{
delete(pAuthEnum);
}
}
if(FAILED(hr))
{
delete(pAuthEnum);
}
}
return hr;
}
HRESULT CAuthMethodsEnum::Init( AUTHVECTOR *pAuthVector )
{
if(NULL==pAuthVector)
{
return E_INVALIDARG;
}
m_ulCurrentMethod=0;
m_pAuthVector=pAuthVector;
return S_OK;
}