diff options
Diffstat (limited to 'Src/auth/Loginbox/providerOperation.cpp')
-rw-r--r-- | Src/auth/Loginbox/providerOperation.cpp | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/Src/auth/Loginbox/providerOperation.cpp b/Src/auth/Loginbox/providerOperation.cpp new file mode 100644 index 00000000..43bf663f --- /dev/null +++ b/Src/auth/Loginbox/providerOperation.cpp @@ -0,0 +1,136 @@ +#include "./providerOperation.h" +#include "./loginProvider.h" +#include "./providerEnumerator.h" + +LoginProviderOperation::LoginProviderOperation(LoginProvider *pSource, LoginProvider *pTarget, UINT uCode) + : ref(1), source(pSource), target(pTarget), code(uCode) +{ + if (NULL != source) source->AddRef(); + if (NULL != target) target->AddRef(); +} + +LoginProviderOperation::~LoginProviderOperation() +{ + if (NULL != source) source->Release(); + if (NULL != target) target->Release(); +} + +HRESULT LoginProviderOperation::CreateDeleteOperation(LoginProvider *pRemove, LoginProviderOperation **instance) +{ + if (NULL == instance) + return E_POINTER; + + if (NULL == pRemove) + { + *instance = NULL; + return E_INVALIDARG; + } + + *instance = new LoginProviderOperation(pRemove, NULL, operationDelete); + if (NULL == *instance) return E_OUTOFMEMORY; + return S_OK; +} + +HRESULT LoginProviderOperation::CreateReplaceOperation(LoginProvider *pSource, LoginProvider *pTarget, LoginProviderOperation **instance) +{ + if (NULL == instance) + return E_POINTER; + + if (NULL == pSource || NULL == pTarget) + { + *instance = NULL; + return E_INVALIDARG; + } + + *instance = new LoginProviderOperation(pSource, pTarget, operationReplace); + if (NULL == *instance) return E_OUTOFMEMORY; + return S_OK; +} + +HRESULT LoginProviderOperation::CreateFromUpdate(LoginProvider *active, LoginProviderEnumerator *enumerator, LoginProviderOperation **instance) +{ + if (NULL == instance) + return E_POINTER; + + *instance = NULL; + + if (NULL == active || NULL == enumerator) + return E_INVALIDARG; + + GUID testId, activeId(GUID_NULL); + HRESULT hr = active->GetId(&activeId); + if (FAILED(hr)) return hr; + + LoginProvider *test; + BOOL providerFound = FALSE; + enumerator->Reset(); + + BOOL loop = TRUE; + while(TRUE == loop && S_OK == enumerator->Next(1, &test, NULL)) + { + if (FAILED(test->GetId(&testId))) + { + hr = E_FAIL; + loop = FALSE; + } + else if(FALSE != IsEqualGUID(activeId, testId)) + { + providerFound = TRUE; + if (S_OK == test->IsIdentical(active)) + hr = S_FALSE; + else + hr = CreateReplaceOperation(active, test, instance); + loop = FALSE; + } + + test->Release(); + } + + if (SUCCEEDED(hr) && FALSE == providerFound) + hr = CreateDeleteOperation(active, instance); + + return hr; +} + +ULONG LoginProviderOperation::AddRef() +{ + return InterlockedIncrement((LONG*)&ref); +} + +ULONG LoginProviderOperation::Release() +{ + if (0 == ref) + return ref; + + LONG r = InterlockedDecrement((LONG*)&ref); + if (0 == r) + delete(this); + + return r; +} + +UINT LoginProviderOperation::GetCode() +{ + return code; +} +HRESULT LoginProviderOperation::GetSource(LoginProvider **provider) +{ + if (NULL == provider) return E_POINTER; + *provider = source; + + if (NULL != source) + source->AddRef(); + + return S_OK; +} + +HRESULT LoginProviderOperation::GetTarget(LoginProvider **provider) +{ + if (NULL == provider) return E_POINTER; + *provider = target; + + if (NULL != target) + target->AddRef(); + + return S_OK; +} |