made the SignalProxy aware of default arguments
authorMarcus Eggenberger <egs@quassel-irc.org>
Sun, 20 Jan 2008 16:49:17 +0000 (16:49 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sun, 20 Jan 2008 16:49:17 +0000 (16:49 +0000)
src/common/signalproxy.cpp
src/common/signalproxy.h
version.inc

index 1127005..764ac7d 100644 (file)
@@ -337,6 +337,21 @@ const QList<int> &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 &params) {
   const QList<int> 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;
   }
index da9657f..04ff7a5 100644 (file)
@@ -89,6 +89,7 @@ public:
   static QString methodBaseName(const QMetaMethod &method);
 
   const QList<int> &argTypes(QObject *obj, int methodId);
+  const int &minArgCount(QObject *obj, int methodId);
   const QByteArray &methodName(QObject *obj, int methodId);
   const QHash<QByteArray, int> &syncMap(SyncableObject *obj);
   int updatedRemotelyId(SyncableObject *obj);
@@ -97,6 +98,7 @@ public:
   typedef QHash<int, QByteArray> MethodNameHash;
   struct ClassInfo {
     ArgHash argTypes;
+    QHash<int, int> minArgCount;
     MethodNameHash methodNames;
     int updatedRemotelyId; // id of the updatedRemotely() signal - makes things faster
     QHash<QByteArray, int> 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);
index c5b41cb..1a2329e 100644 (file)
@@ -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;