121 lines
3.3 KiB
C++
121 lines
3.3 KiB
C++
|
// Licensed under the Apache-2.0 license. See README.md for details.
|
||
|
|
||
|
#include "StandardTask.h"
|
||
|
|
||
|
#include <QEventLoop>
|
||
|
#include <QProcess>
|
||
|
|
||
|
#include "net/CacheDownload.h"
|
||
|
#include "net/ByteArrayDownload.h"
|
||
|
#include "net/NetJob.h"
|
||
|
#include "FileSystem.h"
|
||
|
#include "Exception.h"
|
||
|
#include "Env.h"
|
||
|
|
||
|
StandardTask::StandardTask(QObject *parent)
|
||
|
: Task(parent)
|
||
|
{
|
||
|
m_loop = new QEventLoop(this);
|
||
|
}
|
||
|
|
||
|
void StandardTask::runTask(QObjectPtr<Task> other)
|
||
|
{
|
||
|
connect(other.get(), &Task::succeeded, m_loop, &QEventLoop::quit);
|
||
|
connect(other.get(), &Task::failed, m_loop, &QEventLoop::quit);
|
||
|
connect(other.get(), &Task::progress, this, [this](qint64 current, qint64 total){setProgress(current / total);});
|
||
|
connect(other.get(), &Task::status, this, &StandardTask::setStatus);
|
||
|
if (!other->isRunning())
|
||
|
{
|
||
|
other->start();
|
||
|
}
|
||
|
if (other->isRunning())
|
||
|
{
|
||
|
m_loop->exec();
|
||
|
}
|
||
|
disconnect(other.get(), 0, m_loop, 0);
|
||
|
disconnect(other.get(), 0, this, 0);
|
||
|
other->deleteLater();
|
||
|
if (!other->successful())
|
||
|
{
|
||
|
throw Exception(other->failReason());
|
||
|
}
|
||
|
}
|
||
|
void StandardTask::runTaskNonBlocking(QObjectPtr<Task> other)
|
||
|
{
|
||
|
if (!other)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
m_pendingTasks.append(other.get());
|
||
|
m_pendingTaskPtrs.append(other);
|
||
|
other->start();
|
||
|
}
|
||
|
QByteArray StandardTask::networkGet(const QUrl &url)
|
||
|
{
|
||
|
ByteArrayDownloadPtr task = ByteArrayDownload::make(url);
|
||
|
runTask(wrapDownload("", task));
|
||
|
return task->m_data;
|
||
|
}
|
||
|
QByteArray StandardTask::networkGetCached(const QString &name, const QString &base, const QString &path, const QUrl &url, const bool alwaysRefetch,
|
||
|
INetworkValidator *validator)
|
||
|
{
|
||
|
MetaEntryPtr entry = ENV.metacache()->resolveEntry(base, path);
|
||
|
if (!alwaysRefetch && !entry->stale)
|
||
|
{
|
||
|
if (validator) { delete validator; }
|
||
|
return FS::read(entry->getFullPath());
|
||
|
}
|
||
|
else if (alwaysRefetch)
|
||
|
{
|
||
|
entry->stale = true;
|
||
|
}
|
||
|
CacheDownloadPtr task = CacheDownload::make(url, entry);
|
||
|
task->setValidator(validator);
|
||
|
runTask(wrapDownload(name, task));
|
||
|
return FS::read(entry->getFullPath());
|
||
|
}
|
||
|
QByteArray StandardTask::networkGetCached(const QString &name, const QString &base, const QString &path, const QUrl &url, const QMap<QString, QString> &headers,
|
||
|
INetworkValidator *validator)
|
||
|
{
|
||
|
MetaEntryPtr entry = ENV.metacache()->resolveEntry(base, path);
|
||
|
if (!entry->stale)
|
||
|
{
|
||
|
if (validator) { delete validator; }
|
||
|
return FS::read(entry->getFullPath());
|
||
|
}
|
||
|
CacheDownloadPtr task = CacheDownload::make(url, entry);
|
||
|
//task->setHeaders(headers);
|
||
|
task->setValidator(validator);
|
||
|
runTask(wrapDownload(name, task));
|
||
|
return FS::read(entry->getFullPath());
|
||
|
}
|
||
|
void StandardTask::networkGetCachedNonBlocking(const QString &name, const QString &base, const QString &path, const QUrl &url, const bool alwaysRefetch,
|
||
|
INetworkValidator *validator)
|
||
|
{
|
||
|
MetaEntryPtr entry = ENV.metacache()->resolveEntry(base, path);
|
||
|
if (!alwaysRefetch && !entry->stale)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
CacheDownloadPtr dl = CacheDownload::make(url, entry);
|
||
|
dl->setValidator(validator);
|
||
|
runTaskNonBlocking(wrapDownload(name, dl));
|
||
|
}
|
||
|
void StandardTask::waitOnPending()
|
||
|
{
|
||
|
for (int i = 0; i < m_pendingTasks.size(); ++i)
|
||
|
{
|
||
|
if (m_pendingTasks.at(i) && m_pendingTasks.at(i)->isRunning())
|
||
|
{
|
||
|
runTask(m_pendingTaskPtrs.at(i));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
QObjectPtr<NetJob> StandardTask::wrapDownload(const QString &name, std::shared_ptr<NetAction> action)
|
||
|
{
|
||
|
NetJobPtr task = NetJobPtr(new NetJob(name));
|
||
|
task->addNetAction(action);
|
||
|
return task;
|
||
|
}
|