From a0754f069472a0ef611c191801d9f52b6357ef50 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Sun, 20 Jan 2008 16:49:17 +0000 Subject: [PATCH] made the SignalProxy aware of default arguments --- src/common/signalproxy.cpp | 21 +++++++++++++++++++-- src/common/signalproxy.h | 3 +++ version.inc | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 1127005c..764ac7d4 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -337,6 +337,21 @@ const QList &SignalProxy::argTypes(QObject *obj, int methodId) { return _classInfo[obj->metaObject()]->argTypes[methodId]; } +void SignalProxy::setMinArgCount(QObject *obj, int methodId) { + const QMetaObject *meta = obj->metaObject(); + QString signature(meta->method(methodId).signature()); + int minCount = meta->method(methodId).parameterTypes().count() - signature.count("="); + Q_ASSERT(!_classInfo[meta]->minArgCount.contains(methodId)); + _classInfo[meta]->minArgCount[methodId] = minCount; +} + +const int &SignalProxy::minArgCount(QObject *obj, int methodId) { + Q_ASSERT(_classInfo.contains(obj->metaObject())); + if(!_classInfo[obj->metaObject()]->minArgCount.contains(methodId)) + setMinArgCount(obj, methodId); + return _classInfo[obj->metaObject()]->minArgCount[methodId]; +} + void SignalProxy::setMethodName(QObject *obj, int methodId) { const QMetaObject *meta = obj->metaObject(); QByteArray method(::methodName(meta->method(methodId))); @@ -684,9 +699,11 @@ void SignalProxy::handleSignal(const QByteArray &funcName, const QVariantList &p bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms) { const QList args = argTypes(receiver, methodId); - const int numArgs = args.count(); + const int numArgs = params.count() < args.count() + ? params.count() + : args.count(); - if(numArgs < params.count()) { + if(minArgCount(receiver, methodId) < params.count()) { qWarning() << "SignalProxy::invokeSlot(): not enough params to invoke" << methodName(receiver, methodId); return false; } diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index da9657fe..04ff7a5e 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -89,6 +89,7 @@ public: static QString methodBaseName(const QMetaMethod &method); const QList &argTypes(QObject *obj, int methodId); + const int &minArgCount(QObject *obj, int methodId); const QByteArray &methodName(QObject *obj, int methodId); const QHash &syncMap(SyncableObject *obj); int updatedRemotelyId(SyncableObject *obj); @@ -97,6 +98,7 @@ public: typedef QHash MethodNameHash; struct ClassInfo { ArgHash argTypes; + QHash minArgCount; MethodNameHash methodNames; int updatedRemotelyId; // id of the updatedRemotely() signal - makes things faster QHash syncMap; @@ -123,6 +125,7 @@ private: void createClassInfo(QObject *obj); void setArgTypes(QObject *obj, int methodId); + void setMinArgCount(QObject *obj, int methodId); void setMethodName(QObject *obj, int methodId); void setSyncMap(SyncableObject *obj); void setUpdatedRemotelyId(QObject *obj); diff --git a/version.inc b/version.inc index c5b41cb0..1a2329e1 100644 --- a/version.inc +++ b/version.inc @@ -5,7 +5,7 @@ quasselVersion = "0.2.0-pre"; quasselDate = "2008-01-20"; - quasselBuild = 363; + quasselBuild = 364; //! Minimum client build number the core needs clientBuildNeeded = 358; -- 2.20.1