made the signalproxy compile with MSVC
[quassel.git] / src / common / signalproxy.cpp
index 2c443bb..f6f75d6 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,15 +699,18 @@ 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;
   }
-  
-  void *_a[numArgs+1];
-  _a[0] = 0;
+
+  void *_a[] = {0, // return type
+               0, 0, 0, 0 , 0, // and 10 args - that's the max size qt can handle with signals and slots
+               0, 0, 0, 0 , 0};
   // check for argument compatibility and build params array
   for(int i = 0; i < numArgs; i++) {
     if(args[i] != QMetaType::type(params[i].typeName())) {
@@ -800,6 +818,7 @@ void SignalProxy::setInitData(SyncableObject *obj, const QVariantMap &properties
     return;
   obj->fromVariantMap(properties);
   setInitialized(obj);
+  invokeSlot(obj, updatedRemotelyId(obj));
 }
 
 void SignalProxy::dumpProxyStats() {