This repository has been archived on 2026-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
powersync-core/libnymea-core/devices/scriptdeviceplugin.cpp
2019-12-01 00:07:35 +01:00

85 lines
2.4 KiB
C++

#include "scriptdeviceplugin.h"
#include <QQmlEngine>
#include <QDir>
#include <QJsonDocument>
#include "loggingcategories.h"
ScriptDevicePlugin::ScriptDevicePlugin(QObject *parent) : DevicePlugin(parent)
{
}
bool ScriptDevicePlugin::loadScript(const QString &fileName)
{
QFileInfo fi(fileName);
QString metaDataFileName = fileName + "on";
QFile metaDataFile(metaDataFileName);
if (!metaDataFile.open(QFile::ReadOnly)) {
qCWarning(dcDeviceManager()) << "Failed to open plugin metadata at" << metaDataFileName;
return false;
}
QJsonParseError error;
QByteArray data = metaDataFile.readAll();
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
metaDataFile.close();
if (error.error != QJsonParseError::NoError) {
int errorOffset = error.offset;
int newLineIndex = data.indexOf("\n");
int lineIndex = 1;
while (newLineIndex > 0 && errorOffset > newLineIndex) {
data.remove(0, newLineIndex + 2);
errorOffset -= (newLineIndex + 2);
newLineIndex = data.indexOf("\n");
lineIndex++;
}
if (newLineIndex >= 0) {
data = data.left(newLineIndex);
}
QString spacer;
for (int i = 0; i < errorOffset; i++) {
spacer += ' ';
}
QDebug dbg = qWarning(dcDeviceManager()).nospace().noquote();
dbg << metaDataFileName << ":" << lineIndex << ":" << errorOffset + 2 << ": error: JSON parsing failed: " << error.errorString() << ": " << data.trimmed() << endl;
dbg << data << endl;
dbg << spacer << "^";
return false;
}
m_metaData = QJsonObject::fromVariantMap(jsonDoc.toVariant().toMap());
QFile scriptFile(fileName);
if (!scriptFile.open(QIODevice::ReadOnly)) {
return false;
}
m_engine = new QJSEngine(this);
m_engine->installExtensions(QJSEngine::ConsoleExtension);
QTextStream stream(&scriptFile);
QString contents = stream.readAll();
scriptFile.close();
QJSValue result = m_engine->evaluate(contents, fileName);
if (result.isError()) {
qCWarning(dcDeviceManager()) << "Error evaluating script" << fileName << result.toString();
return false;
}
return true;
}
QJsonObject ScriptDevicePlugin::metaData() const
{
return m_metaData;
}
void ScriptDevicePlugin::init()
{
}