Skip to content

Commit

Permalink
+ added read/write values and read/write to file
Browse files Browse the repository at this point in the history
  • Loading branch information
trueromanus committed Jun 10, 2024
1 parent 6456e16 commit 84e5cbd
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 20 deletions.
136 changes: 116 additions & 20 deletions src/Classes/ViewModels/extensionsviewmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,26 @@
#include <QDebug>
#include <QUuid>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include "extensionsviewmodel.h"
#include "../../globalconstants.h"
#include "../../globalhelpers.h"

ExtensionsViewModel::ExtensionsViewModel(QObject *parent)
: QObject{parent}
{
connect(m_networkManager, &QNetworkAccessManager::finished, this, &ExtensionsViewModel::requestFinished);

m_valuesPath = getCachePath("extensionvalues.cache");
m_extensionsPath = getCachePath("extensions.cache");
readExtensions();
readValues();

#ifdef QT_DEBUG
m_extensions.append("C:/work/Repositories/Anilibria.Qt/testScript");
#endif

adjustEngine();
importExtensions();
}
Expand Down Expand Up @@ -63,6 +74,9 @@ void ExtensionsViewModel::log(const QString &message)
void ExtensionsViewModel::saveValue(const QString &key, const QString &value)
{
m_values.insert(key, value);

//immediatly save values to file
saveValues();
}

QString ExtensionsViewModel::readValue(const QString &key)
Expand All @@ -79,30 +93,46 @@ void ExtensionsViewModel::deleteValue(const QString &key)
m_values.remove(key);
}

void ExtensionsViewModel::addExtension(const QString &path)
{
m_extensions.append(path);

importExtension(path);

remapDisplayExtensions();
}

void ExtensionsViewModel::importExtensions()
{
foreach (auto extension, m_extensions) {
auto pathToIndex = extension + "/index.mjs";
qDebug() << "[extension]: Try to load extension in path: " << pathToIndex;

QJSValue module = m_engine->importModule(pathToIndex);
if (module.isError()) {
qDebug() << "[extension]: Error caught at line " << module.property("lineNumber").toInt() << ": " << module.toString();
continue;
}

QJSValue moduleNameString = module.property("moduleName");
QString moduleName = "";
if (moduleNameString.isString()) moduleName = moduleNameString.toString();

QJSValue moduleAuthorString = module.property("moduleAuthor");
QString moduleAuthor = "";
if (moduleAuthorString.isString()) moduleAuthor = moduleAuthorString.toString();

m_importedModules.insert(extension, module);
auto metadata = std::make_tuple(moduleName, moduleAuthor);
m_importedModulesMetadata.insert(extension, metadata);
importExtension(extension);
}

remapDisplayExtensions();
}

void ExtensionsViewModel::importExtension(const QString &path)
{
auto pathToIndex = path + "/index.mjs";
qDebug() << "[extension]: Try to load extension in path: " << pathToIndex;

QJSValue module = m_engine->importModule(pathToIndex);
if (module.isError()) {
qDebug() << "[extension]: Error caught at line " << module.property("lineNumber").toInt() << ": " << module.toString();
return;
}

QJSValue moduleNameString = module.property("moduleName");
QString moduleName = "";
if (moduleNameString.isString()) moduleName = moduleNameString.toString();

QJSValue moduleAuthorString = module.property("moduleAuthor");
QString moduleAuthor = "";
if (moduleAuthorString.isString()) moduleAuthor = moduleAuthorString.toString();

m_importedModules.insert(path, module);
auto metadata = std::make_tuple(moduleName, moduleAuthor);
m_importedModulesMetadata.insert(path, metadata);
}

void ExtensionsViewModel::adjustEngine()
Expand All @@ -114,6 +144,72 @@ void ExtensionsViewModel::adjustEngine()
m_engine->globalObject().setProperty("appExtension", extensionsObject);
}

void ExtensionsViewModel::readValues()
{
createIfNotExistsFile(m_valuesPath, "{}");

auto json = getJsonContentFromFile(m_valuesPath);
auto content = QJsonDocument::fromJson(json.toUtf8());
auto values = content.object();

foreach (auto key, values.keys()) {
auto keyValue = values.value(key);
if (keyValue.isString()) m_values.insert(key, keyValue.toString());
}
}

