made the SignalProxy aware of default arguments
[quassel.git] / src / common / signalproxy.cpp
index 2c443bb..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)));
@@ -644,7 +659,7 @@ void SignalProxy::handleInitRequest(QIODevice *sender, const QVariantList &param
 void SignalProxy::handleInitData(QIODevice *sender, const QVariantList &params) {
   Q_UNUSED(sender)
   if(params.count() != 3) {
-    qWarning() << "SignalProxy::handleInitRequest() received initRequest with invalid param Count:"
+    qWarning() << "SignalProxy::handleInitData() received initData with invalid param Count:"
               << params;
     return;
   }
@@ -654,13 +669,13 @@ void SignalProxy::handleInitData(QIODevice *sender, const QVariantList &params)
   QVariantMap propertyMap(params[2].toMap());
 
   if(!_syncSlave.contains(className)) {
-    qWarning() << "SignalProxy::handleInitRequest() received initRequest for unregistered Class:"
+    qWarning() << "SignalProxy::handleInitData() received initData for unregistered Class:"
               << className;
     return;
   }
 
   if(!_syncSlave[className].contains(objectName)) {
-    qWarning() << "SignalProxy::handleInitRequest() received initRequest for unregistered Object:"
+    qWarning() << "SignalProxy::handleInitData() received initData for unregistered Object:"
               << className << objectName;
     return;
   }
@@ -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;
   }