summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Sterna <tomek@xiaoka.com>2014-07-06 02:56:39 +0200
committerTomasz Sterna <tomek@xiaoka.com>2014-07-09 01:57:32 +0200
commit66fcda8bf06abcc557d2d435b5dc0562de3a9566 (patch)
tree5b1b53ee834514178790a7a6ef87cdcf17d0ef1e
parent558e07f125eea64436e2097b8a35c9c348b5204e (diff)
Implemented org.pebbled DBus service
-rw-r--r--daemon/daemon.pro8
-rw-r--r--daemon/dbusadaptor.cpp59
-rw-r--r--daemon/dbusadaptor.h68
-rw-r--r--daemon/manager.cpp12
-rw-r--r--daemon/manager.h11
-rw-r--r--daemon/org.pebbled.xml14
-rw-r--r--lib/watchconnector.cpp13
-rw-r--r--lib/watchconnector.h1
8 files changed, 178 insertions, 8 deletions
diff --git a/daemon/daemon.pro b/daemon/daemon.pro
index b0957fe..c4b6a76 100644
--- a/daemon/daemon.pro
+++ b/daemon/daemon.pro
@@ -17,13 +17,15 @@ SOURCES += \
voicecallmanager.cpp \
voicecallhandler.cpp \
manager.cpp \
- dbusconnector.cpp
+ dbusconnector.cpp \
+ dbusadaptor.cpp
HEADERS += \
voicecallmanager.h \
voicecallhandler.h \
manager.h \
- dbusconnector.h
+ dbusconnector.h \
+ dbusadaptor.h
INSTALLS += target pebbled
@@ -31,3 +33,5 @@ target.path = /usr/bin
pebbled.files = $${TARGET}.service
pebbled.path = /usr/lib/systemd/user
+
+OTHER_FILES += org.pebbled.xml
diff --git a/daemon/dbusadaptor.cpp b/daemon/dbusadaptor.cpp
new file mode 100644
index 0000000..914f9f2
--- /dev/null
+++ b/daemon/dbusadaptor.cpp
@@ -0,0 +1,59 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp -c DBusAdaptor -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 DBusAdaptor
+ */
+
+DBusAdaptor::DBusAdaptor(QObject *parent)
+ : QDBusAbstractAdaptor(parent)
+{
+ // constructor
+ setAutoRelaySignals(true);
+}
+
+DBusAdaptor::~DBusAdaptor()
+{
+ // destructor
+}
+
+QString DBusAdaptor::address() const
+{
+ // get the value of property address
+ return qvariant_cast< QString >(parent()->property("address"));
+}
+
+bool DBusAdaptor::connected() const
+{
+ // get the value of property connected
+ return qvariant_cast< bool >(parent()->property("connected"));
+}
+
+QString DBusAdaptor::name() const
+{
+ // get the value of property name
+ return qvariant_cast< QString >(parent()->property("name"));
+}
+
+QVariantMap DBusAdaptor::pebble() const
+{
+ // get the value of property pebble
+ return qvariant_cast< QVariantMap >(parent()->property("pebble"));
+}
+
diff --git a/daemon/dbusadaptor.h b/daemon/dbusadaptor.h
new file mode 100644
index 0000000..9d8759a
--- /dev/null
+++ b/daemon/dbusadaptor.h
@@ -0,0 +1,68 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp -c DBusAdaptor -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_1404605591
+#define DBUSADAPTOR_H_1404605591
+
+#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 DBusAdaptor: 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"
+" </interface>\n"
+ "")
+public:
+ DBusAdaptor(QObject *parent);
+ virtual ~DBusAdaptor();
+
+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
+Q_SIGNALS: // SIGNALS
+ void connectedChanged();
+ void pebbleChanged();
+};
+
+#endif
diff --git a/daemon/manager.cpp b/daemon/manager.cpp
index 7360736..ae757e6 100644
--- a/daemon/manager.cpp
+++ b/daemon/manager.cpp
@@ -1,4 +1,5 @@
#include "manager.h"
+#include "dbusadaptor.h"
#include <QDebug>
#include <QtContacts/QContact>
@@ -18,8 +19,6 @@ Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallMan
conversations = new GroupManager(this);
connect(conversations, SIGNAL(groupAdded(GroupObject*)), SLOT(onConversationGroupAdded(GroupObject*)));
- connect(conversations, SIGNAL(groupUpdated(GroupObject*)), SLOT(onConversationGroupUpdated(GroupObject*)));
- connect(conversations, SIGNAL(groupDeleted(GroupObject*)), SLOT(onConversationGroupDeleted(GroupObject*)));
conversations->getGroups();
connect(voice, SIGNAL(activeVoiceCallChanged()), SLOT(onActiveVoiceCallChanged()));
@@ -37,6 +36,13 @@ Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallMan
connect(dbus, SIGNAL(pebbleChanged()), SLOT(onPebbleChanged()));
dbus->findPebble();
}
+
+ DBusAdaptor *adaptor = new DBusAdaptor(this);
+ QDBusConnection connection = QDBusConnection::sessionBus();
+ connection.registerObject("/", this);
+ connection.registerService("org.pebbled");
+ connect(this, SIGNAL(pebbleChanged()), adaptor, SIGNAL(pebbleChanged()));
+ connect(this, SIGNAL(connectedChanged()), adaptor, SIGNAL(connectedChanged()));
}
void Manager::onPebbleChanged()
@@ -48,6 +54,7 @@ void Manager::onPebbleChanged()
} else {
watch->deviceConnect(name, pebble["Address"].toString());
}
+ emit pebbleChanged();
}
void Manager::onConnectedChanged()
@@ -63,6 +70,7 @@ void Manager::onConnectedChanged()
if (!notification.publish()) {
qDebug() << "Failed publishing notification";
}
+ emit connectedChanged();
}
void Manager::onActiveVoiceCallChanged()
diff --git a/daemon/manager.h b/daemon/manager.h
index bfbd92d..04dd7d4 100644
--- a/daemon/manager.h
+++ b/daemon/manager.h
@@ -18,6 +18,10 @@ using namespace CommHistory;
class Manager : public QObject
{
Q_OBJECT
+ Q_PROPERTY(QVariantMap pebble READ pebble NOTIFY pebbleChanged)
+ Q_PROPERTY(QString name READ pebbleName NOTIFY pebbleChanged)
+ Q_PROPERTY(QString address READ pebbleAddress NOTIFY pebbleChanged)
+ Q_PROPERTY(bool connected READ pebbleConnected NOTIFY connectedChanged)
QBluetoothLocalDevice btDevice;
@@ -37,7 +41,14 @@ public:
Q_INVOKABLE QString findPersonByNumber(QString number);
Q_INVOKABLE void processUnreadMessages(GroupObject *group);
+ QVariantMap pebble() { return dbus->pebble(); }
+ QString pebbleName() { return dbus->pebble()["Name"].toString(); }
+ QString pebbleAddress() { return dbus->pebble()["Address"].toString(); }
+ bool pebbleConnected() { return watch->isConnected(); }
+
signals:
+ void pebbleChanged();
+ void connectedChanged();
public slots:
void hangupAll();
diff --git a/daemon/org.pebbled.xml b/daemon/org.pebbled.xml
new file mode 100644
index 0000000..a282815
--- /dev/null
+++ b/daemon/org.pebbled.xml
@@ -0,0 +1,14 @@
+<!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"/>
+ </interface>
+</node>
diff --git a/lib/watchconnector.cpp b/lib/watchconnector.cpp
index 15fd97f..1bfce0d 100644
--- a/lib/watchconnector.cpp
+++ b/lib/watchconnector.cpp
@@ -40,7 +40,7 @@ void WatchConnector::reconnect()
void WatchConnector::handleWatch(const QString &name, const QString &address)
{
- qDebug() << "handleWatch" << name << (socket != nullptr);
+ qDebug() << "handleWatch" << name << address;
if (socket != nullptr && socket->isOpen()) {
socket->close();
socket->deleteLater();
@@ -54,12 +54,13 @@ void WatchConnector::handleWatch(const QString &name, const QString &address)
qDebug() << "Creating socket";
socket = new QBluetoothSocket(QBluetoothSocket::RfcommSocket);
- // FIXME: Assuming port 1 (with Pebble)
- socket->connectToService(QBluetoothAddress(address), 1);
-
connect(socket, SIGNAL(readyRead()), SLOT(onReadSocket()));
connect(socket, SIGNAL(connected()), SLOT(onConnected()));
connect(socket, SIGNAL(disconnected()), SLOT(onDisconnected()));
+ connect(socket, SIGNAL(error(QBluetoothSocket::SocketError)), this, SLOT(onError(QBluetoothSocket::SocketError)));
+
+ // FIXME: Assuming port 1 (with Pebble)
+ socket->connectToService(QBluetoothAddress(address), 1);
}
QString WatchConnector::decodeEndpoint(unsigned int val)
@@ -171,6 +172,10 @@ void WatchConnector::onDisconnected()
QTimer::singleShot(__reconnect_timeout, this, SLOT(reconnect()));
}
+void WatchConnector::onError(QBluetoothSocket::SocketError error) {
+ qWarning() << "Error connecting Pebble" << error << socket->errorString();
+}
+
void WatchConnector::sendData(const QByteArray &data)
{
if (socket == nullptr) return;
diff --git a/lib/watchconnector.h b/lib/watchconnector.h
index bf404e6..493856b 100644
--- a/lib/watchconnector.h
+++ b/lib/watchconnector.h
@@ -116,6 +116,7 @@ public slots:
void onReadSocket();
void onConnected();
void onDisconnected();
+ void onError(QBluetoothSocket::SocketError error);
void reconnect();
private: