diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-12 09:08:45 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-12 09:08:45 +0000 |
| commit | 73bf9fb779ee4cb2c203caea847fd524b7c9ba3e (patch) | |
| tree | a3dd33b6366cb214d4fa510196bcea151f054088 /src | |
| parent | 1c21da4e6f2958f9c85daf8efb082cd3bab287f3 (diff) | |
| download | qxmpp-73bf9fb779ee4cb2c203caea847fd524b7c9ba3e.tar.gz | |
split stream parser
Diffstat (limited to 'src')
| -rw-r--r-- | src/QXmppStream.cpp | 53 | ||||
| -rw-r--r-- | src/QXmppStream.h | 4 |
2 files changed, 34 insertions, 23 deletions
diff --git a/src/QXmppStream.cpp b/src/QXmppStream.cpp index f8d0c532..af266cc5 100644 --- a/src/QXmppStream.cpp +++ b/src/QXmppStream.cpp @@ -298,38 +298,47 @@ void QXmppStream::parser(const QByteArray& data) if (streamStart) { QDomElement streamElement = doc.documentElement(); - if(d->streamId.isEmpty()) - d->streamId = streamElement.attribute("id"); - if (d->streamFrom.isEmpty()) - d->streamFrom = streamElement.attribute("from"); - if(d->streamVersion.isEmpty()) - { - d->streamVersion = streamElement.attribute("version"); - - // no version specified, signals XMPP Version < 1.0. - // switch to old auth mechanism - if(d->streamVersion.isEmpty()) - sendNonSASLAuthQuery(); - } + handleStream(streamElement); } // process stanzas while(!nodeRecv.isNull()) { - - QString ns = nodeRecv.namespaceURI(); - // if we receive any kind of data, stop the timeout timer d->timeoutTimer->stop(); + // give client opportunity to handle stanza bool handled = false; emit elementReceived(nodeRecv, handled); + if(!handled) + handleStanza(nodeRecv); - if(handled) - { - // already handled by client, do nothing - } - else if(ns == ns_stream && nodeRecv.tagName() == "features") + nodeRecv = nodeRecv.nextSiblingElement(); + } +} + +void QXmppStream::handleStream(const QDomElement &streamElement) +{ + if(d->streamId.isEmpty()) + d->streamId = streamElement.attribute("id"); + if (d->streamFrom.isEmpty()) + d->streamFrom = streamElement.attribute("from"); + if(d->streamVersion.isEmpty()) + { + d->streamVersion = streamElement.attribute("version"); + + // no version specified, signals XMPP Version < 1.0. + // switch to old auth mechanism + if(d->streamVersion.isEmpty()) + sendNonSASLAuthQuery(); + } +} + +void QXmppStream::handleStanza(const QDomElement &nodeRecv) +{ + const QString ns = nodeRecv.namespaceURI(); + + if(ns == ns_stream && nodeRecv.tagName() == "features") { bool nonSaslAvailable = nodeRecv.firstChildElement("auth"). namespaceURI() == ns_authFeature; @@ -794,8 +803,6 @@ void QXmppStream::parser(const QByteArray& data) emit messageReceived(message); } } - nodeRecv = nodeRecv.nextSiblingElement(); - } } void QXmppStream::sendStartStream() diff --git a/src/QXmppStream.h b/src/QXmppStream.h index 3e06bb1b..0a597c2f 100644 --- a/src/QXmppStream.h +++ b/src/QXmppStream.h @@ -130,6 +130,10 @@ signals: // XEP-0166: Jingle void jingleIqReceived(const QXmppJingleIq&); +protected: + virtual void handleStanza(const QDomElement &element); + virtual void handleStream(const QDomElement &element); + private slots: void socketHostFound(); void socketReadReady(); |
