summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--daemon/daemon.pro7
-rw-r--r--daemon/jskitmanager.cpp32
-rw-r--r--daemon/jskitmanager.h3
-rw-r--r--daemon/jskitmanager_p.h15
-rw-r--r--daemon/jskitobjects.cpp69
-rw-r--r--daemon/jskitobjects.h48
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