diff options
| author | Tomasz Sterna <tomek@xiaoka.com> | 2014-07-13 04:09:21 +0200 |
|---|---|---|
| committer | Tomasz Sterna <tomek@xiaoka.com> | 2014-07-13 04:09:21 +0200 |
| commit | 6d6178cca884f563396856d59eba4813b2eb2686 (patch) | |
| tree | ef84e7b3e2ab2ef61648c89eaa0298d3513d4db4 /daemon | |
| parent | 28d27970e9ca71e0abd2526a31043dab33a52a6e (diff) | |
Implemented preliminary MPRIS support
Diffstat (limited to 'daemon')
| -rw-r--r-- | daemon/dbusconnector.cpp | 52 | ||||
| -rw-r--r-- | daemon/dbusconnector.h | 9 | ||||
| -rw-r--r-- | daemon/manager.cpp | 30 | ||||
| -rw-r--r-- | daemon/manager.h | 9 |
4 files changed, 80 insertions, 20 deletions
diff --git a/daemon/dbusconnector.cpp b/daemon/dbusconnector.cpp index 2ad753d..5fe064b 100644 --- a/daemon/dbusconnector.cpp +++ b/daemon/dbusconnector.cpp @@ -6,6 +6,7 @@ #include <QDBusReply> #include <QDBusArgument> #include <QDBusObjectPath> +#include <QDBusConnectionInterface> //dbus-send --system --dest=org.bluez --print-reply / org.bluez.Manager.ListAdapters //dbus-send --system --dest=org.bluez --print-reply $path org.bluez.Adapter.GetProperties @@ -14,16 +15,28 @@ DBusConnector::DBusConnector(QObject *parent) : QObject(parent) -{} +{ + QDBusConnection bus = QDBusConnection::sessionBus(); + QDBusConnectionInterface *interface = bus.interface(); + connect(interface, SIGNAL(serviceRegistered(QString&)), SLOT(onServiceRegistered(QString&))); + connect(interface, SIGNAL(serviceUnregistered(QString&)), SIGNAL(onServiceUnregistered(QString&))); + + QDBusReply<QStringList> serviceNames = interface->registeredServiceNames(); + if (serviceNames.isValid()) { + dbusServices = serviceNames.value(); + } + else { + logger()->error() << serviceNames.error().message(); + } +} bool DBusConnector::findPebble() { QDBusConnection system = QDBusConnection::systemBus(); - QDBusReply<QList<QDBusObjectPath>> ListAdaptersReply = system.call(QDBusMessage::createMethodCall("org.bluez", - "/", - "org.bluez.Manager", - "ListAdapters")); + QDBusReply<QList<QDBusObjectPath>> ListAdaptersReply = system.call( + QDBusMessage::createMethodCall("org.bluez", "/", "org.bluez.Manager", + "ListAdapters")); if (not ListAdaptersReply.isValid()) { logger()->error() << ListAdaptersReply.error().message(); return false; @@ -36,10 +49,9 @@ bool DBusConnector::findPebble() return false; } - QDBusReply<QVariantMap> AdapterPropertiesReply = system.call(QDBusMessage::createMethodCall("org.bluez", - adapters[0].path(), - "org.bluez.Adapter", - "GetProperties")); + QDBusReply<QVariantMap> AdapterPropertiesReply = system.call( + QDBusMessage::createMethodCall("org.bluez", adapters[0].path(), "org.bluez.Adapter", + "GetProperties")); if (not AdapterPropertiesReply.isValid()) { logger()->error() << AdapterPropertiesReply.error().message(); return false; @@ -48,14 +60,10 @@ bool DBusConnector::findPebble() QList<QDBusObjectPath> devices; AdapterPropertiesReply.value()["Devices"].value<QDBusArgument>() >> devices; - QString name; - QString address; - foreach (QDBusObjectPath path, devices) { - QDBusReply<QVariantMap> DevicePropertiesReply = system.call(QDBusMessage::createMethodCall("org.bluez", - path.path(), - "org.bluez.Device", - "GetProperties")); + QDBusReply<QVariantMap> DevicePropertiesReply = system.call( + QDBusMessage::createMethodCall("org.bluez", path.path(), "org.bluez.Device", + "GetProperties")); if (not DevicePropertiesReply.isValid()) { logger()->error() << DevicePropertiesReply.error().message(); continue; @@ -75,3 +83,15 @@ bool DBusConnector::findPebble() return false; } + +void DBusConnector::onServiceRegistered(QString &name) +{ + logger()->debug() << "DBus service online:" << name; + if (!dbusServices.contains(name)) dbusServices.append(name); +} + +void DBusConnector::onServiceUnregistered(QString &name) +{ + logger()->debug() << "DBus service offline:" << name; + if (dbusServices.contains(name)) dbusServices.removeAll(name); +} diff --git a/daemon/dbusconnector.h b/daemon/dbusconnector.h index 98f6e58..4498867 100644 --- a/daemon/dbusconnector.h +++ b/daemon/dbusconnector.h @@ -2,6 +2,7 @@ #define DBUSCONNECTOR_H #include <QObject> +#include <QStringList> #include <QVariantMap> #include "Logger" @@ -11,20 +12,28 @@ class DBusConnector : public QObject LOG4QT_DECLARE_QCLASS_LOGGER Q_PROPERTY(QVariantMap pebble READ pebble NOTIFY pebbleChanged) + Q_PROPERTY(QStringList services READ services NOTIFY servicesChanged) QVariantMap pebbleProps; + QStringList dbusServices; public: explicit DBusConnector(QObject *parent = 0); QVariantMap pebble() { return pebbleProps; } + QStringList services() { return dbusServices; } signals: void pebbleChanged(); + void servicesChanged(); public slots: bool findPebble(); +protected slots: + void onServiceRegistered(QString&); + void onServiceUnregistered(QString&); + }; #endif // DBUSCONNECTOR_H diff --git a/daemon/manager.cpp b/daemon/manager.cpp index 8ff6785..228c466 100644 --- a/daemon/manager.cpp +++ b/daemon/manager.cpp @@ -38,11 +38,16 @@ Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallMan PebbledProxy *proxy = new PebbledProxy(this); PebbledAdaptor *adaptor = new PebbledAdaptor(proxy); - QDBusConnection connection = QDBusConnection::sessionBus(); - connection.registerObject("/", proxy); - connection.registerService("org.pebbled"); + QDBusConnection session = QDBusConnection::sessionBus(); + session.registerObject("/", proxy); + session.registerService("org.pebbled"); connect(dbus, SIGNAL(pebbleChanged()), adaptor, SIGNAL(pebbleChanged())); connect(watch, SIGNAL(connectedChanged()), adaptor, SIGNAL(connectedChanged())); + + // Music Control interface + session.connect("", "/org/mpris/MediaPlayer2", + "org.freedesktop.DBus.Properties", "PropertiesChanged", + this, SLOT(onMprisPropertiesChanged(QString,QMap<QString,QVariant>,QStringList))); } void Manager::onPebbleChanged() @@ -185,3 +190,22 @@ void Manager::processUnreadMessages(GroupObject *group) logger()->debug() << "Got processUnreadMessages for group with no new messages"; } } + +void Manager::onMprisPropertiesChanged(QString interface, QMap<QString,QVariant> changed, QStringList invalidated) +{ + qDebug() << interface << changed << invalidated; + lastSeenMpris = message().service(); +} + +QString Manager::mpris() +{ + const QStringList &services = dbus->services(); + if (not lastSeenMpris.isEmpty() && services.contains(lastSeenMpris)) + return lastSeenMpris; + + foreach (QString service,services) + if (service.startsWith("org.mpris.MediaPlayer2.")) + return service; + + return QString(); +} diff --git a/daemon/manager.h b/daemon/manager.h index db0d0d3..ab5b8e7 100644 --- a/daemon/manager.h +++ b/daemon/manager.h @@ -7,6 +7,7 @@ #include <QObject> #include <QBluetoothLocalDevice> +#include <QDBusContext> #include <QtContacts/QContactManager> #include <QtContacts/QContactDetailFilter> #include <CommHistory/GroupModel> @@ -16,7 +17,9 @@ using namespace QtContacts; using namespace CommHistory; -class Manager : public QObject +class Manager : + public QObject, + protected QDBusContext { Q_OBJECT LOG4QT_DECLARE_QCLASS_LOGGER @@ -35,11 +38,14 @@ class Manager : public QObject QContactDetailFilter numberFilter; GroupManager *conversations; + QString lastSeenMpris; + public: explicit Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallManager *voice); Q_INVOKABLE QString findPersonByNumber(QString number); Q_INVOKABLE void processUnreadMessages(GroupObject *group); + Q_INVOKABLE QString mpris(); signals: @@ -54,6 +60,7 @@ protected slots: void onActiveVoiceCallStatusChanged(); void onConversationGroupAdded(GroupObject *group); void onUnreadMessagesChanged(); + void onMprisPropertiesChanged(QString,QMap<QString,QVariant>,QStringList); }; |
