Compression algo dependencies, still need hackery...

This commit is contained in:
Petr Mrázek
2013-09-26 02:58:09 +02:00
parent af234f3502
commit 2c8dc0b855
52 changed files with 17769 additions and 40 deletions

View File

@ -189,5 +189,8 @@ void OneSixUpdate::jarlibFinished()
void OneSixUpdate::jarlibFailed()
{
emitFailed("Failed to download the binary garbage. Try again. Maybe. IF YOU DARE");
QStringList failed = jarlibDownloadJob->getFailedFiles();
QString failed_all = failed.join("\n");
emitFailed("Failed to download the following files:\n" + failed_all +
"\n\nPlease try again.");
}

View File

@ -152,7 +152,7 @@ void MCVListLoadTask::executeTask()
void MCVListLoadTask::list_downloaded()
{
if(vlistReply->error() != QNetworkReply::QNetworkReply::NoError)
if(vlistReply->error() != QNetworkReply::NoError)
{
vlistReply->deleteLater();
emitFailed("Failed to load Minecraft main version list" + vlistReply->errorString());

View File

@ -31,7 +31,7 @@ void ByteArrayDownload::downloadProgress ( qint64 bytesReceived, qint64 bytesTot
void ByteArrayDownload::downloadError ( QNetworkReply::NetworkError error )
{
// error happened during download.
// TODO: log the reason why
qDebug() << "URL:" << m_url.toString().toLocal8Bit() << "Network error: " << error;
m_status = Job_Failed;
}

View File

@ -7,47 +7,48 @@
#include <QDebug>
ByteArrayDownloadPtr DownloadJob::add ( QUrl url )
ByteArrayDownloadPtr DownloadJob::add(QUrl url)
{
ByteArrayDownloadPtr ptr (new ByteArrayDownload(url));
ByteArrayDownloadPtr ptr(new ByteArrayDownload(url));
ptr->index_within_job = downloads.size();
downloads.append(ptr);
parts_progress.append(QPair<qint64, qint64>(0,1));
parts_progress.append(part_info());
total_progress++;
return ptr;
}
FileDownloadPtr DownloadJob::add ( QUrl url, QString rel_target_path)
FileDownloadPtr DownloadJob::add(QUrl url, QString rel_target_path)
{
FileDownloadPtr ptr (new FileDownload(url, rel_target_path));
FileDownloadPtr ptr(new FileDownload(url, rel_target_path));
ptr->index_within_job = downloads.size();
downloads.append(ptr);
parts_progress.append(QPair<qint64, qint64>(0,1));
parts_progress.append(part_info());
total_progress++;
return ptr;
}
CacheDownloadPtr DownloadJob::add ( QUrl url, MetaEntryPtr entry)
CacheDownloadPtr DownloadJob::add(QUrl url, MetaEntryPtr entry)
{
CacheDownloadPtr ptr (new CacheDownload(url, entry));
CacheDownloadPtr ptr(new CacheDownload(url, entry));
ptr->index_within_job = downloads.size();
downloads.append(ptr);
parts_progress.append(QPair<qint64, qint64>(0,1));
parts_progress.append(part_info());
total_progress++;
return ptr;
}
void DownloadJob::partSucceeded ( int index )
void DownloadJob::partSucceeded(int index)
{
// do progress. all slots are 1 in size at least
auto & slot = parts_progress[index];
partProgress ( index, slot.second , slot.second );
auto &slot = parts_progress[index];
partProgress(index, slot.total_progress, slot.total_progress);
num_succeeded++;
qDebug() << m_job_name.toLocal8Bit() << " progress: " << num_succeeded << "/" << downloads.size();
if(num_failed + num_succeeded == downloads.size())
qDebug() << m_job_name.toLocal8Bit() << " progress: " << num_succeeded << "/"
<< downloads.size();
if (num_failed + num_succeeded == downloads.size())
{
if(num_failed)
if (num_failed)
{
qDebug() << m_job_name.toLocal8Bit() << " failed.";
emit failed();
@ -60,39 +61,65 @@ void DownloadJob::partSucceeded ( int index )
}
}
void DownloadJob::partFailed ( int index )
void DownloadJob::partFailed(int index)
{
num_failed++;
if(num_failed + num_succeeded == downloads.size())
auto &slot = parts_progress[index];
if (slot.failures == 3)
{
qDebug() << m_job_name.toLocal8Bit() << " failed.";
emit failed();
qDebug() << "Part " << index << " failed 3 times (" << downloads[index]->m_url << ")";
num_failed++;
if (num_failed + num_succeeded == downloads.size())
{
qDebug() << m_job_name.toLocal8Bit() << " failed.";
emit failed();
}
}
else
{
qDebug() << "Part " << index << " failed, restarting (" << downloads[index]->m_url
<< ")";
// restart the job
slot.failures++;
downloads[index]->start();
}
}
void DownloadJob::partProgress ( int index, qint64 bytesReceived, qint64 bytesTotal )
void DownloadJob::partProgress(int index, qint64 bytesReceived, qint64 bytesTotal)
{
auto & slot = parts_progress[index];
current_progress -= slot.first;
slot.first = bytesReceived;
current_progress += slot.first;
total_progress -= slot.second;
slot.second = bytesTotal;
total_progress += slot.second;
auto &slot = parts_progress[index];
current_progress -= slot.current_progress;
slot.current_progress = bytesReceived;
current_progress += slot.current_progress;
total_progress -= slot.total_progress;
slot.total_progress = bytesTotal;
total_progress += slot.total_progress;
emit progress(current_progress, total_progress);
}
void DownloadJob::start()
{
qDebug() << m_job_name.toLocal8Bit() << " started.";
for(auto iter: downloads)
for (auto iter : downloads)
{
connect(iter.data(), SIGNAL(succeeded(int)), SLOT(partSucceeded(int)));
connect(iter.data(), SIGNAL(failed(int)), SLOT(partFailed(int)));
connect(iter.data(), SIGNAL(progress(int,qint64,qint64)), SLOT(partProgress(int,qint64,qint64)));
connect(iter.data(), SIGNAL(progress(int, qint64, qint64)),
SLOT(partProgress(int, qint64, qint64)));
iter->start();
}
}
QStringList DownloadJob::getFailedFiles()
{
QStringList failed;
for (auto download : downloads)
{
if (download->m_status == Job_Failed)
{
failed.push_back(download->m_url.toString());
}
}
return failed;
}

View File

@ -51,6 +51,7 @@ public:
{
return m_running;
};
QStringList getFailedFiles();
signals:
void started();
void progress(qint64 current, qint64 total);
@ -63,9 +64,15 @@ private slots:
void partSucceeded(int index);
void partFailed(int index);
private:
struct part_info
{
qint64 current_progress = 0;
qint64 total_progress = 1;
int failures = 0;
};
QString m_job_name;
QList<DownloadPtr> downloads;
QList<QPair<qint64, qint64>> parts_progress;
QList<part_info> parts_progress;
qint64 current_progress = 0;
qint64 total_progress = 0;
int num_succeeded = 0;