/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "UBDownloadManager.h"
#include "core/UBApplication.h"
#include "gui/UBMainWindow.h"
#include "board/UBBoardController.h"
#include "board/UBBoardPaletteManager.h"
#include "core/memcheck.h"
/** The unique instance of the download manager */
static UBDownloadManager* pInstance = NULL;
/**
* \brief Constructor
* @param parent as the parent widget
* @param name as the object name
*/
UBDownloadManager::UBDownloadManager(QObject *parent, const char *name):QObject(parent)
{
setObjectName(name);
init();
connect(this, SIGNAL(fileAddedToDownload()), this, SLOT(onUpdateDownloadLists()));
}
/**
* \brief Destructor
*/
UBDownloadManager::~UBDownloadManager()
{
}
/**
* \brief Get the download manager
* @return a pointer on the download manager
*/
UBDownloadManager* UBDownloadManager::downloadManager()
{
if(NULL == pInstance)
{
pInstance = new UBDownloadManager();
}
return pInstance;
}
void UBDownloadManager::destroy()
{
if(pInstance)
{
delete pInstance;
}
pInstance = NULL;
}
/**
* \brief Add a file to the download list
* @param desc as the given file description
*/
void UBDownloadManager::addFileToDownload(sDownloadFileDesc desc)
{
// Set the ID for this download
desc.id = mLastID;
mLastID++;
// Add the file to the pending download list
mPendingDL.append(desc);
// If the download is modal, show the download dialog
if(desc.modal)
{
// Update the download order (priority to modal files)
updateDownloadOrder();
UBApplication::mainWindow->showDownloadWidget();
}
UBApplication::boardController->paletteManager()->startDownloads();
emit fileAddedToDownload();
}
/**
* \brief Initialize the download manager
*/
void UBDownloadManager::init()
{
mCrntDL.clear();
mPendingDL.clear();
mReplies.clear();
mLastID = 1;
mDLAvailability.clear();
for(int i=0; i modalFiles;
QVector nonModalfiles;
for(int i=0; i UBDownloadManager::currentDownloads()
{
return mCrntDL;
}
/**
* \brief Get the list of the pending downloads
* @return a QVector of pending downloads
*/
QVector UBDownloadManager::pendingDownloads()
{
return mPendingDL;
}
/**
* \brief Update the file transfer information
* @param desc as the current downloaded file description
*/
void UBDownloadManager::onDownloadProgress(int id, qint64 received, qint64 total)
{
updateFileCurrentSize(id, received, total);
}
/**
* \brief Called when the download of the given file is finished
* @param desc as the current downloaded file description
*/
void UBDownloadManager::onDownloadFinished(int id, bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground)
{
for(int i=0; i= 0 && total >= 0)
{
// -------------------------------------
// [=============== x% ==== ]
// -------------------------------------
desc.currentSize = received;
desc.totalSize = total;
emit downloadUpdated(id, received, total);
}
else
{
// -------------------------------------
// [=============== 100% ==============]
// -------------------------------------
// received and total are negative. That means that the download is finished
desc.currentSize = mCrntDL.at(i).totalSize;
// Remove the finished file from the current download list
mCrntDL.remove(i);
// Here we don't forget to remove the reply related to the finished download
mReplies.remove(id);
// Free the download slot used by the finished file
for(int j=0; jget(QUrl(desc.url), desc.pos, desc.size, desc.isBackground);
}
/**
* \brief Verify if modal downloads remains and notify everyone if it is not the case.
*/
void UBDownloadManager::checkIfModalRemains()
{
bool bModal = false;
for(int i=0; ihideDownloadWidget();
// Notify that no modal downloads are pending
emit downloadModalFinished();
}
}
/**
* \brief Cancel all downloads
*/
void UBDownloadManager::cancelDownloads()
{
// Stop the current downloads
QMap::iterator it = mReplies.begin();
for(; it!=mReplies.end();it++)
{
dynamic_cast(it.value())->abort();
}
// Clear all the lists
init();
checkIfModalRemains();
finishDownloads(true);
}
void UBDownloadManager::onDownloadError(int id)
{
QNetworkReply* pReply = mReplies.value(id);
if(NULL != pReply)
{
// Check which error occured:
switch(pReply->error())
{
case QNetworkReply::OperationCanceledError:
// For futur developments: do something in case of download aborting (message? remove the download?)
break;
default:
// Check the documentation of QNetworkReply in Qt Assistant for the different error cases
break;
}
}
}
void UBDownloadManager::finishDownloads(bool cancel)
{
UBApplication::boardController->paletteManager()->stopDownloads();
if(cancel){
emit cancelAllDownloads();
}
else{
emit allDownloadsFinished();
}
}
void UBDownloadManager::cancelDownload(int id)
{
// Stop the download
mReplies[id]->abort();
mReplies.remove(id);
// Remove the canceled download from the download lists
bool bFound = false;
for(int i=0; i