7#include <QtCore/qbytearray.h>
8#include <QtCore/qhash.h>
9#include <QtCore/qstring.h>
10#include <QtCore/qvarlengtharray.h>
19#include <private/qmetaobject_p.h>
20#include <private/qmetaobjectbuilder_p.h>
68 const char *
direction =
"Out",
int id = -1);
72 void parseProperties();
74 static qsizetype aggregateParameterCount(
const MethodMap &
map);
106 nullptr,
nullptr,
nullptr,
nullptr,
107 nullptr,
nullptr,
nullptr,
108 nullptr,
nullptr,
nullptr
115 Q_CONSTINIT
static struct Hash :
QHash<QByteArray, QMetaType>
127 return metatype.
id();
132QDBusMetaObjectGenerator::Type
133QDBusMetaObjectGenerator::findType(
const QByteArray &signature,
151 auto annotation = annotations.
value(annotationName);
162 annotation = annotations.
value(annotationName);
163 typeName = annotation.value.toLatin1();
174 typeName =
"QDBusRawType<0x" + signature.toHex() +
">*";
183 if (signature ==
"av") {
184 result.name =
"QVariantList";
185 type = QMetaType::QVariantList;
186 }
else if (signature ==
"a{sv}") {
187 result.name =
"QVariantMap";
188 type = QMetaType::QVariantMap;
189 }
else if (signature ==
"a{ss}") {
190 result.name =
"QMap<QString,QString>";
191 type = qMetaTypeId<QMap<QString, QString> >();
192 }
else if (signature ==
"aay") {
193 result.name =
"QByteArrayList";
194 type = qMetaTypeId<QByteArrayList>();
196 result.name =
"{D-Bus type \"" + signature +
"\"}";
207void QDBusMetaObjectGenerator::parseMethods()
217 mm.name =
m.name.toLatin1();
227 Type type = findType(
arg.type.toLatin1(),
m.annotations,
"In",
i);
233 mm.inputTypes.append(
type.id);
235 mm.parameterNames.append(
arg.name.toLatin1());
246 Type type = findType(
arg.type.toLatin1(),
m.annotations,
"Out",
i);
252 mm.outputTypes.append(
type.id);
254 if (
i == 0 &&
type.id == -1) {
255 mm.rawReturnType =
type.name;
259 mm.parameterNames.append(
arg.name.toLatin1());
268 if (!mm.parameterNames.isEmpty())
269 prototype[prototype.
size() - 1] =
')';
275 mm.tag =
"Q_NOREPLY";
285void QDBusMetaObjectGenerator::parseSignals()
290 mm.name =
s.name.toLatin1();
300 Type type = findType(
arg.type.toLatin1(),
s.annotations,
"Out",
i);
306 mm.inputTypes.append(
type.id);
308 mm.parameterNames.append(
arg.name.toLatin1());
316 if (!mm.parameterNames.isEmpty())
317 prototype[prototype.
size() - 1] =
')';
329void QDBusMetaObjectGenerator::parseProperties()
333 Type type = findType(
p.type.toLatin1(),
p.annotations);
338 mp.signature =
p.type.toLatin1();
340 mp.typeName =
type.name;
357qsizetype QDBusMetaObjectGenerator::aggregateParameterCount(
const MethodMap &
map)
360 for (
const Method &
m :
map)
379 ((aggregateParameterCount(signals_)
380 + aggregateParameterCount(methods)) * 2)
388 header->classInfoCount = 0;
389 header->classInfoData = 0;
392 header->propertyCount = int(properties.
size());
395 header->enumeratorCount = 0;
396 header->enumeratorData = 0;
397 header->constructorCount = 0;
398 header->constructorData = 0;
411 std::array<std::reference_wrapper<const MethodMap>, 2> methodMaps = { signals_, methods };
413 for (
const auto &methodMap : methodMaps) {
414 for (
const Method &mm : methodMap.get())
415 data_size += 2 + mm.inputTypes.size() + mm.outputTypes.size();
417 idata.
resize(data_size + 1);
425 idata[typeidOffset++] = 0;
428 ++totalMetaTypeCount;
429 for (
const auto &methodMap : methodMaps) {
430 for (
const Method &mm : methodMap.get()) {
432 totalMetaTypeCount += argc + 1;
439 qsizetype currentMethodMetaTypeOffset = properties.
size() + 1;
441 for (
const auto &methodMap : methodMaps) {
442 for (
const Method &mm : methodMap.get()) {
447 idata[
offset++] = parametersOffset;
449 idata[
offset++] = mm.flags;
450 idata[
offset++] = currentMethodMetaTypeOffset;
457 if (!mm.outputTypes.isEmpty()) {
458 type = mm.outputTypes.first();
463 type = QMetaType::Void;
465 }
else if (
i < mm.inputTypes.size()) {
466 type = mm.inputTypes.at(
i);
468 Q_ASSERT(mm.outputTypes.size() > 1);
469 type = mm.outputTypes.at(
i - mm.inputTypes.size() + 1);
481 idata[parametersOffset++] = typeInfo;
485 idata[parametersOffset++] =
strings.enter(mm.parameterNames.at(
i));
487 idata[signatureOffset++] = typeidOffset;
488 idata[typeidOffset++] = mm.inputTypes.size();
489 memcpy(idata.
data() + typeidOffset, mm.inputTypes.data(), mm.inputTypes.size() *
sizeof(
uint));
490 typeidOffset += mm.inputTypes.size();
492 idata[signatureOffset++] = typeidOffset;
493 idata[typeidOffset++] = mm.outputTypes.size();
494 memcpy(idata.
data() + typeidOffset, mm.outputTypes.data(), mm.outputTypes.size() *
sizeof(
uint));
495 typeidOffset += mm.outputTypes.size();
503 offset += methodParametersDataSize;
507 signatureOffset =
header->propertyDBusData;
508 for (
const auto &[
name, mp] : std::as_const(properties).asKeyValueRange()) {
512 idata[
offset++] = mp.type;
513 idata[
offset++] = mp.flags;
517 idata[signatureOffset++] =
strings.enter(mp.signature);
518 idata[signatureOffset++] = mp.type;
520 metaTypes[propertyId++] =
QMetaType(mp.type);
527 char *string_data =
new char[
strings.blobSize()];
528 strings.writeBlob(string_data);
531 memcpy(uint_data, idata.
data(), idata.
size() *
sizeof(
uint));
534 obj->d.data = uint_data;
535 obj->d.relatedMetaObjects =
nullptr;
536 obj->d.static_metacall =
nullptr;
537 obj->d.extradata =
nullptr;
538 obj->d.stringdata =
reinterpret_cast<const uint *
>(string_data);
539 obj->d.superdata = &QDBusAbstractInterface::staticMetaObject;
548 tmp.replace(u
'.',
"::"_L1);
556 char *stringdata =
new char[
name.length() + 1];
557 stringdata[
name.length()] =
'\0';
560 d.relatedMetaObjects = 0;
561 d.static_metacall = 0;
563 d.stringdata = stringdata;
564 d.superdata = &QDBusAbstractInterface::staticMetaObject;
587 if (!
obj && (us || !
interface.startsWith(
"local."_L1 ))) {
593 if ((
obj->cached = !
it.key().startsWith(
"local."_L1)))
629 merged.
name =
"local.Merged"_L1;
641 "Interface '%1' was not found"_L1.arg(
interface));
645QDBusMetaObject::QDBusMetaObject()
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
QByteArray & append(char c)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static Interfaces parseInterfaces(const QString &xml, DiagnosticsReporter *reporter=nullptr)
Parses the XML document fragment (given by xml) containing several interfaces.
iterator insert(const Key &key, const T &value)
T value(const Key &key, const T &defaultValue=T()) const
const_iterator ConstIterator
const_iterator constBegin() const
const_iterator constEnd() const
QMultiMap & unite(const QMultiMap &other)
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
void clear()
Clears the contents of the string and makes it null.
QString arg(qlonglong a, int fieldwidth=0, int base=10, QChar fillChar=u' ') const
constexpr size_type size() const noexcept
void resize(qsizetype sz)
QHash< int, QWidget * > hash
[35multi]
QMap< QString, QString > map
[6]
QCache< int, Employee > cache
[0]
QSet< QString >::iterator it
Combined button and popup list for selecting options.
AudioChannelLayoutTag tag
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char * interface
DBusConnection const char DBusError * error
#define ANNOTATION_NO_WAIT
static QString header(const QString &name)
constexpr const T & qMax(const T &a, const T &b)
GLuint64 GLenum void * handle
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLsizei const GLchar ** strings
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
const char className[16]
[1]
QRandomGenerator generator(sseq)