summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Sterna <tomek@xiaoka.com>2014-07-13 04:09:21 +0200
committerTomasz Sterna <tomek@xiaoka.com>2014-07-13 04:09:21 +0200
commit6d6178cca884f563396856d59eba4813b2eb2686 (patch)
treeef84e7b3e2ab2ef61648c89eaa0298d3513d4db4
parent28d27970e9ca71e0abd2526a31043dab33a52a6e (diff)
Implemented preliminary MPRIS support
-rw-r--r--app/pebbledinterface.cpp9
-rw-r--r--daemon/dbusconnector.cpp52
-rw-r--r--daemon/dbusconnector.h9
-rw-r--r--daemon/manager.cpp30
-rw-r--r--daemon/manager.h9
5 files changed, 83 insertions, 26 deletions
diff --git a/app/pebbledinterface.cpp b/app/pebbledinterface.cpp
index 1bd9b50..50ece6e 100644
--- a/app/pebbledinterface.cpp
+++ b/app/pebbledinterface.cpp
@@ -38,12 +38,9 @@ PebbledInterface::PebbledInterface(QObject *parent) :
getUnitProperties();
QDBusConnection::sessionBus().connect(
- "org.freedesktop.systemd1",
- unitPath.path(),
- "org.freedesktop.DBus.Properties",
- "PropertiesChanged",
- this,
- SLOT(onPropertiesChanged(QString,QMap<QString,QVariant>,QStringList)));
+ "org.freedesktop.systemd1", unitPath.path(),
+ "org.freedesktop.DBus.Properties", "PropertiesChanged",
+ this, SLOT(onPropertiesChanged(QString,QMap<QString,QVariant>,QStringList)));
} else {
qWarning() << unit.error().message();
}
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);
};