113 lines
2.1 KiB
C++
113 lines
2.1 KiB
C++
|
#include "./common.h"
|
||
|
#include "./providerEnumerator.h"
|
||
|
#include "./loginProvider.h"
|
||
|
|
||
|
LoginProviderEnumerator::LoginProviderEnumerator()
|
||
|
: ref(1), cursor(0), list(NULL), size(0)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
LoginProviderEnumerator::~LoginProviderEnumerator()
|
||
|
{
|
||
|
if (NULL != list)
|
||
|
{
|
||
|
size_t index = size;
|
||
|
while(index--)
|
||
|
{
|
||
|
LoginProvider *provider = list[index];
|
||
|
if (NULL != provider) provider->Release();
|
||
|
}
|
||
|
|
||
|
free(list);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ULONG LoginProviderEnumerator::AddRef()
|
||
|
{
|
||
|
return InterlockedIncrement((LONG*)&ref);
|
||
|
}
|
||
|
|
||
|
ULONG LoginProviderEnumerator::Release()
|
||
|
{
|
||
|
if (0 == ref)
|
||
|
return ref;
|
||
|
|
||
|
LONG r = InterlockedDecrement((LONG*)&ref);
|
||
|
if (0 == r)
|
||
|
delete(this);
|
||
|
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
HRESULT LoginProviderEnumerator::CreateInstance(LoginProvider **list, size_t size, LoginProviderEnumerator **instance)
|
||
|
{
|
||
|
if (NULL == instance) return E_POINTER;
|
||
|
if (NULL == list) return E_INVALIDARG;
|
||
|
|
||
|
LoginProviderEnumerator *enumerator = new LoginProviderEnumerator();
|
||
|
if(NULL == enumerator)
|
||
|
return E_OUTOFMEMORY;
|
||
|
|
||
|
if (0 != size)
|
||
|
{
|
||
|
enumerator->list = (LoginProvider**)calloc(size, sizeof(LoginProvider*));
|
||
|
if (NULL == enumerator->list)
|
||
|
{
|
||
|
enumerator->Release();
|
||
|
return E_OUTOFMEMORY;
|
||
|
}
|
||
|
|
||
|
enumerator->size = size;
|
||
|
CopyMemory(enumerator->list, list, size * sizeof(LoginProvider*));
|
||
|
}
|
||
|
|
||
|
*instance = enumerator;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT LoginProviderEnumerator::Next(ULONG listSize, LoginProvider **elementList, ULONG *elementCount)
|
||
|
{
|
||
|
if (NULL == elementList || 0 == listSize) return E_INVALIDARG;
|
||
|
if (cursor >= size)
|
||
|
{
|
||
|
if (NULL != elementCount) *elementCount = 0;
|
||
|
return S_FALSE;
|
||
|
}
|
||
|
|
||
|
ULONG count = 0;
|
||
|
|
||
|
for (;cursor < size && count < listSize; cursor++)
|
||
|
{
|
||
|
LoginProvider *provider = list[cursor];
|
||
|
if (NULL != provider)
|
||
|
{
|
||
|
provider->AddRef();
|
||
|
elementList[count] = provider;
|
||
|
count++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (NULL != elementCount) *elementCount = count;
|
||
|
|
||
|
return (count == listSize) ? S_OK : S_FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT LoginProviderEnumerator::Reset(void)
|
||
|
{
|
||
|
cursor = 0;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT LoginProviderEnumerator::Skip(ULONG elementCount)
|
||
|
{
|
||
|
cursor += elementCount;
|
||
|
if (cursor >= size)
|
||
|
{
|
||
|
cursor = (size - 1);
|
||
|
return S_FALSE;
|
||
|
}
|
||
|
return S_OK;
|
||
|
|
||
|
}
|