diff options
Diffstat (limited to 'Swiften/Serializer/PayloadSerializers/FormSerializer.cpp')
-rw-r--r-- | Swiften/Serializer/PayloadSerializers/FormSerializer.cpp | 76 |
1 files changed, 69 insertions, 7 deletions
diff --git a/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp b/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp index a343989..633ead6 100644 --- a/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp @@ -1,8 +1,8 @@ /* - * Copyright (c) 2010-2013 Isode Limited. + * Copyright (c) 2010-2015 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/FormSerializer.h> @@ -27,17 +27,15 @@ namespace { valueElement->addNode(XMLTextNode::create(value)); parent->addNode(valueElement); } } } - namespace Swift { -FormSerializer::FormSerializer() : GenericPayloadSerializer<Form>() { -} +FormSerializer::FormSerializer() : GenericPayloadSerializer<Form>() {} std::string FormSerializer::serializePayload(boost::shared_ptr<Form> form) const { if (!form) { return ""; } @@ -53,33 +51,100 @@ std::string FormSerializer::serializePayload(boost::shared_ptr<Form> form) cons if (!form->getTitle().empty()) { multiLineify(form->getTitle(), "title", formElement); } if (!form->getInstructions().empty()) { multiLineify(form->getInstructions(), "instructions", formElement); } + foreach(boost::shared_ptr<FormPage> page, form->getPages()) { + formElement->addNode(pageToXML(page)); + } foreach(boost::shared_ptr<FormField> field, form->getFields()) { 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); } + foreach(const FormText::text text, form->getTextElements()) { + formElement->addNode(textToXML(text)); + } + + foreach (boost::shared_ptr<FormField> field, fields_) { + formElement->addNode(fieldToXML(field,true)); + } + return formElement->serialize(); } +boost::shared_ptr<XMLElement> FormSerializer::textToXML(boost::shared_ptr<FormText> text) const { + boost::shared_ptr<XMLElement> textElement (new XMLElement("text")); + textElement->addNode(boost::make_shared<XMLTextNode>(text->getTextString())); + return textElement; +} + +boost::shared_ptr<XMLElement> FormSerializer::fieldRefToXML(const std::string& ref) const { + boost::shared_ptr<XMLElement> fieldRefElement(new XMLElement("fieldref")); + fieldRefElement->setAttribute("var", ref); + return fieldRefElement; +} + +boost::shared_ptr<XMLElement> FormSerializer::pageToXML(boost::shared_ptr<FormPage> page) const { + boost::shared_ptr<XMLElement> pageElement(new XMLElement("page")); + pageElement->setAttribute("xmlns", page->getXMLNS()); + if (!page->getLabel().empty()) { + pageElement->setAttribute("label", page->getLabel()); + } + foreach(const FormText::text text, page->getTextElements()) { + pageElement->addNode(textToXML(text)); + } + foreach (const boost::shared_ptr<FormField> field, page->getFields()) { + pageElement->addNode(fieldRefToXML(field->getName())); + fields_.push_back(field); + } + foreach(const FormReportedRef::ref reportedRef, page->getReportedRefs()) { + pageElement->addNode(boost::make_shared<XMLElement>("reportedref")); + } + foreach(const FormSection::section section, page->getChildSections()) { + pageElement->addNode(sectionToXML(section)); + } + return pageElement; +} + +boost::shared_ptr<XMLElement> FormSerializer::sectionToXML(boost::shared_ptr<FormSection> section) const { + boost::shared_ptr<XMLElement> sectionElement(new XMLElement("section")); + if (!section->getLabel().empty()) { + sectionElement->setAttribute("label", section->getLabel()); + } + foreach(const FormText::text text, section->getTextElements()) { + sectionElement->addNode(textToXML(text)); + } + foreach(const boost::shared_ptr<FormField> field, section->getFields()) { + sectionElement->addNode(fieldRefToXML(field->getName())); + fields_.push_back(field); + } + foreach(const FormReportedRef::ref reportedRef, section->getReportedRefs()) { + sectionElement->addNode(boost::make_shared<XMLElement>("reportedref")); + } + foreach(const FormSection::section childSection, section->getChildSections()) { + sectionElement->addNode(sectionToXML(childSection)); + } + return sectionElement; +} + 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()) { @@ -124,16 +189,14 @@ boost::shared_ptr<XMLElement> FormSerializer::fieldToXML(boost::shared_ptr<FormF optionElement->setAttribute("label", option.label); } boost::shared_ptr<XMLElement> valueElement(new XMLElement("value")); valueElement->addNode(XMLTextNode::create(option.value)); optionElement->addNode(valueElement); - fieldElement->addNode(optionElement); } - return fieldElement; } void FormSerializer::multiLineify(const std::string& text, const std::string& elementName, boost::shared_ptr<XMLElement> element) const { std::string unRdText(text); erase(unRdText, '\r'); @@ -141,8 +204,7 @@ void FormSerializer::multiLineify(const std::string& text, const std::string& el foreach (std::string line, lines) { boost::shared_ptr<XMLElement> lineElement(new XMLElement(elementName)); lineElement->addNode(boost::make_shared<XMLTextNode>(line)); element->addNode(lineElement); } } - } |