diff options
6 files changed, 40 insertions, 0 deletions
diff --git a/Sluift/ElementConvertors/ResultSetConvertor.cpp b/Sluift/ElementConvertors/ResultSetConvertor.cpp index a4ebbf1..bd517b3 100644 --- a/Sluift/ElementConvertors/ResultSetConvertor.cpp +++ b/Sluift/ElementConvertors/ResultSetConvertor.cpp @@ -47,18 +47,23 @@ boost::shared_ptr<ResultSet> ResultSetConvertor::doConvertFromLua(lua_State* L) if (lua_isstring(L, -1)) { result->setLastID(std::string(lua_tostring(L, -1))); } lua_pop(L, 1); lua_getfield(L, -1, "after"); if (lua_isstring(L, -1)) { result->setAfter(std::string(lua_tostring(L, -1))); } lua_pop(L, 1); + lua_getfield(L, -1, "before"); + if (lua_isstring(L, -1)) { + result->setBefore(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); return result; } void ResultSetConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<ResultSet> payload) { lua_createtable(L, 0, 0); if (payload->getMaxItems()) { lua_pushnumber(L, *payload->getMaxItems()); lua_setfield(L, -2, "max_items"); } @@ -76,18 +81,22 @@ void ResultSetConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<ResultSe } if (payload->getLastID()) { lua_pushstring(L, (*payload->getLastID()).c_str()); lua_setfield(L, -2, "last_id"); } if (payload->getAfter()) { lua_pushstring(L, (*payload->getAfter()).c_str()); lua_setfield(L, -2, "after"); } + if (payload->getBefore()) { + lua_pushstring(L, (*payload->getBefore()).c_str()); + lua_setfield(L, -2, "before"); + } } boost::optional<LuaElementConvertor::Documentation> ResultSetConvertor::getDocumentation() const { return Documentation( "ResultSet", "This table has the following fields:\n\n" "- `max_items`: number (Optional)\n" "- `count`: number (Optional)\n" "- `first_id_index`: number (Optional)\n" diff --git a/Swiften/Elements/ResultSet.h b/Swiften/Elements/ResultSet.h index 871b699..e84be35 100644 --- a/Swiften/Elements/ResultSet.h +++ b/Swiften/Elements/ResultSet.h @@ -24,21 +24,25 @@ namespace Swift { void setFirstIDIndex(const boost::optional<int>& firstIndex) { firstIndex_ = firstIndex; } const boost::optional<int>& getFirstIDIndex() const { return firstIndex_; } void setFirstID(const boost::optional<std::string>& firstID) { firstID_ = firstID; } const boost::optional<std::string>& getFirstID() const { return firstID_; } void setLastID(const boost::optional<std::string>& lastID) { lastID_ = lastID; } const boost::optional<std::string>& getLastID() const { return lastID_; } + void setBefore(const boost::optional<std::string>& before) { before_ = before; } + const boost::optional<std::string>& getBefore() const { return before_; } + void setAfter(const boost::optional<std::string>& after) { after_ = after; } const boost::optional<std::string>& getAfter() const { return after_; } private: boost::optional<int> maxItems_; boost::optional<int> count_; boost::optional<int> firstIndex_; boost::optional<std::string> firstID_; boost::optional<std::string> lastID_; + boost::optional<std::string> before_; boost::optional<std::string> after_; }; } diff --git a/Swiften/Parser/PayloadParsers/ResultSetParser.cpp b/Swiften/Parser/PayloadParsers/ResultSetParser.cpp index 95960d7..4c8283b 100644 --- a/Swiften/Parser/PayloadParsers/ResultSetParser.cpp +++ b/Swiften/Parser/PayloadParsers/ResultSetParser.cpp @@ -41,18 +41,20 @@ void ResultSetParser::handleEndElement(const std::string& element, const std::st } else if (element == "count") { try { getPayloadInternal()->setCount(boost::lexical_cast<int>(currentText_)); } catch(boost::bad_lexical_cast&) { } } else if (element == "first") { getPayloadInternal()->setFirstID(currentText_); } else if (element == "last") { getPayloadInternal()->setLastID(currentText_); + } else if (element == "before") { + getPayloadInternal()->setBefore(currentText_); } else if (element == "after") { getPayloadInternal()->setAfter(currentText_); } } } void ResultSetParser::handleCharacterData(const std::string& data) { currentText_ += data; } diff --git a/Swiften/Parser/PayloadParsers/UnitTest/ResultSetParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/ResultSetParserTest.cpp index 68df71b..e345323 100644 --- a/Swiften/Parser/PayloadParsers/UnitTest/ResultSetParserTest.cpp +++ b/Swiften/Parser/PayloadParsers/UnitTest/ResultSetParserTest.cpp @@ -22,33 +22,36 @@ class ResultSetParserTest : public CppUnit::TestFixture public: void testParse() { PayloadsParserTester parser; CPPUNIT_ASSERT(parser.parse( "<set xmlns=\"http://jabber.org/protocol/rsm\">" "<max>100</max>" "<count>800</count>" "<first index=\"123\">stpeter@jabber.org</first>" "<last>peterpan@neverland.lit</last>" + "<before>decaf-badba-dbad1</before>" "<after>09af3-cc343-b409f</after>" "</set>")); boost::shared_ptr<ResultSet> payload = parser.getPayload<ResultSet>(); CPPUNIT_ASSERT(!!payload); CPPUNIT_ASSERT(payload->getMaxItems()); CPPUNIT_ASSERT_EQUAL(100, *payload->getMaxItems()); CPPUNIT_ASSERT(payload->getCount()); CPPUNIT_ASSERT_EQUAL(800, *payload->getCount()); CPPUNIT_ASSERT(payload->getFirstID()); CPPUNIT_ASSERT_EQUAL(std::string("stpeter@jabber.org"), *payload->getFirstID()); CPPUNIT_ASSERT(payload->getFirstIDIndex()); CPPUNIT_ASSERT_EQUAL(123, *payload->getFirstIDIndex()); CPPUNIT_ASSERT(payload->getLastID()); CPPUNIT_ASSERT_EQUAL(std::string("peterpan@neverland.lit"), *payload->getLastID()); + CPPUNIT_ASSERT(payload->getBefore()); + CPPUNIT_ASSERT_EQUAL(std::string("decaf-badba-dbad1"), *payload->getBefore()); CPPUNIT_ASSERT(payload->getAfter()); CPPUNIT_ASSERT_EQUAL(std::string("09af3-cc343-b409f"), *payload->getAfter()); } void testParseFirstNoIndex() { PayloadsParserTester parser; CPPUNIT_ASSERT(parser.parse( "<set xmlns=\"http://jabber.org/protocol/rsm\">" "<first>stpeter@jabber.org</first>" diff --git a/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp b/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp index 86d8830..0f464a4 100644 --- a/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp @@ -39,15 +39,19 @@ std::string ResultSetSerializer::serializePayload(boost::shared_ptr<ResultSet> p firstElement->setAttribute("index", boost::lexical_cast<std::string>(*payload->getFirstIDIndex())); } element.addNode(firstElement); } if (payload->getLastID()) { element.addNode(boost::make_shared<XMLElement>("last", "", *payload->getLastID())); } + if (payload->getBefore()) { + element.addNode(boost::make_shared<XMLElement>("before", "", *payload->getBefore())); + } + if (payload->getAfter()) { element.addNode(boost::make_shared<XMLElement>("after", "", *payload->getAfter())); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/ResultSetSerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/ResultSetSerializerTest.cpp index 641b856..354db85 100644 --- a/Swiften/Serializer/PayloadSerializers/UnitTest/ResultSetSerializerTest.cpp +++ b/Swiften/Serializer/PayloadSerializers/UnitTest/ResultSetSerializerTest.cpp @@ -13,41 +13,44 @@ #include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h> #include <Swiften/Elements/ResultSet.h> using namespace Swift; class ResultSetSerializerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(ResultSetSerializerTest); CPPUNIT_TEST(testSerializeFull); CPPUNIT_TEST(testSerializeMaxItems); + CPPUNIT_TEST(testSerializeEmptyBefore); CPPUNIT_TEST(testSerializeFirst); CPPUNIT_TEST(testSerializeFirstWithIndex); CPPUNIT_TEST_SUITE_END(); public: void testSerializeFull() { ResultSetSerializer serializer; boost::shared_ptr<ResultSet> resultSet(boost::make_shared<ResultSet>()); resultSet->setMaxItems(100); resultSet->setCount(800); resultSet->setFirstIDIndex(123); resultSet->setFirstID(std::string("stpeter@jabber.org")); resultSet->setLastID(std::string("peterpan@neverland.lit")); resultSet->setAfter(std::string("09af3-cc343-b409f")); + resultSet->setBefore(std::string("decaf-badba-dbad1")); std::string expectedResult = "<set xmlns=\"http://jabber.org/protocol/rsm\">" "<max>100</max>" "<count>800</count>" "<first index=\"123\">stpeter@jabber.org</first>" "<last>peterpan@neverland.lit</last>" + "<before>decaf-badba-dbad1</before>" "<after>09af3-cc343-b409f</after>" "</set>"; CPPUNIT_ASSERT_EQUAL(expectedResult, serializer.serialize(resultSet)); } void testSerializeMaxItems() { ResultSetSerializer serializer; @@ -57,18 +60,33 @@ class ResultSetSerializerTest : public CppUnit::TestFixture { std::string expectedResult = "<set xmlns=\"http://jabber.org/protocol/rsm\">" "<max>100</max>" "</set>"; CPPUNIT_ASSERT_EQUAL(expectedResult, serializer.serialize(resultSet)); } + void testSerializeEmptyBefore() { + ResultSetSerializer serializer; + + boost::shared_ptr<ResultSet> resultSet(boost::make_shared<ResultSet>()); + + resultSet->setBefore(std::string()); + + std::string expectedResult = + "<set xmlns=\"http://jabber.org/protocol/rsm\">" + "<before/>" + "</set>"; + + CPPUNIT_ASSERT_EQUAL(expectedResult, serializer.serialize(resultSet)); + } + void testSerializeFirst() { ResultSetSerializer serializer; boost::shared_ptr<ResultSet> resultSet(boost::make_shared<ResultSet>()); resultSet->setFirstID(std::string("stpeter@jabber.org")); std::string expectedResult = "<set xmlns=\"http://jabber.org/protocol/rsm\">" |
Swift