1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
/*
* Copyright (c) 2010 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
// FIXME: We currently keep 2 values: the raw values, and the actual value.
// We should only store the raw values, and deduce the actual values from this
#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;
}
const std::vector<String> getRawValues() const {
return rawValues;
}
void addRawValue(const String& value) {
rawValues.push_back(value);
}
protected:
FormField() : required(false) {}
private:
String name;
String label;
String description;
bool required;
std::vector<Option> options;
std::vector<String> rawValues;
};
template<typename T> class GenericFormField : public FormField {
public:
const T& getValue() const {
return value;
}
void setValue(const T& value) {
this->value = value;
}
protected:
GenericFormField() : value() {}
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>);
SWIFTEN_DECLARE_FORM_FIELD(Untyped, std::vector<String>);
}
|