kopete/protocols/messenger/libpapillon
papillonclientstream.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/ClientStream"
00016
00017
00018 #include <QtCore/QQueue>
00019 #include <QtCore/QPointer>
00020 #include <QtDebug>
00021
00022
00023 #include "Papillon/NetworkMessage"
00024 #include "Papillon/MessengerCoreProtocol"
00025 #include "Papillon/Base/Connector"
00026 #include "Papillon/Base/ByteStream"
00027
00028 namespace Papillon
00029 {
00030
00031 class ClientStream::Private
00032 {
00033 public:
00034 Private()
00035 : connector(0)
00036 {}
00037
00038 ~Private()
00039 {}
00040
00041 Connector *connector;
00042 ByteStream *byteStream;
00043 MessengerCoreProtocol protocol;
00044
00045 QQueue<NetworkMessage*> networkMessageQueue;
00046 };
00047
00048 ClientStream::ClientStream(Connector *connector, QObject *parent)
00049 : Stream(parent), d(new Private)
00050 {
00051 d->connector = connector;
00052 connect(d->connector, SIGNAL(connected()), this, SLOT(slotConnectorConnected()));
00053 connect( &d->protocol, SIGNAL( outgoingData( const QByteArray& ) ), this, SLOT(slotProtocolOutgoingData(const QByteArray&)) );
00054 connect( &d->protocol, SIGNAL( incomingData() ), this, SLOT(slotProtocolIncomingData()) );
00055 }
00056
00057
00058 ClientStream::~ClientStream()
00059 {
00060 delete d;
00061 }
00062
00063 void ClientStream::connectToServer(const QString &server, quint16 port)
00064 {
00065 d->connector->connectToServer(server, port);
00066 }
00067
00068 void ClientStream::slotConnectorConnected()
00069 {
00070 d->byteStream = d->connector->stream();
00071 connect(d->byteStream, SIGNAL(connectionClosed()), SLOT(slotByteStreamConnectionClosed()));
00072 connect(d->byteStream, SIGNAL(readyRead()), SLOT(slotByteStreamReadyRead()));
00073 connect(d->byteStream, SIGNAL(bytesWritten(int)), SLOT(slotByteStreamBytesWritten(int)));
00074
00075 QByteArray spare = d->byteStream->read();
00076
00077 QPointer<QObject> self = this;
00078 emit connected();
00079
00080 if(!self)
00081 return;
00082 }
00083
00084 void ClientStream::reset(bool all)
00085 {
00086
00087 if(d->byteStream)
00088 {
00089 d->byteStream->close();
00090 d->byteStream = 0;
00091 }
00092 d->connector->done();
00093
00094
00095 d->protocol.reset();
00096
00097 if(all)
00098 d->networkMessageQueue.clear();
00099 }
00100
00101 void ClientStream::slotProtocolIncomingData()
00102 {
00103 NetworkMessage * incoming = d->protocol.incomingNetworkMessage();
00104 if( incoming )
00105 {
00106 d->networkMessageQueue.enqueue( incoming );
00107 emit readyRead();
00108 }
00109 }
00110
00111 void ClientStream::slotProtocolOutgoingData(const QByteArray &data)
00112 {
00113 d->byteStream->write(data);
00114 }
00115
00116 void ClientStream::slotByteStreamConnectionClosed()
00117 {
00118 emit connectionClosed();
00119 }
00120
00121 void ClientStream::slotByteStreamReadyRead()
00122 {
00123 d->protocol.addIncomingData( d->byteStream->read() );
00124 }
00125
00126 void ClientStream::slotByteStreamBytesWritten(int bytes)
00127 {
00128
00129 }
00130
00131 void ClientStream::close()
00132 {
00133 d->connector->done();
00134 }
00135
00136 int ClientStream::errorCondition() const
00137 {
00138 return 0;
00139 }
00140
00141 QString ClientStream::errorText() const
00142 {
00143 return QString();
00144 }
00145
00146
00147 bool ClientStream::networkMessagesAvailable() const
00148 {
00149 return !d->networkMessageQueue.isEmpty();
00150 }
00151
00152 NetworkMessage *ClientStream::read()
00153 {
00154 if( d->networkMessageQueue.isEmpty() )
00155 return 0;
00156 else
00157 return d->networkMessageQueue.dequeue();
00158 }
00159
00160 void ClientStream::write(NetworkMessage *networkMessage)
00161 {
00162 qDebug() << Q_FUNC_INFO << "Sending:" << networkMessage->toString().replace("\r\n", "");
00163
00164 d->protocol.outgoingNetworkMessage(networkMessage);
00165 }
00166
00167 }
00168
00169 #include "papillonclientstream.moc"