diff options
6 files changed, 25 insertions, 2 deletions
diff --git a/Sluift/ElementConvertors/MAMQueryConvertor.cpp b/Sluift/ElementConvertors/MAMQueryConvertor.cpp index cf4f787..6217eb7 100644 --- a/Sluift/ElementConvertors/MAMQueryConvertor.cpp +++ b/Sluift/ElementConvertors/MAMQueryConvertor.cpp @@ -28,12 +28,17 @@ boost::shared_ptr<MAMQuery> MAMQueryConvertor::doConvertFromLua(lua_State* L) { boost::shared_ptr<MAMQuery> result = boost::make_shared<MAMQuery>(); lua_getfield(L, -1, "query_id"); if (lua_isstring(L, -1)) { result->setQueryID(std::string(lua_tostring(L, -1))); } lua_pop(L, 1); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); lua_getfield(L, -1, "form"); if (!lua_isnil(L, -1)) { boost::shared_ptr<Form> form = boost::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form")); if (!!form) { result->setForm(form); } @@ -53,12 +58,16 @@ boost::shared_ptr<MAMQuery> MAMQueryConvertor::doConvertFromLua(lua_State* L) { void MAMQueryConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<MAMQuery> payload) { lua_createtable(L, 0, 0); if (payload->getQueryID()) { lua_pushstring(L, (*payload->getQueryID()).c_str()); lua_setfield(L, -2, "query_id"); } + if (payload->getNode()) { + lua_pushstring(L, (*payload->getNode()).c_str()); + lua_setfield(L, -2, "node"); + } if (convertors->convertToLuaUntyped(L, payload->getForm()) > 0) { lua_setfield(L, -2, "form"); } if (convertors->convertToLuaUntyped(L, payload->getResultSet()) > 0) { lua_setfield(L, -2, "result_set"); } @@ -66,10 +75,11 @@ void MAMQueryConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<MAMQuery> boost::optional<LuaElementConvertor::Documentation> MAMQueryConvertor::getDocumentation() const { return Documentation( "MAMQuery", "This table has the following fields:\n\n" "- `query_id`: string (Optional)\n" + "- `node`: string (Optional)\n" "- `form`: string @{Form} (Optional)\n" "- `result_set`: @{ResultSet} (Optional)\n" ); } diff --git a/Swiften/Elements/MAMQuery.h b/Swiften/Elements/MAMQuery.h index 09b5af0..12148c8 100644 --- a/Swiften/Elements/MAMQuery.h +++ b/Swiften/Elements/MAMQuery.h @@ -21,18 +21,22 @@ namespace Swift { public: virtual ~MAMQuery(); void setQueryID(const boost::optional<std::string>& queryID) { queryID_ = queryID; } const boost::optional<std::string>& getQueryID() const { return queryID_; } + void setNode(const boost::optional<std::string>& node) { node_ = node; } + const boost::optional<std::string>& getNode() const { return node_; } + void setForm(boost::shared_ptr<Form> form) { form_ = form; } const boost::shared_ptr<Form>& getForm() const { return form_; } void setResultSet(boost::shared_ptr<ResultSet> resultSet) { resultSet_ = resultSet; } const boost::shared_ptr<ResultSet>& getResultSet() const { return resultSet_; } private: boost::optional<std::string> queryID_; + boost::optional<std::string> node_; boost::shared_ptr<Form> form_; boost::shared_ptr<ResultSet> resultSet_; }; } diff --git a/Swiften/Parser/PayloadParsers/MAMQueryParser.cpp b/Swiften/Parser/PayloadParsers/MAMQueryParser.cpp index 6b3dc65..b0b279d 100644 --- a/Swiften/Parser/PayloadParsers/MAMQueryParser.cpp +++ b/Swiften/Parser/PayloadParsers/MAMQueryParser.cpp @@ -19,12 +19,15 @@ MAMQueryParser::MAMQueryParser() : level_(TopLevel) { void MAMQueryParser::handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes) { if (level_ == TopLevel) { boost::optional<std::string> attributeValue; if ((attributeValue = attributes.getAttributeValue("queryid"))) { getPayloadInternal()->setQueryID(*attributeValue); } + if ((attributeValue = attributes.getAttributeValue("node"))) { + getPayloadInternal()->setNode(*attributeValue); + } } else if (level_ == PayloadLevel) { if (element == "x" && ns == "jabber:x:data") { formParser_ = boost::make_shared<FormParser>(); } else if (element == "set" && ns == "http://jabber.org/protocol/rsm") { resultSetParser_ = boost::make_shared<ResultSetParser>(); } diff --git a/Swiften/Parser/PayloadParsers/UnitTest/MAMQueryParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/MAMQueryParserTest.cpp index e1c8e3e..541f2af 100644 --- a/Swiften/Parser/PayloadParsers/UnitTest/MAMQueryParserTest.cpp +++ b/Swiften/Parser/PayloadParsers/UnitTest/MAMQueryParserTest.cpp @@ -23,13 +23,13 @@ class MAMQueryParserTest : public CppUnit::TestFixture CPPUNIT_TEST_SUITE_END(); public: void testParse() { PayloadsParserTester parser; CPPUNIT_ASSERT(parser.parse( - "<query queryid=\"id0\" xmlns=\"urn:xmpp:mam:0\">" + "<query queryid=\"id0\" xmlns=\"urn:xmpp:mam:0\" node=\"node1\">" "<x type=\"form\" xmlns=\"jabber:x:data\">" "<field type=\"text-single\" var=\"FORM_TYPE\">" "<value>urn:xmpp:mam:0</value>" "</field>" "<field type=\"text-single\" var=\"start\">" "<value>2010-08-07T00:00:00Z</value>" @@ -42,12 +42,13 @@ class MAMQueryParserTest : public CppUnit::TestFixture boost::shared_ptr<MAMQuery> payload = parser.getPayload<MAMQuery>(); CPPUNIT_ASSERT(!!payload); CPPUNIT_ASSERT(payload->getQueryID()); CPPUNIT_ASSERT_EQUAL(std::string("id0"), *payload->getQueryID()); + CPPUNIT_ASSERT_EQUAL(std::string("node1"), *payload->getNode()); CPPUNIT_ASSERT(payload->getForm()); boost::shared_ptr<FormField> fieldType = payload->getForm()->getField("FORM_TYPE"); CPPUNIT_ASSERT(fieldType); CPPUNIT_ASSERT_EQUAL(std::string("urn:xmpp:mam:0"), fieldType->getTextSingleValue()); boost::shared_ptr<FormField> fieldStart = payload->getForm()->getField("start"); diff --git a/Swiften/Serializer/PayloadSerializers/MAMQuerySerializer.cpp b/Swiften/Serializer/PayloadSerializers/MAMQuerySerializer.cpp index 6a12f8e..591e73c 100644 --- a/Swiften/Serializer/PayloadSerializers/MAMQuerySerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/MAMQuerySerializer.cpp @@ -30,12 +30,16 @@ std::string MAMQuerySerializer::serializePayload(boost::shared_ptr<MAMQuery> pay XMLElement element("query", "urn:xmpp:mam:0"); if (payload->getQueryID()) { element.setAttribute("queryid", *payload->getQueryID()); } + if (payload->getNode()) { + element.setAttribute("node", *payload->getNode()); + } + if (payload->getForm()) { element.addNode(boost::make_shared<XMLRawTextNode>(FormSerializer().serialize(payload->getForm()))); } if (payload->getResultSet()) { element.addNode(boost::make_shared<XMLRawTextNode>(ResultSetSerializer().serialize(payload->getResultSet()))); diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/MAMQuerySerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/MAMQuerySerializerTest.cpp index 7f6cbd9..1d695cd 100644 --- a/Swiften/Serializer/PayloadSerializers/UnitTest/MAMQuerySerializerTest.cpp +++ b/Swiften/Serializer/PayloadSerializers/UnitTest/MAMQuerySerializerTest.cpp @@ -41,17 +41,18 @@ class MAMQuerySerializerTest : public CppUnit::TestFixture { boost::shared_ptr<ResultSet> set = boost::make_shared<ResultSet>(); set->setMaxItems(10); boost::shared_ptr<MAMQuery> query(boost::make_shared<MAMQuery>()); query->setQueryID(std::string("id0")); + query->setNode(std::string("node1")); query->setForm(parameters); query->setResultSet(set); std::string expectedResult = - "<query queryid=\"id0\" xmlns=\"urn:xmpp:mam:0\">" + "<query node=\"node1\" queryid=\"id0\" xmlns=\"urn:xmpp:mam:0\">" "<x type=\"form\" xmlns=\"jabber:x:data\">" "<field type=\"text-single\" var=\"FORM_TYPE\">" "<value>urn:xmpp:mam:0</value>" "</field>" "<field type=\"text-single\" var=\"start\">" "<value>2010-08-07T00:00:00Z</value>" |