summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2009-11-20 22:28:29 (GMT)
committerRemko Tronçon <git@el-tramo.be>2009-11-20 22:28:29 (GMT)
commit4e944a225d91ff4622e50186120ef0bbbb3a1d69 (patch)
tree2221e2ccdbaade17c419f45bfea139c3f952f85f /Swiften/Parser/XMPPParser.cpp
parentc84fb752cc881dfca9727b69fcdb3230830b7cc4 (diff)
downloadswift-4e944a225d91ff4622e50186120ef0bbbb3a1d69.zip
swift-4e944a225d91ff4622e50186120ef0bbbb3a1d69.tar.bz2
Added challenge & response parser & serializer.
Diffstat (limited to 'Swiften/Parser/XMPPParser.cpp')
-rw-r--r--Swiften/Parser/XMPPParser.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/Swiften/Parser/XMPPParser.cpp b/Swiften/Parser/XMPPParser.cpp
index f97bed8..83de263 100644
--- a/Swiften/Parser/XMPPParser.cpp
+++ b/Swiften/Parser/XMPPParser.cpp
@@ -1,67 +1,69 @@
#include "Swiften/Parser/XMPPParser.h"
#include <iostream>
#include <cassert>
#include "Swiften/Elements/ProtocolHeader.h"
#include "Swiften/Base/String.h"
#include "Swiften/Parser/XMLParser.h"
#include "Swiften/Parser/PlatformXMLParserFactory.h"
#include "Swiften/Parser/XMPPParserClient.h"
#include "Swiften/Parser/XMPPParser.h"
#include "Swiften/Parser/ElementParser.h"
#include "Swiften/Parser/PresenceParser.h"
#include "Swiften/Parser/IQParser.h"
#include "Swiften/Parser/MessageParser.h"
#include "Swiften/Parser/StreamFeaturesParser.h"
#include "Swiften/Parser/AuthRequestParser.h"
#include "Swiften/Parser/AuthSuccessParser.h"
#include "Swiften/Parser/AuthFailureParser.h"
+#include "Swiften/Parser/AuthChallengeParser.h"
+#include "Swiften/Parser/AuthResponseParser.h"
#include "Swiften/Parser/StartTLSParser.h"
#include "Swiften/Parser/StartTLSFailureParser.h"
#include "Swiften/Parser/CompressParser.h"
#include "Swiften/Parser/CompressFailureParser.h"
#include "Swiften/Parser/CompressedParser.h"
#include "Swiften/Parser/UnknownElementParser.h"
#include "Swiften/Parser/TLSProceedParser.h"
// TODO: Whenever an error occurs in the handlers, stop the parser by returing
// a bool value, and stopping the XML parser
namespace Swift {
XMPPParser::XMPPParser(
XMPPParserClient* client,
PayloadParserFactoryCollection* payloadParserFactories) :
xmlParser_(0),
client_(client),
payloadParserFactories_(payloadParserFactories),
currentDepth_(0),
currentElementParser_(0),
parseErrorOccurred_(false) {
xmlParser_ = PlatformXMLParserFactory().createXMLParser(this);
}
XMPPParser::~XMPPParser() {
delete currentElementParser_;
delete xmlParser_;
}
bool XMPPParser::parse(const String& data) {
bool xmlParseResult = xmlParser_->parse(data);
return xmlParseResult && !parseErrorOccurred_;
}
void XMPPParser::handleStartElement(const String& element, const String& ns, const AttributeMap& attributes) {
if (!inStream()) {
if (element == "stream" && ns == "http://etherx.jabber.org/streams") {
ProtocolHeader header;
header.setFrom(attributes.getAttribute("from"));
header.setTo(attributes.getAttribute("to"));
header.setID(attributes.getAttribute("id"));
header.setVersion(attributes.getAttribute("version"));
client_->handleStreamStart(header);
}
else {
parseErrorOccurred_ = true;
}
@@ -82,70 +84,76 @@ void XMPPParser::handleEndElement(const String& element, const String& ns) {
if (inElement()) {
assert(currentElementParser_);
currentElementParser_->handleEndElement(element, ns);
--currentDepth_;
if (!inElement()) {
client_->handleElement(currentElementParser_->getElement());
delete currentElementParser_;
currentElementParser_ = 0;
}
}
else {
assert(element == "stream");
--currentDepth_;
client_->handleStreamEnd();
}
}
void XMPPParser::handleCharacterData(const String& data) {
if (currentElementParser_) {
currentElementParser_->handleCharacterData(data);
}
//else {
// std::cerr << "XMPPParser: Ignoring stray character data: " << data << std::endl;
//}
}
ElementParser* XMPPParser::createElementParser(const String& element, const String& ns) {
if (element == "presence") {
return new PresenceParser(payloadParserFactories_);
}
else if (element == "iq") {
return new IQParser(payloadParserFactories_);
}
else if (element == "message") {
return new MessageParser(payloadParserFactories_);
}
else if (element == "features" && ns == "http://etherx.jabber.org/streams") {
return new StreamFeaturesParser();
}
else if (element == "auth") {
return new AuthRequestParser();
}
else if (element == "success") {
return new AuthSuccessParser();
}
else if (element == "failure" && ns == "urn:ietf:params:xml:ns:xmpp-sasl") {
return new AuthFailureParser();
}
+ else if (element == "challenge" && ns == "urn:ietf:params:xml:ns:xmpp-sasl") {
+ return new AuthChallengeParser();
+ }
+ else if (element == "response" && ns == "urn:ietf:params:xml:ns:xmpp-sasl") {
+ return new AuthResponseParser();
+ }
else if (element == "starttls") {
return new StartTLSParser();
}
else if (element == "failure" && ns == "urn:ietf:params:xml:ns:xmpp-tls") {
return new StartTLSFailureParser();
}
else if (element == "compress") {
return new CompressParser();
}
else if (element == "compressed") {
return new CompressedParser();
}
else if (element == "failure" && ns == "http://jabber.org/protocol/compress") {
return new CompressFailureParser();
}
else if (element == "proceed") {
return new TLSProceedParser();
}
return new UnknownElementParser();
}
}