diff options
author | Olli Salli <ollisal@gmail.com> | 2011-08-22 21:25:42 +0300 |
---|---|---|
committer | Olli Salli <ollisal@gmail.com> | 2011-10-10 19:17:41 +0300 |
commit | 1b77f30f2a0693357673cc631dac215927ea6a54 (patch) | |
tree | ec01865964672719e611915fae9a12cdcab1ed4c /examples | |
parent | 58840bc9dc2c486c09da681108b130c94dfb59db (diff) |
Tube initiator example: Demonstrate connection monitoring
Diffstat (limited to 'examples')
-rw-r--r-- | examples/stream-tubes/tube-initiator.cpp | 75 | ||||
-rw-r--r-- | examples/stream-tubes/tube-initiator.h | 11 |
2 files changed, 65 insertions, 21 deletions
diff --git a/examples/stream-tubes/tube-initiator.cpp b/examples/stream-tubes/tube-initiator.cpp index 34f86180..6fbceaed 100644 --- a/examples/stream-tubes/tube-initiator.cpp +++ b/examples/stream-tubes/tube-initiator.cpp @@ -22,13 +22,16 @@ #include <TelepathyQt4/Account> #include <TelepathyQt4/AccountFactory> -#include <TelepathyQt4/Debug> +#include <TelepathyQt4/ClientRegistrar> +#include <TelepathyQt4/ContactFactory> #include <TelepathyQt4/Connection> #include <TelepathyQt4/ConnectionFactory> -#include <TelepathyQt4/ClientRegistrar> #include <TelepathyQt4/Constants> +#include <TelepathyQt4/Contact> #include <TelepathyQt4/ContactCapabilities> +#include <TelepathyQt4/ContactFactory> #include <TelepathyQt4/ContactManager> +#include <TelepathyQt4/Debug> #include <TelepathyQt4/OutgoingStreamTubeChannel> #include <TelepathyQt4/PendingChannelRequest> #include <TelepathyQt4/PendingContacts> @@ -56,12 +59,14 @@ TubeInitiator::TubeInitiator(const QString &accountName, const QString &receiver // We only care about CONNECTED connections, so let's specify that in a Connection Factory ConnectionFactoryPtr connectionFactory = ConnectionFactory::create( QDBusConnection::sessionBus(), Connection::FeatureCore | Connection::FeatureConnected); + ChannelFactoryPtr channelFactory = ChannelFactory::create(QDBusConnection::sessionBus()); + ContactFactoryPtr contactFactory = ContactFactory::create(Contact::FeatureAlias); mTubeServer = StreamTubeServer::create( QStringList() << QLatin1String("tp-qt4-stube-example"), QString() /* autogenerated Client name */, - false /* don't monitor connections for now */, - accountFactory, connectionFactory); + true /* do monitor connections */, + accountFactory, connectionFactory, channelFactory, contactFactory); connect(mTubeServer.data(), SIGNAL(tubeRequested(Tp::AccountPtr,Tp::OutgoingStreamTubeChannelPtr,QDateTime,Tp::ChannelRequestHints)), @@ -70,11 +75,16 @@ TubeInitiator::TubeInitiator(const QString &accountName, const QString &receiver SIGNAL(tubeClosed(Tp::AccountPtr,Tp::OutgoingStreamTubeChannelPtr,QString,QString)), SLOT(onTubeClosed(Tp::AccountPtr,Tp::OutgoingStreamTubeChannelPtr,QString,QString))); + connect(mTubeServer.data(), + SIGNAL(newTcpConnection(QHostAddress,quint16,Tp::AccountPtr,Tp::ContactPtr,Tp::OutgoingStreamTubeChannelPtr)), + SLOT(onTubeNewConnection(QHostAddress,quint16,Tp::AccountPtr,Tp::ContactPtr))); + connect(mTubeServer.data(), + SIGNAL(tcpConnectionClosed(QHostAddress,quint16,Tp::AccountPtr,Tp::ContactPtr,QString,QString,Tp::OutgoingStreamTubeChannelPtr)), + SLOT(onTubeConnectionClosed(QHostAddress,quint16,Tp::AccountPtr,Tp::ContactPtr,QString,QString))); + mTubeServer->exportTcpSocket(mServer); Q_ASSERT(mTubeServer->isRegistered()); - // TODO: Start monitoring connections and connect to the connection monitoring signals - connect(accountFactory->proxy( TP_QT4_ACCOUNT_MANAGER_BUS_NAME, TP_QT4_ACCOUNT_OBJECT_PATH_BASE + QLatin1Char('/') + accountName, @@ -205,14 +215,27 @@ void TubeInitiator::onTubeClosed( qDebug() << "Closed tube channel " << tube->objectPath(); } -/* -void TubeInitiator::onStreamTubeChannelNewConnection(uint connectionId) +void TubeInitiator::onTubeNewConnection( + const QHostAddress &srcAddr, + quint16 srcPort, + const Tp::AccountPtr &account, + const Tp::ContactPtr &contact) { - qDebug() << "New remote connection with ID " << connectionId; - qDebug() << mChan->connectionsForSourceAddresses(); - qDebug() << mChan->contactsForConnections(); + qDebug() << "Source port" << srcPort << "is" << contact->alias(); + mConnAliases.insert(qMakePair(srcAddr, srcPort), contact->alias()); +} + +void TubeInitiator::onTubeConnectionClosed( + const QHostAddress &srcAddr, + quint16 srcPort, + const Tp::AccountPtr &account, + const Tp::ContactPtr &contact, + const QString &error, + const QString &message) +{ + qDebug() << "Connection from source port" << srcPort << "closed with" << error << ':' << message; + mConnAliases.remove(qMakePair(srcAddr, srcPort)); } -*/ void TubeInitiator::onTcpServerNewConnection() { @@ -223,10 +246,29 @@ void TubeInitiator::onTcpServerNewConnection() void TubeInitiator::onDataFromSocket() { - QIODevice *source = qobject_cast<QIODevice*>(sender()); + QAbstractSocket *source = qobject_cast<QAbstractSocket *>(sender()); QString data = QLatin1String(source->readLine()); data.remove(QLatin1Char('\n')); - qDebug() << "New data from socket: " << data; + + // Look up the alias of the remote sending us data based on the tube connection tracking. Of + // course, this is slightly overengineered; given that this example uses one-to-one tubes (not + // group/MUC tubes), all remote connections are always from the same contact we opened the tube + // to in the first place. + QPair<QHostAddress, quint16> peerAddr(source->peerAddress(), source->peerPort()); + if (mConnAliases.contains(peerAddr)) { + qDebug() << "New data from contact" << mConnAliases.value(peerAddr) << ':' << data; + } else { + // We haven't found out the identity for this connection yet. This may happen, because the + // TCP server listen socket and the D-Bus connection are on separate sockets and have no + // mutual ordering guarantees. + // + // A GUI application would likely use a placeholder item and lazily replace it with a + // representation of the contact when newTcpConnection for this source address has been + // received. A non-interactive daemon or alike might, in turn, queue incoming data until the + // contact is known, or just carry on if the contact's details aren't needed (yet). + qDebug() << "New data from source port" << peerAddr.second << ':' << data; + } + if (data == QLatin1String("Hi there!!")) { source->write(QByteArray("Hey back mate.\n")); } else { @@ -234,11 +276,6 @@ void TubeInitiator::onDataFromSocket() } } -void TubeInitiator::onInvalidated() -{ - QCoreApplication::quit(); -} - int main(int argc, char **argv) { QCoreApplication app(argc, argv); diff --git a/examples/stream-tubes/tube-initiator.h b/examples/stream-tubes/tube-initiator.h index fde161f0..1d557256 100644 --- a/examples/stream-tubes/tube-initiator.h +++ b/examples/stream-tubes/tube-initiator.h @@ -26,6 +26,10 @@ #include <TelepathyQt4/Contact> #include <TelepathyQt4/Types> +#include <QHash> +#include <QHostAddress> +#include <QPair> + class QTcpServer; using namespace Tp; @@ -53,10 +57,12 @@ private Q_SLOTS: const QDateTime &, const Tp::ChannelRequestHints &); void onTubeClosed(const Tp::AccountPtr &, const Tp::OutgoingStreamTubeChannelPtr &, const QString &, const QString &); - //void onStreamTubeChannelNewConnection(uint); + void onTubeNewConnection(const QHostAddress &, quint16, + const Tp::AccountPtr &, const Tp::ContactPtr &); + void onTubeConnectionClosed(const QHostAddress &, quint16, const Tp::AccountPtr &, + const Tp::ContactPtr &, const QString &, const QString &); void onTcpServerNewConnection(); void onDataFromSocket(); - void onInvalidated(); private: void createStreamTubeChannel(); @@ -70,6 +76,7 @@ private: ContactPtr mContact; bool mTubeRequested; + QHash<QPair<QHostAddress, quint16>, QString> mConnAliases; }; #endif |