| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | /* * cdownloadmanager_moc.cpp, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */#include "StdInc.h"#include "cdownloadmanager_moc.h"#include "../launcherdirs.h"CDownloadManager::CDownloadManager(){	connect(&manager, SIGNAL(finished(QNetworkReply *)),		SLOT(downloadFinished(QNetworkReply *)));}void CDownloadManager::downloadFile(const QUrl & url, const QString & file){	QNetworkRequest request(url);	FileEntry entry;	entry.file.reset(new QFile(CLauncherDirs::get().downloadsPath() + '/' + file));	entry.bytesReceived = 0;	entry.totalSize = 0;	if(entry.file->open(QIODevice::WriteOnly | QIODevice::Truncate))	{		entry.status = FileEntry::IN_PROGRESS;		entry.reply = manager.get(request);		connect(entry.reply, SIGNAL(downloadProgress(qint64,qint64)),			SLOT(downloadProgressChanged(qint64,qint64)));	}	else	{		entry.status = FileEntry::FAILED;		entry.reply = nullptr;		encounteredErrors += entry.file->errorString();	}	// even if failed - add it into list to report it in finished() call	currentDownloads.push_back(entry);}CDownloadManager::FileEntry & CDownloadManager::getEntry(QNetworkReply * reply){	assert(reply);	for(auto & entry : currentDownloads)	{		if(entry.reply == reply)			return entry;	}	assert(0);	static FileEntry errorValue;	return errorValue;}void CDownloadManager::downloadFinished(QNetworkReply * reply){	FileEntry & file = getEntry(reply);	if(file.reply->error())	{		encounteredErrors += file.reply->errorString();		file.file->remove();		file.status = FileEntry::FAILED;	}	else	{		file.file->write(file.reply->readAll());		file.file->close();		file.status = FileEntry::FINISHED;	}	bool downloadComplete = true;	for(auto & entry : currentDownloads)	{		if(entry.status == FileEntry::IN_PROGRESS)		{			downloadComplete = false;			break;		}	}	QStringList successful;	QStringList failed;	for(auto & entry : currentDownloads)	{		if(entry.status == FileEntry::FINISHED)			successful += entry.file->fileName();		else			failed += entry.file->fileName();	}	if(downloadComplete)		emit finished(successful, failed, encounteredErrors);	file.reply->deleteLater();	file.reply = nullptr;}void CDownloadManager::downloadProgressChanged(qint64 bytesReceived, qint64 bytesTotal){	auto reply = dynamic_cast<QNetworkReply *>(sender());	FileEntry & entry = getEntry(reply);	entry.file->write(entry.reply->readAll());	entry.bytesReceived = bytesReceived;	entry.totalSize = bytesTotal;	quint64 total = 0;	for(auto & entry : currentDownloads)		total += entry.totalSize > 0 ? entry.totalSize : 0;	quint64 received = 0;	for(auto & entry : currentDownloads)		received += entry.bytesReceived > 0 ? entry.bytesReceived : 0;	emit downloadProgress(received, total);}bool CDownloadManager::downloadInProgress(const QUrl & url){	for(auto & entry : currentDownloads)	{		if(entry.reply->url() == url)			return true;	}	return false;}
 |