diff options
Diffstat (limited to 'Swiften/Parser/PayloadParsers/SearchPayloadParser.cpp')
-rw-r--r-- | Swiften/Parser/PayloadParsers/SearchPayloadParser.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/Swiften/Parser/PayloadParsers/SearchPayloadParser.cpp b/Swiften/Parser/PayloadParsers/SearchPayloadParser.cpp new file mode 100644 index 0000000..f2cf1dd --- /dev/null +++ b/Swiften/Parser/PayloadParsers/SearchPayloadParser.cpp @@ -0,0 +1,110 @@ +/* + * 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/PayloadParsers/SearchPayloadParser.h" +#include "Swiften/Parser/PayloadParsers/FormParserFactory.h" +#include "Swiften/Parser/PayloadParsers/FormParser.h" + +namespace Swift { + +SearchPayloadParser::SearchPayloadParser() : level(TopLevel), formParser(NULL) { + formParserFactory = new FormParserFactory(); +} + +SearchPayloadParser::~SearchPayloadParser() { + delete formParserFactory; +} + +void SearchPayloadParser::handleStartElement(const String& element, const String& ns, const AttributeMap& attributes) { + if (level == TopLevel) { + } + else if (level == PayloadLevel) { + if (element == "x" && ns == "jabber:x:data") { + assert(!formParser); + formParser = dynamic_cast<FormParser*>(formParserFactory->createPayloadParser()); + } + else if (element == "item") { + assert(!currentItem); + currentItem.reset(SearchPayload::Item()); + currentItem->jid = JID(attributes.getAttribute("jid")); + } + else { + currentText.clear(); + } + } + else if (level == ItemLevel && currentItem) { + currentText.clear(); + } + + if (formParser) { + formParser->handleStartElement(element, ns, attributes); + } + + ++level; +} + +void SearchPayloadParser::handleEndElement(const String& element, const String& ns) { + --level; + + if (formParser) { + formParser->handleEndElement(element, ns); + } + + if (level == TopLevel) { + } + else if (level == PayloadLevel) { + if (formParser) { + getPayloadInternal()->setForm(formParser->getPayloadInternal()); + delete formParser; + formParser = NULL; + } + else if (element == "item") { + assert(currentItem); + getPayloadInternal()->addItem(*currentItem); + currentItem.reset(); + } + else if (element == "instructions") { + getPayloadInternal()->setInstructions(currentText); + } + else if (element == "nick") { + getPayloadInternal()->setNick(currentText); + } + else if (element == "first") { + getPayloadInternal()->setFirst(currentText); + } + else if (element == "last") { + getPayloadInternal()->setLast(currentText); + } + else if (element == "email") { + getPayloadInternal()->setEMail(currentText); + } + } + else if (level == ItemLevel && currentItem) { + if (element == "nick") { + currentItem->nick = currentText; + } + else if (element == "first") { + currentItem->first = currentText; + } + else if (element == "last") { + currentItem->last = currentText; + } + else if (element == "email") { + currentItem->email = currentText; + } + } +} + +void SearchPayloadParser::handleCharacterData(const String& data) { + if (formParser) { + formParser->handleCharacterData(data); + } + else { + currentText += data; + } +} + +} |