Revision control

Copy as Markdown

// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QString>
#include <QDBusArgument>
#include <QDBusMetaType>
#include <QDBusMessage>
#include <QDBusContext>
typedef QDBusVariant MyElement;
typedef QList<MyElement> MyArray;
typedef QHash<int, MyElement> MyDictionary;
typedef QDBusVariant MyType;
typedef QDBusVariant MyValue;
typedef QDBusVariant Type;
QDBusArgument argument;
class MyObject: public QObject
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.qtproject.QtDBus.MyObject")
Q_CLASSINFO("D-Bus Introspection", ""
" <interface name=\"org.qtproject.QtDBus.MyObject\" >\n"
" <property access=\"readwrite\" type=\"i\" name=\"prop1\" />\n"
" <property name=\"complexProp\" type=\"ai\" access=\"readwrite\">\n"
" <annotation name=\"org.qtproject.QtDBus.QtTypeName\" value=\"QList&lt;int&gt;\"/>\n"
" </property>\n"
" <signal name=\"somethingHappened\" >\n"
" <arg direction=\"out\" type=\"s\" />\n"
" </signal>\n"
" <method name=\"ping\" >\n"
" <arg direction=\"in\" type=\"v\" name=\"ping\" />\n"
" <arg direction=\"out\" type=\"v\" name=\"ping\" />\n"
" </method>\n"
" <method name=\"ping_invokable\" >\n"
" <arg direction=\"in\" type=\"v\" name=\"ping_invokable\" />\n"
" <arg direction=\"out\" type=\"v\" name=\"ping_invokable\" />\n"
" </method>\n"
" <method name=\"ping\" >\n"
" <arg direction=\"in\" type=\"v\" name=\"ping1\" />\n"
" <arg direction=\"in\" type=\"v\" name=\"ping2\" />\n"
" <arg direction=\"out\" type=\"v\" name=\"pong1\" />\n"
" <arg direction=\"out\" type=\"v\" name=\"pong2\" />\n"
" </method>\n"
" <method name=\"ping_invokable\" >\n"
" <arg direction=\"in\" type=\"v\" name=\"ping1_invokable\" />\n"
" <arg direction=\"in\" type=\"v\" name=\"ping2_invokable\" />\n"
" <arg direction=\"out\" type=\"v\" name=\"pong1_invokable\" />\n"
" <arg direction=\"out\" type=\"v\" name=\"pong2_invokable\" />\n"
" </method>\n"
" <method name=\"ping\" >\n"
" <arg direction=\"in\" type=\"ai\" name=\"ping\" />\n"
" <arg direction=\"out\" type=\"ai\" name=\"ping\" />\n"
" <annotation name=\"org.qtproject.QtDBus.QtTypeName.In0\" value=\"QList&lt;int&gt;\"/>\n"
" <annotation name=\"org.qtproject.QtDBus.QtTypeName.Out0\" value=\"QList&lt;int&gt;\"/>\n"
" </method>\n"
" <method name=\"ping_invokable\" >\n"
" <arg direction=\"in\" type=\"ai\" name=\"ping_invokable\" />\n"
" <arg direction=\"out\" type=\"ai\" name=\"ping_invokable\" />\n"
" <annotation name=\"org.qtproject.QtDBus.QtTypeName.In0\" value=\"QList&lt;int&gt;\"/>\n"
" <annotation name=\"org.qtproject.QtDBus.QtTypeName.Out0\" value=\"QList&lt;int&gt;\"/>\n"
" </method>\n"
" </interface>\n"
"")
Q_PROPERTY(int prop1 READ prop1 WRITE setProp1)
Q_PROPERTY(QList<int> complexProp READ complexProp WRITE setComplexProp)
public:
static int callCount;
static QVariantList callArgs;
MyObject()
{
QObject *subObject = new QObject(this);
subObject->setObjectName("subObject");
}
};
struct MyMember
{
int subMember1;
int subMember2;
};
//! [0-0]
struct MyStructure
{
int count;
QString name;
//! [0-0]
MyMember member1;
MyMember member2;
MyMember member3;
MyMember member4;
//! [0-1]
// ...
};
Q_DECLARE_METATYPE(MyStructure)
// Marshall the MyStructure data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const MyStructure &myStruct)
{
argument.beginStructure();
argument << myStruct.count << myStruct.name;
argument.endStructure();
return argument;
}
// Retrieve the MyStructure data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, MyStructure &myStruct)
{
argument.beginStructure();
argument >> myStruct.count >> myStruct.name;
argument.endStructure();
return argument;
}
//! [0-1]
const QDBusArgument &operator<<(const QDBusArgument &argument, const MyMember &/*member*/)
{
return argument;
}
const QDBusArgument &operator>>(const QDBusArgument &argument, const MyMember &/*member*/)
{
return argument;
}
void registerMyStructure()
{
//! [1]
qDBusRegisterMetaType<MyStructure>();
//! [1]
}
void castType()
{
QVariant argument = MyObject::callArgs.at(0);
QDBusVariant dv = qdbus_cast<QDBusVariant>(argument);
//! [2]
MyType item = qdbus_cast<Type>(argument);
//! [2]
}
void argumentItem()
{
//! [3]
MyType item;
argument >> item;
//! [3]
}
namespace QDBusSnippets
{
//! [4]
QDBusArgument &operator<<(QDBusArgument &argument, const MyStructure &myStruct)
{
argument.beginStructure();
argument << myStruct.member1 << myStruct.member2;
argument.endStructure();
return argument;
}
//! [4]
namespace Alt {
//! [5]
QDBusArgument &operator<<(QDBusArgument &argument, const MyStructure &myStruct)
{
argument.beginStructure();
argument << myStruct.member1 << myStruct.member2;
argument.beginStructure();
argument << myStruct.member3.subMember1 << myStruct.member3.subMember2;
argument.endStructure();
argument << myStruct.member4;
argument.endStructure();
return argument;
}
//! [5]
} // namespace
//! [6]
// Append an array of MyElement types
QDBusArgument &operator<<(QDBusArgument &argument, const MyArray &myArray)
{
argument.beginArray(qMetaTypeId<MyElement>());
for (const auto &element : myArray)
argument << element;
argument.endArray();
return argument;
}
//! [6]
//! [7]
// Append a dictionary that associates ints to MyValue types
QDBusArgument &operator<<(QDBusArgument &argument, const MyDictionary &myDict)
{
argument.beginMap(QMetaType::fromType<int>(), QMetaType::fromType<MyValue>());
MyDictionary::const_iterator i;
for (i = myDict.cbegin(); i != myDict.cend(); ++i) {
argument.beginMapEntry();
argument << i.key() << i.value();
argument.endMapEntry();
}
argument.endMap();
return argument;
}
//! [7]
//! [8]
const QDBusArgument &operator>>(const QDBusArgument &argument, MyStructure &myStruct)
{
argument.beginStructure();
argument >> myStruct.member1 >> myStruct.member2 >> myStruct.member3;
argument.endStructure();
return argument;
}
//! [8]
//! [9]
// Extract a MyArray array of MyElement elements
const QDBusArgument &operator>>(const QDBusArgument &argument, MyArray &myArray)
{
argument.beginArray();
myArray.clear();
while (!argument.atEnd()) {
MyElement element;
argument >> element;
myArray.append(element);
}
argument.endArray();
return argument;
}
//! [9]
//! [10]
// Extract a MyDictionary map that associates integers to MyElement items
const QDBusArgument &operator>>(const QDBusArgument &argument, MyDictionary &myDict)
{
argument.beginMap();
myDict.clear();
while (!argument.atEnd()) {
int key;
MyElement value;
argument.beginMapEntry();
argument >> key >> value;
argument.endMapEntry();
myDict.insert(key, value);
}
argument.endMap();
return argument;
}
//! [10]
}