-void SignalProxy::handleSignal(const QVariantList &data) {
- QVariantList params = data;
- QByteArray funcName = params.takeFirst().toByteArray();
-
- QObject* receiver;
- int methodId;
- SlotHash::const_iterator slot = _attachedSlots.constFind(funcName);
- while(slot != _attachedSlots.constEnd() && slot.key() == funcName) {
- receiver = (*slot).first;
- methodId = (*slot).second;
- if(!invokeSlot(receiver, methodId, params)) {
- ExtendedMetaObject *eMeta = extendedMetaObject(receiver);
- qWarning("SignalProxy::handleSignal(): invokeMethod for \"%s\" failed ", eMeta->methodName(methodId).constData());
- }
- slot++;
- }
-}
-
-bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms, QVariant &returnValue) {
- ExtendedMetaObject *eMeta = extendedMetaObject(receiver);
- const QList<int> args = eMeta->argTypes(methodId);
- const int numArgs = params.count() < args.count()
- ? params.count()
- : args.count();
-
- if(eMeta->minArgCount(methodId) > params.count()) {
- qWarning() << "SignalProxy::invokeSlot(): not enough params to invoke" << eMeta->methodName(methodId);
- return false;
- }
-
- 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(!params[i].isValid()) {
- qWarning() << "SignalProxy::invokeSlot(): received invalid data for argument number" << i << "of method" << QString("%1::%2()").arg(receiver->metaObject()->className()).arg(receiver->metaObject()->method(methodId).signature());
- qWarning() << " - make sure all your data types are known by the Qt MetaSystem";
- return false;
- }
- if(args[i] != QMetaType::type(params[i].typeName())) {
- qWarning() << "SignalProxy::invokeSlot(): incompatible param types to invoke" << eMeta->methodName(methodId);
- return false;
- }
- _a[i+1] = const_cast<void *>(params[i].constData());
- }
-
- if(returnValue.type() != QVariant::Invalid)
- _a[0] = const_cast<void *>(returnValue.constData());
-
- Qt::ConnectionType type = QThread::currentThread() == receiver->thread()
- ? Qt::DirectConnection
- : Qt::QueuedConnection;
-
- if(type == Qt::DirectConnection) {
- return receiver->qt_metacall(QMetaObject::InvokeMetaMethod, methodId, _a) < 0;
- } else {
- qWarning() << "Queued Connections are not implemented yet";
- // note to self: qmetaobject.cpp:990 ff
- return false;
- }
+void SignalProxy::handleSignal(const QVariantList &data)
+{
+ QVariantList params = data;
+ QByteArray funcName = params.takeFirst().toByteArray();
+
+ QObject *receiver;
+ int methodId;
+ SlotHash::const_iterator slot = _attachedSlots.constFind(funcName);
+ while (slot != _attachedSlots.constEnd() && slot.key() == funcName) {
+ receiver = (*slot).first;
+ methodId = (*slot).second;
+ if (!invokeSlot(receiver, methodId, params)) {
+ ExtendedMetaObject *eMeta = extendedMetaObject(receiver);
+ qWarning("SignalProxy::handleSignal(): invokeMethod for \"%s\" failed ", eMeta->methodName(methodId).constData());
+ }
+ slot++;
+ }
+}
+
+
+bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms, QVariant &returnValue)
+{
+ ExtendedMetaObject *eMeta = extendedMetaObject(receiver);
+ const QList<int> args = eMeta->argTypes(methodId);
+ const int numArgs = params.count() < args.count()
+ ? params.count()
+ : args.count();
+
+ if (eMeta->minArgCount(methodId) > params.count()) {
+ qWarning() << "SignalProxy::invokeSlot(): not enough params to invoke" << eMeta->methodName(methodId);
+ return false;
+ }
+
+ 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 };