/*! \since 4.8 Opens a peer-to-peer connection on address \a address and associate with it the connection name \a name. Returns a QDBusConnection object associated with that connection. */ QDBusConnection QDBusConnection::connectToPeer(const QString &address, const QString &name) { // Q_ASSERT_X(QCoreApplication::instance(), "QDBusConnection::addConnection", // "Cannot create connection without a Q[Core]Application instance"); if (!qdbus_loadLibDBus()) { QDBusConnectionPrivate *d = 0; return QDBusConnection(d); } QMutexLocker locker(&_q_manager()->mutex); QDBusConnectionPrivate *d = _q_manager()->connection(name); if (d || name.isEmpty()) return QDBusConnection(d); d = new QDBusConnectionPrivate; // setPeer does the error handling for us QDBusErrorInternal error; DBusConnection *c = q_dbus_connection_open_private(address.toUtf8().constData(), error); d->setPeer(c, error); _q_manager()->setConnection(name, d); QDBusConnection retval(d); return retval; }
/*! \internal Catch signal disconnections. */ void QDBusAbstractInterface::disconnectNotify(const QMetaMethod &signal) { // someone disconnecting from one of our signals Q_D(QDBusAbstractInterface); if (!d->isValid) return; QDBusConnectionPrivate *conn = d->connectionPrivate(); if (conn && signal.isValid() && !isSignalConnected(signal)) return conn->disconnectRelay(d->service, d->path, d->interface, this, signal); if (!conn) return; // wildcard disconnecting, we need to figure out which of our signals are // no longer connected to anything const QMetaObject *mo = metaObject(); int midx = QObject::staticMetaObject.methodCount(); const int end = mo->methodCount(); for ( ; midx < end; ++midx) { QMetaMethod mm = mo->method(midx); if (mm.methodType() == QMetaMethod::Signal && !isSignalConnected(mm)) conn->disconnectRelay(d->service, d->path, d->interface, this, mm); } }
QDBusConnection QDBusConnection::addConnection(BusType type, const QString &name) { // Q_ASSERT_X(QCoreApplication::instance(), "QDBusConnection::addConnection", // "Cannot create connection without a Q[Core]Application instance"); QDBusConnectionPrivate *d = manager()->connection(name); if (d) return QDBusConnection(name); d = new QDBusConnectionPrivate; DBusConnection *c = 0; switch (type) { case SystemBus: c = dbus_bus_get(DBUS_BUS_SYSTEM, &d->error); break; case SessionBus: c = dbus_bus_get(DBUS_BUS_SESSION, &d->error); break; case ActivationBus: c = dbus_bus_get(DBUS_BUS_STARTER, &d->error); break; } d->setConnection(c); //setConnection does the error handling for us manager()->setConnection(name, d); return QDBusConnection(name); }
/*! \internal Catch signal disconnections. */ void QDBusAbstractInterface::disconnectNotify(const char *signal) { // someone disconnecting from one of our signals Q_D(QDBusAbstractInterface); QDBusConnectionPrivate *conn = d->connectionPrivate(); if (conn) conn->disconnectRelay(d->service, d->currentOwner, d->path, d->interface, this, signal); }
QDBusConnectionManager::~QDBusConnectionManager() { for (QHash<QString, QDBusConnectionPrivate *>::const_iterator it = connectionHash.constBegin(); it != connectionHash.constEnd(); ++it) { QDBusConnectionPrivate *d = it.value(); if (!d->ref.deref()) d->deleteYourself(); else d->closeConnection(); } connectionHash.clear(); }
void QDBusConnectionManager::removeConnection(const QString &name) { QDBusConnectionPrivate *d = 0; d = connectionHash.take(name); if (d && !d->ref.deref()) d->deleteYourself(); // Static objects may be keeping the connection open. // However, it is harmless to have outstanding references to a connection that is // closing as long as those references will be soon dropped without being used. // ### Output a warning if connections are being used after they have been removed. }
/*! \internal Catch signal connections. */ void QDBusAbstractInterface::connectNotify(const char *signal) { // we end up recursing here, so optimise away if (qstrcmp(signal, SIGNAL(destroyed(QObject*))) == 0) return; // someone connecting to one of our signals Q_D(QDBusAbstractInterface); QDBusConnectionPrivate *conn = d->connectionPrivate(); if (conn) conn->connectRelay(d->service, d->currentOwner, d->path, d->interface, this, signal); }
/*! \internal Catch signal connections. */ void QDBusAbstractInterface::connectNotify(const char *signal) { // someone connecting to one of our signals Q_D(QDBusAbstractInterface); if (!d->isValid) return; // we end up recursing here, so optimize away if (qstrcmp(signal + 1, "destroyed(QObject*)") == 0) return; QDBusConnectionPrivate *conn = d->connectionPrivate(); if (conn) { conn->connectRelay(d->service, d->path, d->interface, this, signal); } }
/*! \internal Catch signal connections. */ void QDBusAbstractInterface::connectNotify(const QMetaMethod &signal) { // someone connecting to one of our signals Q_D(QDBusAbstractInterface); if (!d->isValid) return; // we end up recursing here, so optimize away static const QMetaMethod destroyedSignal = QMetaMethod::fromSignal(&QDBusAbstractInterface::destroyed); if (signal == destroyedSignal) return; QDBusConnectionPrivate *conn = d->connectionPrivate(); if (conn) { conn->connectRelay(d->service, d->path, d->interface, this, signal); } }
QDBusConnection QDBusConnection::addConnection(const QString &address, const QString &name) { // Q_ASSERT_X(QCoreApplication::instance(), "QDBusConnection::addConnection", // "Cannot create connection without a Q[Core]Application instance"); QDBusConnectionPrivate *d = manager()->connection(name); if (d) return QDBusConnection(name); d = new QDBusConnectionPrivate; // setConnection does the error handling for us d->setConnection(dbus_connection_open(address.utf8().data(), &d->error)); manager()->setConnection(name, d); return QDBusConnection(name); }
/*! Opens a connection of type \a type to one of the known busses and associate with it the connection name \a name. Returns a QDBusConnection object associated with that connection. */ QDBusConnection QDBusConnection::connectToBus(BusType type, const QString &name) { // Q_ASSERT_X(QCoreApplication::instance(), "QDBusConnection::addConnection", // "Cannot create connection without a Q[Core]Application instance"); if (!qdbus_loadLibDBus()) { QDBusConnectionPrivate *d = 0; return QDBusConnection(d); } QMutexLocker locker(&_q_manager()->mutex); QDBusConnectionPrivate *d = _q_manager()->connection(name); if (d || name.isEmpty()) return QDBusConnection(d); d = new QDBusConnectionPrivate; DBusConnection *c = 0; QDBusErrorInternal error; switch (type) { case SystemBus: c = q_dbus_bus_get_private(DBUS_BUS_SYSTEM, error); break; case SessionBus: c = q_dbus_bus_get_private(DBUS_BUS_SESSION, error); break; case ActivationBus: c = q_dbus_bus_get_private(DBUS_BUS_STARTER, error); break; } d->setConnection(c, error); //setConnection does the error handling for us _q_manager()->setConnection(name, d); QDBusConnection retval(d); // create the bus service // will lock in QDBusConnectionPrivate::connectRelay() d->setBusService(retval); return retval; }
void QDBusConnectionManager::bindToApplication() { if (default_connection) { default_connection->bindToApplication(); } /* FIXME-QT4 for (QHash<QString, QDBusConnectionPrivate *>::const_iterator it = connectionHash.constBegin(); it != connectionHash.constEnd(); ++it) { (*it)->bindToApplication(); }*/ for (ConnectionHash::ConstIterator it = connectionHash.begin(); it != connectionHash.end(); ++it) { it.data()->bindToApplication(); } }