diff options
Diffstat (limited to 'Swiften/Serializer')
4 files changed, 214 insertions, 6 deletions
diff --git a/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp b/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp index 7a6bb79..15c4f32 100644 --- a/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp @@ -46,24 +46,39 @@ std::string FormSerializer::serializePayload(boost::shared_ptr<Form> form) cons } formElement->setAttribute("type", type); if (!form->getTitle().empty()) { multiLineify(form->getTitle(), "title", formElement); } if (!form->getInstructions().empty()) { multiLineify(form->getInstructions(), "instructions", formElement); } foreach(boost::shared_ptr<FormField> field, form->getFields()) { - formElement->addNode(fieldToXML(field)); + formElement->addNode(fieldToXML(field, true)); } + if (!form->getReportedFields().empty()) { + boost::shared_ptr<XMLElement> reportedElement(new XMLElement("reported")); + foreach(FormField::ref field, form->getReportedFields()) { + reportedElement->addNode(fieldToXML(field, true)); + } + formElement->addNode(reportedElement); + } + foreach(Form::FormItem item, form->getItems()) { + boost::shared_ptr<XMLElement> itemElement(new XMLElement("item")); + foreach(FormField::ref field, item) { + itemElement->addNode(fieldToXML(field, false)); + } + formElement->addNode(itemElement); + } + return formElement->serialize(); } -boost::shared_ptr<XMLElement> FormSerializer::fieldToXML(boost::shared_ptr<FormField> field) const { +boost::shared_ptr<XMLElement> FormSerializer::fieldToXML(boost::shared_ptr<FormField> field, bool withTypeAttribute) const { boost::shared_ptr<XMLElement> fieldElement(new XMLElement("field")); if (!field->getName().empty()) { fieldElement->setAttribute("var", field->getName()); } if (!field->getLabel().empty()) { fieldElement->setAttribute("label", field->getLabel()); } if (field->getRequired()) { fieldElement->addNode(boost::shared_ptr<XMLElement>(new XMLElement("required"))); @@ -109,37 +124,37 @@ boost::shared_ptr<XMLElement> FormSerializer::fieldToXML(boost::shared_ptr<FormF boost::shared_ptr<XMLElement> valueElement(new XMLElement("value")); valueElement->addNode(XMLTextNode::create(jid.toString())); fieldElement->addNode(valueElement); } } else if (boost::dynamic_pointer_cast<JIDSingleFormField>(field)) { fieldType = "jid-single"; boost::shared_ptr<XMLElement> valueElement(new XMLElement("value")); valueElement->addNode(XMLTextNode::create(boost::dynamic_pointer_cast<JIDSingleFormField>(field)->getValue().toString())); - fieldElement->addNode(valueElement); + if ( boost::dynamic_pointer_cast<JIDSingleFormField>(field)->getValue().isValid()) fieldElement->addNode(valueElement); } else if (boost::dynamic_pointer_cast<ListMultiFormField>(field)) { fieldType = "list-multi"; std::vector<std::string> lines = boost::dynamic_pointer_cast<ListMultiFormField>(field)->getValue(); foreach(const std::string& line, lines) { boost::shared_ptr<XMLElement> valueElement(new XMLElement("value")); valueElement->addNode(XMLTextNode::create(line)); fieldElement->addNode(valueElement); } } else if (boost::dynamic_pointer_cast<TextMultiFormField>(field)) { fieldType = "text-multi"; multiLineify(boost::dynamic_pointer_cast<TextMultiFormField>(field)->getValue(), "value", fieldElement); } else { assert(false); } - if (!fieldType.empty()) { + if (!fieldType.empty() && withTypeAttribute) { fieldElement->setAttribute("type", fieldType); } foreach (const FormField::Option& option, field->getOptions()) { boost::shared_ptr<XMLElement> optionElement(new XMLElement("option")); if (!option.label.empty()) { optionElement->setAttribute("label", option.label); } diff --git a/Swiften/Serializer/PayloadSerializers/FormSerializer.h b/Swiften/Serializer/PayloadSerializers/FormSerializer.h index 43db9e8..d10f649 100644 --- a/Swiften/Serializer/PayloadSerializers/FormSerializer.h +++ b/Swiften/Serializer/PayloadSerializers/FormSerializer.h @@ -13,15 +13,15 @@ namespace Swift { class FormSerializer : public GenericPayloadSerializer<Form> { public: FormSerializer(); virtual std::string serializePayload(boost::shared_ptr<Form>) const; private: - boost::shared_ptr<XMLElement> fieldToXML(boost::shared_ptr<FormField> field) const; + boost::shared_ptr<XMLElement> fieldToXML(boost::shared_ptr<FormField> field, bool withTypeAttribute) const; void multiLineify(const std::string& text, const std::string& elementName, boost::shared_ptr<XMLElement> parent) const; }; } diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/FormSerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/FormSerializerTest.cpp index 29e7e59..4608522 100644 --- a/Swiften/Serializer/PayloadSerializers/UnitTest/FormSerializerTest.cpp +++ b/Swiften/Serializer/PayloadSerializers/UnitTest/FormSerializerTest.cpp @@ -2,25 +2,25 @@ * Copyright (c) 2010 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #include <cppunit/extensions/HelperMacros.h> #include <cppunit/extensions/TestFactoryRegistry.h> #include <Swiften/Serializer/PayloadSerializers/FormSerializer.h> - using namespace Swift; class FormSerializerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(FormSerializerTest); CPPUNIT_TEST(testSerializeFormInformation); CPPUNIT_TEST(testSerializeFields); + CPPUNIT_TEST(testSerializeFormItems); CPPUNIT_TEST_SUITE_END(); public: void testSerializeFormInformation() { FormSerializer testling; boost::shared_ptr<Form> form(new Form(Form::FormType)); form->setTitle("Bot Configuration"); form->setInstructions("Hello!\nFill out this form to configure your new bot!"); @@ -128,12 +128,105 @@ class FormSerializerTest : public CppUnit::TestFixture { "<option><value>none</value></option>" "</field>" "<field label=\"People to invite\" type=\"jid-multi\" var=\"invitelist\">" "<desc>Tell all your friends about your new bot!</desc>" "<value>foo@bar.com</value>" "<value>baz@fum.org</value>" "</field>" "</x>"), testling.serialize(form)); } + + void testSerializeFormItems() { + FormSerializer testling; + boost::shared_ptr<Form> form(new Form(Form::ResultType)); + + + FormField::ref field = HiddenFormField::create("jabber:iq:search"); + field->setName("FORM_TYPE"); + form->addField(field); + + // reported fields + field = TextSingleFormField::create(); + field->setName("first"); + field->setLabel("Given Name"); + form->addReportedField(field); + + field = TextSingleFormField::create(); + field->setName("last"); + field->setLabel("Family Name"); + form->addReportedField(field); + + field = JIDSingleFormField::create(); + field->setName("jid"); + field->setLabel("Jabber ID"); + form->addReportedField(field); + + field = ListSingleFormField::create(); + field->setName("x-gender"); + field->setLabel("Gender"); + form->addReportedField(field); + + Form::FormItem firstItem; + field = TextSingleFormField::create("Benvolio"); + field->setName("first"); + firstItem.push_back(field); + + field = TextSingleFormField::create("Montague"); + field->setName("last"); + firstItem.push_back(field); + + field = JIDSingleFormField::create(JID("benvolio@montague.net")); + field->setName("jid"); + firstItem.push_back(field); + + field = ListSingleFormField::create("male"); + field->setName("x-gender"); + firstItem.push_back(field); + + Form::FormItem secondItem; + field = TextSingleFormField::create("Romeo"); + field->setName("first"); + secondItem.push_back(field); + + field = TextSingleFormField::create("Montague"); + field->setName("last"); + secondItem.push_back(field); + + field = JIDSingleFormField::create(JID("romeo@montague.net")); + field->setName("jid"); + secondItem.push_back(field); + + field = ListSingleFormField::create("male"); + field->setName("x-gender"); + secondItem.push_back(field); + + form->addItem(firstItem); + form->addItem(secondItem); + + CPPUNIT_ASSERT_EQUAL(std::string( + "<x type=\"result\" xmlns=\"jabber:x:data\">" + "<field type=\"hidden\" var=\"FORM_TYPE\">" + "<value>jabber:iq:search</value>" + "</field>" + "<reported>" + "<field label=\"Given Name\" type=\"text-single\" var=\"first\"/>" + "<field label=\"Family Name\" type=\"text-single\" var=\"last\"/>" + "<field label=\"Jabber ID\" type=\"jid-single\" var=\"jid\"/>" + "<field label=\"Gender\" type=\"list-single\" var=\"x-gender\"/>" + "</reported>" + "<item>" + "<field var=\"first\"><value>Benvolio</value></field>" + "<field var=\"last\"><value>Montague</value></field>" + "<field var=\"jid\"><value>benvolio@montague.net</value></field>" + "<field var=\"x-gender\"><value>male</value></field>" + "</item>" + "<item>" + "<field var=\"first\"><value>Romeo</value></field>" + "<field var=\"last\"><value>Montague</value></field>" + "<field var=\"jid\"><value>romeo@montague.net</value></field>" + "<field var=\"x-gender\"><value>male</value></field>" + "</item>" + "</x>"), testling.serialize(form)); + } }; CPPUNIT_TEST_SUITE_REGISTRATION(FormSerializerTest); diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/SearchPayloadSerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/SearchPayloadSerializerTest.cpp index d0dcbef..42bff72 100644 --- a/Swiften/Serializer/PayloadSerializers/UnitTest/SearchPayloadSerializerTest.cpp +++ b/Swiften/Serializer/PayloadSerializers/UnitTest/SearchPayloadSerializerTest.cpp @@ -9,18 +9,19 @@ #include <Swiften/Serializer/PayloadSerializers/SearchPayloadSerializer.h> using namespace Swift; class SearchPayloadSerializerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(SearchPayloadSerializerTest); CPPUNIT_TEST(testSerialize_Request); CPPUNIT_TEST(testSerialize_Items); + CPPUNIT_TEST(testSerialize_DataForm); CPPUNIT_TEST_SUITE_END(); public: void testSerialize_Request() { SearchPayloadSerializer testling; SearchPayload::ref payload(new SearchPayload()); payload->setFirst("Juliet"); payload->setLast("Capulet"); @@ -64,12 +65,111 @@ class SearchPayloadSerializerTest : public CppUnit::TestFixture { "<item jid=\"tybalt@shakespeare.lit\">" "<first>Tybalt</first>" "<last>Capulet</last>" "<nick>ty</nick>" "<email>tybalt@shakespeare.lit</email>" "</item>" "</query>" ), testling.serialize(payload)); } + + void testSerialize_DataForm() { + SearchPayloadSerializer testling; + + SearchPayload::ref payload(new SearchPayload()); + boost::shared_ptr<Form> form(new Form(Form::ResultType)); + + FormField::ref field = HiddenFormField::create("jabber:iq:search"); + field->setName("FORM_TYPE"); + form->addField(field); + + // reported fields + field = TextSingleFormField::create(); + field->setName("first"); + field->setLabel("Given Name"); + form->addReportedField(field); + + field = TextSingleFormField::create(); + field->setName("last"); + field->setLabel("Family Name"); + form->addReportedField(field); + + field = JIDSingleFormField::create(); + field->setName("jid"); + field->setLabel("Jabber ID"); + form->addReportedField(field); + + field = ListSingleFormField::create(); + field->setName("x-gender"); + field->setLabel("Gender"); + form->addReportedField(field); + + Form::FormItem firstItem; + field = TextSingleFormField::create("Benvolio"); + field->setName("first"); + firstItem.push_back(field); + + field = TextSingleFormField::create("Montague"); + field->setName("last"); + firstItem.push_back(field); + + field = TextSingleFormField::create("benvolio@montague.net"); + field->setName("jid"); + firstItem.push_back(field); + + field = ListSingleFormField::create("male"); + field->setName("x-gender"); + firstItem.push_back(field); + + Form::FormItem secondItem; + field = TextSingleFormField::create("Romeo"); + field->setName("first"); + secondItem.push_back(field); + + field = TextSingleFormField::create("Montague"); + field->setName("last"); + secondItem.push_back(field); + + field = TextSingleFormField::create("romeo@montague.net"); + field->setName("jid"); + secondItem.push_back(field); + + field = ListSingleFormField::create("male"); + field->setName("x-gender"); + secondItem.push_back(field); + + form->addItem(firstItem); + form->addItem(secondItem); + + payload->setForm(form); + + CPPUNIT_ASSERT_EQUAL(std::string( + "<query xmlns=\"jabber:iq:search\">" + "<x type=\"result\" xmlns=\"jabber:x:data\">" + "<field type=\"hidden\" var=\"FORM_TYPE\">" + "<value>jabber:iq:search</value>" + "</field>" + "<reported>" + "<field label=\"Given Name\" type=\"text-single\" var=\"first\"/>" + "<field label=\"Family Name\" type=\"text-single\" var=\"last\"/>" + "<field label=\"Jabber ID\" type=\"jid-single\" var=\"jid\"/>" + "<field label=\"Gender\" type=\"list-single\" var=\"x-gender\"/>" + "</reported>" + "<item>" + "<field var=\"first\"><value>Benvolio</value></field>" + "<field var=\"last\"><value>Montague</value></field>" + "<field var=\"jid\"><value>benvolio@montague.net</value></field>" + "<field var=\"x-gender\"><value>male</value></field>" + "</item>" + "<item>" + "<field var=\"first\"><value>Romeo</value></field>" + "<field var=\"last\"><value>Montague</value></field>" + "<field var=\"jid\"><value>romeo@montague.net</value></field>" + "<field var=\"x-gender\"><value>male</value></field>" + "</item>" + "</x>" + "</query>"), testling.serialize(payload)); + + } }; CPPUNIT_TEST_SUITE_REGISTRATION(SearchPayloadSerializerTest); |