summaryrefslogtreecommitdiffstats
blob: f9e5b05fab0622c2a979e893342704263d110963 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
 * 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/StreamFeaturesParser.h"

namespace Swift {

StreamFeaturesParser::StreamFeaturesParser() : GenericElementParser<StreamFeatures>(), currentDepth_(0), inMechanisms_(false), inMechanism_(false), inCompression_(false), inCompressionMethod_(false) {
}

void StreamFeaturesParser::handleStartElement(const String& element, const String& ns, const AttributeMap&) {
	if (currentDepth_ == 1) {
		if (element == "starttls" && ns == "urn:ietf:params:xml:ns:xmpp-tls") {
			getElementGeneric()->setHasStartTLS();
		}
		else if (element == "session" && ns == "urn:ietf:params:xml:ns:xmpp-session") {
			getElementGeneric()->setHasSession();
		}
		else if (element == "bind" && ns == "urn:ietf:params:xml:ns:xmpp-bind") {
			getElementGeneric()->setHasResourceBind();
		}
		else if (element == "mechanisms" && ns == "urn:ietf:params:xml:ns:xmpp-sasl") {
			inMechanisms_ = true;
		}
		else if (element == "compression" && ns == "http://jabber.org/features/compress") {
			inCompression_ = true;
		}
	}
	else if (currentDepth_ == 2) {
		if (inCompression_ && element == "method") {
			inCompressionMethod_ = true;
			currentText_ = "";
		}
		else if (inMechanisms_ && element == "mechanism") {
			inMechanism_ = true;
			currentText_ = "";
		}
	}
	++currentDepth_;
}

void StreamFeaturesParser::handleEndElement(const String&, const String&) {
	--currentDepth_;
	if (currentDepth_ == 1) {
		inCompression_ = false;
		inMechanisms_ = false;
	}
	else if (currentDepth_ == 2) {
		if (inCompressionMethod_) {
			getElementGeneric()->addCompressionMethod(currentText_);
			inCompressionMethod_ = false;
		}
		else if (inMechanism_) {
			getElementGeneric()->addAuthenticationMechanism(currentText_);
			inMechanism_ = false;
		}
	}
}

void StreamFeaturesParser::handleCharacterData(const String& data) {
	currentText_ += data;
}

}