| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #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;
- }
|