diff --git a/solid/solid/CMakeLists.txt b/solid/solid/CMakeLists.txt index a7f1f07..c2099dc 100644 --- a/solid/solid/CMakeLists.txt +++ b/solid/solid/CMakeLists.txt @@ -287,6 +287,15 @@ if(NOT WIN32 AND NOT APPLE) backends/upower/upowergenericinterface.cpp ) + message(STATUS "Building Solid PhonePower backend." ) + set(solid_LIB_SRCS ${solid_LIB_SRCS} + backends/phonepower/phonepowermanager.cpp + backends/phonepower/phonepowerdevice.cpp + backends/phonepower/phonepowerbattery.cpp + backends/phonepower/phonepowerdeviceinterface.cpp + backends/phonepower/kdeconnectinterface.cpp + ) + # FIXME: this should work on more Unix systems if (CMAKE_SYSTEM_NAME MATCHES Linux) diff --git a/solid/solid/backends/phonepower/kdeconnectinterface.cpp b/solid/solid/backends/phonepower/kdeconnectinterface.cpp new file mode 100644 index 0000000..8b7f519 --- /dev/null +++ b/solid/solid/backends/phonepower/kdeconnectinterface.cpp @@ -0,0 +1,28 @@ +/* + * This file was generated by qdbusxml2cpp version 0.7 + * Command line was: qdbusxml2cpp -m -p daemoninterface /home/vaka/kde4/build/kdeconnect-kded/daemon/org.kde.kdeconnect.daemon.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. + */ + +#include "kdeconnectinterface.h" + +/* + * Implementation of interface class OrgKdeKdeconnectDaemonInterface + */ + +OrgKdeKdeconnectDaemonInterface::OrgKdeKdeconnectDaemonInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgKdeKdeconnectDaemonInterface::~OrgKdeKdeconnectDaemonInterface() +{ +} + + +#include "kdeconnectinterface.moc" diff --git a/solid/solid/backends/phonepower/kdeconnectinterface.h b/solid/solid/backends/phonepower/kdeconnectinterface.h new file mode 100644 index 0000000..e813c4c --- /dev/null +++ b/solid/solid/backends/phonepower/kdeconnectinterface.h @@ -0,0 +1,77 @@ +/* + * This file was generated by qdbusxml2cpp version 0.7 + * Command line was: qdbusxml2cpp -m -p daemoninterface /home/vaka/kde4/build/kdeconnect-kded/daemon/org.kde.kdeconnect.daemon.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. + */ + +#ifndef DAEMONINTERFACE_H_1376408992 +#define DAEMONINTERFACE_H_1376408992 + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface org.kde.kdeconnect.daemon + */ +class OrgKdeKdeconnectDaemonInterface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.kde.kdeconnect.daemon"; } + +public: + OrgKdeKdeconnectDaemonInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + + ~OrgKdeKdeconnectDaemonInterface(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply devices() + { + QList argumentList; + return asyncCallWithArgumentList(QLatin1String("devices"), argumentList); + } + + inline QDBusPendingReply<> forceOnNetworkChange() + { + QList argumentList; + return asyncCallWithArgumentList(QLatin1String("forceOnNetworkChange"), argumentList); + } + + inline QDBusPendingReply<> setDiscoveryEnabled(bool b) + { + QList argumentList; + argumentList << QVariant::fromValue(b); + return asyncCallWithArgumentList(QLatin1String("setDiscoveryEnabled"), argumentList); + } + + inline QDBusPendingReply visibleDevices() + { + QList argumentList; + return asyncCallWithArgumentList(QLatin1String("visibleDevices"), argumentList); + } + +Q_SIGNALS: // SIGNALS + void deviceAdded(const QString &id); + void deviceRemoved(const QString &id); + void deviceVisibilityChanged(const QString &id, bool isVisible); +}; + +namespace org { + namespace kde { + namespace kdeconnect { + typedef ::OrgKdeKdeconnectDaemonInterface daemon; + } + } +} +#endif diff --git a/solid/solid/backends/phonepower/phonepowerbattery.cpp b/solid/solid/backends/phonepower/phonepowerbattery.cpp new file mode 100644 index 0000000..c5c4d87 --- /dev/null +++ b/solid/solid/backends/phonepower/phonepowerbattery.cpp @@ -0,0 +1,98 @@ +/* + Copyright 2013 Albert Vaca + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), which shall + act as a proxy defined in Section 6 of version 3 of the license. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . +*/ + +#include "phonepowerbattery.h" + +#include + +using namespace Solid::Backends::PhonePower; + +Battery::Battery(PhonePowerDevice *device) + : DeviceInterface(device) + , m_chargePercent(0) + , m_chargeState(Solid::Battery::NoCharge) + , mDevice(device) +{ + connect(device, SIGNAL(changed()), this, SLOT(slotChanged())); +} + +Battery::~Battery() +{ +} + +bool Battery::isPlugged() const +{ + return true; +} + +Solid::Battery::BatteryType Battery::type() const +{ + return Solid::Battery::PhoneBattery; +} + +int Battery::chargePercent() const +{ + m_chargePercent = mDevice->chargePercent(); + return m_chargePercent; +} + +int Battery::capacity() const +{ + return 100; +} + +bool Battery::isRechargeable() const +{ + return true; +} + +bool Battery::isPowerSupply() const +{ + return false; +} + +Solid::Battery::ChargeState Battery::chargeState() const +{ + m_chargeState = mDevice->chargeState(); + return m_chargeState; +} + +void Battery::slotChanged() +{ + + if (!mDevice) { + return; + } + + if (m_chargePercent != mDevice->chargePercent()) { + m_chargePercent = mDevice->chargePercent(); + qDebug() << "Percentage has changed: " << m_chargePercent << mDevice->udi(); + Q_EMIT chargePercentChanged(m_chargePercent, mDevice->udi()); + } + + if (m_chargeState != mDevice->chargeState()) { + m_chargeState = mDevice->chargeState(); + qDebug() << "State has changed: " << m_chargeState << mDevice->udi(); + Q_EMIT chargeStateChanged(m_chargeState, mDevice->udi()); + } + +} + +#include "backends/phonepower/phonepowerbattery.moc" diff --git a/solid/solid/backends/phonepower/phonepowerbattery.h b/solid/solid/backends/phonepower/phonepowerbattery.h new file mode 100644 index 0000000..c279df5 --- /dev/null +++ b/solid/solid/backends/phonepower/phonepowerbattery.h @@ -0,0 +1,73 @@ +/* + Copyright 2013 Albert Vaca + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), which shall + act as a proxy defined in Section 6 of version 3 of the license. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . +*/ + +#ifndef SOLID_BACKENDS_PHONEPOWER_BATTERY_H +#define SOLID_BACKENDS_PHONEPOWER_BATTERY_H + +#include +#include "phonepowerdevice.h" +#include "phonepowerdeviceinterface.h" + +namespace Solid +{ +namespace Backends +{ +namespace PhonePower +{ +class Battery : public DeviceInterface, virtual public Solid::Ifaces::Battery +{ + Q_OBJECT + Q_INTERFACES(Solid::Ifaces::Battery) + +public: + Battery(PhonePowerDevice *device); + virtual ~Battery(); + + virtual bool isPlugged() const; + virtual Solid::Battery::BatteryType type() const; + + virtual int chargePercent() const; + virtual int capacity() const; + + virtual bool isRechargeable() const; + virtual bool isPowerSupply() const; + + virtual Solid::Battery::ChargeState chargeState() const; + +Q_SIGNALS: + void chargePercentChanged(int value, const QString &udi); + void capacityChanged(int value, const QString &udi); + void chargeStateChanged(int newState, const QString &udi); + void plugStateChanged(bool newState, const QString &udi); + void powerSupplyStateChanged(bool newState, const QString &udi); + +private Q_SLOTS: + void slotChanged(); + +private: + mutable int m_chargePercent; + mutable Solid::Battery::ChargeState m_chargeState; + PhonePowerDevice *mDevice; +}; +} +} +} + +#endif // SOLID_BACKENDS_PHONEPOWER_BATTERY_H diff --git a/solid/solid/backends/phonepower/phonepowerdevice.cpp b/solid/solid/backends/phonepower/phonepowerdevice.cpp new file mode 100644 index 0000000..8a15168 --- /dev/null +++ b/solid/solid/backends/phonepower/phonepowerdevice.cpp @@ -0,0 +1,141 @@ +/* + Copyright 2013 Albert Vaca + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), which shall + act as a proxy defined in Section 6 of version 3 of the license. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . +*/ + +#include "phonepowerdevice.h" +#include "phonepowerdeviceinterface.h" +#include "phonepowerbattery.h" + +#include +#include + +#include +#include +#include + +using namespace Solid::Backends::PhonePower; + +PhonePowerDevice::PhonePowerDevice(const QString &udi, const QString &id) + : Solid::Ifaces::Device() + , m_device("org.kde.kdeconnect", + "/modules/kdeconnect/devices/"+id, + "org.kde.kdeconnect.device", + QDBusConnection::sessionBus()) + , m_battery("org.kde.kdeconnect", + "/modules/kdeconnect/devices/"+id, + "org.kde.kdeconnect.device.battery", + QDBusConnection::sessionBus()) + , m_udi(udi) +{ + qDebug() << "/modules/kdeconnect/devices/"+id; + + if (m_battery.isValid()) + connect(&m_battery, SIGNAL(chargingChange()), this, SLOT(slotChanged())); +} + +PhonePowerDevice::~PhonePowerDevice() +{ +} + +QObject* PhonePowerDevice::createDeviceInterface(const Solid::DeviceInterface::Type& type) +{ + if (!queryDeviceInterface(type)) { + return 0; + } + + DeviceInterface *iface = 0; + switch (type) + { + case Solid::DeviceInterface::Battery: + iface = new Battery(this); + break; + default: + break; + } + return iface; +} + +bool PhonePowerDevice::queryDeviceInterface(const Solid::DeviceInterface::Type& type) const +{ + switch(type) { + case Solid::DeviceInterface::Battery: + return true; + default: + return false; + } +} + +QStringList PhonePowerDevice::emblems() const +{ + return QStringList(); +} + +QString PhonePowerDevice::description() const +{ + return QObject::tr("%1 Battery", "%1 is battery technology").arg(batteryTechnology()); +} + +QString PhonePowerDevice::batteryTechnology() const +{ + return QLatin1String("Android"); +} + +QString PhonePowerDevice::icon() const +{ + return "pda"; +} + +QString PhonePowerDevice::product() const +{ + return m_device.property("name").toString(); +} + +QString PhonePowerDevice::vendor() const +{ + return QLatin1String("Android"); +} + +QString PhonePowerDevice::udi() const +{ + return m_udi; +} + +QString PhonePowerDevice::parentUdi() const +{ + return QLatin1String("/org/kde/kdeconnect"); +} + +int PhonePowerDevice::chargePercent() +{ + return m_battery.property("charge").toInt(); +} + +Solid::Battery::ChargeState PhonePowerDevice::chargeState() +{ + bool charging = m_battery.property("isCharging").toBool(); + if (charging) return Solid::Battery::Charging; + else return Solid::Battery::NoCharge; + //TODO: return Solid::Battery::Discharging; +} + +void PhonePowerDevice::slotChanged() +{ + qDebug() << "charge information changed" << m_udi; + emit changed(); +} \ No newline at end of file diff --git a/solid/solid/backends/phonepower/phonepowerdevice.h b/solid/solid/backends/phonepower/phonepowerdevice.h new file mode 100644 index 0000000..96e352e --- /dev/null +++ b/solid/solid/backends/phonepower/phonepowerdevice.h @@ -0,0 +1,76 @@ +/* + Copyright 2013 Albert Vaca + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), which shall + act as a proxy defined in Section 6 of version 3 of the license. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + +*/ + +#ifndef PHONEPOWERDEVICE_H +#define PHONEPOWERDEVICE_H + +#include +#include +#include + +#include +#include + +namespace Solid +{ +namespace Backends +{ +namespace PhonePower +{ + +class PhonePowerDevice : public Solid::Ifaces::Device +{ + Q_OBJECT +public: + PhonePowerDevice(const QString &udi, const QString &di); + virtual ~PhonePowerDevice(); + + virtual QObject* createDeviceInterface(const Solid::DeviceInterface::Type& type); + virtual bool queryDeviceInterface(const Solid::DeviceInterface::Type& type) const; + virtual QString description() const; + virtual QStringList emblems() const; + virtual QString icon() const; + virtual QString product() const; + virtual QString vendor() const; + virtual QString udi() const; + virtual QString parentUdi() const; + Solid::Battery::ChargeState chargeState(); + int chargePercent(); + +Q_SIGNALS: + void changed(); + +private Q_SLOTS: + void slotChanged(); + +private: + QString batteryTechnology() const; + mutable QDBusInterface m_device; + mutable QDBusInterface m_battery; + QString m_udi; + +}; + +} +} +} + +#endif // PHONEPOWERDEVICE_H diff --git a/solid/solid/backends/phonepower/phonepowerdeviceinterface.cpp b/solid/solid/backends/phonepower/phonepowerdeviceinterface.cpp new file mode 100644 index 0000000..23ce11c --- /dev/null +++ b/solid/solid/backends/phonepower/phonepowerdeviceinterface.cpp @@ -0,0 +1,33 @@ +/* + Copyright 2013 Albert Vaca + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), which shall + act as a proxy defined in Section 6 of version 3 of the license. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . +*/ + +#include "phonepowerdeviceinterface.h" + +using namespace Solid::Backends::PhonePower; + +DeviceInterface::DeviceInterface(PhonePowerDevice *device) + : QObject(device), m_device(device) +{ + +} + +DeviceInterface::~DeviceInterface() +{ +} diff --git a/solid/solid/backends/phonepower/phonepowerdeviceinterface.h b/solid/solid/backends/phonepower/phonepowerdeviceinterface.h new file mode 100644 index 0000000..85bac01 --- /dev/null +++ b/solid/solid/backends/phonepower/phonepowerdeviceinterface.h @@ -0,0 +1,56 @@ +/* + Copyright 2013 Albert Vaca + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), which shall + act as a proxy defined in Section 6 of version 3 of the license. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + +*/ + +#ifndef PHONEPOWERDEVICEINTERFACE_H +#define PHONEPOWERDEVICEINTERFACE_H + +#include +#include "phonepowerdevice.h" + +#include +#include +#include + +namespace Solid +{ +namespace Backends +{ +namespace PhonePower +{ + +class DeviceInterface : public QObject, virtual public Solid::Ifaces::DeviceInterface +{ + Q_OBJECT + Q_INTERFACES(Solid::Ifaces::DeviceInterface) +public: + DeviceInterface(PhonePowerDevice *device); + virtual ~DeviceInterface(); + +protected: + QWeakPointer m_device; + +}; + +} +} +} + +#endif // PHONEPOWERDEVICEINTERFACE_H diff --git a/solid/solid/backends/phonepower/phonepowermanager.cpp b/solid/solid/backends/phonepower/phonepowermanager.cpp new file mode 100644 index 0000000..a0333d0 --- /dev/null +++ b/solid/solid/backends/phonepower/phonepowermanager.cpp @@ -0,0 +1,238 @@ +/* + Copyright 2013 Albert Vaca + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), which shall + act as a proxy defined in Section 6 of version 3 of the license. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . +*/ + +#include "phonepowermanager.h" +#include "phonepowerdevice.h" + +#include +#include +#include +#include +#include + +#include "../shared/rootdevice.h" + +using namespace Solid::Backends::PhonePower; +using namespace Solid::Backends::Shared; + +PhonePowerManager::PhonePowerManager(QObject *parent) + : Solid::Ifaces::DeviceManager(parent) + , m_manager("org.kde.kdeconnect", + "/modules/kdeconnect", + QDBusConnection::sessionBus()) + , m_ready(false) +{ + m_supportedInterfaces << Solid::DeviceInterface::Battery; + + + QDBusServiceWatcher* watcher = new QDBusServiceWatcher("org.kde.kdeconnect", QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange, this); + connect(watcher, SIGNAL(serviceRegistered(QString)), this, SLOT(serviceReady())); + connect(watcher, SIGNAL(serviceUnregistered(QString)), this, SLOT(serviceUnregistered())); + + QDBusPendingCall msg = m_manager.asyncCall("visibleDevices"); + msg.waitForFinished(); + if (msg.isValid()) { + serviceReady(); + } + +} + +void PhonePowerManager::serviceReady() +{ + + QDBusPendingReply pendingDeviceList = m_manager.visibleDevices(); + pendingDeviceList.waitForFinished(); + if (!pendingDeviceList.isValid() || pendingDeviceList.isError()) { + return; + } + QStringList deviceList = pendingDeviceList.value(); + + Q_FOREACH(const QString& device, deviceList) { + slotDeviceAdded(device); + } + + connect(&m_manager, SIGNAL(deviceVisibilityChanged(QString, bool)), + this, SLOT(deviceVisibilityChanged(QString,bool))); + + m_ready = true; +} + +void PhonePowerManager::serviceUnregistered() +{ + m_ready = false; + Q_FOREACH(const QString& device, m_devices) { + slotDeviceRemoved(device); + } + m_devices.clear(); + + disconnect(&m_manager, SIGNAL(deviceVisibilityChanged(QString, bool)), + this, SLOT(deviceVisibilityChanged(QString,bool))); + +} + +void PhonePowerManager::deviceVisibilityChanged(const QString& id, bool visible) +{ + if (visible) + slotDeviceAdded(id); + else + slotDeviceRemoved(id); +} + +PhonePowerManager::~PhonePowerManager() +{ + +} + +QObject* PhonePowerManager::createDevice(const QString& udi) +{ + if (!m_ready) return 0; + + QString connectId = udi.mid(udiPrefix().count() + 1); + qDebug() << "createDevice" << udi << connectId; + if (udi == udiPrefix()) { + + RootDevice *root = new RootDevice(udiPrefix()); + + root->setProduct(tr("Power Management")); + root->setDescription(tr("Batteries and other sources of power")); + root->setIcon("preferences-system-power-management"); + + return root; + + } else if (m_devices.contains(connectId)) { + return new PhonePowerDevice(udi, connectId); + } else { + return 0; + } +} + +QStringList PhonePowerManager::devicesFromQuery(const QString& parentUdi, Solid::DeviceInterface::Type type) +{ + if (!m_ready) { + return QStringList(); + } + + if (type != Solid::DeviceInterface::Battery) + { + return QStringList(); + } + + if (!parentUdi.isEmpty() && parentUdi != udiPrefix()) + { + return QStringList(); + } + + return allDevices(); + +} + +QStringList PhonePowerManager::allDevices() +{ + if (!m_ready) { + return QStringList(); + } + + QStringList udiList; + Q_FOREACH(const QString& device, m_devices) { + udiList.append(udiPrefix()+"/"+device); + } + + return udiList; +} + +QSet< Solid::DeviceInterface::Type > PhonePowerManager::supportedInterfaces() const +{ + return m_supportedInterfaces; +} + +QString PhonePowerManager::udiPrefix() const +{ + return QLatin1String("/org/kde/kdeconnect"); +} + +void PhonePowerManager::slotDeviceAdded(const QString &id) +{ + + qDebug() << "slotDeviceAdded" << id; + + if (id.isEmpty() || m_devices.contains(id)) { + return; + } + + //Test if device has battery support! + QDBusInterface* device = new QDBusInterface("org.kde.kdeconnect", "/modules/kdeconnect/devices/"+id, "org.kde.kdeconnect.device", QDBusConnection::sessionBus(), this); + QDBusPendingReply reply = device->asyncCallWithArgumentList("hasPlugin",QVariantList() << QVariant("kdeconnect_battery")); + reply.waitForFinished(); + if (!reply.isValid()) { + return; + } + + bool hasBattery = reply.value(); + + qDebug() << "HasBattery:" << hasBattery; + + if (hasBattery) { + m_devices.insert(id); + Q_EMIT deviceAdded(udiPrefix()+"/"+id); + device->deleteLater(); + } else { + connect(device, SIGNAL(pluginsChanged()), + this, SLOT(pluginsChanged())); + } + +} + +void PhonePowerManager::pluginsChanged() +{ + QDBusInterface* device = (QDBusInterface*)sender(); + + disconnect(device, SIGNAL(pluginsChanged()), + this, SLOT(pluginsChanged())); + + QVariant id = device->property("id"); + if (id.isValid()) { + qDebug() << "PluginsChanged" << id.toString(); + QDBusInterface* device = new QDBusInterface("org.kde.kdeconnect", "/modules/kdeconnect/devices/"+id.toString(), "org.kde.kdeconnect.device", QDBusConnection::sessionBus(), this); + if (!device->isValid()) return; + QDBusPendingReply reply = device->asyncCallWithArgumentList("hasPlugin",QVariantList() << QVariant("kdeconnect_battery")); + reply.waitForFinished(); + if (!reply.isValid() || !reply.value()) { + slotDeviceRemoved(id.toString()); + } else { + slotDeviceAdded(id.toString()); + } + + //device->deleteLater(); + } + +} + +void PhonePowerManager::slotDeviceRemoved(const QString &id) +{ + qDebug() << "slotDeviceRemoved" << id; + if (!m_devices.contains(id)) { + return; + } + + m_devices.remove(id); + Q_EMIT deviceRemoved(id); +} + +#include "backends/phonepower/phonepowermanager.moc" diff --git a/solid/solid/backends/phonepower/phonepowermanager.h b/solid/solid/backends/phonepower/phonepowermanager.h new file mode 100644 index 0000000..2722899 --- /dev/null +++ b/solid/solid/backends/phonepower/phonepowermanager.h @@ -0,0 +1,73 @@ +/* + Copyright 2013 Albert Vaca + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), which shall + act as a proxy defined in Section 6 of version 3 of the license. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + +*/ + +#ifndef PHONEPOWERMANAGER_H +#define PHONEPOWERMANAGER_H + +#include "solid/ifaces/devicemanager.h" + +#include +#include + +#include "kdeconnectinterface.h" + +namespace Solid +{ +namespace Backends +{ +namespace PhonePower +{ + +class PhonePowerDevice; + +class PhonePowerManager : public Solid::Ifaces::DeviceManager +{ + Q_OBJECT + +public: + PhonePowerManager(QObject *parent); + virtual ~PhonePowerManager(); + virtual QObject* createDevice(const QString& udi); + virtual QStringList devicesFromQuery(const QString& parentUdi, Solid::DeviceInterface::Type type); + virtual QStringList allDevices(); + virtual QSet< Solid::DeviceInterface::Type > supportedInterfaces() const; + virtual QString udiPrefix() const; + +private Q_SLOTS: + void serviceReady(); + void serviceUnregistered(); + void deviceVisibilityChanged(const QString& id ,bool visible); + void slotDeviceAdded(const QString &opath); + void slotDeviceRemoved(const QString &opath); + void pluginsChanged(); + +private: + QSet m_supportedInterfaces; + QSet m_devices; + OrgKdeKdeconnectDaemonInterface m_manager; + bool m_ready; + +}; + +} +} +} +#endif // PHONEPOWERMANAGER_H diff --git a/solid/solid/managerbase.cpp b/solid/solid/managerbase.cpp index 6649972..96d66ac 100644 --- a/solid/solid/managerbase.cpp +++ b/solid/solid/managerbase.cpp @@ -47,6 +47,7 @@ #endif #include "backends/fstab/fstabmanager.h" +#include "backends/phonepower/phonepowermanager.h" #elif defined (Q_WS_WIN) && !defined(_WIN32_WCE) #include "backends/win/windevicemanager.h" @@ -99,6 +100,7 @@ void Solid::ManagerBasePrivate::loadBackends() << new Solid::Backends::UPower::UPowerManager(0) << new Solid::Backends::Fstab::FstabManager(0); } + m_backends << new Solid::Backends::PhonePower::PhonePowerManager(0); # endif # if defined (HUPNP_FOUND)