summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2014-12-02 23:33:19 +0100
committerJavier <dev.git@javispedro.com>2014-12-02 23:33:19 +0100
commitc35a3a9bea759cadf1e975a2a62e50789cad096c (patch)
tree0e8b48fdb8bf07226b18a87f312631debbf41383
parent81f91639969de0f3852a3fe73db13b4cb0ecf3b4 (diff)
define new D-Bus interface, use qmake to generate adaptors/interfaces
also slightly clean up the way d-bus is handled both in daemon and UI
-rw-r--r--app/app.pro2
-rw-r--r--app/pebbledinterface.cpp100
-rw-r--r--app/pebbledinterface.h45
-rw-r--r--daemon/daemon.pro5
-rw-r--r--daemon/dbusadaptor.cpp92
-rw-r--r--daemon/dbusadaptor.h88
-rw-r--r--daemon/dbusconnector.h4
-rw-r--r--daemon/manager.cpp32
-rw-r--r--daemon/manager.h91
-rw-r--r--daemon/org.pebbled.xml20
-rw-r--r--org.pebbled.Watch.xml46
11 files changed, 191 insertions, 334 deletions
diff --git a/app/app.pro b/app/app.pro
index e08fa87..e0ff449 100644
--- a/app/app.pro
+++ b/app/app.pro
@@ -14,6 +14,8 @@ SOURCES += \
HEADERS += \
pebbledinterface.h
+DBUS_INTERFACES += ../org.pebbled.Watch.xml
+
OTHER_FILES += \
qml/cover/CoverPage.qml \
qml/pages/ManagerPage.qml \
diff --git a/app/pebbledinterface.cpp b/app/pebbledinterface.cpp
index 8759863..fb937f2 100644
--- a/app/pebbledinterface.cpp
+++ b/app/pebbledinterface.cpp
@@ -1,37 +1,33 @@
#include "pebbledinterface.h"
+#include "watch_interface.h"
-QString PebbledInterface::PEBBLED_SYSTEMD_UNIT("pebbled.service");
-QString PebbledInterface::PEBBLED_DBUS_SERVICE("org.pebbled");
-QString PebbledInterface::PEBBLED_DBUS_PATH("/org/pebbled");
-QString PebbledInterface::PEBBLED_DBUS_IFACE("org.pebbled");
-
-#define PebbledDbusInterface QDBusInterface(PEBBLED_DBUS_SERVICE, PEBBLED_DBUS_PATH, PEBBLED_DBUS_IFACE)
-
+static const QString PEBBLED_SYSTEMD_UNIT("pebbled.service");
+static const QString PEBBLED_DBUS_SERVICE("org.pebbled");
+static const QString PEBBLED_DBUS_PATH("/org/pebbled/watch");
+static const QString PEBBLED_DBUS_IFACE("org.pebbled.Watch");
PebbledInterface::PebbledInterface(QObject *parent) :
- QObject(parent), systemd(0)
-{
- QDBusConnection::sessionBus().connect(
- PEBBLED_DBUS_SERVICE, PEBBLED_DBUS_PATH, PEBBLED_DBUS_IFACE,
- "connectedChanged", this, SIGNAL(connectedChanged()));
-
- QDBusConnection::sessionBus().connect(
- PEBBLED_DBUS_SERVICE, PEBBLED_DBUS_PATH, PEBBLED_DBUS_IFACE,
- "pebbleChanged", this, SLOT(onPebbleChanged()));
-
- QDBusConnection::sessionBus().connect(
- PEBBLED_DBUS_SERVICE, PEBBLED_DBUS_PATH, PEBBLED_DBUS_IFACE,
- "openUrl", this, SIGNAL(openUrl(QString)));
+ QObject(parent),
+ systemd(new QDBusInterface("org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ QDBusConnection::sessionBus(), this)),
+ watch(new OrgPebbledWatchInterface(PEBBLED_DBUS_SERVICE,
+ PEBBLED_DBUS_PATH,
+ QDBusConnection::sessionBus(), this))
+{
+ connect(watch, &OrgPebbledWatchInterface::NameChanged,
+ this, &PebbledInterface::nameChanged);
+ connect(watch, &OrgPebbledWatchInterface::AddressChanged,
+ this, &PebbledInterface::addressChanged);
+ connect(watch, &OrgPebbledWatchInterface::ConnectedChanged,
+ this, &PebbledInterface::connectedChanged);
// simulate connected change on active changed
// as the daemon might not had a chance to send 'connectedChanged'
// when going down
- connect(this, SIGNAL(activeChanged()), SIGNAL(connectedChanged()));
-
- systemd = new QDBusInterface("org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- QDBusConnection::sessionBus(), this);
+ connect(this, &PebbledInterface::activeChanged,
+ this, &PebbledInterface::connectedChanged);
systemd->call("Subscribe");
@@ -59,9 +55,9 @@ void PebbledInterface::getUnitProperties()
QDBusReply<QVariantMap> reply = QDBusConnection::sessionBus().call(request);
if (reply.isValid()) {
QVariantMap newProperties = reply.value();
- bool emitEnabledChanged = (properties["UnitFileState"] != newProperties["UnitFileState"]);
- bool emitActiveChanged = (properties["ActiveState"] != newProperties["ActiveState"]);
- properties = newProperties;
+ bool emitEnabledChanged = (unitProperties["UnitFileState"] != newProperties["UnitFileState"]);
+ bool emitActiveChanged = (unitProperties["ActiveState"] != newProperties["ActiveState"]);
+ unitProperties = newProperties;
if (emitEnabledChanged) emit enabledChanged();
if (emitActiveChanged) emit activeChanged();
} else {
@@ -73,22 +69,14 @@ void PebbledInterface::onPropertiesChanged(QString interface, QMap<QString,QVari
{
qDebug() << __FUNCTION__ << interface << changed << invalidated;
if (interface != "org.freedesktop.systemd1.Unit") return;
- if (invalidated.contains("UnitFileState") or invalidated.contains("ActiveState"))
+ if (invalidated.contains("UnitFileState") || invalidated.contains("ActiveState"))
getUnitProperties();
}
-void PebbledInterface::onPebbleChanged()
-{
- qDebug() << __FUNCTION__;
- emit nameChanged();
- emit addressChanged();
- emit pebbleChanged();
-}
-
bool PebbledInterface::enabled() const
{
qDebug() << __FUNCTION__;
- return properties["UnitFileState"].toString() == "enabled";
+ return unitProperties["UnitFileState"].toString() == "enabled";
}
void PebbledInterface::setEnabled(bool enabled)
@@ -108,7 +96,7 @@ void PebbledInterface::setEnabled(bool enabled)
bool PebbledInterface::active() const
{
qDebug() << __FUNCTION__;
- return properties["ActiveState"].toString() == "active";
+ return unitProperties["ActiveState"].toString() == "active";
}
void PebbledInterface::setActive(bool active)
@@ -123,59 +111,53 @@ void PebbledInterface::setActive(bool active)
bool PebbledInterface::connected() const
{
qDebug() << __FUNCTION__;
- return PebbledDbusInterface.property(__FUNCTION__).toBool();
-}
-
-QVariantMap PebbledInterface::pebble() const
-{
- qDebug() << __FUNCTION__;
- return PebbledDbusInterface.property(__FUNCTION__).toMap();
+ return watch->connected();
}
QString PebbledInterface::name() const
{
qDebug() << __FUNCTION__;
- return PebbledDbusInterface.property(__FUNCTION__).toString();
+ return watch->name();
}
QString PebbledInterface::address() const
{
qDebug() << __FUNCTION__;
- return PebbledDbusInterface.property(__FUNCTION__).toString();
+ return watch->address();
}
void PebbledInterface::ping()
{
qDebug() << __FUNCTION__;
- PebbledDbusInterface.call("ping", 66);
+ watch->Ping(66);
}
void PebbledInterface::time()
{
qDebug() << __FUNCTION__;
- PebbledDbusInterface.call("time");
+ watch->SyncTime();
}
void PebbledInterface::disconnect()
{
qDebug() << __FUNCTION__;
- PebbledDbusInterface.call("disconnect");
+ watch->Disconnect();
}
void PebbledInterface::reconnect()
{
qDebug() << __FUNCTION__;
- PebbledDbusInterface.call("reconnect");
+ watch->Reconnect();
}
-void PebbledInterface::test()
+QUrl PebbledInterface::configureApp(const QUuid &uuid)
{
- qDebug() << __FUNCTION__;
- PebbledDbusInterface.call("test");
+ qDebug() << __FUNCTION__ << uuid;
+ QString url = watch->StartAppConfiguration(uuid.toString());
+ return QUrl(url);
}
-void PebbledInterface::webviewClosed(const QString &result)
+void PebbledInterface::setAppConfiguration(const QUuid &uuid, const QString &data)
{
- qDebug() << __FUNCTION__;
- PebbledDbusInterface.call("webviewClosed", QVariant::fromValue(result));
+ watch->SendAppConfigurationData(uuid.toString(), data);
}
diff --git a/app/pebbledinterface.h b/app/pebbledinterface.h
index 7d00110..78724ad 100644
--- a/app/pebbledinterface.h
+++ b/app/pebbledinterface.h
@@ -2,51 +2,36 @@
#define PEBBLEDINTERFACE_H
#include <QObject>
-#include <QtDBus/QtDBus>
-#include <QDBusArgument>
+#include <QUrl>
+#include <QDBusInterface>
+
+class OrgPebbledWatchInterface;
class PebbledInterface : public QObject
{
Q_OBJECT
-
- static QString PEBBLED_SYSTEMD_UNIT;
- static QString PEBBLED_DBUS_SERVICE;
- static QString PEBBLED_DBUS_PATH;
- static QString PEBBLED_DBUS_IFACE;
-
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
- bool enabled() const;
-
Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged)
- bool active() const;
-
Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged)
- bool connected() const;
-
- Q_PROPERTY(QVariantMap pebble READ pebble NOTIFY pebbleChanged)
- QVariantMap pebble() const;
-
Q_PROPERTY(QString name READ name NOTIFY nameChanged)
- QString name() const;
-
Q_PROPERTY(QString address READ address NOTIFY addressChanged)
- QString address() const;
-
public:
explicit PebbledInterface(QObject *parent = 0);
+ bool enabled() const;
+ bool active() const;
+ bool connected() const;
+ QString name() const;
+ QString address() const;
+
signals:
void enabledChanged();
void activeChanged();
-
void connectedChanged();
- void pebbleChanged();
void nameChanged();
void addressChanged();
- void openUrl(const QString &url);
-
public slots:
void setEnabled(bool);
void setActive(bool);
@@ -54,19 +39,19 @@ public slots:
void time();
void disconnect();
void reconnect();
- void test();
- void webviewClosed(const QString &result);
+
+ QUrl configureApp(const QUuid &uuid);
+ void setAppConfiguration(const QUuid &uuid, const QString &data);
private slots:
void getUnitProperties();
void onPropertiesChanged(QString interface, QMap<QString, QVariant> changed, QStringList invalidated);
- void onPebbleChanged();
private:
QDBusInterface *systemd;
+ OrgPebbledWatchInterface *watch;
QDBusObjectPath unitPath;
-
- QVariantMap properties;
+ QVariantMap unitProperties;
};
#endif // PEBBLEDINTERFACE_H
diff --git a/daemon/daemon.pro b/daemon/daemon.pro
index c59d408..3306541 100644
--- a/daemon/daemon.pro
+++ b/daemon/daemon.pro
@@ -20,7 +20,6 @@ SOURCES += \
notificationmanager.cpp \
watchconnector.cpp \
dbusconnector.cpp \
- dbusadaptor.cpp \
appmanager.cpp \
musicmanager.cpp \
datalogmanager.cpp \
@@ -38,7 +37,6 @@ HEADERS += \
notificationmanager.h \
watchconnector.h \
dbusconnector.h \
- dbusadaptor.h \
settings.h \
appmanager.h \
musicmanager.h \
@@ -51,10 +49,11 @@ HEADERS += \
packer.h
OTHER_FILES += \
- org.pebbled.xml \
../log4qt-debug.conf \
../log4qt-release.conf
+DBUS_ADAPTORS += ../org.pebbled.Watch.xml
+
INSTALLS += target pebbled confile
target.path = /usr/bin
diff --git a/daemon/dbusadaptor.cpp b/daemon/dbusadaptor.cpp
deleted file mode 100644
index 25e2508..0000000
--- a/daemon/dbusadaptor.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * This file was generated by qdbusxml2cpp version 0.8
- * Command line was: qdbusxml2cpp -a dbusadaptor org.pebbled.xml
- *
- * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
- *
- * This is an auto-generated file.
- * Do not edit! All changes made to it will be lost.
- */
-
-#include "dbusadaptor.h"
-#include <QtCore/QMetaObject>
-#include <QtCore/QByteArray>
-#include <QtCore/QList>
-#include <QtCore/QMap>
-#include <QtCore/QString>
-#include <QtCore/QStringList>
-#include <QtCore/QVariant>
-
-/*
- * Implementation of adaptor class PebbledAdaptor
- */
-
-PebbledAdaptor::PebbledAdaptor(QObject *parent)
- : QDBusAbstractAdaptor(parent)
-{
- // constructor
- setAutoRelaySignals(true);
-}
-
-PebbledAdaptor::~PebbledAdaptor()
-{
- // destructor
-}
-
-QString PebbledAdaptor::address() const
-{
- // get the value of property address
- return qvariant_cast< QString >(parent()->property("address"));
-}
-
-bool PebbledAdaptor::connected() const
-{
- // get the value of property connected
- return qvariant_cast< bool >(parent()->property("connected"));
-}
-
-QString PebbledAdaptor::name() const
-{
- // get the value of property name
- return qvariant_cast< QString >(parent()->property("name"));
-}
-
-QVariantMap PebbledAdaptor::pebble() const
-{
- // get the value of property pebble
- return qvariant_cast< QVariantMap >(parent()->property("pebble"));
-}
-
-void PebbledAdaptor::disconnect()
-{
- // handle method call org.pebbled.disconnect
- QMetaObject::invokeMethod(parent(), "disconnect");
-}
-
-void PebbledAdaptor::ping(int val)
-{
- // handle method call org.pebbled.ping
- QMetaObject::invokeMethod(parent(), "ping", Q_ARG(int, val));
-}
-
-void PebbledAdaptor::time()
-{
- // handle method call org.pebbled.time
- QMetaObject::invokeMethod(parent(), "time");
-}
-
-void PebbledAdaptor::reconnect()
-{
- // handle method call org.pebbled.reconnect
- QMetaObject::invokeMethod(parent(), "reconnect");
-}
-
-void PebbledAdaptor::test()
-{
- QMetaObject::invokeMethod(parent(), "test");
-}
-
-void PebbledAdaptor::webviewClosed(const QString &result)
-{
- QMetaObject::invokeMethod(parent(), "webviewClosed", Q_ARG(QString, result));
-}
diff --git a/daemon/dbusadaptor.h b/daemon/dbusadaptor.h
deleted file mode 100644
index f347f92..0000000
--- a/daemon/dbusadaptor.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * This file was generated by qdbusxml2cpp version 0.8
- * Command line was: qdbusxml2cpp -a dbusadaptor org.pebbled.xml
- *
- * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
- *
- * This is an auto-generated file.
- * This file may have been hand-edited. Look for HAND-EDIT comments
- * before re-generating it.
- */
-
-#ifndef DBUSADAPTOR_H_1404986135
-#define DBUSADAPTOR_H_1404986135
-
-#include <QtCore/QObject>
-#include <QtDBus/QtDBus>
-QT_BEGIN_NAMESPACE
-class QByteArray;
-template<class T> class QList;
-template<class Key, class Value> class QMap;
-class QString;
-class QStringList;
-class QVariant;
-QT_END_NAMESPACE
-
-/*
- * Adaptor class for interface org.pebbled
- */
-class PebbledAdaptor: public QDBusAbstractAdaptor
-{
- Q_OBJECT
- Q_CLASSINFO("D-Bus Interface", "org.pebbled")
- Q_CLASSINFO("D-Bus Introspection", ""
-" <interface name=\"org.pebbled\">\n"
-" <property access=\"read\" type=\"a{sv}\" name=\"pebble\">\n"
-" <annotation value=\"QVariantMap\" name=\"org.qtproject.QtDBus.QtTypeName\"/>\n"
-" </property>\n"
-" <property access=\"read\" type=\"s\" name=\"name\"/>\n"
-" <property access=\"read\" type=\"s\" name=\"address\"/>\n"
-" <property access=\"read\" type=\"b\" name=\"connected\"/>\n"
-" <signal name=\"pebbleChanged\"/>\n"
-" <signal name=\"connectedChanged\"/>\n"
-" <method name=\"ping\">\n"
-" <arg direction=\"in\" type=\"i\" name=\"val\"/>\n"
-" </method>\n"
-" <method name=\"time\"/>\n"
-" <method name=\"disconnect\"/>\n"
-" <method name=\"reconnect\"/>\n"
-" <method name=\"test\"/>\n"
-" <signal name=\"openUrl\">\n"
-" <arg type=\"s\" name=\"url\"/>\n"
-" </signal>\n"
-" <method name=\"webviewClosed\">\n"
-" <arg direction=\"in\" type=\"s\" name=\"result\"/>\n"
-" </method>\n"
-" </interface>\n"
- "")
-public:
- PebbledAdaptor(QObject *parent);
- virtual ~PebbledAdaptor();
-
-public: // PROPERTIES
- Q_PROPERTY(QString address READ address)
- QString address() const;
-
- Q_PROPERTY(bool connected READ connected)
- bool connected() const;
-
- Q_PROPERTY(QString name READ name)
- QString name() const;
-
- Q_PROPERTY(QVariantMap pebble READ pebble)
- QVariantMap pebble() const;
-
-public Q_SLOTS: // METHODS
- void disconnect();
- void ping(int val);
- void time();
- void reconnect();
- void test();
- void webviewClosed(const QString &result);
-Q_SIGNALS: // SIGNALS
- void connectedChanged();
- void pebbleChanged();
- void openUrl(const QString &s);
-};
-
-#endif
diff --git a/daemon/dbusconnector.h b/daemon/dbusconnector.h
index e6dd793..d4c1bcb 100644
--- a/daemon/dbusconnector.h
+++ b/daemon/dbusconnector.h
@@ -20,8 +20,8 @@ class DBusConnector : public QObject
public:
explicit DBusConnector(QObject *parent = 0);
- QVariantMap pebble() { return pebbleProps; }
- QStringList services() { return dbusServices; }
+ QVariantMap pebble() const { return pebbleProps; }
+ QStringList services() const { return dbusServices; }
signals:
void pebbleChanged();
diff --git a/daemon/manager.cpp b/daemon/manager.cpp
index e732d38..38b3948 100644
--- a/daemon/manager.cpp
+++ b/daemon/manager.cpp
@@ -3,10 +3,11 @@
#include <QtContacts/QContactPhoneNumber>
#include "manager.h"
-#include "dbusadaptor.h"
+#include "watch_adaptor.h"
Manager::Manager(Settings *settings, QObject *parent) :
QObject(parent), settings(settings),
+ proxy(new PebbledProxy(this)),
watch(new WatchConnector(this)),
dbus(new DBusConnector(this)),
apps(new AppManager(this)),
@@ -54,14 +55,16 @@ Manager::Manager(Settings *settings, QObject *parent) :
connect(notifications, SIGNAL(twitterNotify(const QString &,const QString &)), SLOT(onTwitterNotify(const QString &,const QString &)));
connect(notifications, SIGNAL(facebookNotify(const QString &,const QString &)), SLOT(onFacebookNotify(const QString &,const QString &)));
- PebbledProxy *proxy = new PebbledProxy(this);
- PebbledAdaptor *adaptor = new PebbledAdaptor(proxy);
+ connect(appmsg, &AppMsgManager::messageReceived, this, &Manager::onAppMessage);
+
QDBusConnection session = QDBusConnection::sessionBus();
- session.registerObject("/org/pebbled", proxy);
+ new WatchAdaptor(proxy);
+ session.registerObject("/org/pebbled/watch", proxy);
session.registerService("org.pebbled");
- connect(dbus, SIGNAL(pebbleChanged()), adaptor, SIGNAL(pebbleChanged()));
- connect(watch, SIGNAL(connectedChanged()), adaptor, SIGNAL(connectedChanged()));
- connect(js, SIGNAL(appOpenUrl(QString)), adaptor, SIGNAL(openUrl(QString)));
+
+ connect(dbus, &DBusConnector::pebbleChanged, proxy, &PebbledProxy::NameChanged);
+ connect(dbus, &DBusConnector::pebbleChanged, proxy, &PebbledProxy::AddressChanged);
+ connect(watch, &WatchConnector::connectedChanged, proxy, &PebbledProxy::ConnectedChanged);
QString currentProfile = getCurrentProfile();
defaultProfile = currentProfile.isEmpty() ? "ambience" : currentProfile;
@@ -289,7 +292,7 @@ void Manager::onMprisPropertiesChanged(QString interface, QMap<QString,QVariant>
logger()->debug() << "lastSeenMpris:" << lastSeenMpris;
}
-QString Manager::mpris()
+QString Manager::mpris() const
{
const QStringList &services = dbus->services();
if (not lastSeenMpris.isEmpty() && services.contains(lastSeenMpris))
@@ -316,7 +319,7 @@ void Manager::setMprisMetadata(QVariantMap metadata)
emit mprisMetadataChanged(mprisMetadata);
}
-QString Manager::getCurrentProfile()
+QString Manager::getCurrentProfile() const
{
QDBusReply<QString> profile = QDBusConnection::sessionBus().call(
QDBusMessage::createMethodCall("com.nokia.profiled", "/com/nokia/profiled", "com.nokia.profiled", "get_profile"));
@@ -386,12 +389,6 @@ void Manager::transliterateMessage(const QString &text)
}
}
-bool Manager::uploadApp(const QUuid &uuid, int slot)
-{
- // TODO
- return false;
-}
-
void Manager::test()
{
logger()->debug() << "Starting test";
@@ -399,6 +396,11 @@ void Manager::test()
js->showConfiguration();
}
+void Manager::onAppMessage(const QUuid &uuid, const QVariantMap &data)
+{
+ emit proxy->AppMessage(uuid.toString(), data);
+}
+
void Manager::onWebviewClosed(const QString &result)
{
js->handleWebviewClosed(result);
diff --git a/daemon/manager.h b/daemon/manager.h
index b0e15fb..c12d3dc 100644
--- a/daemon/manager.h
+++ b/daemon/manager.h
@@ -24,9 +24,9 @@
using namespace QtContacts;
-class Manager :
- public QObject,
- protected QDBusContext
+class PebbledProxy;
+
+class Manager : public QObject, protected QDBusContext
{
Q_OBJECT
LOG4QT_DECLARE_QCLASS_LOGGER
@@ -40,6 +40,8 @@ class Manager :
Settings *settings;
+ PebbledProxy *proxy;
+
WatchConnector *watch;
DBusConnector *dbus;
AppManager *apps;
@@ -58,6 +60,7 @@ class Manager :
QString defaultProfile;
QString lastSeenMpris;
+ QVariantMap mprisMetadata;
QScopedPointer<icu::Transliterator> transliterator;
@@ -65,13 +68,11 @@ public:
explicit Manager(Settings *settings, QObject *parent = 0);
~Manager();
- Q_INVOKABLE QString findPersonByNumber(QString number);
- Q_INVOKABLE QString getCurrentProfile();
- Q_INVOKABLE QString mpris();
- QVariantMap mprisMetadata;
- QVariantMap getMprisMetadata() { return mprisMetadata; }
+ QString findPersonByNumber(QString number);
+ QString getCurrentProfile() const;
+ QString mpris() const;
- Q_INVOKABLE bool uploadApp(const QUuid &uuid, int slot = -1);
+ inline QVariantMap getMprisMetadata() const { return mprisMetadata; }
protected:
void transliterateMessage(const QString &text);
@@ -100,31 +101,71 @@ private slots:
void onMprisPropertiesChanged(QString,QMap<QString,QVariant>,QStringList);
void setMprisMetadata(QDBusArgument metadata);
void setMprisMetadata(QVariantMap metadata);
+
+ void onAppMessage(const QUuid &uuid, const QVariantMap &data);
};
-class PebbledProxy : public QObject
+/** This class is what's actually exported over D-Bus,
+ * so the names of the slots and properties must match with org.pebbled.Watch D-Bus interface.
+ * Case sensitive. Otherwise, _runtime_ failures will occur. */
+// The methods are marked inline so that they may be inlined inside qt_metacall
+class PebbledProxy : public QObject, protected QDBusContext
{
Q_OBJECT
- Q_PROPERTY(QVariantMap pebble READ pebble)
- Q_PROPERTY(QString name READ pebbleName)
- Q_PROPERTY(QString address READ pebbleAddress)
- Q_PROPERTY(bool connected READ pebbleConnected)
+ Q_PROPERTY(QString Name READ Name NOTIFY NameChanged)
+ Q_PROPERTY(QString Address READ Address NOTIFY AddressChanged)
+ Q_PROPERTY(bool Connected READ Connected NOTIFY ConnectedChanged)
- QVariantMap pebble() { return static_cast<Manager*>(parent())->dbus->pebble(); }
- QString pebbleName() { return static_cast<Manager*>(parent())->dbus->pebble()["Name"].toString(); }
- QString pebbleAddress() { return static_cast<Manager*>(parent())->dbus->pebble()["Address"].toString(); }
- bool pebbleConnected() { return static_cast<Manager*>(parent())->watch->isConnected(); }
+ inline Manager* manager() const { return static_cast<Manager*>(parent()); }
+ inline QVariantMap pebble() const { return manager()->dbus->pebble(); }
public:
- explicit PebbledProxy(QObject *parent) : QObject(parent) {}
+ inline explicit PebbledProxy(QObject *parent) : QObject(parent) {}
+
+ inline QString Name() const { return pebble()["Name"].toString(); }
+ inline QString Address() const { return pebble()["Address"].toString(); }
+ inline bool Connected() const { return manager()->watch->isConnected(); }
public slots:
- void ping(int val) { static_cast<Manager*>(parent())->watch->ping((unsigned int)val); }
- void time() { static_cast<Manager*>(parent())->watch->time(); }
- void disconnect() { static_cast<Manager*>(parent())->watch->disconnect(); }
- void reconnect() { static_cast<Manager*>(parent())->watch->reconnect(); }
- void test() { static_cast<Manager*>(parent())->test(); }
- void webviewClosed(const QString &result) { static_cast<Manager*>(parent())->onWebviewClosed(result); }
+ inline void Disconnected() { manager()->watch->disconnect(); }
+ inline void Reconnect() { manager()->watch->reconnect(); }
+ inline void Ping(uint val) { manager()->watch->ping(val); }
+ inline void SyncTime() { manager()->watch->time(); }
+
+ inline void LaunchApp(const QString &uuid) { /* TODO */ }
+ inline void CloseApp(const QString &uuid) { /* TODO */ }
+
+ bool SendAppMessage(const QString &uuid, const QVariantMap &data) {
+ Q_ASSERT(calledFromDBus());
+ const QDBusMessage msg = message();
+ setDelayedReply(true);
+ manager()->appmsg->send(uuid, data, [this, msg]() {
+ QDBusMessage reply = msg.createReply(QVariant::fromValue(true));
+ this->connection().send(reply);
+ }, [this, msg]() {
+ QDBusMessage reply = msg.createReply(QVariant::fromValue(false));
+ this->connection().send(reply);
+ });
+ return false; // D-Bus clients should never see this reply.
+ }
+
+ QString StartAppConfiguration(const QString &uuid) {
+ Q_ASSERT(calledFromDBus());
+ const QDBusMessage msg = message();
+ setDelayedReply(true);
+
+ // TODO
+ }
+
+ inline void SendAppConfiguration(const QString &uuid, const QString &data) {
+ // TODO
+ }
+
+signals:
+ void NameChanged();
+ void AddressChanged();
+ void ConnectedChanged();
+ void AppMessage(const QString &uuid, const QVariantMap &data);
};
#endif // MANAGER_H
diff --git a/daemon/org.pebbled.xml b/daemon/org.pebbled.xml
deleted file mode 100644
index e255782..0000000
--- a/daemon/org.pebbled.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
-"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
-<node>
- <interface name="org.pebbled">
- <property name="pebble" type="a{sv}" access="read">
- <annotation name="org.qtproject.QtDBus.QtTypeName" value="QVariantMap"/>
- </property>
- <property name="name" type="s" access="read"/>
- <property name="address" type="s" access="read"/>
- <property name="connected" type="b" access="read"/>
- <signal name="pebbleChanged"/>
- <signal name="connectedChanged"/>
- <method name="ping">
- <arg name="val" type="i" direction="in"/>
- </method>
- <method name="time"/>
- <method name="disconnect"/>
- <method name="reconnect"/>
- </interface>
-</node>
diff --git a/org.pebbled.Watch.xml b/org.pebbled.Watch.xml
new file mode 100644
index 0000000..72aab6b
--- /dev/null
+++ b/org.pebbled.Watch.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node name="/org/pebbled/watch">
+ <interface name="org.pebbled.Watch">
+ <property name="Name" type="s" access="read"/>
+ <property name="Address" type="s" access="read"/>
+ <property name="Connected" type="b" access="read"/>
+ <!-- Qt does not yet support property changed signals, so we fake them. -->
+ <signal name="NameChanged"/>
+ <signal name="AddressChanged"/>
+ <signal name="ConnectedChanged"/>
+ <method name="Disconnect"/>
+ <method name="Reconnect"/>
+ <method name="Ping">
+ <arg name="val" type="u" direction="in"/>
+ </method>
+ <method name="SyncTime"/>
+ <!-- The following methods resemble the official PebbleKit API -->
+ <method name="LaunchApp">
+ <arg name="uuid" type="s" direction="in"/>
+ </method>
+ <method name="CloseApp">
+ <arg name="uuid" type="s" direction="in"/>
+ </method>
+ <method name="SendAppMessage">
+ <arg name="uuid" type="s" direction="in"/>
+ <arg name="message" type="a{sv}" direction="in"/>
+ <arg name="msg_ack" type="b" direction="out"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QVariantMap"/>
+ </method>
+ <signal name="AppMessage">
+ <arg name="uuid" type="s"/>
+ <arg name="message" type="a{sv}"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QVariantMap"/>
+ </signal>
+ <!-- The following method are used for configuration of JSKit applications by the client app -->
+ <method name="StartAppConfiguration">
+ <arg name="uuid" type="s" direction="in"/>
+ <arg name="config_url" type="s" direction="out"/>
+ </method>
+ <method name="SendAppConfigurationData">
+ <arg name="uuid" type="s" direction="in"/>
+ <arg name="data" type="s" direction="in"/>
+ </method>
+ </interface>
+</node>