void QDBusViewer::callMethod(const BusSignature &sig) { QDBusInterface iface(sig.mService, sig.mPath, sig.mInterface, c); const QMetaObject *mo = iface.metaObject(); // find the method QMetaMethod method; for (int i = 0; i < mo->methodCount(); ++i) { const QString signature = QString::fromLatin1(mo->method(i).signature()); if (signature.startsWith(sig.mName) && signature.at(sig.mName.length()) == QLatin1Char('(')) if (getDbusSignature(mo->method(i)) == sig.mTypeSig) method = mo->method(i); } if (!method.signature()) { QMessageBox::warning(this, tr("Unable to find method"), tr("Unable to find method %1 on path %2 in interface %3").arg( sig.mName).arg(sig.mPath).arg(sig.mInterface)); return; } PropertyDialog dialog; QList<QVariant> args; const QList<QByteArray> paramTypes = method.parameterTypes(); const QList<QByteArray> paramNames = method.parameterNames(); QList<int> types; // remember the low-level D-Bus type for (int i = 0; i < paramTypes.count(); ++i) { const QByteArray paramType = paramTypes.at(i); if (paramType.endsWith('&')) continue; // ignore OUT parameters QVariant::Type type = QVariant::nameToType(paramType); dialog.addProperty(QString::fromLatin1(paramNames.value(i)), type); types.append(QMetaType::type(paramType)); } if (!types.isEmpty()) { dialog.setInfo(tr("Please enter parameters for the method \"%1\"").arg(sig.mName)); if (dialog.exec() != QDialog::Accepted) return; args = dialog.values(); } // Special case - convert a value to a QDBusVariant if the // interface wants a variant for (int i = 0; i < args.count(); ++i) { if (types.at(i) == qMetaTypeId<QDBusVariant>()) args[i] = qVariantFromValue(QDBusVariant(args.at(i))); } QDBusMessage message = QDBusMessage::createMethodCall(sig.mService, sig.mPath, sig.mInterface, sig.mName); message.setArguments(args); c.callWithCallback(message, this, SLOT(dumpMessage(QDBusMessage))); }
void VideoTestWindow::on_actionProperties_triggered() { PropertyDialog dlg; dlg.setVideoEngine(&_videoEngine); dlg.exec(); }