65 parameterTypes.reserve(mm.arguments.size());
67 for (
const ArgumentDef &arg : mm.arguments)
68 parameterTypes.append(arg.normalizedType);
70 return qDBusParametersForMethod(parameterTypes, metaTypes, errorMsg);
82 QString xml = QString::asprintf(
" <%s name=\"%s\">\n",
83 isSignal ?
"signal" :
"method", mm.name.constData());
86 int typeId = QMetaType::fromName(mm.normalizedType).id();
87 const bool hasVoidReturn = typeId == QMetaType::Void;
90 const char *typeName = QDBusMetaType::typeToSignature(QMetaType(typeId));
92 xml += QString::fromLatin1(
" <arg type=\"%1\" direction=\"out\"/>\n")
93 .arg(typeNameToXml(typeName));
96 if (!QDBusMetaType::signatureToMetaType(typeName).isValid())
97 xml += QString::fromLatin1(
" <annotation name=\"org.qtproject.QtDBus.QtTypeName.Out0\" value=\"%1\"/>\n")
98 .arg(typeNameToXml(mm.normalizedType.constData()));
102 }
else if (!mm.normalizedType.isEmpty()) {
103 qWarning() <<
"Unregistered return type:" << mm.normalizedType.constData();
108 QList<QMetaType> types;
110 int inputCount = qDBusParametersForMethod(mm, types, errorMsg);
111 const int outputArgsStart = hasVoidReturn ? 0 : 1;
112 if (inputCount == -1) {
116 if (isSignal && inputCount + 1 != types.size())
118 if (isSignal && types.at(inputCount) == QDBusMetaTypeId::message())
122 for (qsizetype j = 1; j < types.size(); ++j) {
124 if (types.at(j) == QDBusMetaTypeId::message()) {
130 if (!names.at(j - 1).name.isEmpty())
131 name = QString::fromLatin1(
"name=\"%1\" ").arg(QString::fromLatin1(names.at(j - 1).name));
133 bool isOutput = isSignal || j > inputCount;
135 const char *signature = QDBusMetaType::typeToSignature(QMetaType(types.at(j)));
136 xml += QString::fromLatin1(
" <arg %1type=\"%2\" direction=\"%3\"/>\n")
138 QLatin1StringView(signature),
139 isOutput ?
"out"_L1 :
"in"_L1);
142 if (!QDBusMetaType::signatureToMetaType(signature).isValid()) {
143 const char *typeName = QMetaType(types.at(j)).name();
144 xml += QString::fromLatin1(
" <annotation name=\"org.qtproject.QtDBus.QtTypeName.%1%2\" value=\"%3\"/>\n")
145 .arg(isOutput ?
"Out"_L1 :
"In"_L1)
146 .arg(isOutput && !isSignal ? j - 1 - inputCount + outputArgsStart : j - 1)
147 .arg(typeNameToXml(typeName));
153 wantedMask = isSignal ? QDBusConnection::ExportScriptableSignals
154 : QDBusConnection::ExportScriptableSlots;
156 wantedMask = isSignal ? QDBusConnection::ExportNonScriptableSignals
157 : QDBusConnection::ExportNonScriptableSlots;
158 if ((
flags & wantedMask) != wantedMask)
161 if (qDBusCheckAsyncTag(mm.tag.constData()))
165 QString retval = xml;
166 retval += QString::fromLatin1(
" </%1>\n").arg(isSignal ?
"signal"_L1 :
"method"_L1);
177 if (flags & (QDBusConnection::ExportScriptableProperties |
178 QDBusConnection::ExportNonScriptableProperties)) {
179 static const char *accessvalues[] = {
nullptr,
"read",
"write",
"readwrite"};
180 for (
const PropertyDef &mp : mo->propertyList) {
181 if (!((!mp.scriptable.isEmpty() && (flags & QDBusConnection::ExportScriptableProperties)) ||
182 (!mp.scriptable.isEmpty() && (flags & QDBusConnection::ExportNonScriptableProperties))))
186 if (!mp.read.isEmpty())
188 if (!mp.write.isEmpty())
190 if (!mp.member.isEmpty())
193 int typeId = QMetaType::fromName(mp.type).id();
195 fprintf(stderr,
PROGRAMNAME ": unregistered type: '%s', ignoring\n",
196 mp.type.constData());
199 const char *signature = QDBusMetaType::typeToSignature(QMetaType(typeId));
203 retval += QString::fromLatin1(
" <property name=\"%1\" type=\"%2\" access=\"%3\"")
204 .arg(QLatin1StringView(mp.name),
205 QLatin1StringView(signature),
206 QLatin1StringView(accessvalues[access]));
208 if (!QDBusMetaType::signatureToMetaType(signature).isValid()) {
209 retval += QString::fromLatin1(
">\n <annotation name=\"org.qtproject.QtDBus.QtTypeName\" value=\"%3\"/>\n </property>\n")
210 .arg(typeNameToXml(mp.type.constData()));
219 if (flags & (QDBusConnection::ExportScriptableSignals | QDBusConnection::ExportNonScriptableSignals)) {
220 for (
const FunctionDef &mm : mo->signalList) {
223 if (!mm.isScriptable && !(flags & QDBusConnection::ExportNonScriptableSignals))
226 retval += addFunction(mm,
true);
230 if (flags & (QDBusConnection::ExportScriptableSlots | QDBusConnection::ExportNonScriptableSlots)) {
231 for (
const FunctionDef &slot : mo->slotList) {
232 if (!slot.isScriptable && !(flags & QDBusConnection::ExportNonScriptableSlots))
234 if (slot.access == FunctionDef::Public)
235 retval += addFunction(slot);
237 for (
const FunctionDef &method : mo->methodList) {
238 if (!method.isScriptable && !(flags & QDBusConnection::ExportNonScriptableSlots))
240 if (method.access == FunctionDef::Public)
241 retval += addFunction(method);
341 for (qsizetype i = 0; i < arguments.size(); ++i) {
342 const QString arg = arguments.at(i);
344 if (arg ==
"--help"_L1)
347 if (!arg.startsWith(u'-'))
350 char c = arg.size() == 2 ? arg.at(1).toLatin1() :
char(0);
353 flags |= QDBusConnection::ExportNonScriptableProperties;
356 flags |= QDBusConnection::ExportScriptableProperties;
360 flags |= QDBusConnection::ExportNonScriptableSignals;
363 flags |= QDBusConnection::ExportScriptableSignals;
367 flags |= QDBusConnection::ExportNonScriptableSlots;
370 flags |= QDBusConnection::ExportScriptableSlots;
374 flags |= QDBusConnection::ExportNonScriptableContents;
377 flags |= QDBusConnection::ExportScriptableContents;
381 if (arguments.size() < i + 2) {
382 printf(
"-t expects a type=dbustype argument\n");
385 const QByteArray arg = arguments.takeAt(i + 1).toUtf8();
387 const qsizetype separator = arg.lastIndexOf(
'=');
388 if (separator == -1) {
389 printf(
"-t expects a type=dbustype argument, but no '=' was found\n");
393 const QByteArray dbustype = arg.mid(separator+1);
396 QMetaType metaType = s_customTypes.back().metaType();
397 QDBusMetaType::registerCustomType(metaType, dbustype);
402 if (arguments.size() < i + 2 || arguments.at(i + 1).startsWith(u'-')) {
403 printf(
"-o expects a filename\n");
406 outputFile = arguments.takeAt(i + 1);
419 printf(
"unknown option: \"%s\"\n",
qPrintable(arg));
425 flags = QDBusConnection::ExportScriptableContents
426 | QDBusConnection::ExportNonScriptableContents;
432 args.reserve(argc - 1);
433 for (
int n = 1; n < argc; ++n)
434 args.append(QString::fromLocal8Bit(argv[n]));
437 QDBusMetaTypeId::init();
443 for (
const auto &arg: std::as_const(args)) {
444 if (arg.startsWith(u'-') && arg.size() > 1)
451 fileName =
"stdin"_L1;
452 fileIsOpen = f.open(stdin, QIODevice::ReadOnly | QIODevice::Text);
456 fileIsOpen = f.open(QIODevice::ReadOnly | QIODevice::Text);
459 fprintf(stderr,
PROGRAMNAME ": could not open '%s': %s\n",
466 pp.macros[
"Q_MOC_RUN"];
467 pp.macros[
"__cplusplus"];
469 const QByteArray filename = arg.toLocal8Bit();
471 moc.filename = filename;
472 moc.currentFilenames.push(filename);
474 moc.symbols = pp.preprocessed(moc.filename, &f);
477 if (moc.classList.isEmpty())
479 classes = moc.classList;
485 if (outputFile.isEmpty()) {
486 if (!output.open(stdout, QIODevice::WriteOnly)) {
487 fprintf(stderr,
PROGRAMNAME ": could not open standard output: %s\n",
492 output.setFileName(outputFile);
493 if (!output.open(QIODevice::WriteOnly)) {
494 fprintf(stderr,
PROGRAMNAME ": could not open output file '%s': %s\n",
501 output.write(
"<node>\n");
502 for (
const ClassDef &cdef : std::as_const(classes)) {
503 QString xml = qDBusGenerateClassDefXml(&cdef);
504 output.write(std::move(xml).toLocal8Bit());
506 output.write(
"</node>\n");