1
0

providerEnumerator.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include "./common.h"
  2. #include "./providerEnumerator.h"
  3. #include "./loginProvider.h"
  4. LoginProviderEnumerator::LoginProviderEnumerator()
  5. : ref(1), cursor(0), list(NULL), size(0)
  6. {
  7. }
  8. LoginProviderEnumerator::~LoginProviderEnumerator()
  9. {
  10. if (NULL != list)
  11. {
  12. size_t index = size;
  13. while(index--)
  14. {
  15. LoginProvider *provider = list[index];
  16. if (NULL != provider) provider->Release();
  17. }
  18. free(list);
  19. }
  20. }
  21. ULONG LoginProviderEnumerator::AddRef()
  22. {
  23. return InterlockedIncrement((LONG*)&ref);
  24. }
  25. ULONG LoginProviderEnumerator::Release()
  26. {
  27. if (0 == ref)
  28. return ref;
  29. LONG r = InterlockedDecrement((LONG*)&ref);
  30. if (0 == r)
  31. delete(this);
  32. return r;
  33. }
  34. HRESULT LoginProviderEnumerator::CreateInstance(LoginProvider **list, size_t size, LoginProviderEnumerator **instance)
  35. {
  36. if (NULL == instance) return E_POINTER;
  37. if (NULL == list) return E_INVALIDARG;
  38. LoginProviderEnumerator *enumerator = new LoginProviderEnumerator();
  39. if(NULL == enumerator)
  40. return E_OUTOFMEMORY;
  41. if (0 != size)
  42. {
  43. enumerator->list = (LoginProvider**)calloc(size, sizeof(LoginProvider*));
  44. if (NULL == enumerator->list)
  45. {
  46. enumerator->Release();
  47. return E_OUTOFMEMORY;
  48. }
  49. enumerator->size = size;
  50. CopyMemory(enumerator->list, list, size * sizeof(LoginProvider*));
  51. }
  52. *instance = enumerator;
  53. return S_OK;
  54. }
  55. HRESULT LoginProviderEnumerator::Next(ULONG listSize, LoginProvider **elementList, ULONG *elementCount)
  56. {
  57. if (NULL == elementList || 0 == listSize) return E_INVALIDARG;
  58. if (cursor >= size)
  59. {
  60. if (NULL != elementCount) *elementCount = 0;
  61. return S_FALSE;
  62. }
  63. ULONG count = 0;
  64. for (;cursor < size && count < listSize; cursor++)
  65. {
  66. LoginProvider *provider = list[cursor];
  67. if (NULL != provider)
  68. {
  69. provider->AddRef();
  70. elementList[count] = provider;
  71. count++;
  72. }
  73. }
  74. if (NULL != elementCount) *elementCount = count;
  75. return (count == listSize) ? S_OK : S_FALSE;
  76. }
  77. HRESULT LoginProviderEnumerator::Reset(void)
  78. {
  79. cursor = 0;
  80. return S_OK;
  81. }
  82. HRESULT LoginProviderEnumerator::Skip(ULONG elementCount)
  83. {
  84. cursor += elementCount;
  85. if (cursor >= size)
  86. {
  87. cursor = (size - 1);
  88. return S_FALSE;
  89. }
  90. return S_OK;
  91. }