void ExtensionsViewModel::saveValues()
{
QJsonObject object;
auto keys = m_values.keys();
foreach (auto key, keys) {
object.insert(key, m_values.value(key));
}

saveJsonObjectToFile(m_valuesPath, object);
}

void ExtensionsViewModel::readExtensions()
{
createIfNotExistsFile(m_extensionsPath, "[]");

auto json = getJsonContentFromFile(m_valuesPath);
auto content = QJsonDocument::fromJson(json.toUtf8());
auto values = content.array();

foreach(auto extension, values) {
m_extensions.append(extension.toString());
}
}

void ExtensionsViewModel::saveExtensions()
{
QJsonArray array;
foreach (auto extension, m_extensions) {
array.append(extension);
}

saveJsonArrayToFile(m_extensionsPath, array);
}

void ExtensionsViewModel::remapDisplayExtensions()
{
m_displayedExtensions.clear();

auto keys = m_importedModulesMetadata.keys();
foreach (auto key, keys) {
auto item = m_importedModulesMetadata[key];
QVariantMap map;
map["indentifier"] = key;
map["title"] = std::get<0>(item);
map["author"] = std::get<1>(item);

m_displayedExtensions.append(map);
}

emit displayedExtensionsChanged();
}

void ExtensionsViewModel::requestFinished(QNetworkReply *reply)
{
if (reply->error() != QNetworkReply::NoError) {
Expand Down
15 changes: 15 additions & 0 deletions src/Classes/ViewModels/extensionsviewmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
#include <QJSValue>
#include <QMap>
#include <QJSEngine>
#include <QList>
#include <QNetworkAccessManager>

class ExtensionsViewModel : public QObject
{
Q_OBJECT
Q_PROPERTY(QVariantList displayedExtensions READ displayedExtensions NOTIFY displayedExtensionsChanged FINAL)

private:
QList<QString> m_extensions { QList<QString>() };
Expand All @@ -19,25 +21,38 @@ class ExtensionsViewModel : public QObject
QMap<QString, QJSValue> m_pendingCallbacks { QMap<QString, QJSValue>() };
QNetworkAccessManager* m_networkManager { new QNetworkAccessManager(this) };
QMap<QString, QString> m_values { QMap<QString, QString>() };
QString m_valuesPath { "" };
QString m_extensionsPath { "" };
QVariantList m_displayedExtensions { QVariantList() };

public:
explicit ExtensionsViewModel(QObject *parent = nullptr);

QVariantList displayedExtensions() const noexcept { return m_displayedExtensions; }

Q_INVOKABLE void releaseOpenedInVideoPlayer(int releaseId, const QString& title, int seria);
Q_INVOKABLE void makeHttpGet(const QString& url, const QList<QString> headers, const QJSValue& callback);
Q_INVOKABLE void log(const QString& message);
Q_INVOKABLE void saveValue(const QString& key, const QString& value);
Q_INVOKABLE QString readValue(const QString& key);
Q_INVOKABLE void deleteValue(const QString& key);
Q_INVOKABLE void addExtension(const QString& path);

private:
void importExtensions();
void importExtension(const QString& path);
void adjustEngine();
void readValues();
void saveValues();
void readExtensions();
void saveExtensions();
void remapDisplayExtensions();

private slots:
void requestFinished(QNetworkReply *reply);

signals:
void displayedExtensionsChanged();

};

Expand Down
10 changes: 10 additions & 0 deletions src/globalhelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,13 @@ QString getLeadingZeroDigit(int number) noexcept

return result;
}

void saveJsonObjectToFile(const QString &path, const QJsonObject &object) noexcept
{
QJsonDocument document(object);

QFile scheduleCacheFile(getCachePath(path));
scheduleCacheFile.open(QFile::WriteOnly | QFile::Text);
scheduleCacheFile.write(document.toJson());
scheduleCacheFile.close();
}
3 changes: 3 additions & 0 deletions src/globalhelpers.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <QString>
#include <QJsonArray>
#include <QJsonObject>

QString getCachePath(const QString& filename) noexcept;

Expand All @@ -15,4 +16,6 @@ QString getJsonContentFromFile(const QString& path) noexcept;

void saveJsonArrayToFile(const QString& path, const QJsonArray& array) noexcept;

void saveJsonObjectToFile(const QString& path, const QJsonObject& object) noexcept;

QString getLeadingZeroDigit(int number) noexcept;

0 comments on commit 84e5cbd

Please sign in to comment.