aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppStream.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2011-09-06 15:50:52 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2011-09-06 15:50:52 +0000
commit2ba5ac7e09c1c9cf9d59d9bc1ed7937e1559458b (patch)
tree0c150bf945f36a10ecedfdac0b0d7521431f6d3d /src/QXmppStream.cpp
parent51caca53408f2626414b593adb825449712e0bc1 (diff)
downloadqxmpp-2ba5ac7e09c1c9cf9d59d9bc1ed7937e1559458b.tar.gz
Improve QXmppServer packet routing performance.
Diffstat (limited to 'src/QXmppStream.cpp')
-rw-r--r--src/QXmppStream.cpp56
1 files changed, 29 insertions, 27 deletions
diff --git a/src/QXmppStream.cpp b/src/QXmppStream.cpp
index 2221411a..f87efcd0 100644
--- a/src/QXmppStream.cpp
+++ b/src/QXmppStream.cpp
@@ -96,9 +96,13 @@ void QXmppStream::disconnectFromHost()
/// Handles a stream start event, which occurs when the underlying transport
/// becomes ready (socket connected, encryption started).
+///
+/// If you redefine handleStart(), make sure to call the base class's method.
void QXmppStream::handleStart()
{
+ d->dataBuffer.clear();
+ d->streamStart.clear();
}
/// Returns true if the stream is connected.
@@ -172,19 +176,22 @@ void QXmppStream::setSocket(QSslSocket *socket)
// socket events
bool check = connect(socket, SIGNAL(connected()),
- this, SLOT(socketConnected()));
+ this, SLOT(_q_socketConnected()));
Q_ASSERT(check);
check = connect(socket, SIGNAL(disconnected()),
- this, SLOT(socketDisconnected()));
+ this, SLOT(_q_socketDisconnected()));
Q_ASSERT(check);
check = connect(socket, SIGNAL(encrypted()),
- this, SLOT(socketEncrypted()));
+ this, SLOT(_q_socketEncrypted()));
Q_ASSERT(check);
+ check = connect(socket, SIGNAL(error(QAbstractSocket::SocketError)),
+ this, SLOT(_q_socketError(QAbstractSocket::SocketError)));
+
check = connect(socket, SIGNAL(readyRead()),
- this, SLOT(socketReadyRead()));
+ this, SLOT(_q_socketReadyRead()));
Q_ASSERT(check);
// relay signals
@@ -193,34 +200,34 @@ void QXmppStream::setSocket(QSslSocket *socket)
Q_ASSERT(check);
}
-void QXmppStream::socketConnected()
+void QXmppStream::_q_socketConnected()
{
info(QString("Socket connected to %1 %2").arg(
d->socket->peerAddress().toString(),
QString::number(d->socket->peerPort())));
- d->dataBuffer.clear();
handleStart();
}
-void QXmppStream::socketDisconnected()
+void QXmppStream::_q_socketDisconnected()
{
info("Socket disconnected");
- d->dataBuffer.clear();
}
-void QXmppStream::socketEncrypted()
+void QXmppStream::_q_socketEncrypted()
{
debug("Socket encrypted");
- d->dataBuffer.clear();
handleStart();
}
-void QXmppStream::socketReadyRead()
+void QXmppStream::_q_socketError(QAbstractSocket::SocketError socketError)
{
- const QByteArray data = d->socket->readAll();
- //debug("SERVER [COULD BE PARTIAL DATA]:" + data.left(20));
+ Q_UNUSED(socketError);
+ warning(QString("Socket error: " + socket()->errorString()));
+}
- d->dataBuffer.append(data);
+void QXmppStream::_q_socketReadyRead()
+{
+ d->dataBuffer.append(d->socket->readAll());
// FIXME : maybe these QRegExps could be static?
QRegExp startStreamRegex("^(<\\?xml.*\\?>)?\\s*<stream:stream.*>");
@@ -232,36 +239,31 @@ void QXmppStream::socketReadyRead()
QByteArray completeXml = d->dataBuffer;
const QString strData = QString::fromUtf8(d->dataBuffer);
bool streamStart = false;
- if(strData.contains(startStreamRegex))
- {
+ if (d->streamStart.isEmpty() && strData.contains(startStreamRegex))
streamStart = true;
- d->streamStart = startStreamRegex.cap(0).toUtf8();
- }
else
completeXml.prepend(d->streamStart);
- if(!strData.contains(endStreamRegex))
+ if (!strData.contains(endStreamRegex))
completeXml.append(streamRootElementEnd);
// check whether we have a valid XML document
QDomDocument doc;
- if(!doc.setContent(completeXml, true))
+ if (!doc.setContent(completeXml, true))
return;
// remove data from buffer
logReceived(strData);
d->dataBuffer.clear();
+ if (streamStart)
+ d->streamStart = startStreamRegex.cap(0).toUtf8();
// process stream start
- QDomElement nodeRecv = doc.documentElement().firstChildElement();
if (streamStart)
- {
- QDomElement streamElement = doc.documentElement();
- handleStream(streamElement);
- }
+ handleStream(doc.documentElement());
// process stanzas
- while(!nodeRecv.isNull())
- {
+ QDomElement nodeRecv = doc.documentElement().firstChildElement();
+ while (!nodeRecv.isNull()) {
handleStanza(nodeRecv);
nodeRecv = nodeRecv.nextSiblingElement();
}