From b2f9839457a7c09c2898befe431443aaeb607edb Mon Sep 17 00:00:00 2001 From: David Faure Date: Sat, 4 May 2013 13:03:45 +0200 Subject: QDBus: improve error handling, to give the developer feedback. For instance, exporting an object with a slot like QString complexMethod(const MyVariantMap& vars); (even with a simple typedef QVariantMap MyVariantMap) used to silently skip that method in the introspection. Now it outputs: generateInterfaceXml: Skipped method "complexMethod" : Invalid type in parameter list: MyVariantMap Change-Id: I7964cfb63e973257ce1abe47b9625e361b2ad23f Reviewed-by: Kevin Ottens Reviewed-by: Thiago Macieira --- src/dbus/qdbusabstractadaptor.cpp | 11 +++++++---- src/dbus/qdbusconnection_p.h | 4 ++-- src/dbus/qdbusintegrator.cpp | 6 ++++-- src/dbus/qdbusmisc.cpp | 22 ++++++++++------------ src/dbus/qdbusxmlgenerator.cpp | 16 ++++++++++++---- src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp | 12 ++++++++---- 6 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/dbus/qdbusabstractadaptor.cpp b/src/dbus/qdbusabstractadaptor.cpp index e08714f04d..1dbc79d6ec 100644 --- a/src/dbus/qdbusabstractadaptor.cpp +++ b/src/dbus/qdbusabstractadaptor.cpp @@ -298,15 +298,18 @@ void QDBusAdaptorConnector::relay(QObject *senderObj, int lastSignalIdx, void ** // break down the parameter list QVector types; - int inputCount = qDBusParametersForMethod(mm, types); - if (inputCount == -1) + QString errorMsg; + int inputCount = qDBusParametersForMethod(mm, types, errorMsg); + if (inputCount == -1) { // invalid signal signature - // qDBusParametersForMethod has already complained + qWarning("QDBusAbstractAdaptor: Cannot relay signal %s::%s: %s", + senderMetaObject->className(), mm.methodSignature().constData(), + qPrintable(errorMsg)); return; + } if (inputCount + 1 != types.count() || types.at(inputCount) == QDBusMetaTypeId::message()) { // invalid signal signature - // qDBusParametersForMethod has not yet complained about this one qWarning("QDBusAbstractAdaptor: Cannot relay signal %s::%s", senderMetaObject->className(), mm.methodSignature().constData()); return; diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h index 73c8dcf411..48026e15bd 100644 --- a/src/dbus/qdbusconnection_p.h +++ b/src/dbus/qdbusconnection_p.h @@ -342,9 +342,9 @@ public: }; // in qdbusmisc.cpp -extern int qDBusParametersForMethod(const QMetaMethod &mm, QVector &metaTypes); +extern int qDBusParametersForMethod(const QMetaMethod &mm, QVector &metaTypes, QString &errorMsg); #endif // QT_BOOTSTRAPPED -extern Q_DBUS_EXPORT int qDBusParametersForMethod(const QList ¶meters, QVector& metaTypes); +extern Q_DBUS_EXPORT int qDBusParametersForMethod(const QList ¶meters, QVector& metaTypes, QString &errorMsg); extern Q_DBUS_EXPORT bool qDBusCheckAsyncTag(const char *tag); #ifndef QT_BOOTSTRAPPED extern bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name); diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index afb8506b28..e0aec2cad9 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -721,7 +721,8 @@ static int findSlot(const QMetaObject *mo, const QByteArray &name, int flags, if (isAsync && returnType != QMetaType::Void) continue; - int inputCount = qDBusParametersForMethod(mm, metaTypes); + QString errorMsg; + int inputCount = qDBusParametersForMethod(mm, metaTypes, errorMsg); if (inputCount == -1) continue; // problem parsing @@ -1312,7 +1313,8 @@ int QDBusConnectionPrivate::findSlot(QObject* obj, const QByteArray &normalizedN if (midx == -1) return -1; - int inputCount = qDBusParametersForMethod(obj->metaObject()->method(midx), params); + QString errorMsg; + int inputCount = qDBusParametersForMethod(obj->metaObject()->method(midx), params, errorMsg); if ( inputCount == -1 || inputCount + 1 != params.count() ) return -1; // failed to parse or invalid arguments or output arguments diff --git a/src/dbus/qdbusmisc.cpp b/src/dbus/qdbusmisc.cpp index d28d5598c6..5d3512845a 100644 --- a/src/dbus/qdbusmisc.cpp +++ b/src/dbus/qdbusmisc.cpp @@ -131,14 +131,14 @@ bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name) // metaTypes.count() >= retval + 1 in all cases // // sig must be the normalised signature for the method -int qDBusParametersForMethod(const QMetaMethod &mm, QVector &metaTypes) +int qDBusParametersForMethod(const QMetaMethod &mm, QVector &metaTypes, QString &errorMsg) { - return qDBusParametersForMethod(mm.parameterTypes(), metaTypes); + return qDBusParametersForMethod(mm.parameterTypes(), metaTypes, errorMsg); } #endif // QT_BOOTSTRAPPED -int qDBusParametersForMethod(const QList ¶meterTypes, QVector& metaTypes) +int qDBusParametersForMethod(const QList ¶meterTypes, QVector& metaTypes, QString &errorMsg) { QDBusMetaTypeId::init(); metaTypes.clear(); @@ -151,8 +151,7 @@ int qDBusParametersForMethod(const QList ¶meterTypes, QVector ¶meterTypes, QVector ¶meterTypes, QVector #include +#include #include "qdbusinterface_p.h" // for ANNOTATION_NO_WAIT #include "qdbusabstractadaptor_p.h" // for QCLASSINFO_DBUS_* @@ -159,17 +160,24 @@ static QString generateInterfaceXml(const QMetaObject *mo, int flags, int method if (QDBusMetaType::signatureToType(typeName) == QVariant::Invalid) xml += QString::fromLatin1(" \n") .arg(typeNameToXml(QMetaType::typeName(typeId))); - } else + } else { + qWarning() << "Unsupported return type" << typeId << QMetaType::typeName(typeId) << "in method" << mm.name(); continue; + } } - else if (typeId == QMetaType::UnknownType) + else if (typeId == QMetaType::UnknownType) { + qWarning() << "Invalid return type in method" << mm.name(); continue; // wasn't a valid type + } QList names = mm.parameterNames(); QVector types; - int inputCount = qDBusParametersForMethod(mm, types); - if (inputCount == -1) + QString errorMsg; + int inputCount = qDBusParametersForMethod(mm, types, errorMsg); + if (inputCount == -1) { + qWarning() << "Skipped method" << mm.name() << ":" << qPrintable(errorMsg); continue; // invalid form + } if (isSignal && inputCount + 1 != types.count()) continue; // signal with output arguments? if (isSignal && types.at(inputCount) == QDBusMetaTypeId::message()) diff --git a/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp b/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp index a66757907d..0e1fa59b90 100644 --- a/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp +++ b/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include @@ -95,14 +96,14 @@ static const char help[] = "\n"; -int qDBusParametersForMethod(const FunctionDef &mm, QVector& metaTypes) +int qDBusParametersForMethod(const FunctionDef &mm, QVector& metaTypes, QString &errorMsg) { QList parameterTypes; foreach (const ArgumentDef &arg, mm.arguments) parameterTypes.append(arg.normalizedType); - return qDBusParametersForMethod(parameterTypes, metaTypes); + return qDBusParametersForMethod(parameterTypes, metaTypes, errorMsg); } @@ -140,9 +141,12 @@ static QString addFunction(const FunctionDef &mm, bool isSignal = false) { } QList names = mm.arguments; QVector types; - int inputCount = qDBusParametersForMethod(mm, types); - if (inputCount == -1) + QString errorMsg; + int inputCount = qDBusParametersForMethod(mm, types, errorMsg); + if (inputCount == -1) { + qWarning() << qPrintable(errorMsg); return QString(); // invalid form + } if (isSignal && inputCount + 1 != types.count()) return QString(); // signal with output arguments? if (isSignal && types.at(inputCount) == QDBusMetaTypeId::message()) -- cgit v1.2.3