From a687821a4e099c9c0d73cbecc1368a13c697066b Mon Sep 17 00:00:00 2001 From: "Denis V. Dedkov" Date: Fri, 14 Apr 2023 16:10:16 +0200 Subject: [PATCH] Dump service was added --- CMakeLists.txt | 1 + models/basemodel.cpp | 4 +++ models/basemodel.h | 4 +++ services/beerservice.cpp | 39 +++---------------------- services/beerservice.h | 5 ++-- services/dumpservice.cpp | 62 ++++++++++++++++++++++++++++++++++++++++ services/dumpservice.h | 24 ++++++++++++++++ 7 files changed, 102 insertions(+), 37 deletions(-) create mode 100644 services/dumpservice.cpp create mode 100644 services/dumpservice.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b232193..75606da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ set(PROJECT_SOURCES services/beerservice.h services/beerservice.cpp services/settingsservice.h services/settingsservice.cpp services/modelsregister.h services/modelsregister.cpp + services/dumpservice.h services/dumpservice.cpp ${TS_FILES} ) diff --git a/models/basemodel.cpp b/models/basemodel.cpp index fd1e23f..590b512 100644 --- a/models/basemodel.cpp +++ b/models/basemodel.cpp @@ -7,12 +7,16 @@ BaseModel::BaseModel(const QString &entity, QObject *parent) : QObject{parent}, { Q_ASSERT(!m_entity.isEmpty()); + m_dumpService.setEntityName(m_entity); + m_data = m_dumpService.loadMap(); + service()->connectListener(this); service()->sendCommand(m_entity, BeerService::ActionGet); } BaseModel::~BaseModel() { + m_dumpService.dump(m_data); service()->removeListener(this); } diff --git a/models/basemodel.h b/models/basemodel.h index 54a727d..adc27e3 100644 --- a/models/basemodel.h +++ b/models/basemodel.h @@ -4,6 +4,8 @@ #include #include +#include "services/dumpservice.h" + class BeerService; class BaseModel : public QObject { @@ -36,6 +38,8 @@ signals: private: BeerService *service() const; + DumpService m_dumpService; + QVariantMap m_data; QString m_entity; }; diff --git a/services/beerservice.cpp b/services/beerservice.cpp index b36c328..9ed319f 100644 --- a/services/beerservice.cpp +++ b/services/beerservice.cpp @@ -2,10 +2,6 @@ #include #include -#include -#include -#include -#include #include "settingsservice.h" @@ -19,6 +15,7 @@ BeerService::BeerService() { ActionModify, "mod" } }; + m_dumpService.setEntityName("command"); restoreStash(); connect(&m_socket, &QWebSocket::textMessageReceived, this, [this](QString message) { @@ -58,7 +55,7 @@ BeerService::BeerService() BeerService::~BeerService() { - saveStash(); + m_dumpService.dump(m_commandStash); m_socket.close(); } @@ -90,37 +87,10 @@ void BeerService::removeListener(QObject *listener) m_listeners.remove(entity, listener); } -QString BeerService::stashFileName() const -{ - return QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/command.stash"; -} - -void BeerService::saveStash() const -{ - if (m_commandStash.isEmpty()) { - return; - } - - QFile stash(stashFileName()); - if (stash.open(QIODevice::WriteOnly)) { - stash.write(QJsonDocument::fromVariant(m_commandStash).toJson(QJsonDocument::Compact)); - stash.close(); - } else { - qWarning() << stash.errorString(); - } -} - void BeerService::restoreStash() { - QFile stash(stashFileName()); - if (stash.open(QIODevice::ReadOnly)) { - QJsonDocument doc = QJsonDocument::fromJson(stash.readAll()); - m_commandStash = doc.array().toVariantList(); - stash.close(); - stash.remove(); - } else { - qWarning() << stash.errorString(); - } + m_commandStash = m_dumpService.loadList(); + m_dumpService.clear(); } void BeerService::reconnect() @@ -135,7 +105,6 @@ void BeerService::reconnect() QNetworkRequest request(serverUrl); request.setRawHeader("Authorization", "Basic " + QString("%1:pass").arg(userId).toLatin1().toBase64()); m_socket.open(request); - } void BeerService::sendCommand(const QVariantMap &command) diff --git a/services/beerservice.h b/services/beerservice.h index d0ae8d3..5dd926f 100644 --- a/services/beerservice.h +++ b/services/beerservice.h @@ -4,6 +4,8 @@ #include #include +#include "services/dumpservice.h" + class SettingsService; class BeerService : public QObject { @@ -40,8 +42,6 @@ private: SettingsService *settings() const; - QString stashFileName() const; - void saveStash() const; void restoreStash(); void reconnect(); @@ -50,6 +50,7 @@ private: QMultiMap m_listeners; + DumpService m_dumpService; QWebSocket m_socket; QVariantList m_commandStash; QMap m_actions; diff --git a/services/dumpservice.cpp b/services/dumpservice.cpp new file mode 100644 index 0000000..71a9c2a --- /dev/null +++ b/services/dumpservice.cpp @@ -0,0 +1,62 @@ +#include "dumpservice.h" + +#include +#include +#include +#include +#include + +void DumpService::setEntityName(const QString &name) +{ + m_entityName = name; +} + +void DumpService::dump(const QVariant &data) const +{ + QFile stash(dumpFileName()); + if (stash.open(QIODevice::WriteOnly)) { + stash.write(QJsonDocument::fromVariant(data).toJson(QJsonDocument::Compact)); + stash.close(); + } else { + qWarning() << stash.errorString(); + } +} + +QVariantList DumpService::loadList() const +{ + QJsonDocument dump = readFile(); + return dump.array().toVariantList(); +} + +QVariantMap DumpService::loadMap() const +{ + QJsonDocument dump = readFile(); + return dump.object().toVariantMap(); +} + +void DumpService::clear() const +{ + QFile::remove(dumpFileName()); +} + +QString DumpService::dumpFileName() const +{ + Q_ASSERT(!m_entityName.isEmpty()); + + return QString("%1/%2.dump").arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation), m_entityName); +} + +QJsonDocument DumpService::readFile() const +{ + QJsonDocument res; + + QFile dump(dumpFileName()); + if (dump.open(QIODevice::ReadOnly)) { + res = QJsonDocument::fromJson(dump.readAll()); + dump.close(); + } else { + qWarning() << dump.errorString(); + } + + return res; +} diff --git a/services/dumpservice.h b/services/dumpservice.h new file mode 100644 index 0000000..ae3f8fc --- /dev/null +++ b/services/dumpservice.h @@ -0,0 +1,24 @@ +#ifndef DUMPSERVICE_H +#define DUMPSERVICE_H + +#include + +class QJsonDocument; +class DumpService +{ +public: + void setEntityName(const QString &name); + + void dump(const QVariant &data) const; + QVariantList loadList() const; + QVariantMap loadMap() const; + void clear() const; + +private: + QString dumpFileName() const; + QJsonDocument readFile() const; + + QString m_entityName; +}; + +#endif // DUMPSERVICE_H