summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorOlli Salli <ollisal@gmail.com>2011-08-22 21:25:42 +0300
committerOlli Salli <ollisal@gmail.com>2011-10-10 19:17:41 +0300
commit1b77f30f2a0693357673cc631dac215927ea6a54 (patch)
treeec01865964672719e611915fae9a12cdcab1ed4c /examples
parent58840bc9dc2c486c09da681108b130c94dfb59db (diff)
Tube initiator example: Demonstrate connection monitoring
Diffstat (limited to 'examples')
-rw-r--r--examples/stream-tubes/tube-initiator.cpp75
-rw-r--r--examples/stream-tubes/tube-initiator.h11
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