1
0

providerOperation.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "./providerOperation.h"
  2. #include "./loginProvider.h"
  3. #include "./providerEnumerator.h"
  4. LoginProviderOperation::LoginProviderOperation(LoginProvider *pSource, LoginProvider *pTarget, UINT uCode)
  5. : ref(1), source(pSource), target(pTarget), code(uCode)
  6. {
  7. if (NULL != source) source->AddRef();
  8. if (NULL != target) target->AddRef();
  9. }
  10. LoginProviderOperation::~LoginProviderOperation()
  11. {
  12. if (NULL != source) source->Release();
  13. if (NULL != target) target->Release();
  14. }
  15. HRESULT LoginProviderOperation::CreateDeleteOperation(LoginProvider *pRemove, LoginProviderOperation **instance)
  16. {
  17. if (NULL == instance)
  18. return E_POINTER;
  19. if (NULL == pRemove)
  20. {
  21. *instance = NULL;
  22. return E_INVALIDARG;
  23. }
  24. *instance = new LoginProviderOperation(pRemove, NULL, operationDelete);
  25. if (NULL == *instance) return E_OUTOFMEMORY;
  26. return S_OK;
  27. }
  28. HRESULT LoginProviderOperation::CreateReplaceOperation(LoginProvider *pSource, LoginProvider *pTarget, LoginProviderOperation **instance)
  29. {
  30. if (NULL == instance)
  31. return E_POINTER;
  32. if (NULL == pSource || NULL == pTarget)
  33. {
  34. *instance = NULL;
  35. return E_INVALIDARG;
  36. }
  37. *instance = new LoginProviderOperation(pSource, pTarget, operationReplace);
  38. if (NULL == *instance) return E_OUTOFMEMORY;
  39. return S_OK;
  40. }
  41. HRESULT LoginProviderOperation::CreateFromUpdate(LoginProvider *active, LoginProviderEnumerator *enumerator, LoginProviderOperation **instance)
  42. {
  43. if (NULL == instance)
  44. return E_POINTER;
  45. *instance = NULL;
  46. if (NULL == active || NULL == enumerator)
  47. return E_INVALIDARG;
  48. GUID testId, activeId(GUID_NULL);
  49. HRESULT hr = active->GetId(&activeId);
  50. if (FAILED(hr)) return hr;
  51. LoginProvider *test;
  52. BOOL providerFound = FALSE;
  53. enumerator->Reset();
  54. BOOL loop = TRUE;
  55. while(TRUE == loop && S_OK == enumerator->Next(1, &test, NULL))
  56. {
  57. if (FAILED(test->GetId(&testId)))
  58. {
  59. hr = E_FAIL;
  60. loop = FALSE;
  61. }
  62. else if(FALSE != IsEqualGUID(activeId, testId))
  63. {
  64. providerFound = TRUE;
  65. if (S_OK == test->IsIdentical(active))
  66. hr = S_FALSE;
  67. else
  68. hr = CreateReplaceOperation(active, test, instance);
  69. loop = FALSE;
  70. }
  71. test->Release();
  72. }
  73. if (SUCCEEDED(hr) && FALSE == providerFound)
  74. hr = CreateDeleteOperation(active, instance);
  75. return hr;
  76. }
  77. ULONG LoginProviderOperation::AddRef()
  78. {
  79. return InterlockedIncrement((LONG*)&ref);
  80. }
  81. ULONG LoginProviderOperation::Release()
  82. {
  83. if (0 == ref)
  84. return ref;
  85. LONG r = InterlockedDecrement((LONG*)&ref);
  86. if (0 == r)
  87. delete(this);
  88. return r;
  89. }
  90. UINT LoginProviderOperation::GetCode()
  91. {
  92. return code;
  93. }
  94. HRESULT LoginProviderOperation::GetSource(LoginProvider **provider)
  95. {
  96. if (NULL == provider) return E_POINTER;
  97. *provider = source;
  98. if (NULL != source)
  99. source->AddRef();
  100. return S_OK;
  101. }
  102. HRESULT LoginProviderOperation::GetTarget(LoginProvider **provider)
  103. {
  104. if (NULL == provider) return E_POINTER;
  105. *provider = target;
  106. if (NULL != target)
  107. target->AddRef();
  108. return S_OK;
  109. }