From e76e6329cdf4f1613c6303debd3ca43493147f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 3 May 2017 23:11:52 +0200 Subject: NOISSUE Revert all recent changes to NetAction and NetJob --- api/logic/net/ByteArraySink.h | 22 +++++----- api/logic/net/Download.cpp | 88 +++++++++++++++++----------------------- api/logic/net/Download.h | 7 ++-- api/logic/net/FileSink.cpp | 36 ++++++++--------- api/logic/net/FileSink.h | 12 +++--- api/logic/net/MetaCacheSink.cpp | 10 ++--- api/logic/net/MetaCacheSink.h | 4 +- api/logic/net/NetAction.h | 71 +++++++++++++++++++++++++++----- api/logic/net/NetJob.cpp | 89 +++++++++++++---------------------------- api/logic/net/NetJob.h | 68 +++++++++++++++++++++++-------- api/logic/net/PasteUpload.cpp | 2 +- api/logic/net/Sink.h | 8 ++-- 12 files changed, 227 insertions(+), 190 deletions(-) (limited to 'api/logic/net') diff --git a/api/logic/net/ByteArraySink.h b/api/logic/net/ByteArraySink.h index c81b952b..03b77fcc 100644 --- a/api/logic/net/ByteArraySink.h +++ b/api/logic/net/ByteArraySink.h @@ -21,34 +21,34 @@ public: } public: - Task::Status init(QNetworkRequest & request) override + JobStatus init(QNetworkRequest & request) override { m_output->clear(); if(initAllValidators(request)) - return Task::Status::InProgress; - return Task::Status::Failed; + return Job_InProgress; + return Job_Failed; }; - Task::Status write(QByteArray & data) override + JobStatus write(QByteArray & data) override { m_output->append(data); if(writeAllValidators(data)) - return Task::Status::InProgress; - return Task::Status::Failed; + return Job_InProgress; + return Job_Failed; } - Task::Status abort() override + JobStatus abort() override { m_output->clear(); failAllValidators(); - return Task::Status::Failed; + return Job_Failed; } - Task::Status finalize(QNetworkReply &reply) override + JobStatus finalize(QNetworkReply &reply) override { if(finalizeAllValidators(reply)) - return Task::Status::Finished; - return Task::Status::Failed; + return Job_Finished; + return Job_Failed; } bool hasLocalData() override diff --git a/api/logic/net/Download.cpp b/api/logic/net/Download.cpp index 12c4d7e0..ee872e33 100644 --- a/api/logic/net/Download.cpp +++ b/api/logic/net/Download.cpp @@ -28,7 +28,7 @@ namespace Net { Download::Download():NetAction() { - m_status = Status::NotStarted; + m_status = Job_NotStarted; } Download::Ptr Download::makeCached(QUrl url, MetaEntryPtr entry, Options options) @@ -40,7 +40,7 @@ Download::Ptr Download::makeCached(QUrl url, MetaEntryPtr entry, Options options auto cachedNode = new MetaCacheSink(entry, md5Node); dl->m_sink.reset(cachedNode); dl->m_target_path = entry->getFullPath(); - return dl; + return std::shared_ptr(dl); } Download::Ptr Download::makeByteArray(QUrl url, QByteArray *output, Options options) @@ -49,7 +49,7 @@ Download::Ptr Download::makeByteArray(QUrl url, QByteArray *output, Options opti dl->m_url = url; dl->m_options = options; dl->m_sink.reset(new ByteArraySink(output)); - return dl; + return std::shared_ptr(dl); } Download::Ptr Download::makeFile(QUrl url, QString path, Options options) @@ -58,7 +58,7 @@ Download::Ptr Download::makeFile(QUrl url, QString path, Options options) dl->m_url = url; dl->m_options = options; dl->m_sink.reset(new FileSink(path)); - return dl; + return std::shared_ptr(dl); } void Download::addValidator(Validator * v) @@ -66,30 +66,30 @@ void Download::addValidator(Validator * v) m_sink->addValidator(v); } -void Download::executeTask() +void Download::start() { - if(m_status == Status::Aborted) + if(m_status == Job_Aborted) { qWarning() << "Attempt to start an aborted Download:" << m_url.toString(); - emit aborted(); + emit aborted(m_index_within_job); return; } QNetworkRequest request(m_url); m_status = m_sink->init(request); switch(m_status) { - case Status::Finished: - emit succeeded(); + case Job_Finished: + emit succeeded(m_index_within_job); qDebug() << "Download cache hit " << m_url.toString(); return; - case Status::InProgress: + case Job_InProgress: qDebug() << "Downloading " << m_url.toString(); break; - case Status::NotStarted: - case Status::Failed: - emit failed(); + case Job_NotStarted: + case Job_Failed: + emit failed(m_index_within_job); return; - case Status::Aborted: + case Job_Aborted: return; } @@ -106,20 +106,9 @@ void Download::executeTask() void Download::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) { - // FIXME: ignore unknown size. for now. - if(bytesTotal == -1) - { - return; - } - // FIXME: ignore redirects... for now. - auto redirectURL = getRedirect(); - if(!redirectURL.isEmpty()) - { - return; - } - m_progressTotal = bytesTotal; + m_total_progress = bytesTotal; m_progress = bytesReceived; - emit progress(bytesReceived, bytesTotal); + emit netActionProgress(m_index_within_job, bytesReceived, bytesTotal); } void Download::downloadError(QNetworkReply::NetworkError error) @@ -127,7 +116,7 @@ void Download::downloadError(QNetworkReply::NetworkError error) if(error == QNetworkReply::OperationCanceledError) { qCritical() << "Aborted " << m_url.toString(); - m_status = Status::Aborted; + m_status = Job_Aborted; } else { @@ -135,17 +124,17 @@ void Download::downloadError(QNetworkReply::NetworkError error) { if(m_sink->hasLocalData()) { - m_status = Status::Failed_Proceed; + m_status = Job_Failed_Proceed; return; } } // error happened during download. qCritical() << "Failed " << m_url.toString() << " with reason " << error; - m_status = Status::Failed; + m_status = Job_Failed; } } -QString Download::getRedirect() +bool Download::handleRedirect() { QVariant redirect = m_reply->header(QNetworkRequest::LocationHeader); QString redirectURL; @@ -162,15 +151,10 @@ QString Download::getRedirect() redirectURL = m_reply->url().scheme() + ":" + data; } } - return redirectURL; -} - -bool Download::handleRedirect() -{ - auto redirectURL = getRedirect(); if (!redirectURL.isEmpty()) { - m_url = QUrl(redirectURL); + m_url = QUrl(redirect.toString()); + qDebug() << "Following redirect to " << m_url.toString(); start(); return true; } @@ -188,28 +172,28 @@ void Download::downloadFinished() } // if the download failed before this point ... - if (m_status == Status::Failed_Proceed) + if (m_status == Job_Failed_Proceed) { qDebug() << "Download failed but we are allowed to proceed:" << m_url.toString(); m_sink->abort(); m_reply.reset(); - emit succeeded(); + emit succeeded(m_index_within_job); return; } - else if (m_status == Status::Failed) + else if (m_status == Job_Failed) { qDebug() << "Download failed in previous step:" << m_url.toString(); m_sink->abort(); m_reply.reset(); - emit failed(); + emit failed(m_index_within_job); return; } - else if(m_status == Status::Aborted) + else if(m_status == Job_Aborted) { qDebug() << "Download aborted in previous step:" << m_url.toString(); m_sink->abort(); m_reply.reset(); - emit aborted(); + emit aborted(m_index_within_job); return; } @@ -223,26 +207,26 @@ void Download::downloadFinished() // otherwise, finalize the whole graph m_status = m_sink->finalize(*m_reply.get()); - if (m_status != Status::Finished) + if (m_status != Job_Finished) { qDebug() << "Download failed to finalize:" << m_url.toString(); m_sink->abort(); m_reply.reset(); - emit failed(); + emit failed(m_index_within_job); return; } m_reply.reset(); qDebug() << "Download succeeded:" << m_url.toString(); - emit succeeded(); + emit succeeded(m_index_within_job); } void Download::downloadReadyRead() { - if(m_status == Status::InProgress) + if(m_status == Job_InProgress) { auto data = m_reply->readAll(); m_status = m_sink->write(data); - if(m_status == Status::Failed) + if(m_status == Job_Failed) { qCritical() << "Failed to process response chunk for " << m_target_path; } @@ -250,7 +234,7 @@ void Download::downloadReadyRead() } else { - qCritical() << "Cannot write to " << m_target_path << ", illegal status" << int(m_status); + qCritical() << "Cannot write to " << m_target_path << ", illegal status" << m_status; } } @@ -264,12 +248,12 @@ bool Net::Download::abort() } else { - m_status = Status::Aborted; + m_status = Job_Aborted; } return true; } -bool Net::Download::canAbort() const +bool Net::Download::canAbort() { return true; } diff --git a/api/logic/net/Download.h b/api/logic/net/Download.h index fdc83d5e..3347dc96 100644 --- a/api/logic/net/Download.h +++ b/api/logic/net/Download.h @@ -27,7 +27,7 @@ class MULTIMC_LOGIC_EXPORT Download : public NetAction Q_OBJECT public: /* types */ - typedef shared_qobject_ptr Ptr; + typedef std::shared_ptr Ptr; enum class Option { NoOptions = 0, @@ -50,10 +50,9 @@ public: /* methods */ } void addValidator(Validator * v); bool abort() override; - bool canAbort() const override; + bool canAbort() override; private: /* methods */ - QString getRedirect(); bool handleRedirect(); protected slots: @@ -63,7 +62,7 @@ protected slots: void downloadReadyRead() override; public slots: - void executeTask() override; + void start() override; private: /* data */ // FIXME: remove this, it has no business being here. diff --git a/api/logic/net/FileSink.cpp b/api/logic/net/FileSink.cpp index 83df6843..7dfc4336 100644 --- a/api/logic/net/FileSink.cpp +++ b/api/logic/net/FileSink.cpp @@ -17,10 +17,10 @@ FileSink::~FileSink() // nil }; -Task::Status FileSink::init(QNetworkRequest& request) +JobStatus FileSink::init(QNetworkRequest& request) { auto result = initCache(request); - if(result != Task::Status::InProgress) + if(result != Job_InProgress) { return result; } @@ -28,27 +28,27 @@ Task::Status FileSink::init(QNetworkRequest& request) if (!FS::ensureFilePathExists(m_filename)) { qCritical() << "Could not create folder for " + m_filename; - return Task::Status::Failed; + return Job_Failed; } wroteAnyData = false; m_output_file.reset(new QSaveFile(m_filename)); if (!m_output_file->open(QIODevice::WriteOnly)) { qCritical() << "Could not open " + m_filename + " for writing"; - return Task::Status::Failed; + return Job_Failed; } if(initAllValidators(request)) - return Task::Status::InProgress; - return Task::Status::Failed; + return Job_InProgress; + return Job_Failed; } -Task::Status FileSink::initCache(QNetworkRequest &) +JobStatus FileSink::initCache(QNetworkRequest &) { - return Task::Status::InProgress; + return Job_InProgress; } -Task::Status FileSink::write(QByteArray& data) +JobStatus FileSink::write(QByteArray& data) { if (!writeAllValidators(data) || m_output_file->write(data) != data.size()) { @@ -56,20 +56,20 @@ Task::Status FileSink::write(QByteArray& data) m_output_file->cancelWriting(); m_output_file.reset(); wroteAnyData = false; - return Task::Status::Failed; + return Job_Failed; } wroteAnyData = true; - return Task::Status::InProgress; + return Job_InProgress; } -Task::Status FileSink::abort() +JobStatus FileSink::abort() { m_output_file->cancelWriting(); failAllValidators(); - return Task::Status::Failed; + return Job_Failed; } -Task::Status FileSink::finalize(QNetworkReply& reply) +JobStatus FileSink::finalize(QNetworkReply& reply) { // if we wrote any data to the save file, we try to commit the data to the real file. if (wroteAnyData) @@ -77,13 +77,13 @@ Task::Status FileSink::finalize(QNetworkReply& reply) // ask validators for data consistency // we only do this for actual downloads, not 'your data is still the same' cache hits if(!finalizeAllValidators(reply)) - return Task::Status::Failed; + return Job_Failed; // nothing went wrong... if (!m_output_file->commit()) { qCritical() << "Failed to commit changes to " << m_filename; m_output_file->cancelWriting(); - return Task::Status::Failed; + return Job_Failed; } } // then get rid of the save file @@ -92,9 +92,9 @@ Task::Status FileSink::finalize(QNetworkReply& reply) return finalizeCache(reply); } -Task::Status FileSink::finalizeCache(QNetworkReply &) +JobStatus FileSink::finalizeCache(QNetworkReply &) { - return Task::Status::Finished; + return Job_Finished; } bool FileSink::hasLocalData() diff --git a/api/logic/net/FileSink.h b/api/logic/net/FileSink.h index a7528b5d..035d5bfd 100644 --- a/api/logic/net/FileSink.h +++ b/api/logic/net/FileSink.h @@ -10,15 +10,15 @@ public: /* con/des */ virtual ~FileSink(); public: /* methods */ - Task::Status init(QNetworkRequest & request) override; - Task::Status write(QByteArray & data) override; - Task::Status abort() override; - Task::Status finalize(QNetworkReply & reply) override; + JobStatus init(QNetworkRequest & request) override; + JobStatus write(QByteArray & data) override; + JobStatus abort() override; + JobStatus finalize(QNetworkReply & reply) override; bool hasLocalData() override; protected: /* methods */ - virtual Task::Status initCache(QNetworkRequest &); - virtual Task::Status finalizeCache(QNetworkReply &reply); + virtual JobStatus initCache(QNetworkRequest &); + virtual JobStatus finalizeCache(QNetworkReply &reply); protected: /* data */ QString m_filename; diff --git a/api/logic/net/MetaCacheSink.cpp b/api/logic/net/MetaCacheSink.cpp index 4fe4f3fb..c9d75310 100644 --- a/api/logic/net/MetaCacheSink.cpp +++ b/api/logic/net/MetaCacheSink.cpp @@ -17,11 +17,11 @@ MetaCacheSink::~MetaCacheSink() // nil }; -Task::Status MetaCacheSink::initCache(QNetworkRequest& request) +JobStatus MetaCacheSink::initCache(QNetworkRequest& request) { if (!m_entry->isStale()) { - return Task::Status::Finished; + return Job_Finished; } // check if file exists, if it does, use its information for the request QFile current(m_filename); @@ -36,10 +36,10 @@ Task::Status MetaCacheSink::initCache(QNetworkRequest& request) request.setRawHeader(QString("If-None-Match").toLatin1(), m_entry->getETag().toLatin1()); } } - return Task::Status::InProgress; + return Job_InProgress; } -Task::Status MetaCacheSink::finalizeCache(QNetworkReply & reply) +JobStatus MetaCacheSink::finalizeCache(QNetworkReply & reply) { QFileInfo output_file_info(m_filename); if(wroteAnyData) @@ -54,7 +54,7 @@ Task::Status MetaCacheSink::finalizeCache(QNetworkReply & reply) m_entry->setLocalChangedTimestamp(output_file_info.lastModified().toUTC().toMSecsSinceEpoch()); m_entry->setStale(false); ENV.metacache()->updateEntry(m_entry); - return Task::Status::Finished; + return Job_Finished; } bool MetaCacheSink::hasLocalData() diff --git a/api/logic/net/MetaCacheSink.h b/api/logic/net/MetaCacheSink.h index 8df03d06..0f3bbdf6 100644 --- a/api/logic/net/MetaCacheSink.h +++ b/api/logic/net/MetaCacheSink.h @@ -12,8 +12,8 @@ public: /* con/des */ bool hasLocalData() override; protected: /* methods */ - Task::Status initCache(QNetworkRequest & request) override; - Task::Status finalizeCache(QNetworkReply & reply) override; + JobStatus initCache(QNetworkRequest & request) override; + JobStatus finalizeCache(QNetworkReply & reply) override; private: /* data */ MetaEntryPtr m_entry; diff --git a/api/logic/net/NetAction.h b/api/logic/net/NetAction.h index 667484d1..a533c317 100644 --- a/api/logic/net/NetAction.h +++ b/api/logic/net/NetAction.h @@ -15,8 +15,6 @@ #pragma once -#include "tasks/Task.h" - #include #include #include @@ -25,29 +23,82 @@ #include "multimc_logic_export.h" -typedef shared_qobject_ptr NetActionPtr; -class MULTIMC_LOGIC_EXPORT NetAction : public Task +enum JobStatus +{ + Job_NotStarted, + Job_InProgress, + Job_Finished, + Job_Failed, + Job_Aborted, + Job_Failed_Proceed +}; + +typedef std::shared_ptr NetActionPtr; +class MULTIMC_LOGIC_EXPORT NetAction : public QObject { Q_OBJECT protected: - explicit NetAction(QObject *parent = 0) : Task(parent) {}; + explicit NetAction() : QObject(0) {}; public: virtual ~NetAction() {}; public: + virtual qint64 totalProgress() const + { + return m_total_progress; + } + virtual qint64 currentProgress() const + { + return m_progress; + } + virtual qint64 numberOfFailures() const + { + return m_failures; + } + virtual bool abort() + { + return false; + } + virtual bool canAbort() + { + return false; + } + +public: + /// the network reply unique_qobject_ptr m_reply; + + /// source URL QUrl m_url; - // FIXME: pull this up into Task - Status m_status = Status::NotStarted; + + /// The file's status + JobStatus m_status = Job_NotStarted; + + /// index within the parent job + int m_index_within_job = 0; + + qint64 m_progress = 0; + qint64 m_total_progress = 1; + + /// number of failures up to this point + int m_failures = 0; signals: - void failed(); - void aborted(); + void started(int index); + void netActionProgress(int index, qint64 current, qint64 total); + void succeeded(int index); + void failed(int index); + void aborted(int index); -protected slots: +protected +slots: virtual void downloadProgress(qint64 bytesReceived, qint64 bytesTotal) = 0; virtual void downloadError(QNetworkReply::NetworkError error) = 0; virtual void downloadFinished() = 0; virtual void downloadReadyRead() = 0; + +public +slots: + virtual void start() = 0; }; diff --git a/api/logic/net/NetJob.cpp b/api/logic/net/NetJob.cpp index ff2c711b..275da749 100644 --- a/api/logic/net/NetJob.cpp +++ b/api/logic/net/NetJob.cpp @@ -18,24 +18,22 @@ #include -void NetJob::partSucceeded() +void NetJob::partSucceeded(int index) { - auto index = m_partsIndex[(NetAction *)QObject::sender()]; // do progress. all slots are 1 in size at least - auto &slot = m_parts[index]; - setPartProgress(index, slot.total_progress, slot.total_progress); + auto &slot = parts_progress[index]; + partProgress(index, slot.total_progress, slot.total_progress); m_doing.remove(index); m_done.insert(index); - slot.download->disconnect(this); + downloads[index].get()->disconnect(this); startMoreParts(); } -void NetJob::partFailed() +void NetJob::partFailed(int index) { - auto index = m_partsIndex[(NetAction *)QObject::sender()]; m_doing.remove(index); - auto &slot = m_parts[index]; + auto &slot = parts_progress[index]; if (slot.failures == 3) { m_failed.insert(index); @@ -45,47 +43,38 @@ void NetJob::partFailed() slot.failures++; m_todo.enqueue(index); } - slot.download->disconnect(this); + downloads[index].get()->disconnect(this); startMoreParts(); } -void NetJob::partAborted() +void NetJob::partAborted(int index) { - auto index = m_partsIndex[(NetAction *)QObject::sender()]; m_aborted = true; m_doing.remove(index); - auto &slot = m_parts[index]; m_failed.insert(index); - slot.download->disconnect(this); + downloads[index].get()->disconnect(this); startMoreParts(); } -void NetJob::partProgress(qint64 bytesReceived, qint64 bytesTotal) +void NetJob::partProgress(int index, qint64 bytesReceived, qint64 bytesTotal) { - auto index = m_partsIndex[(NetAction *)QObject::sender()]; - setPartProgress(index, bytesReceived, bytesTotal); -} + auto &slot = parts_progress[index]; -void NetJob::setPartProgress(int index, qint64 bytesReceived, qint64 bytesTotal) -{ - auto &slot = m_parts[index]; + current_progress -= slot.current_progress; slot.current_progress = bytesReceived; + current_progress += slot.current_progress; + + total_progress -= slot.total_progress; slot.total_progress = bytesTotal; - qint64 current_progress = m_done.count() * 100; - qint64 total_progress = m_parts.count() * 100; - for(auto iter = m_doing.begin(); iter != m_doing.end(); iter++) - { - auto &part = m_parts[*iter]; - float percentage = (float(part.current_progress) / float(part.total_progress)) * 100.0f; - current_progress += (qint64) percentage; - } + total_progress += slot.total_progress; setProgress(current_progress, total_progress); } void NetJob::executeTask() { qDebug() << m_job_name.toLocal8Bit() << " started."; - for (int i = 0; i < m_parts.size(); i++) + m_running = true; + for (int i = 0; i < downloads.size(); i++) { m_todo.enqueue(i); } @@ -125,28 +114,24 @@ void NetJob::startMoreParts() return; int doThis = m_todo.dequeue(); m_doing.insert(doThis); - auto part = m_parts[doThis].download; + auto part = downloads[doThis]; // connect signals :D - connectAction(part.get()); + connect(part.get(), SIGNAL(succeeded(int)), SLOT(partSucceeded(int))); + connect(part.get(), SIGNAL(failed(int)), SLOT(partFailed(int))); + connect(part.get(), SIGNAL(aborted(int)), SLOT(partAborted(int))); + connect(part.get(), SIGNAL(netActionProgress(int, qint64, qint64)), + SLOT(partProgress(int, qint64, qint64))); part->start(); } } -void NetJob::connectAction(NetAction* action) -{ - connect(action, &NetAction::succeeded, this, &NetJob::partSucceeded); - connect(action, &NetAction::failed, this, &NetJob::partFailed); - connect(action, &NetAction::aborted, this, &NetJob::partAborted); - connect(action, &NetAction::progress, this, &NetJob::partProgress); -} - QStringList NetJob::getFailedFiles() { QStringList failed; for (auto index: m_failed) { - failed.push_back(m_parts[index].download->m_url.toString()); + failed.push_back(downloads[index]->m_url.toString()); } failed.sort(); return failed; @@ -158,13 +143,13 @@ bool NetJob::canAbort() const // can abort the waiting? for(auto index: m_todo) { - auto part = m_parts[index].download; + auto part = downloads[index]; canFullyAbort &= part->canAbort(); } // can abort the active? for(auto index: m_doing) { - auto part = m_parts[index].download; + auto part = downloads[index]; canFullyAbort &= part->canAbort(); } return canFullyAbort; @@ -180,26 +165,8 @@ bool NetJob::abort() auto toKill = m_doing.toList(); for(auto index: toKill) { - auto part = m_parts[index].download; + auto part = downloads[index]; fullyAborted &= part->abort(); } return fullyAborted; } - -void NetJob::addNetAction(NetActionPtr action) -{ - m_partsIndex[action.get()] = m_parts.count(); - part_info pi; - { - pi.current_progress = action->getProgress(); - pi.total_progress = action->getTotalProgress(); - pi.failures = 0; - pi.download = action; - } - m_parts.append(pi); - - if (isRunning()) - { - m_todo.enqueue(m_parts.size() - 1); - } -} diff --git a/api/logic/net/NetJob.h b/api/logic/net/NetJob.h index 5503cd24..ca4f5df1 100644 --- a/api/logic/net/NetJob.h +++ b/api/logic/net/NetJob.h @@ -32,12 +32,52 @@ class MULTIMC_LOGIC_EXPORT NetJob : public Task public: explicit NetJob(QString job_name) : Task(), m_job_name(job_name) {} virtual ~NetJob() {} + bool addNetAction(NetActionPtr action) + { + action->m_index_within_job = downloads.size(); + downloads.append(action); + part_info pi; + { + pi.current_progress = action->currentProgress(); + pi.total_progress = action->totalProgress(); + pi.failures = action->numberOfFailures(); + } + parts_progress.append(pi); + total_progress += pi.total_progress; + // if this is already running, the action needs to be started right away! + if (isRunning()) + { + setProgress(current_progress, total_progress); + connect(action.get(), SIGNAL(succeeded(int)), SLOT(partSucceeded(int))); + connect(action.get(), SIGNAL(failed(int)), SLOT(partFailed(int))); + connect(action.get(), SIGNAL(netActionProgress(int, qint64, qint64)), + SLOT(partProgress(int, qint64, qint64))); + action->start(); + } + return true; + } - void addNetAction(NetActionPtr action); - + NetActionPtr operator[](int index) + { + return downloads[index]; + } + const NetActionPtr at(const int index) + { + return downloads.at(index); + } + NetActionPtr first() + { + if (downloads.size()) + return downloads[0]; + return NetActionPtr(); + } int size() const { - return m_parts.size(); + return downloads.size(); + } + virtual bool isRunning() const override + { + return m_running; } QStringList getFailedFiles(); @@ -51,32 +91,28 @@ public slots: virtual bool abort() override; private slots: - void partProgress(qint64 bytesReceived, qint64 bytesTotal); - void partSucceeded(); - void partFailed(); - void partAborted(); - -private: - void setPartProgress(int index, qint64 bytesReceived, qint64 bytesTotal); - void connectAction(NetAction * action); + void partProgress(int index, qint64 bytesReceived, qint64 bytesTotal); + void partSucceeded(int index); + void partFailed(int index); + void partAborted(int index); private: struct part_info { - NetActionPtr download; qint64 current_progress = 0; qint64 total_progress = 1; int failures = 0; bool connected = false; }; QString m_job_name; - QVector m_parts; - QMap m_partsIndex; + QList downloads; + QList parts_progress; QQueue m_todo; QSet m_doing; QSet m_done; QSet m_failed; - //qint64 current_progress = 0; - //qint64 total_progress = 0; + qint64 current_progress = 0; + qint64 total_progress = 0; + bool m_running = false; bool m_aborted = false; }; diff --git a/api/logic/net/PasteUpload.cpp b/api/logic/net/PasteUpload.cpp index 17b59e6b..59779b2c 100644 --- a/api/logic/net/PasteUpload.cpp +++ b/api/logic/net/PasteUpload.cpp @@ -39,7 +39,7 @@ void PasteUpload::executeTask() QNetworkReply *rep = ENV.qnam().post(request, buf); m_reply = std::shared_ptr(rep); - setStatusText(tr("Uploading to paste.ee")); + setStatus(tr("Uploading to paste.ee")); connect(rep, &QNetworkReply::uploadProgress, this, &Task::setProgress); connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError))); connect(rep, SIGNAL(finished()), this, SLOT(downloadFinished())); diff --git a/api/logic/net/Sink.h b/api/logic/net/Sink.h index 28a54ef7..de9b1722 100644 --- a/api/logic/net/Sink.h +++ b/api/logic/net/Sink.h @@ -13,10 +13,10 @@ public: /* con/des */ virtual ~Sink() {}; public: /* methods */ - virtual Task::Status init(QNetworkRequest & request) = 0; - virtual Task::Status write(QByteArray & data) = 0; - virtual Task::Status abort() = 0; - virtual Task::Status finalize(QNetworkReply & reply) = 0; + virtual JobStatus init(QNetworkRequest & request) = 0; + virtual JobStatus write(QByteArray & data) = 0; + virtual JobStatus abort() = 0; + virtual JobStatus finalize(QNetworkReply & reply) = 0; virtual bool hasLocalData() = 0; void addValidator(Validator * validator) -- cgit v1.2.3