221QDBusConnection QDBusConnection::connectToBus(BusType type,
const QString &name)
223 auto *manager = QDBusConnectionManager::instance();
225 if (!manager || !qdbus_loadLibDBus()) {
226 QDBusConnectionPrivate *d =
nullptr;
227 return QDBusConnection(d);
229 return QDBusConnection(manager->connectToBus(type, name,
false));
236QDBusConnection QDBusConnection::connectToBus(
const QString &address,
239 auto *manager = QDBusConnectionManager::instance();
241 if (!manager || !qdbus_loadLibDBus()) {
242 QDBusConnectionPrivate *d =
nullptr;
243 return QDBusConnection(d);
245 return QDBusConnection(manager->connectToBus(address, name));
253QDBusConnection QDBusConnection::connectToPeer(
const QString &address,
256 auto *manager = QDBusConnectionManager::instance();
258 if (!manager || !qdbus_loadLibDBus()) {
259 QDBusConnectionPrivate *d =
nullptr;
260 return QDBusConnection(d);
262 return QDBusConnection(manager->connectToPeer(address, name));
339bool QDBusConnection::callWithCallback(
const QDBusMessage &message, QObject *receiver,
340 const char *returnMethod,
const char *errorMethod,
343 if (!d || !d->connection) {
344 QDBusError err = QDBusError(QDBusError::Disconnected,
345 QDBusUtil::disconnectedErrorMessage());
350 return d->sendWithReplyAsync(message, receiver, returnMethod, errorMethod, timeout) !=
nullptr;
370bool QDBusConnection::callWithCallback(
const QDBusMessage &message, QObject *receiver,
371 const char *returnMethod,
int timeout)
const
373 return callWithCallback(message, receiver, returnMethod,
nullptr, timeout);
399QDBusMessage QDBusConnection::call(
const QDBusMessage &message, QDBus::CallMode mode,
int timeout)
const
401 if (!d || !d->connection) {
402 QDBusError err = QDBusError(QDBusError::Disconnected,
403 QDBusUtil::disconnectedErrorMessage());
407 return QDBusMessage::createError(err);
410 if (mode != QDBus::NoBlock)
411 return d->sendWithReply(message, mode, timeout);
415 retval << QVariant();
460bool QDBusConnection::connect(
const QString &service,
const QString &path,
const QString& interface,
461 const QString &name, QObject *receiver,
const char *slot)
463 return connect(service, path, interface, name, QStringList(), QString(), receiver, slot);
483bool QDBusConnection::connect(
const QString &service,
const QString &path,
const QString& interface,
484 const QString &name,
const QString &signature,
485 QObject *receiver,
const char *slot)
487 return connect(service, path, interface, name, QStringList(), signature, receiver, slot);
513bool QDBusConnection::connect(
const QString &service,
const QString &path,
const QString& interface,
514 const QString &name,
const QStringList &argumentMatch,
const QString &signature,
515 QObject *receiver,
const char *slot)
518 if (!receiver || !slot || !d || !d->connection)
520 if (interface.isEmpty() && name.isEmpty())
522 if (!interface.isEmpty() && !QDBusUtil::isValidInterfaceName(interface)) {
524 qWarning(
"QDBusConnection::connect: interface name '%s' is not valid", interface.toLatin1().constData());
528 if (!service.isEmpty() && !QDBusUtil::isValidBusName(service)) {
530 qWarning(
"QDBusConnection::connect: service name '%s' is not valid", service.toLatin1().constData());
534 if (!path.isEmpty() && !QDBusUtil::isValidObjectPath(path)) {
536 qWarning(
"QDBusConnection::connect: object path '%s' is not valid", path.toLatin1().constData());
541 return d->connectSignal(service, path, interface, name, argumentMatch, signature, receiver, slot);
551bool QDBusConnection::disconnect(
const QString &service,
const QString &path,
const QString &interface,
552 const QString &name, QObject *receiver,
const char *slot)
554 return disconnect(service, path, interface, name, QStringList(), QString(), receiver, slot);
567bool QDBusConnection::disconnect(
const QString &service,
const QString &path,
const QString& interface,
568 const QString &name,
const QString &signature,
569 QObject *receiver,
const char *slot)
571 return disconnect(service, path, interface, name, QStringList(), signature, receiver, slot);
585bool QDBusConnection::disconnect(
const QString &service,
const QString &path,
const QString& interface,
586 const QString &name,
const QStringList &argumentMatch,
const QString &signature,
587 QObject *receiver,
const char *slot)
589 if (!receiver || !slot || !d || !d->connection)
591 if (!interface.isEmpty() && !QDBusUtil::isValidInterfaceName(interface))
593 if (interface.isEmpty() && name.isEmpty())
596 return d->disconnectSignal(service, path, interface, name, argumentMatch, signature, receiver, slot);
615bool QDBusConnection::registerObject(
const QString &path, QObject *object, RegisterOptions options)
617 return registerObject(path, QString(), object, options);
639bool QDBusConnection::registerObject(
const QString &path,
const QString &interface, QObject *object, RegisterOptions options)
641 Q_ASSERT_X(QDBusUtil::isValidObjectPath(path),
"QDBusConnection::registerObject",
642 "Invalid object path given");
643 if (!d || !d->connection || !object || !options || !QDBusUtil::isValidObjectPath(path))
646 auto pathComponents = QStringView{path}.split(u'/');
647 if (pathComponents.constLast().isEmpty())
648 pathComponents.removeLast();
649 QDBusWriteLocker locker(RegisterObjectAction, d);
652 QDBusConnectionPrivate::ObjectTreeNode *node = &d->rootNode;
655 if (pathComponents.size() == i) {
662 if (options & QDBusConnectionPrivate::VirtualObject) {
663 if (options & SubPath && !node->children.isEmpty())
666 if ((options & ExportChildObjects && !node->children.isEmpty()))
671 node->flags = options;
672 node->interfaceName = interface;
674 d->registerObject(node);
680 if (node->obj && (node->flags & QDBusConnectionPrivate::VirtualObject) && (node->flags & QDBusConnection::SubPath)) {
687 QDBusConnectionPrivate::ObjectTreeNode::DataList::Iterator it =
688 std::lower_bound(node->children.begin(), node->children.end(), pathComponents.at(i));
689 if (it != node->children.end() && it->name == pathComponents.at(i)) {
694 if (node->flags & ExportChildObjects) {
702 it = node->children.insert(it, pathComponents.at(i).toString());
710 Q_ASSERT_X(
false,
"QDBusConnection::registerObject",
"The impossible happened");
722bool QDBusConnection::registerVirtualObject(
const QString &path, QDBusVirtualObject *treeNode,
723 VirtualObjectRegisterOption options)
725 int opts = options | QDBusConnectionPrivate::VirtualObject;
726 return registerObject(path, (QObject*) treeNode, (RegisterOptions) opts);
735void QDBusConnection::unregisterObject(
const QString &path, UnregisterMode mode)
737 if (!d || !d->connection || !QDBusUtil::isValidObjectPath(path))
740 QDBusWriteLocker locker(UnregisterObjectAction, d);
741 d->unregisterObject(path, mode);
748QObject *QDBusConnection::objectRegisteredAt(
const QString &path)
const
750 Q_ASSERT_X(QDBusUtil::isValidObjectPath(path),
"QDBusConnection::registeredObject",
751 "Invalid object path given");
752 if (!d || !d->connection || !QDBusUtil::isValidObjectPath(path))
755 auto pathComponents = QStringView{path}.split(u'/');
756 if (pathComponents.constLast().isEmpty())
757 pathComponents.removeLast();
760 QDBusReadLocker lock(ObjectRegisteredAtAction, d);
761 const QDBusConnectionPrivate::ObjectTreeNode *node = &d->rootNode;
765 if (pathComponents.size() == i)
767 if ((node->flags & QDBusConnectionPrivate::VirtualObject) && (node->flags & QDBusConnection::SubPath))
770 QDBusConnectionPrivate::ObjectTreeNode::DataList::ConstIterator it =
771 std::lower_bound(node->children.constBegin(), node->children.constEnd(), pathComponents.at(i));
772 if (it == node->children.constEnd() || it->name != pathComponents.at(i))
949void QDBusConnectionPrivate::createBusService()
951 Q_ASSERT(mode == ClientMode);
952 QDBusConnection connection(
this);
953 busService =
new QDBusConnectionInterface(connection,
this);
957 QObject::connect(
this, &QDBusConnectionPrivate::callWithCallbackFailed,
958 busService, emit &QDBusConnectionInterface::callWithCallbackFailed,
959 Qt::QueuedConnection);