mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
159 lines
3.6 KiB
C++
159 lines
3.6 KiB
C++
|
#include "main.h"
|
||
|
#include "api__ml_downloads.h"
|
||
|
#include "DownloadStatus.h"
|
||
|
#include "DownloadsDialog.h"
|
||
|
|
||
|
#include <strsafe.h>
|
||
|
|
||
|
DownloadStatus downloadStatus;
|
||
|
|
||
|
using namespace Nullsoft::Utility;
|
||
|
|
||
|
DownloadStatus::Status::Status()
|
||
|
{
|
||
|
Init();
|
||
|
}
|
||
|
|
||
|
DownloadStatus::Status::Status( size_t _downloaded, size_t _maxSize, const wchar_t *_source, const wchar_t *_title, const wchar_t *_path )
|
||
|
{
|
||
|
Init();
|
||
|
|
||
|
downloaded = _downloaded;
|
||
|
maxSize = _maxSize;
|
||
|
source = _wcsdup( _source );
|
||
|
title = _wcsdup( _title );
|
||
|
path = _wcsdup( _path );
|
||
|
}
|
||
|
|
||
|
const DownloadStatus::Status &DownloadStatus::Status::operator =( const DownloadStatus::Status © )
|
||
|
{
|
||
|
Reset();
|
||
|
Init();
|
||
|
|
||
|
downloaded = copy.downloaded;
|
||
|
maxSize = copy.maxSize;
|
||
|
source = _wcsdup( copy.source );
|
||
|
title = _wcsdup( copy.title );
|
||
|
path = _wcsdup( copy.path );
|
||
|
killswitch = copy.killswitch;
|
||
|
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
DownloadStatus::Status::~Status()
|
||
|
{
|
||
|
Reset();
|
||
|
}
|
||
|
|
||
|
void DownloadStatus::Status::Init()
|
||
|
{
|
||
|
downloaded = 0;
|
||
|
maxSize = 0;
|
||
|
killswitch = 0;
|
||
|
source = 0;
|
||
|
title = 0;
|
||
|
path = 0;
|
||
|
}
|
||
|
|
||
|
void DownloadStatus::Status::Reset()
|
||
|
{
|
||
|
if ( source )
|
||
|
{
|
||
|
free( source );
|
||
|
source = 0;
|
||
|
}
|
||
|
|
||
|
if ( title )
|
||
|
{
|
||
|
free( title );
|
||
|
title = 0;
|
||
|
}
|
||
|
|
||
|
if ( path )
|
||
|
{
|
||
|
free( path );
|
||
|
path = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DownloadStatus::AddDownloadThread(DownloadToken token, const wchar_t *source, const wchar_t *title, const wchar_t *path)
|
||
|
{
|
||
|
{
|
||
|
AutoLock lock(statusLock);
|
||
|
downloads[token] = Status(0,0,source,title,path);
|
||
|
DownloadsUpdated(downloads[token],token);
|
||
|
}
|
||
|
|
||
|
static pluginMessage p = {ML_MSG_DOWNLOADS_VIEW_POSITION, 0, 0, 0};
|
||
|
PostMessage(plugin.hwndLibraryParent, WM_ML_IPC, (WPARAM)&p, ML_IPC_SEND_PLUGIN_MESSAGE);
|
||
|
}
|
||
|
|
||
|
void DownloadStatus::DownloadThreadDone(DownloadToken token)
|
||
|
{
|
||
|
{
|
||
|
AutoLock lock(statusLock);
|
||
|
downloads.erase(token);
|
||
|
}
|
||
|
|
||
|
static pluginMessage p = {ML_MSG_DOWNLOADS_VIEW_POSITION, 0, 0, 0};
|
||
|
PostMessage(plugin.hwndLibraryParent, WM_ML_IPC, (WPARAM)&p, ML_IPC_SEND_PLUGIN_MESSAGE);
|
||
|
}
|
||
|
|
||
|
bool DownloadStatus::UpdateStatus(DownloadToken token, size_t downloaded, size_t maxSize)
|
||
|
{
|
||
|
AutoLock lock(statusLock);
|
||
|
downloads[token].downloaded = downloaded;
|
||
|
downloads[token].maxSize = maxSize;
|
||
|
|
||
|
return !!downloads[token].killswitch;
|
||
|
}
|
||
|
|
||
|
bool DownloadStatus::CurrentlyDownloading()
|
||
|
{
|
||
|
AutoLock lock(statusLock);
|
||
|
return !downloads.empty();
|
||
|
}
|
||
|
|
||
|
void DownloadStatus::GetStatusString( wchar_t *status, size_t len )
|
||
|
{
|
||
|
AutoLock lock( statusLock );
|
||
|
Downloads::iterator itr;
|
||
|
size_t bytesDownloaded = 0, bytesTotal = 0, numDownloads = 0;
|
||
|
bool unknownTotal = false;
|
||
|
for ( itr = downloads.begin(); itr != downloads.end(); itr++ )
|
||
|
{
|
||
|
Status &dlstatus = itr->second;
|
||
|
if ( dlstatus.maxSize )
|
||
|
{
|
||
|
numDownloads++;
|
||
|
bytesDownloaded += dlstatus.downloaded;
|
||
|
bytesTotal += dlstatus.maxSize;
|
||
|
}
|
||
|
else // don't have a max size
|
||
|
{
|
||
|
if ( dlstatus.downloaded ) // if we've downloaded some then we just don't know the total
|
||
|
{
|
||
|
unknownTotal = true;
|
||
|
numDownloads++;
|
||
|
bytesDownloaded += dlstatus.downloaded;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( 0 == numDownloads )
|
||
|
{
|
||
|
status[ 0 ] = L'\0';
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
wchar_t buf[ 128 ] = { 0 };
|
||
|
if ( unknownTotal || bytesTotal == 0 )
|
||
|
StringCchPrintf( status, len, WASABI_API_LNGSTRINGW( IDS_DOWNLOADING_COMPLETE ), numDownloads, numDownloads, WASABI_API_LNG->FormattedSizeString( buf, ARRAYSIZE( buf ), bytesDownloaded ) );
|
||
|
else
|
||
|
{
|
||
|
wchar_t buf2[ 128 ] = { 0 };
|
||
|
StringCchPrintf( status, len, WASABI_API_LNGSTRINGW( IDS_DOWNLOADING_PROGRESS ), numDownloads, WASABI_API_LNG->FormattedSizeString( buf, ARRAYSIZE( buf ), bytesDownloaded ), WASABI_API_LNG->FormattedSizeString( buf2, ARRAYSIZE( buf2 ), bytesTotal ), MulDiv( (int)bytesDownloaded, 100, (int)bytesTotal ) );
|
||
|
}
|
||
|
}
|
||
|
}
|