Initial community commit
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user