summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Parser')
-rw-r--r--Swiften/Parser/ComponentHandshakeParser.cpp30
-rw-r--r--Swiften/Parser/ComponentHandshakeParser.h26
-rw-r--r--Swiften/Parser/SConscript1
-rw-r--r--Swiften/Parser/UnitTest/XMPPParserTest.cpp19
-rw-r--r--Swiften/Parser/XMPPParser.cpp4
5 files changed, 68 insertions, 12 deletions
diff --git a/Swiften/Parser/ComponentHandshakeParser.cpp b/Swiften/Parser/ComponentHandshakeParser.cpp
new file mode 100644
index 0000000..e88adb3
--- /dev/null
+++ b/Swiften/Parser/ComponentHandshakeParser.cpp
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include "Swiften/Parser/ComponentHandshakeParser.h"
+#include "Swiften/StringCodecs/Base64.h"
+
+namespace Swift {
+
+ComponentHandshakeParser::ComponentHandshakeParser() : GenericElementParser<ComponentHandshake>(), depth(0) {
+}
+
+void ComponentHandshakeParser::handleStartElement(const String&, const String&, const AttributeMap&) {
+ ++depth;
+}
+
+void ComponentHandshakeParser::handleEndElement(const String&, const String&) {
+ --depth;
+ if (depth == 0) {
+ getElementGeneric()->setData(text);
+ }
+}
+
+void ComponentHandshakeParser::handleCharacterData(const String& text) {
+ this->text += text;
+}
+
+}
diff --git a/Swiften/Parser/ComponentHandshakeParser.h b/Swiften/Parser/ComponentHandshakeParser.h
new file mode 100644
index 0000000..de5b8e1
--- /dev/null
+++ b/Swiften/Parser/ComponentHandshakeParser.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include "Swiften/Parser/GenericElementParser.h"
+#include "Swiften/Elements/ComponentHandshake.h"
+#include "Swiften/Base/String.h"
+
+namespace Swift {
+ class ComponentHandshakeParser : public GenericElementParser<ComponentHandshake> {
+ public:
+ ComponentHandshakeParser();
+
+ virtual void handleStartElement(const String&, const String& ns, const AttributeMap&);
+ virtual void handleEndElement(const String&, const String& ns);
+ virtual void handleCharacterData(const String&);
+
+ private:
+ int depth;
+ String text;
+ };
+}
diff --git a/Swiften/Parser/SConscript b/Swiften/Parser/SConscript
index 9cd6b31..0256cbf 100644
--- a/Swiften/Parser/SConscript
+++ b/Swiften/Parser/SConscript
@@ -16,6 +16,7 @@ sources = [
"MessageParser.cpp",
"PayloadParser.cpp",
"StanzaAckParser.cpp",
+ "ComponentHandshakeParser.cpp",
"PayloadParserFactory.cpp",
"PayloadParserFactoryCollection.cpp",
"PayloadParsers/BodyParser.cpp",
diff --git a/Swiften/Parser/UnitTest/XMPPParserTest.cpp b/Swiften/Parser/UnitTest/XMPPParserTest.cpp
index cd42b90..90a4b03 100644
--- a/Swiften/Parser/UnitTest/XMPPParserTest.cpp
+++ b/Swiften/Parser/UnitTest/XMPPParserTest.cpp
@@ -22,8 +22,7 @@
using namespace Swift;
-class XMPPParserTest : public CppUnit::TestFixture
-{
+class XMPPParserTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(XMPPParserTest);
CPPUNIT_TEST(testParse_SimpleSession);
CPPUNIT_TEST(testParse_SimpleClientFromServerSession);
@@ -37,8 +36,6 @@ class XMPPParserTest : public CppUnit::TestFixture
CPPUNIT_TEST_SUITE_END();
public:
- XMPPParserTest() {}
-
void testParse_SimpleSession() {
XMPPParser testling(&client_, &factories_);
@@ -51,7 +48,7 @@ class XMPPParserTest : public CppUnit::TestFixture
CPPUNIT_ASSERT_EQUAL(5, static_cast<int>(client_.events.size()));
CPPUNIT_ASSERT_EQUAL(Client::StreamStart, client_.events[0].type);
- CPPUNIT_ASSERT_EQUAL(String("example.com"), client_.events[0].to);
+ CPPUNIT_ASSERT_EQUAL(String("example.com"), client_.events[0].header->getTo());
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[1].type);
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[2].type);
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[3].type);
@@ -66,8 +63,8 @@ class XMPPParserTest : public CppUnit::TestFixture
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(client_.events.size()));
CPPUNIT_ASSERT_EQUAL(Client::StreamStart, client_.events[0].type);
- CPPUNIT_ASSERT_EQUAL(String("example.com"), client_.events[0].from);
- CPPUNIT_ASSERT_EQUAL(String("aeab"), client_.events[0].id);
+ CPPUNIT_ASSERT_EQUAL(String("example.com"), client_.events[0].header->getFrom());
+ CPPUNIT_ASSERT_EQUAL(String("aeab"), client_.events[0].header->getID());
}
@@ -159,21 +156,19 @@ class XMPPParserTest : public CppUnit::TestFixture
struct Event {
Event(Type type, boost::shared_ptr<Element> element)
: type(type), element(element) {}
- Event(Type type, const String& from, const String& to, const String& id) : type(type), from(from), to(to), id(id) {}
+ Event(Type type, const ProtocolHeader& header) : type(type), header(header) {}
Event(Type type) : type(type) {}
Type type;
- String from;
- String to;
- String id;
+ boost::optional<ProtocolHeader> header;
boost::shared_ptr<Element> element;
};
Client() {}
void handleStreamStart(const ProtocolHeader& header) {
- events.push_back(Event(StreamStart, header.getFrom(), header.getTo(), header.getID()));
+ events.push_back(Event(StreamStart, header));
}
void handleElement(boost::shared_ptr<Element> element) {
diff --git a/Swiften/Parser/XMPPParser.cpp b/Swiften/Parser/XMPPParser.cpp
index 795bee6..93797b3 100644
--- a/Swiften/Parser/XMPPParser.cpp
+++ b/Swiften/Parser/XMPPParser.cpp
@@ -37,6 +37,7 @@
#include "Swiften/Parser/CompressedParser.h"
#include "Swiften/Parser/UnknownElementParser.h"
#include "Swiften/Parser/TLSProceedParser.h"
+#include "Swiften/Parser/ComponentHandshakeParser.h"
// TODO: Whenever an error occurs in the handlers, stop the parser by returing
// a bool value, and stopping the XML parser
@@ -177,6 +178,9 @@ ElementParser* XMPPParser::createElementParser(const String& element, const Stri
else if (element == "r" && ns == "urn:xmpp:sm:2") {
return new StanzaAckRequestParser();
}
+ else if (element == "handshake") {
+ return new ComponentHandshakeParser();
+ }
return new UnknownElementParser();
}