180 lines
3.4 KiB
C++
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();
|
|
}
|
|
}
|