winamp/Src/auth/Loginbox/update.cpp
2024-09-24 14:54:57 +02:00

180 lines
3.4 KiB
C++

#include "./update.h"
#include "./download.h"
#include "./downloadResult.h"
#include "./loginBox.h"
#include "./loginStatus.h"
#include "./providerLoader.h"
#include "./providerEnumerator.h"
#include "../resource.h"
#include "../api.h"
LoginUpdate::LoginUpdate(HWND hLoginbox)
: ref(1), hwnd(hLoginbox)
{
InitializeCriticalSection(&lock);
}
LoginUpdate::~LoginUpdate()
{
EnterCriticalSection(&lock);
size_t index = downloads.size();
while(index--)
{
LoginDownloadResult *result = downloads[index];
if (NULL != result)
{
result->RequestAbort(TRUE);
result->Release();
}
}
downloads.clear();
LeaveCriticalSection(&lock);
DeleteCriticalSection(&lock);
}
HRESULT LoginUpdate::CreateInstance(HWND hLoginbox, LoginUpdate **instance)
{
if (NULL == instance) return E_POINTER;
*instance = new LoginUpdate(hLoginbox);
if (NULL == *instance) return E_OUTOFMEMORY;
return S_OK;
}
ULONG LoginUpdate::AddRef()
{
return InterlockedIncrement((LONG*)&ref);
}
ULONG LoginUpdate::Release()
{
if (0 == ref)
return ref;
LONG r = InterlockedDecrement((LONG*)&ref);
if (0 == r)
delete(this);
return r;
}
HRESULT LoginUpdate::Start()
{
EnterCriticalSection(&lock);
HRESULT hr;
if (0 != downloads.size())
hr = E_PENDING;
else
{
LoginDownload download;
downloads.push_back(NULL);
LoginDownloadResult **ppResult = (downloads.end() - 1);
hr = download.Begin(L"http://dl.getdropbox.com/u/1994752/loginProviders.xml",
LoginDownloadResult::typeProviderList, LoginUpdate_DownloadCompleted, this, NULL, ppResult);
if (FAILED(hr))
{
downloads.pop_back();
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT LoginUpdate::Abort()
{
EnterCriticalSection(&lock);
size_t index = downloads.size();
while(index--)
{
LoginDownloadResult *result = downloads[index];
if (NULL != result)
{
result->RequestAbort(TRUE);
result->Release();
}
}
downloads.clear();
LeaveCriticalSection(&lock);
return S_OK;
}
void LoginUpdate::DownloadCompleted(LoginDownloadResult *result)
{
// BSTR fileName = NULL;
// LoginDownload download;
// HRESULT hr = download.End(result, &fileName);
//
// SleepEx(10000, FALSE);
//
// UINT type;
// if (FAILED(result->GetType(&type)))
// type = LoginDownloadResult::typeUnknown;
//
// switch(type)
// {
// case LoginDownloadResult::typeProviderList:
// {
// LoginProviderEnumerator *enumerator;
// if (S_FALSE != hr)
// {
// LoginProviderLoader loader;
// hr = loader.ReadXml(fileName, &enumerator);
// if (FAILED(hr))
// enumerator = NULL;
// }
// else
// enumerator = NULL;
//
// if (SUCCEEDED(hr))
// {
// LoginBox_ProvidersUpdated(hwnd, this, (S_FALSE == hr), enumerator);
// }
//
// if (NULL != enumerator)
// enumerator->Release();
// }
// break;
// case LoginDownloadResult::typeImage:
// break;
// }
//
// EnterCriticalSection(&lock);
//
// size_t index = downloads.size();
// while(index--)
// {
// if (downloads[index] == result)
// {
// downloads.eraseindex(index);
// result->Release();
// break;
// }
// }
//
// LeaveCriticalSection(&lock);
//
// SysFreeString(fileName);
}
static void CALLBACK LoginUpdate_DownloadCompleted(LoginDownloadResult *result, void *data)
{
if (NULL == result) return;
LoginUpdate *update = (LoginUpdate*)data;
if (NULL != update)
{
update->AddRef();
update->DownloadCompleted(result);
update->Release();
}
}