46 int argType = arg.metaType().id();
48 if (argType == QMetaType::QStringList) {
50 const QStringList list = arg.toStringList();
51 for (
const QString &item : list)
52 out += u'\"' + item +
"\", "_L1;
56 }
else if (argType == QMetaType::QByteArray) {
58 QByteArray list = arg.toByteArray();
59 for (
int i = 0; i < list.size(); ++i) {
60 out += QString::number(list.at(i));
66 }
else if (argType == QMetaType::QVariantList) {
68 const QList<QVariant> list = arg.toList();
69 for (
const QVariant &item : list) {
70 if (!variantToString(item, out))
77 }
else if (argType == QMetaType::Char || argType == QMetaType::Short || argType == QMetaType::Int
78 || argType == QMetaType::Long || argType == QMetaType::LongLong) {
79 out += QString::number(arg.toLongLong());
80 }
else if (argType == QMetaType::UChar || argType == QMetaType::UShort || argType == QMetaType::UInt
81 || argType == QMetaType::ULong || argType == QMetaType::ULongLong) {
82 out += QString::number(arg.toULongLong());
83 }
else if (argType == QMetaType::Double) {
84 out += QString::number(arg.toDouble());
85 }
else if (argType == QMetaType::Bool) {
86 out += arg.toBool() ?
"true"_L1 :
"false"_L1;
89 }
else if (argType == qMetaTypeId<QDBusObjectPath>()) {
90 const QString path = qvariant_cast<QDBusObjectPath>(arg).path();
91 out +=
"[ObjectPath: "_L1;
94 }
else if (argType == qMetaTypeId<QDBusSignature>()) {
95 out +=
"[Signature: "_L1 + qvariant_cast<QDBusSignature>(arg).signature();
97 }
else if (argType == qMetaTypeId<QDBusUnixFileDescriptor>()) {
98 out +=
"[Unix FD: "_L1;
99 out += qvariant_cast<QDBusUnixFileDescriptor>(arg).isValid() ?
"valid"_L1 :
"not valid"_L1;
101 }
else if (argType == qMetaTypeId<QDBusVariant>()) {
102 const QVariant v = qvariant_cast<QDBusVariant>(arg).variant();
103 out +=
"[Variant"_L1;
104 QMetaType vUserType = v.metaType();
105 if (vUserType != QMetaType::fromType<QDBusVariant>()
106 && vUserType != QMetaType::fromType<QDBusSignature>()
107 && vUserType != QMetaType::fromType<QDBusObjectPath>()
108 && vUserType != QMetaType::fromType<QDBusArgument>())
109 out += u'(' + QLatin1StringView(v.typeName()) + u')';
111 if (!variantToString(v, out))
114 }
else if (arg.canConvert<QString>()) {
115 out += u'\"' + arg.toString() + u'\"';
118 out += QLatin1StringView(arg.typeName());
125bool argToString(
const QDBusArgument &busArg, QString &out)
127 QString busSig = busArg.currentSignature();
128 bool doIterate =
false;
129 QDBusArgument::ElementType elementType = busArg.currentType();
131 if (elementType != QDBusArgument::BasicType && elementType != QDBusArgument::VariantType
132 && elementType != QDBusArgument::MapEntryType)
133 out +=
"[Argument: "_L1 + busSig + u' ';
135 switch (elementType) {
136 case QDBusArgument::BasicType:
137 case QDBusArgument::VariantType:
138 if (!variantToString(busArg.asVariant(), out))
141 case QDBusArgument::StructureType:
142 busArg.beginStructure();
145 case QDBusArgument::ArrayType:
150 case QDBusArgument::MapType:
155 case QDBusArgument::MapEntryType:
156 busArg.beginMapEntry();
157 if (!variantToString(busArg.asVariant(), out))
160 if (!argToString(busArg, out))
162 busArg.endMapEntry();
164 case QDBusArgument::UnknownType:
166 out +=
"<ERROR - Unknown Type>"_L1;
169 if (doIterate && !busArg.atEnd()) {
170 while (!busArg.atEnd()) {
171 if (!argToString(busArg, out))
177 switch (elementType) {
178 case QDBusArgument::BasicType:
179 case QDBusArgument::VariantType:
180 case QDBusArgument::UnknownType:
181 case QDBusArgument::MapEntryType:
184 case QDBusArgument::StructureType:
185 busArg.endStructure();
187 case QDBusArgument::ArrayType:
191 case QDBusArgument::MapType:
197 if (elementType != QDBusArgument::BasicType && elementType != QDBusArgument::VariantType
198 && elementType != QDBusArgument::MapEntryType)
367 !connName.startsWith(u':'))
370 const auto parts = connName.mid(1).split(u'.');
371 if (parts.size() < 1)
374 for (QStringView part : parts) {
378 const QChar* c = part.data();
379 for (
int j = 0; j < part.size(); ++j)
380 if (!isValidCharacter(c[j]))
402 bool isValidBusName(
const QString &busName)
407 if (busName.startsWith(u':'))
408 return isValidUniqueConnectionName(busName);
410 const auto parts = QStringView{busName}.split(u'.');
411 if (parts.size() < 2)
413 for (QStringView part : parts) {
417 const QChar *c = part.data();
418 if (isValidNumber(c[0]))
420 for (
int j = 0; j < part.size(); ++j)
421 if (!isValidCharacter(c[j]))