diff --git a/JGE/include/qt/filedownloader.h b/JGE/include/qt/filedownloader.h index 2eb7c1ace..d7deb7c64 100644 --- a/JGE/include/qt/filedownloader.h +++ b/JGE/include/qt/filedownloader.h @@ -9,6 +9,8 @@ #include #ifdef QT_WIDGET #include +#include +#include #else #include #endif //QT_WIDGET @@ -60,19 +62,30 @@ signals: private slots: void fileDownloaded(){ - if(m_tmp.write(m_downloadReply->readAll()) == -1) return; - if(QFile(m_localPath).exists()) - QFile::remove(m_localPath); + // let's check some error + if(m_downloadReply->error() != QNetworkReply::NoError) { + m_state = NETWORK_ERROR; + } else { + if(m_tmp.write(m_downloadReply->readAll()) == -1) return; + if(QFile(m_localPath).exists()) + QFile::remove(m_localPath); - if(!m_tmp.rename(m_localPath)) return; - - computeLocalHash(m_tmp); - m_tmp.setAutoRemove(false); - m_state = DOWNLOADED; + m_tmp.close(); + computeLocalHash(m_tmp); + if(m_localHash == m_remoteHash) { + if(!m_tmp.rename(m_localPath)) return; + m_tmp.setAutoRemove(false); + m_state = DOWNLOADED; + } + else { + m_state = NETWORK_ERROR; + } + } emit stateChanged(m_state); }; void downloadProgress(qint64 bytesReceived, qint64 bytesTotal){ if(m_tmp.write(m_downloadReply->readAll()) == -1) return; + if(!bytesTotal) return; m_received = bytesReceived*100/bytesTotal; emit receivedChanged(m_received); }; @@ -83,8 +96,16 @@ private slots: void handleStateChange(DownloadState state){ #ifdef QT_WIDGET switch(state) { - case DOWNLOADED: case NETWORK_ERROR: + if(m_localHash == "") { + setLabelText("Network Error"); + setCancelButton(new QPushButton("OK")); + show(); + } else { + emit finished(0); + } + break; + case DOWNLOADED: emit finished(0); break; case DOWNLOADING_HASH: @@ -98,6 +119,11 @@ private slots: emit stateStringChanged(); #endif //QT_WIDGET }; +#ifdef QT_WIDGET + void handleCancel(){ + QCoreApplication::instance()->exit(1); + } +#endif //QT_WIDGET private: diff --git a/JGE/src/qt/filedownloader.cpp b/JGE/src/qt/filedownloader.cpp index 96143f404..8dc16d7dd 100644 --- a/JGE/src/qt/filedownloader.cpp +++ b/JGE/src/qt/filedownloader.cpp @@ -13,8 +13,9 @@ FileDownloader::FileDownloader(QString localPath, QString targetFile, QObject *p { #ifdef QT_WIDGET setCancelButton(0); -#endif //QT_WIDGET 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()); @@ -81,18 +82,22 @@ void FileDownloader::requestHash(QUrl url) void FileDownloader::computeRemoteHash() { - QString aString = m_hashReply->readAll(); + if(m_hashReply->error() != QNetworkReply::NoError) { + m_state = NETWORK_ERROR; + } else { + QString aString = m_hashReply->readAll(); - int index = aString.indexOf("SHA1 Checksum: "); - m_remoteHash = aString.mid(index+52, 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; + int index = aString.indexOf("SHA1 Checksum: "); + m_remoteHash = aString.mid(index+52, 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); } @@ -100,9 +105,10 @@ void FileDownloader::computeRemoteHash() void FileDownloader::computeLocalHash(QFile& file) { QCryptographicHash crypto(QCryptographicHash::Sha1); - file.open(QFile::ReadOnly); - while(!file.atEnd()){ - crypto.addData(file.read(8192)); + QFile myFile(file.fileName()); + myFile.open(QFile::ReadOnly); + while(!myFile.atEnd()){ + crypto.addData(myFile.read(8192)); } QByteArray hash = crypto.result(); m_localHash = hash.toHex();