aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-12 09:08:45 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-12 09:08:45 +0000
commit73bf9fb779ee4cb2c203caea847fd524b7c9ba3e (patch)
treea3dd33b6366cb214d4fa510196bcea151f054088 /src
parent1c21da4e6f2958f9c85daf8efb082cd3bab287f3 (diff)
downloadqxmpp-73bf9fb779ee4cb2c203caea847fd524b7c9ba3e.tar.gz
split stream parser
Diffstat (limited to 'src')
-rw-r--r--src/QXmppStream.cpp53
-rw-r--r--src/QXmppStream.h4
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();