summaryrefslogblamecommitdiffstats
path: root/src/DownloadManager.cpp
blob: b63799466fed61f012e4a5fea4ecde3e2b13e06d (plain) (tree)
1
2
3
4
5
6
7
8
9
                            
 




                                                                
                                                                                           
                                                               
 
                                                              
                                                  






                                                                                
                                                                 
                       
                                                          
                            
 
                                                                                           
                                         
 
                                                                       
                                                              

                                             
                         




                                                               
                                        
                                 
                                                        
                                            







                                                          

                                                        
                                                 

                                                
                                                             

                                    
         
                                          


                                                                                            

                                                                                       

                                                                                              



                                                                                           

                                     
                                                        

                                                        


                                                                                           

                                                                         

                                                                                
 


                                                                                           

                                        
                                                             

                                                                                       
                             
                        



                                                       

                                       
                                       

                                    
                            
 

                                                                                           
                                                     
 
                                                               
                                                 
                                
                    
 
              

                                   
                            
 
#include "DownloadManager.h"

void DownloadManager::downloadFile(QString name)
{
	qDebug() << "Received downloadFile signal for:" << name;
	this->processDownloadRequest(name);
}
// ----------------------------------------------------------------------------------------
void DownloadManager::processDownloadRequest(QString& filename)
{
	// Forge URL from the given filename and the base URL.
	QUrl u = this->baseUrl.resolved(filename);
	// If download in progress, enqueue file and return.
	if (dip)
	{
		qDebug() << "Download in progress! Enqueueing:" << u.toString();
		dlQ.enqueue(u);
		return;
	}
	// No running downloads: enqueue and start next download.
	dlQ.enqueue(u);
	qDebug() << "Enqueueing:" << u.toString() << endl;
	startNextDownload();
}
// ----------------------------------------------------------------------------------------
void DownloadManager::startNextDownload()
{
	qDebug() << "Starting next download: " << dlQ.head().toString()
			 << "(" << dlQ.size() << "in queue.)";
	// Set flag for download in progress.
	dip = true;
	// TODO: needed ?
	if (dlQ.isEmpty())
	{
		qDebug() << "Download queue empty! Exiting...";
		return;
	}
	// Dequeue next URL to download.
	QUrl url = dlQ.dequeue();
	//qDebug() << "Dequeueing..." << url.toString();
	// Extract the filename from the URL
	QString path = url.path();
	QString basename = QFileInfo(path).fileName();
	if (basename.isEmpty())
		this->filename = "download";
	else
		this->filename = basename;
	//qDebug() << "Path is: " << path << endl;
	//qDebug() << "Basename is: " << basename << endl;
	//qDebug() << "Filename is: " << this->filename;
	outfile.setFileName(this->filename);
	// If error upon opening, skip this file.
	if (!outfile.open(QIODevice::WriteOnly))
	{
		qDebug() << "Couldn't open file! Exiting...";
		startNextDownload();
		return;
	}
	// Start the request for this URL.
	QNetworkRequest request(url);
	currentDownload = (*qnam).get(request);
	QObject::connect(currentDownload, SIGNAL(readyRead()), this, SLOT(downloadReady()));
	QObject::connect(currentDownload, SIGNAL(downloadProgress(qint64, qint64)),
					 this, SLOT(downloadProgress(qint64, qint64)));
	QObject::connect(currentDownload, SIGNAL(finished()), this, SLOT(downloadFinished()));
}
// ----------------------------------------------------------------------------------------
//                  Slots for the signals emmited by currentDownload.
// ----------------------------------------------------------------------------------------
// This slot listens to readyRead() emmited when data is available for reading.
void DownloadManager::downloadReady()
{
	// readyRead() fired, so save the readable data.
	outfile.write(this->currentDownload->readAll());
}
// ----------------------------------------------------------------------------------------
// This slot listens to the downloadProgress(..)
// which provides information on the download progress of the file.
void DownloadManager::downloadProgress(qint64 bytesIn, qint64 bytesTotal)
{
	qDebug() << "Download progress of " << currentDownload->url().toString()
			 << ": " << bytesIn << "/" << bytesTotal;
}
// ----------------------------------------------------------------------------------------
// This slot listens to the finished() which is emmited
// when all the data from the reply has been read.
void DownloadManager::downloadFinished()
{
	// Second check if the download actually is finished.
	if (currentDownload->isFinished())
		qDebug() << "Downloaded " << currentDownload->url().toString() << endl;
	// Close output file.
	outfile.close();
	// If queue is empty, we are done.
	// TODO: not sure if this is actually needed...
	if (dlQ.isEmpty())
		return;
	// Queue not empty.
	// Delete current reply object.
	currentDownload->deleteLater();
	// Initialise next download.
	dip = false;
	startNextDownload();
}
// ----------------------------------------------------------------------------------------
// Constructor.
DownloadManager::DownloadManager(const QUrl& baseUrl)
{
	qDebug() << endl << "Initialising Download Manager...";
	this->qnam = new QNetworkAccessManager();
	this->baseUrl = baseUrl;
	dip = false;
}
// Destructor.
DownloadManager::~DownloadManager()
{
	delete[] this->qnam;
}