[SCM] kdeconnect packaging branch, master, updated. debian/0.9g-1-1183-g9d69498

Maximiliano Curia maxy at moszumanska.debian.org
Fri Oct 14 14:26:41 UTC 2016


Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/kdeconnect.git;a=commitdiff;h=2c1d63b

The following commit has been merged in the master branch:
commit 2c1d63bf4dc80493fc9dad469719976284b82dbe
Author: Albert Vaca <albertvaka at gmail.com>
Date:   Tue Jul 30 20:21:06 2013 +0200

    Added multi-device support for mpris, and current track reporting
---
 daemon/devicelinks/tcpdevicelink.cpp               |  2 +-
 daemon/linkproviders/avahitcplinkprovider.cpp      |  4 +-
 daemon/linkproviders/loopbacklinkprovider.cpp      |  1 +
 daemon/networkpackage.h                            | 12 ++-
 .../mpriscontrolpackageinterface.cpp               | 93 ++++++++++++++++++++--
 .../mpriscontrolpackageinterface.h                 | 15 ++++
 6 files changed, 112 insertions(+), 15 deletions(-)

diff --git a/daemon/devicelinks/tcpdevicelink.cpp b/daemon/devicelinks/tcpdevicelink.cpp
index bc357d0..16a558e 100644
--- a/daemon/devicelinks/tcpdevicelink.cpp
+++ b/daemon/devicelinks/tcpdevicelink.cpp
@@ -45,7 +45,7 @@ void TcpDeviceLink::dataReceived()
 
         if (package.length() < 3) continue;
 
-        NetworkPackage np;
+        NetworkPackage np("");
         NetworkPackage::unserialize(package,&np);
 
         emit receivedPackage(np);
diff --git a/daemon/linkproviders/avahitcplinkprovider.cpp b/daemon/linkproviders/avahitcplinkprovider.cpp
index 0203361..d7b77a3 100644
--- a/daemon/linkproviders/avahitcplinkprovider.cpp
+++ b/daemon/linkproviders/avahitcplinkprovider.cpp
@@ -49,7 +49,7 @@ void AvahiTcpLinkProvider::newConnection()
 
     connect(socket,SIGNAL(readyRead()),this,SLOT(dataReceived()));
 
-    NetworkPackage np;
+    NetworkPackage np(PACKAGE_TYPE_IDENTITY);
     NetworkPackage::createIdentityPackage(&np);
     int written = socket->write(np.serialize());
 
@@ -64,7 +64,7 @@ void AvahiTcpLinkProvider::dataReceived()
 
     qDebug() << "AvahiTcpLinkProvider received reply:" << data;
 
-    NetworkPackage np;
+    NetworkPackage np("");
     NetworkPackage::unserialize(data,&np);
 
     if (np.version() > 0 && np.type() == PACKAGE_TYPE_IDENTITY) {
diff --git a/daemon/linkproviders/loopbacklinkprovider.cpp b/daemon/linkproviders/loopbacklinkprovider.cpp
index c286bbb..bb476f0 100644
--- a/daemon/linkproviders/loopbacklinkprovider.cpp
+++ b/daemon/linkproviders/loopbacklinkprovider.cpp
@@ -24,6 +24,7 @@
 #include <QDebug>
 
 LoopbackLinkProvider::LoopbackLinkProvider()
+    : identityPackage(PACKAGE_TYPE_IDENTITY)
 {
     echoDeviceLink = new EchoDeviceLink("fake", this);
     NetworkPackage::createIdentityPackage(&identityPackage);
diff --git a/daemon/networkpackage.h b/daemon/networkpackage.h
index ce65f4c..5ac0c38 100644
--- a/daemon/networkpackage.h
+++ b/daemon/networkpackage.h
@@ -25,6 +25,7 @@
 #include <QObject>
 #include <QString>
 #include <QVariant>
+#include <QStringList>
 #include <qjson/parser.h>
 #include "default_args.h"
 
@@ -38,7 +39,6 @@ class NetworkPackage : public QObject
 
 public:
 
-    NetworkPackage() {};
     NetworkPackage(QString type);
 
     static void unserialize(QByteArray, NetworkPackage*);
@@ -52,10 +52,12 @@ public:
     int version() const { return mVersion; }
 
     //Get and set info from body. Note that id, type and version can not be accessed through these.
-    template<typename T> T get(const QString& property, const T& defaultValue = default_arg<T>::get()) const {
-        return mBody.value(property,defaultValue).template value<T>(); //Important note: Awesome template syntax is awesome
+    template<typename T> T get(const QString& key, const T& defaultValue = default_arg<T>::get()) const {
+        return mBody.value(key,defaultValue).template value<T>(); //Important note: Awesome template syntax is awesome
     }
-    template<typename T> void set(const QString& property, const T& value) { mBody[property] = value; }
+    template<typename T> void set(const QString& key, const T& value) { mBody[key] = QVariant(value); }
+    
+    bool has(const QString& key) { return mBody.contains(key); }
 
 private:
     void setId(long id) { mId = id; }
@@ -70,5 +72,7 @@ private:
 
 };
 
+//Set specialization need this awesome-to-the-max syntax:
+//template<> inline void NetworkPackage::set<QStringList>(const QString& key, const QStringList& value) { mBody[key] = QVariant(value); }
 
 #endif // NETWORKPACKAGE_H
diff --git a/daemon/packageinterfaces/mpriscontrolpackageinterface.cpp b/daemon/packageinterfaces/mpriscontrolpackageinterface.cpp
index 71b20ec..9764162 100644
--- a/daemon/packageinterfaces/mpriscontrolpackageinterface.cpp
+++ b/daemon/packageinterfaces/mpriscontrolpackageinterface.cpp
@@ -29,7 +29,60 @@
 
 MprisControlPackageInterface::MprisControlPackageInterface()
 {
-    //TODO: Emit info read form mpris to the phone
+
+    //Detect new interfaces
+    connect(QDBusConnection::sessionBus().interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)),
+            this, SLOT(serviceOwnerChanged(QString,QString,QString)));
+
+    //Add existing interfaces
+    QStringList interfaces = QDBusConnection::sessionBus().interface()->registeredServiceNames().value();
+    Q_FOREACH (const QString& iface, interfaces) {
+        if (iface.startsWith("org.mpris.MediaPlayer2")) {
+            addPlayer(iface);
+        }
+    }
+
+}
+
+void MprisControlPackageInterface::serviceOwnerChanged(const QString &name,
+                                              const QString &oldOwner,
+                                              const QString &newOwner)
+{
+    Q_UNUSED(oldOwner);
+
+    if (name.startsWith("org.mpris.MediaPlayer2")) {
+
+        qDebug() << "Something registered in bus" << name << oldOwner << newOwner;
+
+        if (oldOwner.isEmpty()) {
+            addPlayer(name);
+        } else if (newOwner.isEmpty()) {
+            removePlayer(name);
+        }
+    }
+}
+
+void MprisControlPackageInterface::addPlayer(const QString& ifaceName)
+{
+    QDBusInterface interface(ifaceName, "/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2");
+    //TODO: Make this async
+    QString identity = interface.property("Identity").toString();
+    playerList[identity] = ifaceName;
+    qDebug() << "addPlayer" << ifaceName << identity;
+    sendPlayerList();
+}
+
+void MprisControlPackageInterface::removePlayer(const QString& ifaceName)
+{
+    playerList.remove(playerList.key(ifaceName));
+    sendPlayerList();
+}
+
+void MprisControlPackageInterface::sendPlayerList()
+{
+    NetworkPackage np(PACKAGE_TYPE_MPRIS);
+    np.set("playerList",playerList.keys());
+    sendPackage(np);
 }
 
 bool MprisControlPackageInterface::receivePackage (const Device& device, const NetworkPackage& np)
