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 if (typeId != QMetaType::Void) {
89 const char *typeName = QDBusMetaType::typeToSignature(QMetaType(typeId));
91 xml += QString::fromLatin1(
" <arg type=\"%1\" direction=\"out\"/>\n")
92 .arg(typeNameToXml(typeName));
95 if (!QDBusMetaType::signatureToMetaType(typeName).isValid())
96 xml += QString::fromLatin1(
" <annotation name=\"org.qtproject.QtDBus.QtTypeName.Out0\" value=\"%1\"/>\n")
97 .arg(typeNameToXml(mm.normalizedType.constData()));
101 }
else if (!mm.normalizedType.isEmpty()) {
102 qWarning() <<
"Unregistered return type:" << mm.normalizedType.constData();
107 QList<QMetaType> types;
109 int inputCount = qDBusParametersForMethod(mm, types, errorMsg);
110 if (inputCount == -1) {
114 if (isSignal && inputCount + 1 != types.size())
116 if (isSignal && types.at(inputCount) == QDBusMetaTypeId::message())
120 for (qsizetype j = 1; j < types.size(); ++j) {
122 if (types.at(j) == QDBusMetaTypeId::message()) {
128 if (!names.at(j - 1).name.isEmpty())
129 name = QString::fromLatin1(
"name=\"%1\" ").arg(QString::fromLatin1(names.at(j - 1).name));
131 bool isOutput = isSignal || j > inputCount;
133 const char *signature = QDBusMetaType::typeToSignature(QMetaType(types.at(j)));
134 xml += QString::fromLatin1(
" <arg %1type=\"%2\" direction=\"%3\"/>\n")
136 QLatin1StringView(signature),
137 isOutput ?
"out"_L1 :
"in"_L1);
140 if (!QDBusMetaType::signatureToMetaType(signature).isValid()) {
141 const char *typeName = QMetaType(types.at(j)).name();
142 xml += QString::fromLatin1(
" <annotation name=\"org.qtproject.QtDBus.QtTypeName.%1%2\" value=\"%3\"/>\n")
143 .arg(isOutput ?
"Out"_L1 :
"In"_L1)
144 .arg(isOutput && !isSignal ? j - inputCount : j - 1)
145 .arg(typeNameToXml(typeName));
151 wantedMask = isSignal ? QDBusConnection::ExportScriptableSignals
152 : QDBusConnection::ExportScriptableSlots;
154 wantedMask = isSignal ? QDBusConnection::ExportNonScriptableSignals
155 : QDBusConnection::ExportNonScriptableSlots;
156 if ((
flags & wantedMask) != wantedMask)
159 if (qDBusCheckAsyncTag(mm.tag.constData()))
163 QString retval = xml;
164 retval += QString::fromLatin1(
" </%1>\n").arg(isSignal ?
"signal"_L1 :
"method"_L1);
175 if (flags & (QDBusConnection::ExportScriptableProperties |
176 QDBusConnection::ExportNonScriptableProperties)) {
177 static const char *accessvalues[] = {
nullptr,
"read",
"write",
"readwrite"};
178 for (
const PropertyDef &mp : mo->propertyList) {
179 if (!((!mp.scriptable.isEmpty() && (flags & QDBusConnection::ExportScriptableProperties)) ||
180 (!mp.scriptable.isEmpty() && (flags & QDBusConnection::ExportNonScriptableProperties))))
184 if (!mp.read.isEmpty())
186 if (!mp.write.isEmpty())
188 if (!mp.member.isEmpty())
191 int typeId = QMetaType::fromName(mp.type).id();
193 fprintf(stderr,
PROGRAMNAME ": unregistered type: '%s', ignoring\n",
194 mp.type.constData());
197 const char *signature = QDBusMetaType::typeToSignature(QMetaType(typeId));
201 retval += QString::fromLatin1(
" <property name=\"%1\" type=\"%2\" access=\"%3\"")
202 .arg(QLatin1StringView(mp.name),
203 QLatin1StringView(signature),
204 QLatin1StringView(accessvalues[access]));
206 if (!QDBusMetaType::signatureToMetaType(signature).isValid()) {
207 retval += QString::fromLatin1(
">\n <annotation name=\"org.qtproject.QtDBus.QtTypeName\" value=\"%3\"/>\n </property>\n")
208 .arg(typeNameToXml(mp.type.constData()));
217 if (flags & (QDBusConnection::ExportScriptableSignals | QDBusConnection::ExportNonScriptableSignals)) {
218 for (
const FunctionDef &mm : mo->signalList) {
221 if (!mm.isScriptable && !(flags & QDBusConnection::ExportNonScriptableSignals))
224 retval += addFunction(mm,
true);
228 if (flags & (QDBusConnection::ExportScriptableSlots | QDBusConnection::ExportNonScriptableSlots)) {
229 for (
const FunctionDef &slot : mo->slotList) {
230 if (!slot.isScriptable && !(flags & QDBusConnection::ExportNonScriptableSlots))
232 if (slot.access == FunctionDef::Public)
233 retval += addFunction(slot);
235 for (
const FunctionDef &method : mo->methodList) {
236 if (!method.isScriptable && !(flags & QDBusConnection::ExportNonScriptableSlots))
238 if (method.access == FunctionDef::Public)
239 retval += addFunction(method);
339 for (qsizetype i = 0; i < arguments.size(); ++i) {
340 const QString arg = arguments.at(i);
342 if (arg ==
"--help"_L1)
345 if (!arg.startsWith(u'-'))
348 char c = arg.size() == 2 ? arg.at(1).toLatin1() :
char(0);
351 flags |= QDBusConnection::ExportNonScriptableProperties;
354 flags |= QDBusConnection::ExportScriptableProperties;
358 flags |= QDBusConnection::ExportNonScriptableSignals;
361 flags |= QDBusConnection::ExportScriptableSignals;
365 flags |= QDBusConnection::ExportNonScriptableSlots;
368 flags |= QDBusConnection::ExportScriptableSlots;
372 flags |= QDBusConnection::ExportNonScriptableContents;
375 flags |= QDBusConnection::ExportScriptableContents;
379 if (arguments.size() < i + 2) {
380 printf(
"-t expects a type=dbustype argument\n");
383 const QByteArray arg = arguments.takeAt(i + 1).toUtf8();
385 const qsizetype separator = arg.lastIndexOf(
'=');
386 if (separator == -1) {
387 printf(
"-t expects a type=dbustype argument, but no '=' was found\n");
391 const QByteArray dbustype = arg.mid(separator+1);
394 QMetaType metaType = s_customTypes.back().metaType();
395 QDBusMetaType::registerCustomType(metaType, dbustype);
400 if (arguments.size() < i + 2 || arguments.at(i + 1).startsWith(u'-')) {
401 printf(
"-o expects a filename\n");
404 outputFile = arguments.takeAt(i + 1);
417 printf(
"unknown option: \"%s\"\n",
qPrintable(arg));
423 flags = QDBusConnection::ExportScriptableContents
424 | QDBusConnection::ExportNonScriptableContents;
430 args.reserve(argc - 1);
431 for (
int n = 1; n < argc; ++n)
432 args.append(QString::fromLocal8Bit(argv[n]));
435 QDBusMetaTypeId::init();
441 for (
const auto &arg: std::as_const(args)) {
442 if (arg.startsWith(u'-') && arg.size() > 1)
449 fileName =
"stdin"_L1;
450 fileIsOpen = f.open(stdin, QIODevice::ReadOnly | QIODevice::Text);
454 fileIsOpen = f.open(QIODevice::ReadOnly | QIODevice::Text);
457 fprintf(stderr,
PROGRAMNAME ": could not open '%s': %s\n",
464 pp.macros[
"Q_MOC_RUN"];
465 pp.macros[
"__cplusplus"];
467 const QByteArray filename = arg.toLocal8Bit();
469 moc.filename = filename;
470 moc.currentFilenames.push(filename);
472 moc.symbols = pp.preprocessed(moc.filename, &f);
475 if (moc.classList.isEmpty())
477 classes = moc.classList;
483 if (outputFile.isEmpty()) {
484 if (!output.open(stdout, QIODevice::WriteOnly)) {
485 fprintf(stderr,
PROGRAMNAME ": could not open standard output: %s\n",
490 output.setFileName(outputFile);
491 if (!output.open(QIODevice::WriteOnly)) {
492 fprintf(stderr,
PROGRAMNAME ": could not open output file '%s': %s\n",
499 output.write(
"<node>\n");
500 for (
const ClassDef &cdef : std::as_const(classes)) {
501 QString xml = qDBusGenerateClassDefXml(&cdef);
502 output.write(std::move(xml).toLocal8Bit());
504 output.write(
"</node>\n");