/* * 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 */ int 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(); return desc.id; } /** * \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) { // Temporary data for dnd do not delete it please Q_UNUSED(pPos) Q_UNUSED(pSize) Q_UNUSED(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(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