diff options
Diffstat (limited to 'Swiften/Parser/PayloadParsers/FormParser.h')
-rw-r--r-- | Swiften/Parser/PayloadParsers/FormParser.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/Swiften/Parser/PayloadParsers/FormParser.h b/Swiften/Parser/PayloadParsers/FormParser.h new file mode 100644 index 0000000..76a54b9 --- /dev/null +++ b/Swiften/Parser/PayloadParsers/FormParser.h @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include "Swiften/Elements/Form.h" +#include "Swiften/Parser/GenericPayloadParser.h" + +namespace Swift { + class FormParser : public GenericPayloadParser<Form> { + public: + FormParser(); + + virtual void handleStartElement(const String& element, const String&, const AttributeMap& attributes); + virtual void handleEndElement(const String& element, const String&); + virtual void handleCharacterData(const String& data); + + private: + class FieldParseHelper { + public: + virtual ~FieldParseHelper() {} + virtual void addValue(const String&) = 0; + virtual boost::shared_ptr<FormField> getField() const { + return field; + } + protected: + boost::shared_ptr<FormField> field; + }; + class BoolFieldParseHelper : public FieldParseHelper { + virtual void addValue(const String& s) { + boost::dynamic_pointer_cast< GenericFormField<bool> >(getField())->setValue(s == "1" || s == "true"); + } + }; + class StringFieldParseHelper : public FieldParseHelper { + virtual void addValue(const String& s) { + boost::shared_ptr<GenericFormField<String> > field = boost::dynamic_pointer_cast< GenericFormField<String> >(getField()); + if (field->getValue().isEmpty()) { + field->setValue(s); + } + else { + field->setValue(field->getValue() + "\n" + s); + } + } + }; + class JIDFieldParseHelper : public FieldParseHelper { + virtual void addValue(const String& s) { + boost::dynamic_pointer_cast< GenericFormField<JID> >(getField())->setValue(JID(s)); + } + }; + class StringListFieldParseHelper : public FieldParseHelper { + virtual void addValue(const String& s) { + // FIXME: Inefficient, but too much hassle to do efficiently + boost::shared_ptr<GenericFormField< std::vector<String> > > field = boost::dynamic_pointer_cast< GenericFormField<std::vector<String > > >(getField()); + std::vector<String> l = field->getValue(); + l.push_back(s); + field->setValue(l); + } + }; + class JIDListFieldParseHelper : public FieldParseHelper { + virtual void addValue(const String& s) { + // FIXME: Inefficient, but too much hassle to do efficiently + boost::shared_ptr< GenericFormField< std::vector<JID> > > field = boost::dynamic_pointer_cast< GenericFormField<std::vector<JID > > >(getField()); + std::vector<JID> l = field->getValue(); + l.push_back(JID(s)); + field->setValue(l); + } + }; + +#define SWIFTEN_DECLARE_FORM_FIELD_PARSE_HELPER(name, baseParser) \ + class name##FormFieldParseHelper : public baseParser##FieldParseHelper { \ + public: \ + typedef boost::shared_ptr<name##FormFieldParseHelper> ref; \ + static ref create() { \ + return ref(new name##FormFieldParseHelper()); \ + } \ + private: \ + name##FormFieldParseHelper() : baseParser##FieldParseHelper() { \ + field = name##FormField::create(); \ + } \ + }; + + SWIFTEN_DECLARE_FORM_FIELD_PARSE_HELPER(Boolean, Bool); + SWIFTEN_DECLARE_FORM_FIELD_PARSE_HELPER(Fixed, String); + SWIFTEN_DECLARE_FORM_FIELD_PARSE_HELPER(Hidden, String); + SWIFTEN_DECLARE_FORM_FIELD_PARSE_HELPER(ListSingle, String); + SWIFTEN_DECLARE_FORM_FIELD_PARSE_HELPER(TextMulti, String); + SWIFTEN_DECLARE_FORM_FIELD_PARSE_HELPER(TextPrivate, String); + SWIFTEN_DECLARE_FORM_FIELD_PARSE_HELPER(TextSingle, String); + SWIFTEN_DECLARE_FORM_FIELD_PARSE_HELPER(JIDSingle, JID); + SWIFTEN_DECLARE_FORM_FIELD_PARSE_HELPER(JIDMulti, JIDList); + SWIFTEN_DECLARE_FORM_FIELD_PARSE_HELPER(ListMulti, StringList); + + enum Level { + TopLevel = 0, + PayloadLevel = 1, + FieldLevel = 2 + }; + int level_; + String currentText_; + String currentOptionLabel_; + boost::shared_ptr<FieldParseHelper> currentFieldParseHelper_; + }; +} |