diff options
author | Remko Tronçon <git@el-tramo.be> | 2010-09-05 11:01:20 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2010-09-05 11:01:20 (GMT) |
commit | 0630c01cf274a9de6b67856b8c00b1503b39353e (patch) | |
tree | d304c6510063ddd7ba5eb934e92f93f7222e3b41 /Swiften/Parser/PayloadParsers/RosterParser.cpp | |
parent | 840dc1e190cfdfdc9ec88f9f2db3a507221c96bc (diff) | |
download | swift-contrib-0630c01cf274a9de6b67856b8c00b1503b39353e.zip swift-contrib-0630c01cf274a9de6b67856b8c00b1503b39353e.tar.bz2 |
Don't lose unknown roster content.
Resolves: #555
Diffstat (limited to 'Swiften/Parser/PayloadParsers/RosterParser.cpp')
-rw-r--r-- | Swiften/Parser/PayloadParsers/RosterParser.cpp | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/Swiften/Parser/PayloadParsers/RosterParser.cpp b/Swiften/Parser/PayloadParsers/RosterParser.cpp index b35c035..c3a35b6 100644 --- a/Swiften/Parser/PayloadParsers/RosterParser.cpp +++ b/Swiften/Parser/PayloadParsers/RosterParser.cpp @@ -5,13 +5,14 @@ */ #include "Swiften/Parser/PayloadParsers/RosterParser.h" +#include "Swiften/Parser/SerializingParser.h" namespace Swift { -RosterParser::RosterParser() : level_(TopLevel) { +RosterParser::RosterParser() : level_(TopLevel), unknownContentParser_(0) { } -void RosterParser::handleStartElement(const String& element, const String&, const AttributeMap& attributes) { +void RosterParser::handleStartElement(const String& element, const String& ns, const AttributeMap& attributes) { if (level_ == PayloadLevel) { if (element == "item") { inItem_ = true; @@ -46,11 +47,19 @@ void RosterParser::handleStartElement(const String& element, const String&, cons if (element == "group") { currentText_ = ""; } + else { + assert(!unknownContentParser_); + unknownContentParser_ = new SerializingParser(); + unknownContentParser_->handleStartElement(element, ns, attributes); + } + } + else if (unknownContentParser_) { + unknownContentParser_->handleStartElement(element, ns, attributes); } ++level_; } -void RosterParser::handleEndElement(const String& element, const String&) { +void RosterParser::handleEndElement(const String& element, const String& ns) { --level_; if (level_ == PayloadLevel) { if (inItem_) { @@ -59,14 +68,27 @@ void RosterParser::handleEndElement(const String& element, const String&) { } } else if (level_ == ItemLevel) { - if (element == "group") { + if (unknownContentParser_) { + unknownContentParser_->handleEndElement(element, ns); + currentItem_.addUnknownContent(unknownContentParser_->getResult()); + unknownContentParser_ = NULL; + } + else if (element == "group") { currentItem_.addGroup(currentText_); } } + else if (unknownContentParser_) { + unknownContentParser_->handleEndElement(element, ns); + } } void RosterParser::handleCharacterData(const String& data) { - currentText_ += data; + if (unknownContentParser_) { + unknownContentParser_->handleCharacterData(data); + } + else { + currentText_ += data; + } } } |