summaryrefslogtreecommitdiffstats
path: root/logic/net/NetJob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'logic/net/NetJob.cpp')
-rw-r--r--logic/net/NetJob.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/logic/net/NetJob.cpp b/logic/net/NetJob.cpp
new file mode 100644
index 00000000..c7ca4409
--- /dev/null
+++ b/logic/net/NetJob.cpp
@@ -0,0 +1,98 @@
+#include "NetJob.h"
+#include "pathutils.h"
+#include "MultiMC.h"
+#include "FileDownload.h"
+#include "ByteArrayDownload.h"
+#include "CacheDownload.h"
+
+#include <logger/QsLog.h>
+
+void NetJob::partSucceeded(int index)
+{
+ // do progress. all slots are 1 in size at least
+ auto &slot = parts_progress[index];
+ partProgress(index, slot.total_progress, slot.total_progress);
+
+ num_succeeded++;
+ QLOG_INFO() << m_job_name.toLocal8Bit() << "progress:" << num_succeeded << "/"
+ << downloads.size();
+ emit filesProgress(num_succeeded, num_failed, downloads.size());
+
+ if (num_failed + num_succeeded == downloads.size())
+ {
+ if (num_failed)
+ {
+ QLOG_ERROR() << m_job_name.toLocal8Bit() << "failed.";
+ emit failed();
+ }
+ else
+ {
+ QLOG_INFO() << m_job_name.toLocal8Bit() << "succeeded.";
+ emit succeeded();
+ }
+ }
+}
+
+void NetJob::partFailed(int index)
+{
+ auto &slot = parts_progress[index];
+ if (slot.failures == 3)
+ {
+ QLOG_ERROR() << "Part" << index << "failed 3 times (" << downloads[index]->m_url << ")";
+ num_failed++;
+ emit filesProgress(num_succeeded, num_failed, downloads.size());
+ if (num_failed + num_succeeded == downloads.size())
+ {
+ QLOG_ERROR() << m_job_name.toLocal8Bit() << "failed.";
+ emit failed();
+ }
+ }
+ else
+ {
+ QLOG_ERROR() << "Part" << index << "failed, restarting (" << downloads[index]->m_url
+ << ")";
+ // restart the job
+ slot.failures++;
+ downloads[index]->start();
+ }
+}
+
+void NetJob::partProgress(int index, qint64 bytesReceived, qint64 bytesTotal)
+{
+ 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 NetJob::start()
+{
+ QLOG_INFO() << m_job_name.toLocal8Bit() << " started.";
+ for (auto iter : downloads)
+ {
+ connect(iter.get(), SIGNAL(succeeded(int)), SLOT(partSucceeded(int)));
+ connect(iter.get(), SIGNAL(failed(int)), SLOT(partFailed(int)));
+ connect(iter.get(), SIGNAL(progress(int, qint64, qint64)),
+ SLOT(partProgress(int, qint64, qint64)));
+ iter->start();
+ }
+}
+
+QStringList NetJob::getFailedFiles()
+{
+ QStringList failed;
+ for (auto download : downloads)
+ {
+ if (download->m_status == Job_Failed)
+ {
+ failed.push_back(download->m_url.toString());
+ }
+ }
+ return failed;
+}