/* * 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/IBBParser.h" #include <boost/lexical_cast.hpp> #include "Swiften/Base/foreach.h" #include "Swiften/StringCodecs/Base64.h" namespace Swift { IBBParser::IBBParser() : level(TopLevel) { } IBBParser::~IBBParser() { } void IBBParser::handleStartElement(const String& element, const String&, const AttributeMap& attributes) { if (level == TopLevel) { if (element == "data") { getPayloadInternal()->setAction(IBB::Data); getPayloadInternal()->setStreamID(attributes.getAttribute("sid")); try { getPayloadInternal()->setSequenceNumber(boost::lexical_cast<int>(attributes.getAttribute("seq"))); } catch (boost::bad_lexical_cast& e) { } } else if (element == "open") { getPayloadInternal()->setAction(IBB::Open); getPayloadInternal()->setStreamID(attributes.getAttribute("sid")); if (attributes.getAttribute("stanza") == "message") { getPayloadInternal()->setStanzaType(IBB::MessageStanza); } else { getPayloadInternal()->setStanzaType(IBB::IQStanza); } try { getPayloadInternal()->setBlockSize(boost::lexical_cast<int>(attributes.getAttribute("block-size"))); } catch (boost::bad_lexical_cast& e) { } } else if (element == "close") { getPayloadInternal()->setAction(IBB::Close); getPayloadInternal()->setStreamID(attributes.getAttribute("sid")); } } ++level; } void IBBParser::handleEndElement(const String& element, const String&) { --level; if (level == TopLevel) { if (element == "data") { std::vector<char> data; for (size_t i = 0; i < currentText.getUTF8Size(); ++i) { char c = currentText[i]; if (c >= 48 && c <= 122) { data.push_back(c); } } getPayloadInternal()->setData(Base64::decode(String(&data[0], data.size()))); } } } void IBBParser::handleCharacterData(const String& data) { currentText += data; } }