--- /dev/null
+#include "ddbussender.h"
--- /dev/null
+#include "ddbussender.h"
+
+#include <QDBusInterface>
+#include <QDebug>
+
+DDBusSender::DDBusSender()
+ : m_dbusData(std::make_shared<DDBusData>())
+{
+}
+
+DDBusSender DDBusSender::service(const QString &service)
+{
+ m_dbusData->service = service;
+
+ return *this;
+}
+
+DDBusSender DDBusSender::interface(const QString &interface)
+{
+ m_dbusData->interface = interface;
+
+ return *this;
+}
+
+DDBusCaller DDBusSender::method(const QString &method)
+{
+ return DDBusCaller(method, m_dbusData);
+}
+
+DDBusProperty DDBusSender::property(const QString &property)
+{
+ return DDBusProperty(property, m_dbusData);
+}
+
+DDBusSender DDBusSender::path(const QString &path)
+{
+ m_dbusData->path = path;
+
+ return *this;
+}
+
+DDBusSender DDBusSender::type(const QDBusConnection::BusType busType)
+{
+ switch (busType)
+ {
+ case QDBusConnection::SessionBus:
+ m_dbusData->connection = QDBusConnection::sessionBus();
+ break;
+
+ case QDBusConnection::SystemBus:
+ m_dbusData->connection = QDBusConnection::systemBus();
+ break;
+
+ default:
+ Q_UNREACHABLE_IMPL();
+ }
+
+ return *this;
+}
+
+DDBusData::DDBusData()
+ : connection(QDBusConnection::sessionBus())
+{
+
+}
+
+QDBusPendingCall DDBusCaller::call()
+{
+ QDBusInterface iface(m_dbusData->service, m_dbusData->path, m_dbusData->interface, m_dbusData->connection);
+
+ return iface.asyncCallWithArgumentList(m_methodName, m_arguments);
+}
+
+DDBusCaller::DDBusCaller(const QString &method, std::shared_ptr<DDBusData> data)
+ : m_dbusData(data)
+ , m_methodName(method)
+{
+}
+
+QDBusPendingCall DDBusProperty::get()
+{
+ QDBusInterface iface(m_dbusData->service, m_dbusData->path, QStringLiteral("org.freedesktop.DBus.Properties"), m_dbusData->connection);
+
+ return iface.asyncCallWithArgumentList(QStringLiteral("Get"), { QVariant::fromValue(m_dbusData->interface), QVariant::fromValue(m_propertyName) });
+}
+
+DDBusProperty::DDBusProperty(const QString &property, std::shared_ptr<DDBusData> data)
+ : m_dbusData(data)
+ , m_propertyName(property)
+{
+}
--- /dev/null
+#ifndef DDBUSSENDER_H
+#define DDBUSSENDER_H
+
+#include <QObject>
+#include <QDBusConnection>
+#include <QDBusPendingCall>
+#include <QDBusInterface>
+
+#include <memory>
+
+class DDBusData
+{
+public:
+ DDBusData();
+
+ QString service;
+ QString path;
+ QString interface;
+ QString queryName;
+ QDBusConnection connection;
+};
+
+class DDBusCaller
+{
+ friend class DDBusSender;
+
+public:
+ QDBusPendingCall call();
+
+ template <typename T>
+ DDBusCaller arg(const T &argument);
+
+private:
+ explicit DDBusCaller(const QString &method, std::shared_ptr<DDBusData> data);
+
+private:
+ std::shared_ptr<DDBusData> m_dbusData;
+ QString m_methodName;
+ QVariantList m_arguments;
+};
+
+template <typename T>
+DDBusCaller DDBusCaller::arg(const T &argument)
+{
+ m_arguments << QVariant::fromValue(argument);
+
+ return *this;
+}
+
+class DDBusProperty
+{
+ friend class DDBusSender;
+
+public:
+ QDBusPendingCall get();
+ template <typename T>
+ QDBusPendingCall set(const T &value);
+
+private:
+ explicit DDBusProperty(const QString &property, std::shared_ptr<DDBusData> data);
+
+private:
+ std::shared_ptr<DDBusData> m_dbusData;
+ QString m_propertyName;
+};
+
+template <typename T>
+QDBusPendingCall DDBusProperty::set(const T &value)
+{
+ QDBusInterface iface(m_dbusData->service, m_dbusData->path, QStringLiteral("org.freedesktop.DBus.Properties"), m_dbusData->connection);
+
+ const QVariantList args = { QVariant::fromValue(m_dbusData->interface), QVariant::fromValue(m_propertyName), QVariant::fromValue(QDBusVariant(value)) };
+
+ return iface.asyncCallWithArgumentList(QStringLiteral("Set"), args);
+}
+
+class DDBusSender
+{
+public:
+ explicit DDBusSender();
+
+ DDBusSender service(const QString &service);
+ DDBusSender interface(const QString &interface);
+ DDBusSender path(const QString &path);
+ DDBusCaller method(const QString &method);
+ DDBusProperty property(const QString &property);
+
+private:
+ DDBusSender type(const QDBusConnection::BusType busType);
+
+private:
+ std::shared_ptr<DDBusData> m_dbusData;
+};
+
+#endif // DDBUSSENDER_H
$$PWD/dpinyin.h \
$$PWD/dtimeunitformatter.h \
$$PWD/dabstractunitformatter.h \
- $$PWD/ddisksizeformatter.h
+ $$PWD/ddisksizeformatter.h \
+ $$PWD/ddbussender.h
includes.files += $$PWD/*.h
includes.files += \
SOURCES += \
$$PWD/dtimeunitformatter.cpp \
$$PWD/dabstractunitformatter.cpp \
- $$PWD/ddisksizeformatter.cpp
+ $$PWD/ddisksizeformatter.cpp \
+ $$PWD/ddbussender.cpp
#include <QtTest/QtTest>
#include <QStandardPaths>
#include <QThread>
+#include <QDBusPendingCall>
+#include <QDBusReply>
#include "log/LogManager.h"
#include "filesystem/dpathbuf.h"
#include "singletontester.h"
#include "util/dtimeunitformatter.h"
#include "util/ddisksizeformatter.h"
+#include "util/ddbussender.h"
#include "settings/dsettings.h"
#include "settings/dsettingsgroup.h"
#include "settings/dsettingsoption.h"
Q_ASSERT(qFuzzyCompare(0.09094947017729282, d2));
}
+void TestDUtil::testDBusSender()
+{
+ // basic method call
+ DDBusSender()
+ .service("com.deepin.dde.ControlCenter")
+ .interface("com.deepin.dde.ControlCenter")
+ .path("/com/deepin/dde/ControlCenter")
+ .method("ShowPage")
+ .arg(QString("update"))
+ .arg(QString("available-updates"))
+ .call();
+
+ // property set
+ QDBusPendingReply<> r1 = DDBusSender()
+ .service("com.deepin.dde.daemon.Dock")
+ .interface("com.deepin.dde.daemon.Dock")
+ .path("/com/deepin/dde/daemon/Dock")
+ .property("DisplayMode")
+ .set(1); // set to efficient mode
+
+ // property get
+ QDBusPendingReply<QVariant> r2 = DDBusSender()
+ .service("com.deepin.dde.daemon.Dock")
+ .interface("com.deepin.dde.daemon.Dock")
+ .path("/com/deepin/dde/daemon/Dock")
+ .property("DisplayMode")
+ .get(); // read mode
+
+ if (!r2.isError() && !r1.isError())
+ Q_ASSERT(r2.value().toInt() == 1);
+
+ // complex type property get
+ QDBusPendingReply<QVariant> r3 = DDBusSender()
+ .service("com.deepin.dde.ControlCenter")
+ .interface("com.deepin.dde.ControlCenter")
+ .path("/com/deepin/dde/ControlCenter")
+ .property("Rect")
+ .get();
+
+ QVariant variant = r3.value();
+ const QDBusArgument v = variant.value<QDBusArgument>();
+
+ int x, y, w, h;
+ v.beginStructure();
+ v >> x >> y >> w >> h;
+ v.endStructure();
+
+ qDebug() << x << y << w << h;
+}
+
void TestDUtil::testGroups()
{
auto path = ":/data/dt-settings.json";
void testDiskFormatter();
void testDiskFormatterList();
void testDiskFormatter1024();
+ void testDBusSender();
void testGroups();
};
-QT += testlib
+QT += testlib dbus
QT -= gui
TEMPLATE = app