summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Swiften/Elements/StreamError.h68
-rw-r--r--Swiften/Parser/SConscript1
-rw-r--r--Swiften/Parser/StreamErrorParser.cpp106
-rw-r--r--Swiften/Parser/StreamErrorParser.h29
-rw-r--r--Swiften/Parser/XMPPParser.cpp4
-rw-r--r--Swiften/SConscript1
-rw-r--r--Swiften/Serializer/GenericElementSerializer.h6
-rw-r--r--Swiften/Serializer/GenericPayloadSerializer.h5
-rw-r--r--Swiften/Serializer/XMPPSerializer.cpp43
9 files changed, 238 insertions, 25 deletions
diff --git a/Swiften/Elements/StreamError.h b/Swiften/Elements/StreamError.h
new file mode 100644
index 0000000..a480d5a
--- /dev/null
+++ b/Swiften/Elements/StreamError.h
@@ -0,0 +1,68 @@
+/*
+ * 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 <boost/shared_ptr.hpp>
+
+#include <Swiften/Elements/Element.h>
+#include <Swiften/Base/String.h>
+
+namespace Swift {
+ class StreamError : public Element {
+ public:
+ typedef boost::shared_ptr<StreamError> ref;
+
+ enum Type {
+ BadFormat,
+ BadNamespacePrefix,
+ Conflict,
+ ConnectionTimeout,
+ HostGone,
+ HostUnknown,
+ ImproperAddressing,
+ InternalServerError,
+ InvalidFrom,
+ InvalidID,
+ InvalidNamespace,
+ InvalidXML,
+ NotAuthorized,
+ PolicyViolation,
+ RemoteConnectionFailed,
+ ResourceConstraint,
+ RestrictedXML,
+ SeeOtherHost,
+ SystemShutdown,
+ UndefinedCondition,
+ UnsupportedEncoding,
+ UnsupportedStanzaType,
+ UnsupportedVersion,
+ XMLNotWellFormed,
+ };
+
+ StreamError(Type type = UndefinedCondition, const String& text = String()) : type_(type), text_(text) { }
+
+ Type getType() const {
+ return type_;
+ }
+
+ void setType(Type type) {
+ type_ = type;
+ }
+
+ void setText(const String& text) {
+ text_ = text;
+ }
+
+ const String& getText() const {
+ return text_;
+ }
+
+ private:
+ Type type_;
+ String text_;
+ };
+}
diff --git a/Swiften/Parser/SConscript b/Swiften/Parser/SConscript
index 29398f0..6e77109 100644
--- a/Swiften/Parser/SConscript
+++ b/Swiften/Parser/SConscript
@@ -54,6 +54,7 @@ sources = [
"PresenceParser.cpp",
"SerializingParser.cpp",
"StanzaParser.cpp",
+ "StreamErrorParser.cpp",
"StreamFeaturesParser.cpp",
"XMLParser.cpp",
"XMLParserClient.cpp",
diff --git a/Swiften/Parser/StreamErrorParser.cpp b/Swiften/Parser/StreamErrorParser.cpp
new file mode 100644
index 0000000..b121ef2
--- /dev/null
+++ b/Swiften/Parser/StreamErrorParser.cpp
@@ -0,0 +1,106 @@
+/*
+ * 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/StreamErrorParser.h>
+
+namespace Swift {
+
+StreamErrorParser::StreamErrorParser() : level(TopLevel) {
+}
+
+void StreamErrorParser::handleStartElement(const String&, const String&, const AttributeMap&) {
+ ++level;
+}
+
+void StreamErrorParser::handleEndElement(const String& element, const String&) {
+ --level;
+ if (level == ElementLevel) {
+ if (element == "text") {
+ getElementGeneric()->setText(currentText);
+ }
+ else if (element == "bad-format") {
+ getElementGeneric()->setType(StreamError::BadFormat);
+ }
+ else if(element == "bad-namespace-prefix") {
+ getElementGeneric()->setType(StreamError::BadNamespacePrefix);
+ }
+ else if(element == "conflict") {
+ getElementGeneric()->setType(StreamError::Conflict);
+ }
+ else if(element == "connection-timeout") {
+ getElementGeneric()->setType(StreamError::ConnectionTimeout);
+ }
+ else if(element == "host-gone") {
+ getElementGeneric()->setType(StreamError::HostGone);
+ }
+ else if(element == "host-unknown") {
+ getElementGeneric()->setType(StreamError::HostUnknown);
+ }
+ else if(element == "improper-addressing") {
+ getElementGeneric()->setType(StreamError::ImproperAddressing);
+ }
+ else if(element == "internal-server-error") {
+ getElementGeneric()->setType(StreamError::InternalServerError);
+ }
+ else if(element == "invalid-from") {
+ getElementGeneric()->setType(StreamError::InvalidFrom);
+ }
+ else if(element == "invalid-id") {
+ getElementGeneric()->setType(StreamError::InvalidID);
+ }
+ else if(element == "invalid-namespace") {
+ getElementGeneric()->setType(StreamError::InvalidNamespace);
+ }
+ else if(element == "invalid-xml") {
+ getElementGeneric()->setType(StreamError::InvalidXML);
+ }
+ else if(element == "not-authorized") {
+ getElementGeneric()->setType(StreamError::NotAuthorized);
+ }
+ else if(element == "policy-violation") {
+ getElementGeneric()->setType(StreamError::PolicyViolation);
+ }
+ else if(element == "remote-connection-failed") {
+ getElementGeneric()->setType(StreamError::RemoteConnectionFailed);
+ }
+ else if(element == "resource-constraint") {
+ getElementGeneric()->setType(StreamError::ResourceConstraint);
+ }
+ else if(element == "restricted-xml") {
+ getElementGeneric()->setType(StreamError::RestrictedXML);
+ }
+ else if(element == "see-other-host") {
+ getElementGeneric()->setType(StreamError::SeeOtherHost);
+ }
+ else if(element == "system-shutdown") {
+ getElementGeneric()->setType(StreamError::SystemShutdown);
+ }
+ else if(element == "undefined-condition") {
+ getElementGeneric()->setType(StreamError::UndefinedCondition);
+ }
+ else if(element == "unsupported-encoding") {
+ getElementGeneric()->setType(StreamError::UnsupportedEncoding);
+ }
+ else if(element == "unsupported-stanza-type") {
+ getElementGeneric()->setType(StreamError::UnsupportedStanzaType);
+ }
+ else if(element == "unsupported-version") {
+ getElementGeneric()->setType(StreamError::UnsupportedVersion);
+ }
+ else if(element == "xml-not-well-formed") {
+ getElementGeneric()->setType(StreamError::XMLNotWellFormed);
+ }
+ else {
+ getElementGeneric()->setType(StreamError::UndefinedCondition);
+ }
+ }
+}
+
+void StreamErrorParser::handleCharacterData(const String& data) {
+ currentText += data;
+}
+
+}
diff --git a/Swiften/Parser/StreamErrorParser.h b/Swiften/Parser/StreamErrorParser.h
new file mode 100644
index 0000000..a2aaa67
--- /dev/null
+++ b/Swiften/Parser/StreamErrorParser.h
@@ -0,0 +1,29 @@
+/*
+ * 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/Elements/StreamError.h>
+#include <Swiften/Parser/GenericElementParser.h>
+
+namespace Swift {
+ class StreamErrorParser : public GenericElementParser<StreamError> {
+ public:
+ StreamErrorParser();
+
+ virtual void handleStartElement(const String& element, const String&, const AttributeMap& attributes);
+ virtual void handleEndElement(const String& element, const String&);
+ virtual void handleCharacterData(const String& data);
+
+ private:
+ enum Level {
+ TopLevel = 0,
+ ElementLevel = 1
+ };
+ int level;
+ String currentText;
+ };
+}
diff --git a/Swiften/Parser/XMPPParser.cpp b/Swiften/Parser/XMPPParser.cpp
index 6bd6082..26cebe2 100644
--- a/Swiften/Parser/XMPPParser.cpp
+++ b/Swiften/Parser/XMPPParser.cpp
@@ -20,6 +20,7 @@
#include "Swiften/Parser/IQParser.h"
#include "Swiften/Parser/MessageParser.h"
#include "Swiften/Parser/StreamFeaturesParser.h"
+#include "Swiften/Parser/StreamErrorParser.h"
#include "Swiften/Parser/AuthRequestParser.h"
#include "Swiften/Parser/AuthSuccessParser.h"
#include "Swiften/Parser/AuthFailureParser.h"
@@ -136,6 +137,9 @@ ElementParser* XMPPParser::createElementParser(const String& element, const Stri
else if (element == "features" && ns == "http://etherx.jabber.org/streams") {
return new StreamFeaturesParser();
}
+ else if (element == "error" && ns == "urn:ietf:params:xml:ns:xmpp-streams") {
+ return new StreamErrorParser();
+ }
else if (element == "auth") {
return new AuthRequestParser();
}
diff --git a/Swiften/SConscript b/Swiften/SConscript
index afab713..c5198a6 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -119,6 +119,7 @@ if env["SCONS_STAGE"] == "build" :
"Serializer/PayloadSerializers/NicknameSerializer.cpp",
"Serializer/PresenceSerializer.cpp",
"Serializer/StanzaSerializer.cpp",
+ "Serializer/StreamErrorSerializer.cpp",
"Serializer/StreamFeaturesSerializer.cpp",
"Serializer/XML/XMLElement.cpp",
"Serializer/XML/XMLNode.cpp",
diff --git a/Swiften/Serializer/GenericElementSerializer.h b/Swiften/Serializer/GenericElementSerializer.h
index 702e374..0329411 100644
--- a/Swiften/Serializer/GenericElementSerializer.h
+++ b/Swiften/Serializer/GenericElementSerializer.h
@@ -6,7 +6,9 @@
#pragma once
-#include "Swiften/Serializer/ElementSerializer.h"
+#include <boost/shared_ptr.hpp>
+
+#include <Swiften/Serializer/ElementSerializer.h>
namespace Swift {
template<typename T>
@@ -15,7 +17,7 @@ namespace Swift {
virtual String serialize(boost::shared_ptr<Element> element) const = 0;
virtual bool canSerialize(boost::shared_ptr<Element> element) const {
- return dynamic_cast<T*>(element.get()) != 0;
+ return boost::dynamic_pointer_cast<T>(element);
}
};
}
diff --git a/Swiften/Serializer/GenericPayloadSerializer.h b/Swiften/Serializer/GenericPayloadSerializer.h
index b415256..13603e5 100644
--- a/Swiften/Serializer/GenericPayloadSerializer.h
+++ b/Swiften/Serializer/GenericPayloadSerializer.h
@@ -8,8 +8,7 @@
#include <boost/shared_ptr.hpp>
-#include "Swiften/Serializer/PayloadSerializer.h"
-#include "Swiften/Elements/Body.h"
+#include <Swiften/Serializer/PayloadSerializer.h>
namespace Swift {
template<typename PAYLOAD_TYPE>
@@ -20,7 +19,7 @@ namespace Swift {
}
virtual bool canSerialize(boost::shared_ptr<Payload> element) const {
- return dynamic_cast<PAYLOAD_TYPE*>(element.get());
+ return boost::dynamic_pointer_cast<PAYLOAD_TYPE>(element);
}
virtual String serializePayload(boost::shared_ptr<PAYLOAD_TYPE>) const = 0;
diff --git a/Swiften/Serializer/XMPPSerializer.cpp b/Swiften/Serializer/XMPPSerializer.cpp
index da4715c..ad84152 100644
--- a/Swiften/Serializer/XMPPSerializer.cpp
+++ b/Swiften/Serializer/XMPPSerializer.cpp
@@ -7,6 +7,7 @@
#include "Swiften/Serializer/XMPPSerializer.h"
#include <boost/bind.hpp>
+#include <boost/smart_ptr/make_shared.hpp>
#include <iostream>
#include <cassert>
@@ -14,6 +15,7 @@
#include "Swiften/Base/foreach.h"
#include "Swiften/Serializer/CompressRequestSerializer.h"
#include "Swiften/Serializer/CompressFailureSerializer.h"
+#include "Swiften/Serializer/StreamErrorSerializer.h"
#include "Swiften/Serializer/StreamFeaturesSerializer.h"
#include "Swiften/Serializer/AuthRequestSerializer.h"
#include "Swiften/Serializer/AuthFailureSerializer.h"
@@ -36,26 +38,27 @@
namespace Swift {
XMPPSerializer::XMPPSerializer(PayloadSerializerCollection* payloadSerializers, StreamType type) : type_(type) {
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new PresenceSerializer(payloadSerializers)));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new IQSerializer(payloadSerializers)));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new MessageSerializer(payloadSerializers)));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new CompressRequestSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new CompressFailureSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new AuthRequestSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new AuthFailureSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new AuthSuccessSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new AuthChallengeSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new AuthResponseSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StartTLSRequestSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StartTLSFailureSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new TLSProceedSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StreamFeaturesSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new EnableStreamManagementSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StreamManagementEnabledSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StreamManagementFailedSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StanzaAckSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StanzaAckRequestSerializer()));
- serializers_.push_back(boost::shared_ptr<ElementSerializer>(new ComponentHandshakeSerializer()));
+ serializers_.push_back(boost::make_shared<PresenceSerializer>(payloadSerializers));
+ serializers_.push_back(boost::make_shared<IQSerializer>(payloadSerializers));
+ serializers_.push_back(boost::make_shared<MessageSerializer>(payloadSerializers));
+ serializers_.push_back(boost::make_shared<CompressRequestSerializer>());
+ serializers_.push_back(boost::make_shared<CompressFailureSerializer>());
+ serializers_.push_back(boost::make_shared<AuthRequestSerializer>());
+ serializers_.push_back(boost::make_shared<AuthFailureSerializer>());
+ serializers_.push_back(boost::make_shared<AuthSuccessSerializer>());
+ serializers_.push_back(boost::make_shared<AuthChallengeSerializer>());
+ serializers_.push_back(boost::make_shared<AuthResponseSerializer>());
+ serializers_.push_back(boost::make_shared<StartTLSRequestSerializer>());
+ serializers_.push_back(boost::make_shared<StartTLSFailureSerializer>());
+ serializers_.push_back(boost::make_shared<TLSProceedSerializer>());
+ serializers_.push_back(boost::make_shared<StreamFeaturesSerializer>());
+ serializers_.push_back(boost::make_shared<StreamErrorSerializer>());
+ serializers_.push_back(boost::make_shared<EnableStreamManagementSerializer>());
+ serializers_.push_back(boost::make_shared<StreamManagementEnabledSerializer>());
+ serializers_.push_back(boost::make_shared<StreamManagementFailedSerializer>());
+ serializers_.push_back(boost::make_shared<StanzaAckSerializer>());
+ serializers_.push_back(boost::make_shared<StanzaAckRequestSerializer>());
+ serializers_.push_back(boost::make_shared<ComponentHandshakeSerializer>());
}
String XMPPSerializer::serializeHeader(const ProtocolHeader& header) const {