NetworkController.cpp
87 lines
| 2.9 KiB
| text/x-c
|
CppLexer
r339 | #include "Network/NetworkController.h" | |||
#include <QMutex> | ||||
r386 | #include <QNetworkAccessManager> | |||
#include <QNetworkReply> | ||||
r389 | #include <QNetworkRequest> | |||
r339 | #include <QThread> | |||
r389 | #include <unordered_map> | |||
r339 | Q_LOGGING_CATEGORY(LOG_NetworkController, "NetworkController") | |||
struct NetworkController::NetworkControllerPrivate { | ||||
r389 | explicit NetworkControllerPrivate(NetworkController *parent) : m_WorkingMutex{} {} | |||
r339 | QMutex m_WorkingMutex; | |||
r386 | ||||
r389 | std::unordered_map<QNetworkReply *, QUuid> m_NetworkReplyToVariableId; | |||
r386 | std::unique_ptr<QNetworkAccessManager> m_AccessManager{nullptr}; | |||
r339 | }; | |||
NetworkController::NetworkController(QObject *parent) | ||||
: QObject(parent), impl{spimpl::make_unique_impl<NetworkControllerPrivate>(this)} | ||||
{ | ||||
r386 | } | |||
r389 | void NetworkController::onProcessRequested(const QNetworkRequest &request, QUuid identifier, | |||
std::function<void(QNetworkReply *, QUuid)> callback) | ||||
r386 | { | |||
r401 | qCInfo(LOG_NetworkController()) << tr("NetworkController registered") | |||
<< QThread::currentThread(); | ||||
r389 | auto reply = impl->m_AccessManager->get(request); | |||
// Store the couple reply id | ||||
impl->m_NetworkReplyToVariableId[reply] = identifier; | ||||
auto onReplyFinished = [reply, this, identifier, callback]() { | ||||
r401 | qCInfo(LOG_NetworkController()) << tr("NetworkController onReplyFinished") | |||
<< QThread::currentThread(); | ||||
r389 | auto it = impl->m_NetworkReplyToVariableId.find(reply); | |||
if (it != impl->m_NetworkReplyToVariableId.cend()) { | ||||
callback(reply, identifier); | ||||
} | ||||
}; | ||||
r401 | auto onReplyProgress = [reply, this](qint64 bytesRead, qint64 totalBytes) { | |||
r386 | ||||
r401 | double progress = (bytesRead * 100.0) / totalBytes; | |||
r389 | auto it = impl->m_NetworkReplyToVariableId.find(reply); | |||
if (it != impl->m_NetworkReplyToVariableId.cend()) { | ||||
r401 | emit this->replyDownloadProgress(it->second, progress); | |||
r389 | } | |||
}; | ||||
r386 | ||||
r389 | ||||
connect(reply, &QNetworkReply::finished, this, onReplyFinished); | ||||
r401 | connect(reply, &QNetworkReply::downloadProgress, this, onReplyProgress); | |||
r339 | } | |||
void NetworkController::initialize() | ||||
{ | ||||
qCDebug(LOG_NetworkController()) << tr("NetworkController init") << QThread::currentThread(); | ||||
impl->m_WorkingMutex.lock(); | ||||
r389 | impl->m_AccessManager = std::make_unique<QNetworkAccessManager>(); | |||
r339 | qCDebug(LOG_NetworkController()) << tr("NetworkController init END"); | |||
} | ||||
void NetworkController::finalize() | ||||
{ | ||||
impl->m_WorkingMutex.unlock(); | ||||
} | ||||
r389 | void NetworkController::onReplyCanceled(QUuid identifier) | |||
{ | ||||
auto findReply = [identifier](const auto &entry) { return identifier == entry.second; }; | ||||
auto end = impl->m_NetworkReplyToVariableId.cend(); | ||||
auto it = std::find_if(impl->m_NetworkReplyToVariableId.cbegin(), end, findReply); | ||||
if (it != end) { | ||||
it->first->abort(); | ||||
} | ||||
} | ||||
r339 | void NetworkController::waitForFinish() | |||
{ | ||||
QMutexLocker locker{&impl->m_WorkingMutex}; | ||||
} | ||||