kopete/protocols/messenger/libpapillon
connection.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "Papillon/Connection"
00016
00017
00018 #include <QtDebug>
00019
00020
00021 #include "Papillon/Task"
00022 #include "Papillon/ClientStream"
00023 #include "Papillon/NetworkMessage"
00024 #include "Papillon/Client"
00025
00026 namespace Papillon
00027 {
00028
00029 class Connection::Private
00030 {
00031 public:
00032 Private()
00033 : rootTask(0), stream(0), client(0), transactionId(0),
00034 isConnected(false)
00035 {}
00036
00037 ~Private()
00038 {
00039 delete rootTask;
00040 delete stream;
00041 }
00042
00043 Task *rootTask;
00044 ClientStream *stream;
00045 Client *client;
00046
00047 int transactionId;
00048 bool isConnected;
00049 QString server;
00050 int port;
00051 };
00052
00053 Connection::Connection(ClientStream *stream, QObject *parent)
00054 : QObject(parent), d(new Private)
00055 {
00056 d->rootTask = new Task(this, true);
00057 d->stream = stream;
00058
00059 connect(d->stream, SIGNAL(readyRead()), this, SLOT(networkMessageReceived()));
00060 connect(d->stream, SIGNAL(connected()), this, SLOT(slotConnected()));
00061 connect(d->stream, SIGNAL(connectionClosed()), this, SLOT(slotDisconnected()));
00062 }
00063
00064 Connection::~Connection()
00065 {
00066 delete d;
00067 }
00068
00069 Task *Connection::rootTask()
00070 {
00071 return d->rootTask;
00072 }
00073
00074 Client *Connection::client()
00075 {
00076 return d->client;
00077 }
00078
00079 void Connection::setClient(Client *client)
00080 {
00081 d->client = client;
00082 }
00083
00084 int Connection::transactionId()
00085 {
00086 return ++d->transactionId;
00087 }
00088
00089 bool Connection::isConnected()
00090 {
00091 return d->isConnected;
00092 }
00093
00094 void Connection::connectToServer(const QString &server, quint16 port)
00095 {
00096 d->server = server;
00097 d->port = port;
00098
00099 d->stream->connectToServer(d->server, d->port);
00100 }
00101
00102 void Connection::disconnectFromServer()
00103 {
00104 d->stream->close();
00105 }
00106
00107 void Connection::send(NetworkMessage *transfer)
00108 {
00109 d->stream->write(transfer);
00110 }
00111
00112 void Connection::networkMessageReceived()
00113 {
00114 NetworkMessage *readNetworkMessage = d->stream->read();
00115 if(readNetworkMessage)
00116 {
00117 qDebug() << Q_FUNC_INFO << "Dispatch received NetworkMessage to tasks.";
00118 dispatchNetworkMessage( readNetworkMessage );
00119 }
00120 else
00121 {
00122 qDebug() << Q_FUNC_INFO << "Got a null NetworkMessage, investigate.";
00123 }
00124 }
00125
00126 void Connection::dispatchNetworkMessage(NetworkMessage *networkMessage)
00127 {
00128 if( !d->rootTask->take(networkMessage) )
00129 {
00130 qDebug() << Q_FUNC_INFO << "Root task refused the NetworkMessage." << "NetworkMessage was:" << networkMessage->toString();
00131 }
00132
00133 delete networkMessage;
00134 }
00135
00136 void Connection::slotConnected()
00137 {
00138 qDebug() << Q_FUNC_INFO << "We are connected to" << d->server;
00139
00140 d->isConnected = true;
00141 emit connected();
00142 }
00143
00144 void Connection::slotDisconnected()
00145 {
00146 qDebug() << Q_FUNC_INFO << "We got disconnected from" << d->server;
00147
00148 d->isConnected = false;
00149 emit disconnected();
00150 }
00151
00152 }
00153
00154 #include "connection.moc"