diff options
author | Thiago Macieira <thiago@kde.org> | 2006-05-29 18:17:09 +0000 |
---|---|---|
committer | Thiago Macieira <thiago@kde.org> | 2006-05-29 18:17:09 +0000 |
commit | 26ab02e91671548e2b55a16bb953b3d9e0a82497 (patch) | |
tree | 6618b0255fc1fc8c6b56ec3e9e13e0eea7aecccb /qt/qdbusinternalfilters.cpp | |
parent | 5bc9dc5cf03d05feb62f0e28e2d5e04faf33610b (diff) |
* qt/*: Update the QtDBus bindings up to revision 546310 in
Subversion.
This adds the dbuscpp2xml tool, that parses a C++ header and
outputs a D-BUS Introspection XML.
Diffstat (limited to 'qt/qdbusinternalfilters.cpp')
-rw-r--r-- | qt/qdbusinternalfilters.cpp | 173 |
1 files changed, 10 insertions, 163 deletions
diff --git a/qt/qdbusinternalfilters.cpp b/qt/qdbusinternalfilters.cpp index 3d454277..8886d3bf 100644 --- a/qt/qdbusinternalfilters.cpp +++ b/qt/qdbusinternalfilters.cpp @@ -30,10 +30,15 @@ #include "qdbusabstractadaptor.h" #include "qdbusabstractadaptor_p.h" -#include "qdbusinterface_p.h" // for ANNOTATION_NO_WAIT +#include "qdbusconnection.h" #include "qdbusmessage.h" +#include "qdbustypehelper_p.h" #include "qdbusutil.h" +// defined in qdbusxmlgenerator.cpp +extern QString qDBusGenerateMetaObjectXml(QString interface, const QMetaObject *mo, + const QMetaObject *base, int flags); + static const char introspectableInterfaceXml[] = " <interface name=\"org.freedesktop.DBus.Introspectable\">\n" " <method name=\"Introspect\">\n" @@ -55,164 +60,6 @@ static const char propertiesInterfaceXml[] = " </method>\n" " </interface>\n"; -// implement the D-Bus org.freedesktop.DBus.Introspectable interface -// we do that by analysing the metaObject of all the adaptor interfaces - -static QString generateInterfaceXml(const QMetaObject *mo, int flags, int methodOffset, int propOffset) -{ - QString retval; - - // start with properties: - if (flags & QDBusConnection::ExportProperties) { - for (int i = propOffset; i < mo->propertyCount(); ++i) { - static const char *accessvalues[] = {0, "read", "write", "readwrite"}; - - QMetaProperty mp = mo->property(i); - - if (!mp.isScriptable() && (flags & QDBusConnection::ExportAllProperties) != - QDBusConnection::ExportAllProperties) - continue; - - int access = 0; - if (mp.isReadable()) - access |= 1; - if (mp.isWritable()) - access |= 2; - - int typeId = qDBusNameToTypeId(mp.typeName()); - if (!typeId) - continue; - - retval += QString(QLatin1String(" <property name=\"%1\" type=\"%2\" access=\"%3\" />\n")) - .arg(mp.name()) - .arg(QLatin1String( QDBusUtil::typeToSignature( QVariant::Type(typeId) ))) - .arg(QLatin1String( accessvalues[access] )); - } - } - - // now add methods: - for (int i = methodOffset; i < mo->methodCount(); ++i) { - QMetaMethod mm = mo->method(i); - QByteArray signature = mm.signature(); - int paren = signature.indexOf('('); - - bool isSignal; - if (mm.methodType() == QMetaMethod::Signal) - // adding a signal - isSignal = true; - else if (mm.methodType() == QMetaMethod::Slot && mm.access() == QMetaMethod::Public) - isSignal = false; - else - continue; // neither signal nor public slot - - if ((isSignal && !(flags & QDBusConnection::ExportSignals)) || - (!isSignal && !(flags & QDBusConnection::ExportSlots))) - continue; - - QString xml = QString(QLatin1String(" <%1 name=\"%2\">\n")) - .arg(isSignal ? QLatin1String("signal") : QLatin1String("method")) - .arg(QLatin1String(signature.left(paren))); - - // check the return type first - int typeId = qDBusNameToTypeId(mm.typeName()); - if (typeId) - xml += QString(QLatin1String(" <arg type=\"%1\" direction=\"out\"/>\n")) - .arg(QLatin1String(QDBusUtil::typeToSignature( QVariant::Type(typeId) ))); - else if (*mm.typeName()) - continue; // wasn't a valid type - - QList<QByteArray> names = mm.parameterNames(); - QList<int> types; - int inputCount = qDBusParametersForMethod(mm, types); - if (inputCount == -1) - continue; // invalid form - if (isSignal && inputCount + 1 != types.count()) - continue; // signal with output arguments? - if (isSignal && types.at(inputCount) == QDBusConnectionPrivate::messageMetaType) - continue; // signal with QDBusMessage argument? - - int j; - bool isScriptable = mm.attributes() & QMetaMethod::Scriptable; - for (j = 1; j < types.count(); ++j) { - // input parameter for a slot or output for a signal - if (types.at(j) == QDBusConnectionPrivate::messageMetaType) { - isScriptable = true; - continue; - } - - QString name; - if (!names.at(j - 1).isEmpty()) - name = QString(QLatin1String("name=\"%1\" ")).arg(QLatin1String(names.at(j - 1))); - - bool isOutput = isSignal || j > inputCount; - - xml += QString(QLatin1String(" <arg %1type=\"%2\" direction=\"%3\"/>\n")) - .arg(name) - .arg(QLatin1String(QDBusUtil::typeToSignature( QVariant::Type(types.at(j)) ))) - .arg(isOutput ? QLatin1String("out") : QLatin1String("in")); - } - - if (!isScriptable) { - // check if this was added by other means - if (isSignal && (flags & QDBusConnection::ExportAllSignals) != QDBusConnection::ExportAllSignals) - continue; - if (!isSignal && (flags & QDBusConnection::ExportAllSlots) != QDBusConnection::ExportAllSlots) - continue; - } - - if (qDBusCheckAsyncTag(mm.tag())) - // add the no-reply annotation - xml += QLatin1String(" <annotation name=\"" ANNOTATION_NO_WAIT "\"" - " value=\"true\"/>\n"); - - retval += xml; - retval += QString(QLatin1String(" </%1>\n")) - .arg(isSignal ? QLatin1String("signal") : QLatin1String("method")); - } - - return retval; -} - -static QString generateMetaObjectXml(QString interface, const QMetaObject *mo, const QMetaObject *base, - int flags) -{ - if (interface.isEmpty()) { - // generate the interface name from the meta object - int idx = mo->indexOfClassInfo(QCLASSINFO_DBUS_INTERFACE); - if (idx >= mo->classInfoOffset()) { - interface = QLatin1String(mo->classInfo(idx).value()); - } else { - interface = QLatin1String(mo->className()); - interface.replace(QLatin1String("::"), QLatin1String(".")); - - if (interface.startsWith( QLatin1String("QDBus") )) { - interface.prepend( QLatin1String("com.trolltech.QtDBus.") ); - } else if (interface.startsWith( QLatin1Char('Q') )) { - // assume it's Qt - interface.prepend( QLatin1String("com.trolltech.Qt.") ); - } else if (!QCoreApplication::instance() || - QCoreApplication::instance()->applicationName().isEmpty()) { - interface.prepend( QLatin1String("local.") ); - } else { - interface.prepend(QLatin1Char('.')).prepend( QCoreApplication::instance()->applicationName() ); - QStringList domainName = QCoreApplication::instance()->organizationDomain().split(QLatin1Char('.')); - foreach (const QString &part, domainName) - interface.prepend(QLatin1Char('.')).prepend(part); - } - } - } - - QString xml; - int idx = mo->indexOfClassInfo(QCLASSINFO_DBUS_INTROSPECTION); - if (idx >= mo->classInfoOffset()) - xml = QString::fromUtf8(mo->classInfo(idx).value()); - else - xml = generateInterfaceXml(mo, flags, base->methodCount(), base->propertyCount()); - - return QString(QLatin1String(" <interface name=\"%1\">\n%2 </interface>\n")) - .arg(interface, xml); -} - static QString generateSubObjectXml(QObject *object) { QString retval; @@ -236,7 +83,7 @@ QString qDBusIntrospectObject(const QDBusConnectionPrivate::ObjectTreeNode *node if (node->flags & QDBusConnection::ExportContents) { const QMetaObject *mo = node->obj->metaObject(); for ( ; mo != &QObject::staticMetaObject; mo = mo->superClass()) - xml_data += generateMetaObjectXml(QString(), mo, mo->superClass(), + xml_data += qDBusGenerateMetaObjectXml(QString(), mo, mo->superClass(), node->flags); } @@ -253,9 +100,9 @@ QString qDBusIntrospectObject(const QDBusConnectionPrivate::ObjectTreeNode *node QString ifaceXml = QDBusAbstractAdaptorPrivate::retrieveIntrospectionXml(it->adaptor); if (ifaceXml.isEmpty()) { // add the interface's contents: - ifaceXml += generateMetaObjectXml(it->interface, it->metaObject, - &QDBusAbstractAdaptor::staticMetaObject, - QDBusConnection::ExportAllContents); + ifaceXml += qDBusGenerateMetaObjectXml(it->interface, it->metaObject, + &QDBusAbstractAdaptor::staticMetaObject, + QDBusConnection::ExportAllContents); QDBusAbstractAdaptorPrivate::saveIntrospectionXml(it->adaptor, ifaceXml); } |