Files
wagic/projects/mtg/src/qt/filedownloader.cpp
2015-09-26 21:52:07 +02:00

116 lines
3.1 KiB
C++

#include "filedownloader.h"
#include <QDir>
#include <QCryptographicHash>
FileDownloader::FileDownloader(QString localPath, QString targetFile, QObject *parent) :
#ifdef QT_WIDGET
QProgressDialog("Downloading resources", "", 0, 100, (QWidget*)parent, 0),
#else
QObject(parent),
#endif //QT_WIDGET
m_state(NETWORK_ERROR), m_received(0), m_targetFile(targetFile), m_localHash(""), m_OK(false)
{
#ifdef QT_WIDGET
setCancelButton(0);
connect(this, SIGNAL(receivedChanged(int)), SLOT(setValue(int)));
connect(this, SIGNAL(canceled()), SLOT(handleCancel()));
#endif //QT_WIDGET
connect(this, SIGNAL(stateChanged(DownloadState)), SLOT(handleStateChange(DownloadState)));
QDir dir(QDir::homePath());
if(!dir.mkpath(localPath))
{
m_OK = false;
return;
}
dir.cd(localPath);
m_localPath = dir.filePath("core.zip");
QFile local(m_localPath);
if(local.exists()) {
/* a file is already present in the local path */
computeLocalHash(local);
m_state = DOWNLOADED;
}
if(m_WebCtrl.networkAccessible()) {
/* Network is OK, we request the remote hash file */
m_state = DOWNLOADING_HASH;
requestHash(QUrl("http://code.google.com/p/wagic/downloads/detail?name="+m_targetFile));
}
emit stateChanged(m_state);
}
void FileDownloader::setDownloadUrl(QUrl url)
{
if((!url.isEmpty()))
{
if(!m_WebCtrl.networkAccessible()) {
m_status = "Network not accessible, press retry when the network is accessible.";
emit statusChanged();
return;
}
QNetworkRequest request(url);
m_downloadReply = m_WebCtrl.get(request);
connect(m_downloadReply, SIGNAL(downloadProgress(qint64, qint64)),
SLOT(downloadProgress(qint64, qint64)));
connect(m_downloadReply, SIGNAL(finished()), SLOT(fileDownloaded()));
m_status = "Downloading Resources";
m_OK = m_tmp.open();
}
}
FileDownloader::~FileDownloader()
{
}
void FileDownloader::requestHash(QUrl url)
{
QNetworkRequest request(url);
m_hashReply = m_WebCtrl.get(request);
connect(m_hashReply, SIGNAL(finished()), SLOT(computeRemoteHash()));
}
void FileDownloader::computeRemoteHash()
{
if(m_hashReply->error() != QNetworkReply::NoError) {
m_state = NETWORK_ERROR;
} else {
QString aString = m_hashReply->readAll();
int index = aString.indexOf("<span id=\"sha1\">");
m_remoteHash = aString.mid(index+16, 40);
if(m_localHash != m_remoteHash)
{ /* We download the real file */
m_state = DOWNLOADING_FILE;
setDownloadUrl(QUrl("http://wagic.googlecode.com/files/" + m_targetFile));
}
else
{
m_state = DOWNLOADED;
}
}
emit stateChanged(m_state);
}
void FileDownloader::computeLocalHash(QFile& file)
{
QCryptographicHash crypto(QCryptographicHash::Sha1);
QFile myFile(file.fileName());
myFile.open(QFile::ReadOnly);
while(!myFile.atEnd()){
crypto.addData(myFile.read(8192));
}
QByteArray hash = crypto.result();
m_localHash = hash.toHex();
}