diff options
| -rw-r--r-- | daemon/daemon.pro | 7 | ||||
| -rw-r--r-- | daemon/jskitmanager.cpp | 32 | ||||
| -rw-r--r-- | daemon/jskitmanager.h | 3 | ||||
| -rw-r--r-- | daemon/jskitmanager_p.h | 15 | ||||
| -rw-r--r-- | daemon/jskitobjects.cpp | 69 | ||||
| -rw-r--r-- | daemon/jskitobjects.h | 48 |
6 files changed, 140 insertions, 34 deletions
diff --git a/daemon/daemon.pro b/daemon/daemon.pro index 5338bfd..48410c4 100644 --- a/daemon/daemon.pro +++ b/daemon/daemon.pro @@ -27,7 +27,8 @@ SOURCES += \ unpacker.cpp \ appmsgmanager.cpp \ jskitmanager.cpp \ - appinfo.cpp + appinfo.cpp \ + jskitobjects.cpp HEADERS += \ manager.h \ @@ -44,8 +45,8 @@ HEADERS += \ datalogmanager.h \ appmsgmanager.h \ jskitmanager.h \ - jskitmanager_p.h \ - appinfo.h + appinfo.h \ + jskitobjects.h OTHER_FILES += \ org.pebbled.xml \ diff --git a/daemon/jskitmanager.cpp b/daemon/jskitmanager.cpp index 41451ac..8329e74 100644 --- a/daemon/jskitmanager.cpp +++ b/daemon/jskitmanager.cpp @@ -1,16 +1,8 @@ #include <QFile> -#include <QJSValueIterator> -#include "jskitmanager.h" -#include "jskitmanager_p.h" - -JSKitPebble::JSKitPebble(JSKitManager *mgr) - : QObject(mgr) -{ -} +#include <QDir> -JSKitPebble::~JSKitPebble() -{ -} +#include "jskitmanager.h" +#include "jskitobjects.h" JSKitManager::JSKitManager(AppManager *apps, AppMsgManager *appmsg, QObject *parent) : QObject(parent), _apps(apps), _appmsg(appmsg), _engine(0) @@ -58,18 +50,15 @@ void JSKitManager::startJsApp() _engine = new QJSEngine(this); _jspebble = new JSKitPebble(this); + _jsstorage = new JSKitLocalStorage(_curApp.uuid(), this); logger()->debug() << "starting JS app"; QJSValue globalObj = _engine->globalObject(); globalObj.setProperty("Pebble", _engine->newQObject(_jspebble)); + globalObj.setProperty("localStorage", _engine->newQObject(_jsstorage)); - QJSValueIterator it(globalObj); - while (it.hasNext()) { - it.next(); - logger()->debug() << "JS property:" << it.name(); - } QFile scriptFile(_curApp.path() + "/pebble-js-app.js"); if (!scriptFile.open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -77,6 +66,15 @@ void JSKitManager::startJsApp() stopJsApp(); return; } + + QString script = QString::fromUtf8(scriptFile.readAll()); + + QJSValue result = _engine->evaluate(script, scriptFile.fileName()); + if (result.isError()) { + logger()->warn() << "error while evaluating JSKit script:" << result.toString(); + } + + logger()->debug() << "JS script evaluated"; } void JSKitManager::stopJsApp() @@ -89,6 +87,8 @@ void JSKitManager::stopJsApp() delete _engine; _engine = 0; + delete _jsstorage; + _jsstorage = 0; delete _jspebble; _jspebble = 0; } diff --git a/daemon/jskitmanager.h b/daemon/jskitmanager.h index 2f5ae42..f25a96f 100644 --- a/daemon/jskitmanager.h +++ b/daemon/jskitmanager.h @@ -6,6 +6,7 @@ #include "appmsgmanager.h" class JSKitPebble; +class JSKitLocalStorage; class JSKitManager : public QObject { @@ -36,6 +37,8 @@ private: AppInfo _curApp; QJSEngine *_engine; QPointer<JSKitPebble> _jspebble; + QPointer<JSKitLocalStorage> _jsstorage; + }; #endif // JSKITMANAGER_H diff --git a/daemon/jskitmanager_p.h b/daemon/jskitmanager_p.h deleted file mode 100644 index 690a0ec..0000000 --- a/daemon/jskitmanager_p.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef JSKITMANAGER_P_H -#define JSKITMANAGER_P_H - -#include "jskitmanager.h" - -class JSKitPebble : public QObject -{ - Q_OBJECT - -public: - explicit JSKitPebble(JSKitManager *mgr); - ~JSKitPebble(); -}; - -#endif // JSKITMANAGER_P_H diff --git a/daemon/jskitobjects.cpp b/daemon/jskitobjects.cpp new file mode 100644 index 0000000..fc9506d --- /dev/null +++ b/daemon/jskitobjects.cpp @@ -0,0 +1,69 @@ +#include <QStandardPaths> +#include <QDir> +#include "jskitobjects.h" + +JSKitPebble::JSKitPebble(JSKitManager *mgr) + : QObject(mgr) +{ +} + +void JSKitPebble::addEventListener(const QString &value, QJSValue callback) +{ + _callbacks[value].append(callback); +} + +JSKitLocalStorage::JSKitLocalStorage(const QUuid &uuid, JSKitManager *mgr) + : QObject(mgr), _storage(new QSettings(getStorageFileFor(uuid), QSettings::IniFormat, this)) +{ + _len = _storage->allKeys().size(); +} + +int JSKitLocalStorage::length() const +{ + return _len; +} + +QJSValue JSKitLocalStorage::getItem(const QString &key) const +{ + QVariant value = _storage->value(key); + if (value.isValid()) { + return QJSValue(value.toString()); + } else { + return QJSValue(QJSValue::NullValue); + } +} + +void JSKitLocalStorage::setItem(const QString &key, const QString &value) +{ + _storage->setValue(key, QVariant::fromValue(value)); + checkLengthChanged(); +} + +void JSKitLocalStorage::removeItem(const QString &key) +{ + _storage->remove(key); + checkLengthChanged(); +} + +void JSKitLocalStorage::clear() +{ + _storage->clear(); + _len = 0; + emit lengthChanged(); +} + +void JSKitLocalStorage::checkLengthChanged() +{ + int curLen = _storage->allKeys().size(); + if (_len != curLen) { + _len = curLen; + emit lengthChanged(); + } +} + +QString JSKitLocalStorage::getStorageFileFor(const QUuid &uuid) +{ + QDir dataDir(QStandardPaths::writableLocation(QStandardPaths::DataLocation)); + dataDir.mkdir("js-storage"); + return dataDir.absoluteFilePath("js-storage/" + uuid.toString() + ".ini"); +} diff --git a/daemon/jskitobjects.h b/daemon/jskitobjects.h new file mode 100644 index 0000000..8acd76f --- /dev/null +++ b/daemon/jskitobjects.h @@ -0,0 +1,48 @@ +#ifndef JSKITMANAGER_P_H +#define JSKITMANAGER_P_H + +#include <QSettings> +#include "jskitmanager.h" + +class JSKitPebble : public QObject +{ + Q_OBJECT + +public: + explicit JSKitPebble(JSKitManager *mgr); + + Q_INVOKABLE void addEventListener(const QString &event, QJSValue callback); +private: + QHash<QString, QList<QJSValue>> _callbacks; +}; + +class JSKitLocalStorage : public QObject +{ + Q_OBJECT + + Q_PROPERTY(int length READ length NOTIFY lengthChanged) + +public: + explicit JSKitLocalStorage(const QUuid &uuid, JSKitManager *mgr); + + int length() const; + + Q_INVOKABLE QJSValue getItem(const QString &key) const; + Q_INVOKABLE void setItem(const QString &key, const QString &value); + Q_INVOKABLE void removeItem(const QString &key); + + Q_INVOKABLE void clear(); + +signals: + void lengthChanged(); + +private: + void checkLengthChanged(); + static QString getStorageFileFor(const QUuid &uuid); + +private: + QSettings *_storage; + int _len; +}; + +#endif // JSKITMANAGER_P_H |
