summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2010-08-08 18:41:53 (GMT)
committerRemko Tronçon <git@el-tramo.be>2010-08-08 18:41:53 (GMT)
commit19df82042f44c201e5a2821b4fa35465e33a1c90 (patch)
tree1746bddfa31ce2a6488ef5186036a049a255c9da /Swiften/Parser/PayloadParsers/FormParser.h
parent4a5a0977f661bf5c7c34ee7aa48b35073a682203 (diff)
downloadswift-19df82042f44c201e5a2821b4fa35465e33a1c90.zip
swift-19df82042f44c201e5a2821b4fa35465e33a1c90.tar.bz2
Added XEP-0004 data forms parsing & serializing.
Diffstat (limited to 'Swiften/Parser/PayloadParsers/FormParser.h')
-rw-r--r--Swiften/Parser/PayloadParsers/FormParser.h106
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_;
+ };
+}