diff options
Diffstat (limited to 'Swiften/Parser/PayloadParsers')
5 files changed, 125 insertions, 0 deletions
diff --git a/Swiften/Parser/PayloadParsers/ClientStateParser.cpp b/Swiften/Parser/PayloadParsers/ClientStateParser.cpp new file mode 100644 index 0000000..8a6cc9c --- /dev/null +++ b/Swiften/Parser/PayloadParsers/ClientStateParser.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2017 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include <Swiften/Parser/PayloadParsers/ClientStateParser.h> + +namespace Swift { + +ClientStateParser::ClientStateParser() { +} + +void ClientStateParser::handleStartElement(const std::string& element, const std::string&, const AttributeMap&) { + if (level_ == 0) { + auto state = ClientState::ClientStateType::Active; + if (element == "active") { + state = ClientState::ClientStateType::Active; + } else if (element == "inactive") { + state = ClientState::ClientStateType::Inactive; + } + getPayloadInternal()->setClientState(state); + } + ++level_; +} + +void ClientStateParser::handleEndElement(const std::string&, const std::string&) { + --level_; +} + +void ClientStateParser::handleCharacterData(const std::string&) { + +} + +} diff --git a/Swiften/Parser/PayloadParsers/ClientStateParser.h b/Swiften/Parser/PayloadParsers/ClientStateParser.h new file mode 100644 index 0000000..039ae37 --- /dev/null +++ b/Swiften/Parser/PayloadParsers/ClientStateParser.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2017 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include <Swiften/Base/API.h> +#include <Swiften/Elements/ClientState.h> +#include <Swiften/Parser/GenericPayloadParser.h> + +namespace Swift { + class SWIFTEN_API ClientStateParser : public GenericPayloadParser<ClientState> { + public: + ClientStateParser(); + + virtual void handleStartElement(const std::string& element, const std::string&, const AttributeMap& attributes); + virtual void handleEndElement(const std::string& element, const std::string&); + virtual void handleCharacterData(const std::string& data); + + private: + int level_ = 0; + }; +} diff --git a/Swiften/Parser/PayloadParsers/ClientStateParserFactory.h b/Swiften/Parser/PayloadParsers/ClientStateParserFactory.h new file mode 100644 index 0000000..95617a1 --- /dev/null +++ b/Swiften/Parser/PayloadParsers/ClientStateParserFactory.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2017 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include <Swiften/Base/API.h> +#include <Swiften/Parser/PayloadParserFactory.h> +#include <Swiften/Parser/PayloadParsers/ClientStateParser.h> + +namespace Swift { + class PayloadParserFactoryCollection; + + class SWIFTEN_API ClientStateParserFactory : public PayloadParserFactory { + public: + ClientStateParserFactory() { + } + + virtual bool canParse(const std::string& element, const std::string& ns, const AttributeMap&) const { + return ns == "urn:xmpp:csi:0" && + (element == "active" || element == "inactive"); + } + + virtual PayloadParser* createPayloadParser() { + return new ClientStateParser(); + } + + }; +} diff --git a/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp b/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp index b67556e..4ad943a 100644 --- a/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp +++ b/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp @@ -23,6 +23,7 @@ #include <Swiften/Parser/PayloadParsers/CarbonsReceivedParser.h> #include <Swiften/Parser/PayloadParsers/CarbonsSentParser.h> #include <Swiften/Parser/PayloadParsers/ChatStateParserFactory.h> +#include <Swiften/Parser/PayloadParsers/ClientStateParserFactory.h> #include <Swiften/Parser/PayloadParsers/CommandParser.h> #include <Swiften/Parser/PayloadParsers/DelayParser.h> #include <Swiften/Parser/PayloadParsers/DeliveryReceiptParserFactory.h> @@ -127,6 +128,7 @@ FullPayloadParserFactoryCollection::FullPayloadParserFactoryCollection() { factories_.push_back(std::make_shared<GenericPayloadParserFactory<VCardParser> >("vCard", "vcard-temp")); factories_.push_back(std::make_shared<PrivateStorageParserFactory>(this)); factories_.push_back(std::make_shared<ChatStateParserFactory>()); + factories_.push_back(std::make_shared<ClientStateParserFactory>()); factories_.push_back(std::make_shared<MUCUserPayloadParserFactory>(this)); factories_.push_back(std::make_shared<MUCOwnerPayloadParserFactory>(this)); factories_.push_back(std::make_shared<GenericPayloadParserFactory<MUCInvitationPayloadParser> >("x", "jabber:x:conference")); diff --git a/Swiften/Parser/PayloadParsers/UnitTest/ClientStateParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/ClientStateParserTest.cpp new file mode 100644 index 0000000..ca89040 --- /dev/null +++ b/Swiften/Parser/PayloadParsers/UnitTest/ClientStateParserTest.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2017 Tarun Gupta + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include <gtest/gtest.h> + +#include <Swiften/Elements/ClientState.h> +#include <Swiften/Parser/PayloadParsers/UnitTest/PayloadsParserTester.h> + +using namespace Swift; + +TEST(ClientStateParserTest, testParse_Active) { + PayloadsParserTester parser; + ASSERT_TRUE(parser.parse( + "<active xmlns='urn:xmpp:csi:0'/>" + )); + + ClientState::ref payload = parser.getPayload<ClientState>(); + ASSERT_EQ(ClientState::ClientStateType::Active, payload->getClientState()); +} + +TEST(ClientStateParserTest, testParse_Inactive) { + PayloadsParserTester parser; + ASSERT_TRUE(parser.parse( + "<inactive xmlns='urn:xmpp:csi:0'/>" + )); + + ClientState::ref payload = parser.getPayload<ClientState>(); + ASSERT_EQ(ClientState::ClientStateType::Inactive, payload->getClientState()); +} |