winamp/Src/auth/Loginbox/providerOperation.cpp

137 lines
2.9 KiB
C++
Raw Normal View History

2024-09-24 12:54:57 +00:00
#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;
}