diff options
| -rw-r--r-- | Swiften/Parser/XMPPParser.cpp | 28 | ||||
| -rw-r--r-- | Swiften/Parser/XMPPParser.h | 15 | 
2 files changed, 19 insertions, 24 deletions
| diff --git a/Swiften/Parser/XMPPParser.cpp b/Swiften/Parser/XMPPParser.cpp index 034077e..795bee6 100644 --- a/Swiften/Parser/XMPPParser.cpp +++ b/Swiften/Parser/XMPPParser.cpp @@ -49,7 +49,7 @@ XMPPParser::XMPPParser(  				xmlParser_(0),  				client_(client),   				payloadParserFactories_(payloadParserFactories),  -				currentDepth_(0), +				level_(0),  				currentElementParser_(0),  				parseErrorOccurred_(false) {  	xmlParser_ = PlatformXMLParserFactory().createXMLParser(this); @@ -66,7 +66,7 @@ bool XMPPParser::parse(const String& data) {  }  void XMPPParser::handleStartElement(const String& element, const String& ns, const AttributeMap& attributes) { -	if (!inStream()) { +	if (level_ == TopLevel) {  		if (element == "stream" && ns == "http://etherx.jabber.org/streams") {  			ProtocolHeader header;  			header.setFrom(attributes.getAttribute("from")); @@ -80,33 +80,31 @@ void XMPPParser::handleStartElement(const String& element, const String& ns, con  		}  	}  	else { -		if (!inElement()) { +		if (level_ == StreamLevel) {  			assert(!currentElementParser_); -			delete currentElementParser_;  			currentElementParser_ = createElementParser(element, ns);  		}  		currentElementParser_->handleStartElement(element, ns, attributes);  	} -	++currentDepth_; +	++level_;  }  void XMPPParser::handleEndElement(const String& element, const String& ns) { -	assert(inStream()); -	if (inElement()) { +	assert(level_ > TopLevel); +	--level_; +	if (level_ == TopLevel) { +		assert(element == "stream"); +		client_->handleStreamEnd(); +	} +	else {  		assert(currentElementParser_);  		currentElementParser_->handleEndElement(element, ns); -		--currentDepth_; -		if (!inElement()) { +		if (level_ == StreamLevel) {  			client_->handleElement(currentElementParser_->getElement());  			delete currentElementParser_; -			currentElementParser_ = 0; +			currentElementParser_ = NULL;  		}  	} -	else { -		assert(element == "stream"); -		--currentDepth_; -		client_->handleStreamEnd(); -	}  }  void XMPPParser::handleCharacterData(const String& data) { diff --git a/Swiften/Parser/XMPPParser.h b/Swiften/Parser/XMPPParser.h index 45d005c..c1a9323 100644 --- a/Swiften/Parser/XMPPParser.h +++ b/Swiften/Parser/XMPPParser.h @@ -37,21 +37,18 @@ namespace Swift {  			virtual void handleEndElement(const String& element, const String& ns);  			virtual void handleCharacterData(const String& data); -			bool inStream() const { -				return currentDepth_ > 0; -			} - -			bool inElement() const { -				return currentDepth_ > 1; -			} -  			ElementParser* createElementParser(const String& element, const String& xmlns);  		private:  			XMLParser* xmlParser_;  			XMPPParserClient* client_;  			PayloadParserFactoryCollection* payloadParserFactories_; -			int currentDepth_; +			enum Level { +				TopLevel = 0, +				StreamLevel = 1, +				ElementLevel = 2 +			}; +			int level_;  			ElementParser* currentElementParser_;  			bool parseErrorOccurred_;  	}; | 
 Swift
 Swift