104QDBusAbstractAdaptor::QDBusAbstractAdaptor(QObject* obj)
105 : QObject(*
new QDBusAbstractAdaptorPrivate, obj)
108 Q_ASSERT_X(obj, Q_FUNC_INFO,
"Expected non-null parent");
110 QDBusAdaptorConnector *connector = qDBusCreateAdaptorConnector(obj);
112 connector->waitingForPolish =
true;
113 QMetaObject::invokeMethod(connector, &QDBusAdaptorConnector::polish, Qt::QueuedConnection);
134void QDBusAbstractAdaptor::setAutoRelaySignals(
bool enable)
136 const QMetaObject *us = metaObject();
137 const QMetaObject *them = parent()->metaObject();
138 bool connected =
false;
139 for (
int idx = staticMetaObject.methodCount(); idx < us->methodCount(); ++idx) {
140 QMetaMethod mm = us->method(idx);
142 if (mm.methodType() != QMetaMethod::Signal)
146 QByteArray sig = QMetaObject::normalizedSignature(mm.methodSignature().constData());
147 if (them->indexOfSignal(sig) == -1)
149 sig.prepend(QSIGNAL_CODE +
'0');
150 parent()->disconnect(sig,
this, sig);
152 connected = connect(parent(), sig, sig) || connected;
154 d_func()->autoRelaySignals = connected;
180 const QMetaObject *mo = adaptor->metaObject();
183 QMetaClassInfo mci = mo->classInfo(ciid);
186 const char *interface = mci.value();
188 QByteArrayView(interface));
189 if (it !=
adaptors.end() && qstrcmp(interface, it->interface) == 0) {
191 if (it->adaptor != adaptor) {
193 disconnectAllSignals(it->adaptor);
194 connectAllSignals(adaptor);
196 it->adaptor = adaptor;
200 entry.interface = interface;
201 entry.adaptor = adaptor;
205 connectAllSignals(adaptor);
239 QObject *sndr = sender();
240 if (Q_LIKELY(sndr)) {
241 relay(sndr, senderSignalIndex(), argv.arguments);
243 qWarning(
"QtDBus: cannot relay signals from parent %s(%p \"%s\") unless they are emitted in the object's thread %s(%p \"%s\"). "
244 "Current thread is %s(%p \"%s\").",
245 parent()->metaObject()->className(), parent(), qPrintable(parent()->objectName()),
246 parent()->thread()->metaObject()->className(), parent()->thread(), qPrintable(parent()->thread()->objectName()),
247 QThread::currentThread()->metaObject()->className(), QThread::currentThread(), qPrintable(QThread::currentThread()->objectName()));
253 if (lastSignalIdx < QObject::staticMetaObject.methodCount())
257 QMetaMethod mm = senderObj->metaObject()->method(lastSignalIdx);
258 const QMetaObject *senderMetaObject = mm.enclosingMetaObject();
260 QObject *realObject = senderObj;
261 if (qobject_cast<QDBusAbstractAdaptor *>(senderObj))
263 realObject = realObject->parent();
266 QList<QMetaType> types;
268 int inputCount = qDBusParametersForMethod(mm, types, errorMsg);
269 if (inputCount == -1) {
271 qWarning(
"QDBusAbstractAdaptor: Cannot relay signal %s::%s: %s",
272 senderMetaObject->className(), mm.methodSignature().constData(),
273 qPrintable(errorMsg));
276 if (inputCount + 1 != types.size() ||
277 types.at(inputCount) == QDBusMetaTypeId::message()) {
279 qWarning(
"QDBusAbstractAdaptor: Cannot relay signal %s::%s",
280 senderMetaObject->className(), mm.methodSignature().constData());
285 const int numTypes = types.size();
286 args.reserve(numTypes - 1);
287 for (
int i = 1; i < numTypes; ++i)
288 args << QVariant(QMetaType(types.at(i)), argv[i]);
291 emit relaySignal(realObject, senderMetaObject, lastSignalIdx, args);