116 lines
3.1 KiB
C++
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();
|
|
}
|