int QDBusAdaptorConnector::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QObject::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { switch (_id) { case 0: relaySlot(_a); break; // HAND EDIT: add the _a parameter case 1: polish(); break; case 2: relaySignal((*reinterpret_cast< QObject*(*)>(_a[1])),(*reinterpret_cast< const QMetaObject*(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3])),(*reinterpret_cast< const QVariantList(*)>(_a[4]))); break; } _id -= 3; } return _id; }
void QDBusAdaptorConnector::relay(QObject *senderObj, int lastSignalIdx, void **argv) { if (lastSignalIdx < QObject::staticMetaObject.methodCount()) // QObject signal (destroyed(QObject *)) -- ignore return; const QMetaObject *senderMetaObject = senderObj->metaObject(); QMetaMethod mm = senderMetaObject->method(lastSignalIdx); QObject *realObject = senderObj; if (qobject_cast<QDBusAbstractAdaptor *>(senderObj)) // it's an adaptor, so the real object is in fact its parent realObject = realObject->parent(); // break down the parameter list QVector<int> types; QString errorMsg; int inputCount = qDBusParametersForMethod(mm, types, errorMsg); if (inputCount == -1) { // invalid signal signature qWarning("QDBusAbstractAdaptor: Cannot relay signal %s::%s: %s", senderMetaObject->className(), mm.methodSignature().constData(), qPrintable(errorMsg)); return; } if (inputCount + 1 != types.count() || types.at(inputCount) == QDBusMetaTypeId::message()) { // invalid signal signature qWarning("QDBusAbstractAdaptor: Cannot relay signal %s::%s", senderMetaObject->className(), mm.methodSignature().constData()); return; } QVariantList args; for (int i = 1; i < types.count(); ++i) args << QVariant(types.at(i), argv[i]); // now emit the signal with all the information emit relaySignal(realObject, senderMetaObject, lastSignalIdx, args); }