diff options
Diffstat (limited to 'Src/auth/Loginbox/providerEnumerator.cpp')
-rw-r--r-- | Src/auth/Loginbox/providerEnumerator.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/Src/auth/Loginbox/providerEnumerator.cpp b/Src/auth/Loginbox/providerEnumerator.cpp new file mode 100644 index 00000000..e3dda5b9 --- /dev/null +++ b/Src/auth/Loginbox/providerEnumerator.cpp @@ -0,0 +1,112 @@ +#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; + +} |