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/Elements/FormField.h
parent4a5a0977f661bf5c7c34ee7aa48b35073a682203 (diff)
downloadswift-19df82042f44c201e5a2821b4fa35465e33a1c90.zip
swift-19df82042f44c201e5a2821b4fa35465e33a1c90.tar.bz2
Added XEP-0004 data forms parsing & serializing.
Diffstat (limited to 'Swiften/Elements/FormField.h')
-rw-r--r--Swiften/Elements/FormField.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/Swiften/Elements/FormField.h b/Swiften/Elements/FormField.h
new file mode 100644
index 0000000..732203a
--- /dev/null
+++ b/Swiften/Elements/FormField.h
@@ -0,0 +1,102 @@
+/*
+ * 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 <vector>
+#include <boost/shared_ptr.hpp>
+
+#include "Swiften/Base/String.h"
+#include "Swiften/JID/JID.h"
+
+namespace Swift {
+ class FormField {
+ public:
+ typedef boost::shared_ptr<FormField> ref;
+
+ virtual ~FormField() {}
+
+ struct Option {
+ Option(const String& label, const String& value) : label(label), value(value) {}
+ String label;
+ String value;
+ };
+
+ void setName(const String& name) { this->name = name; }
+ const String& getName() const { return name; }
+
+ void setLabel(const String& label) { this->label = label; }
+ const String& getLabel() const { return label; }
+
+ void setDescription(const String& description) { this->description = description; }
+ const String& getDescription() const { return description; }
+
+ void setRequired(bool required) { this->required = required; }
+ bool getRequired() const { return required; }
+
+ void addOption(const Option& option) {
+ options.push_back(option);
+ }
+
+ const std::vector<Option>& getOptions() const {
+ return options;
+ }
+
+ protected:
+ FormField() : required(false) {}
+
+ private:
+ String name;
+ String label;
+ String description;
+ bool required;
+ std::vector<Option> options;
+ };
+
+ template<typename T> class GenericFormField : public FormField {
+ public:
+ const T& getValue() const {
+ return value;
+ }
+
+ void setValue(const T& value) {
+ this->value = value;
+ }
+
+ protected:
+ GenericFormField() {}
+ GenericFormField(const T& value) : value(value) {}
+
+ private:
+ T value;
+ };
+
+#define SWIFTEN_DECLARE_FORM_FIELD(name, valueType) \
+ class name##FormField : public GenericFormField< valueType > { \
+ public: \
+ typedef boost::shared_ptr<name##FormField> ref; \
+ static ref create(const valueType& value) { \
+ return ref(new name##FormField(value)); \
+ } \
+ static ref create() { \
+ return ref(new name##FormField()); \
+ } \
+ private: \
+ name##FormField(valueType value) : GenericFormField< valueType >(value) {} \
+ name##FormField() : GenericFormField< valueType >() {} \
+ };
+
+ SWIFTEN_DECLARE_FORM_FIELD(Boolean, bool);
+ SWIFTEN_DECLARE_FORM_FIELD(Fixed, String);
+ SWIFTEN_DECLARE_FORM_FIELD(Hidden, String);
+ SWIFTEN_DECLARE_FORM_FIELD(ListSingle, String);
+ SWIFTEN_DECLARE_FORM_FIELD(TextMulti, String);
+ SWIFTEN_DECLARE_FORM_FIELD(TextPrivate, String);
+ SWIFTEN_DECLARE_FORM_FIELD(TextSingle, String);
+ SWIFTEN_DECLARE_FORM_FIELD(JIDSingle, JID);
+ SWIFTEN_DECLARE_FORM_FIELD(JIDMulti, std::vector<JID>);
+ SWIFTEN_DECLARE_FORM_FIELD(ListMulti, std::vector<String>);
+}