@@ -38,16 +91,40 @@ bool MprisControlPackageInterface::receivePackage (const Device& device, const N
 
     if (np.type() != PACKAGE_TYPE_MPRIS) return false;
 
-    QString action = np.get<QString>("action");
 
-    QStringList interfaces = QDBusConnection::sessionBus().interface()->registeredServiceNames().value();
-    Q_FOREACH (const QString& iface, interfaces) {
-        if (iface.startsWith("org.mpris.MediaPlayer2")) {
-            QDBusInterface mprisInterface(iface, "/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Player");
-            mprisInterface.asyncCall(action);
-        }
+    QString player = np.get<QString>("player");
+    if (!playerList.contains(player)) {
+        sendPlayerList();
+        return true;
+    }
+
+    QDBusInterface mprisInterface(playerList[player], "/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Player");
+
+    if (np.get<bool>("requestPlayerList")) {
+        sendPlayerList();
+    }
+
+    QString action = np.get<QString>("action");
+    if (!action.isEmpty()) {
+        qDebug() << "Calling action" << action << "in" << playerList[player];
+        mprisInterface.call(action);
+        sendNowPlaying(mprisInterface);
+    } else if (np.get<bool>("requestNowPlaying")) {
+        sendNowPlaying(mprisInterface);
     }
 
     return true;
 
 }
+
+void MprisControlPackageInterface::sendNowPlaying(const QDBusInterface& mprisInterface)
+{
+    QVariantMap nowPlayingMap = mprisInterface.property("Metadata").toMap();
+    QString nowPlaying = nowPlayingMap["xesam:title"].toString();
+    if (nowPlayingMap.contains("xesam:artist")) {
+        nowPlaying = nowPlayingMap["xesam:artist"].toString() + " - " + nowPlaying;
+    }
+    NetworkPackage np(PACKAGE_TYPE_MPRIS);
+    np.set("nowPlaying",nowPlaying);
+    sendPackage(np);
+}
diff --git a/daemon/packageinterfaces/mpriscontrolpackageinterface.h b/daemon/packageinterfaces/mpriscontrolpackageinterface.h
index 02d8eec..1f1ebe1 100644
--- a/daemon/packageinterfaces/mpriscontrolpackageinterface.h
+++ b/daemon/packageinterfaces/mpriscontrolpackageinterface.h
@@ -25,14 +25,29 @@
 
 #include <QSet>
 #include <QString>
+#include <QHash>
+#include <QDBusArgument>
 
 class MprisControlPackageInterface
     : public PackageInterface
 {
+    Q_OBJECT
+
 public:
     MprisControlPackageInterface();
     virtual bool receivePackage(const Device& device, const NetworkPackage& np);
 
+public Q_SLOTS:
+    void serviceOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner);
+
+private:
+    QHash<QString, QString> playerList;
+    void addPlayer(const QString& ifaceName);
+    void removePlayer(const QString& ifaceName);
+    void sendPlayerList();
+    void sendNowPlaying(const QDBusInterface& interface);
+
+
 };
 
 #endif

-- 
kdeconnect packaging



More information about the pkg-kde-commits mailing list