/*------------------------------------------------------------------------------ -- This file is a part of the QLop Software -- Copyright (C) 2015, Plasma Physics Laboratory - CNRS -- -- 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 2 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, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -------------------------------------------------------------------------------*/ /*-- Author : Alexis Jeandet -- Mail : alexis.jeandet@member.fsf.org ----------------------------------------------------------------------------*/ #include "filedownloader.h" #include FileDownloader* FileDownloader::_self=NULL; QNetworkAccessManager* FileDownloader::m_WebCtrl=NULL; QList* FileDownloader::m_pendingTasks=NULL; QDockWidget* FileDownloader::m_gui=NULL; DownLoadHistory* FileDownloader::m_DownLoadHistory=NULL; #define _INIT \ if(Q_UNLIKELY(_self==NULL))\ {\ init();\ }\ int FileDownloader::downloadFile(QUrl fileUrl, const QString &name) { _INIT if(QFile::exists(name)|| QFile::exists(name+".part")) { return -1; } FileDownloaderTask* task=NULL; int ID=_self->getTaskId(); if(ID!=-1) { QNetworkRequest request(fileUrl); QNetworkReply* reply = m_WebCtrl->get(request); if(reply && (reply->error()==QNetworkReply::NoError)) { task=new FileDownloaderTask(reply,ID,name,_self); m_pendingTasks->append(task); if(!_self->m_noGui) { m_DownLoadHistory->addElement(new DownloadHistoryElement(task)); } } else { return -1; } } return ID; } int FileDownloader::downloadFile(QString fileUrl, const QString &name) { return downloadFile(QUrl(fileUrl),name); } QDockWidget *FileDownloader::getGUI() { if(!_self->m_noGui && (m_gui==NULL)) { m_DownLoadHistory=new DownLoadHistory(); m_gui=new QDockWidget("Download History"); m_gui->setWidget(m_DownLoadHistory); m_gui->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable); } return (QDockWidget*) m_gui; } const QString &FileDownloader::serviceName() { return m_serviceName; } int FileDownloader::download_file(QUrl fileUrl, const QString &name) { return downloadFile(fileUrl,name); } int FileDownloader::download_file(QString fileUrl, const QString &name) { return downloadFile(fileUrl,name); } FileDownloaderTask* FileDownloader::getDownloadTask(int ID) { _INIT for(int i=0;icount();i++) { if(m_pendingTasks->at(i)->ID()==ID) return m_pendingTasks->at(i); } return NULL; } bool FileDownloader::taskIsCompleted(int ID) { return getDownloadTask(ID)->downloadComplete(); } FileDownloader *FileDownloader::self() { _INIT return _self; } int FileDownloader::getTaskId() { for(unsigned int i=0;icount();j++) { if(m_pendingTasks->at(j)->ID()==(int)i) idValid=false; } if(idValid) return (int)i; } return -1; } void FileDownloader::init(bool noGUI, QObject *parent) { if(Q_UNLIKELY(_self==NULL)) { _self=new FileDownloader(noGUI,parent); } } FileDownloader::FileDownloader(bool noGUI,QObject *parent) : QLopService(parent) { QNetworkProxyQuery q(QUrl("http://www.google.com")); q.setQueryType(QNetworkProxyQuery::UrlRequest); q.setProtocolTag("http"); QList proxies = QNetworkProxyFactory::systemProxyForQuery(q); if( proxies.size() > 0 && proxies[0].type() != QNetworkProxy::NoProxy ) QNetworkProxy::setApplicationProxy(proxies[0]); else qDebug("No proxy server selected"); m_WebCtrl = new QNetworkAccessManager(this); m_pendingTasks = new QList(); m_noGui=noGUI; m_serviceName="FileDownloader"; } FileDownloader::~FileDownloader() { if(!m_noGui) delete m_gui; while (m_pendingTasks->count()) { FileDownloaderTask* task=m_pendingTasks->last(); m_pendingTasks->removeLast(); delete task; } delete m_WebCtrl; }