aboutsummaryrefslogtreecommitdiff
path: root/xmpp-vala/src/module/xep/0004_data_forms.vala
diff options
context:
space:
mode:
Diffstat (limited to 'xmpp-vala/src/module/xep/0004_data_forms.vala')
-rw-r--r--xmpp-vala/src/module/xep/0004_data_forms.vala93
1 files changed, 66 insertions, 27 deletions
diff --git a/xmpp-vala/src/module/xep/0004_data_forms.vala b/xmpp-vala/src/module/xep/0004_data_forms.vala
index a0e8cd43..57ff834a 100644
--- a/xmpp-vala/src/module/xep/0004_data_forms.vala
+++ b/xmpp-vala/src/module/xep/0004_data_forms.vala
@@ -21,8 +21,12 @@ public class DataForm {
}
public void submit() {
+ on_result(stream, get_submit_node());
+ }
+
+ public StanzaNode get_submit_node() {
stanza_node.set_attribute("type", "submit");
- on_result(stream, stanza_node);
+ return stanza_node;
}
public enum Type {
@@ -46,19 +50,24 @@ public class DataForm {
}
}
- public abstract class Field {
- public string label {
+ public class Field {
+ public StanzaNode node { get; set; }
+ public string? label {
get { return node.get_attribute("label", NS_URI); }
set { node.set_attribute("label", value); }
+ default = null;
}
- public StanzaNode node { get; set; }
- public abstract Type type_ { get; internal set; }
- public string var {
+ public virtual Type? type_ { get; internal set; default=null; }
+ public string? var {
get { return node.get_attribute("var", NS_URI); }
set { node.set_attribute("var", value); }
}
- public Field(StanzaNode node) {
+ public Field() {
+ this.node = new StanzaNode.build("field", NS_URI);
+ }
+
+ public Field.from_node(StanzaNode node) {
this.node = node;
}
@@ -103,73 +112,94 @@ public class DataForm {
}
public class BooleanField : Field {
- public override Type type_ { get; internal set; default=Type.BOOLEAN; }
public bool value {
get { return get_value_string() == "1"; }
set { set_value_string(value ? "1" : "0"); }
}
- public BooleanField(StanzaNode node) { base(node); }
+ public BooleanField(StanzaNode node) {
+ base.from_node(node);
+ type_ = Type.BOOLEAN;
+ }
}
public class FixedField : Field {
- public override Type type_ { get; internal set; default=Type.FIXED; }
public string value {
owned get { return get_value_string(); }
set { set_value_string(value); }
}
- public FixedField(StanzaNode node) { base(node); }
+ public FixedField(StanzaNode node) {
+ base.from_node(node);
+ type_ = Type.FIXED;
+ }
}
public class HiddenField : Field {
- public override Type type_ { get; internal set; default=Type.HIDDEN; }
- public HiddenField(StanzaNode node) { base(node); }
+ public HiddenField() {
+ base();
+ type_ = Type.HIDDEN;;
+ node.put_attribute("type", "hidden");
+ }
+ public HiddenField.from_node(StanzaNode node) {
+ base.from_node(node);
+ type_ = Type.HIDDEN;;
+ }
}
public class JidMultiField : Field {
public Gee.List<Option> options { owned get { return get_options(); } }
- public override Type type_ { get; internal set; default=Type.JID_MULTI; }
public Gee.List<string> value { get; set; }
- public JidMultiField(StanzaNode node) { base(node); }
+ public JidMultiField(StanzaNode node) {
+ base.from_node(node);
+ type_ = Type.JID_MULTI;
+ }
}
public class ListSingleField : Field {
public Gee.List<Option> options { owned get { return get_options(); } }
- public override Type type_ { get; internal set; default=Type.LIST_SINGLE; }
public string value {
owned get { return get_value_string(); }
set { set_value_string(value); }
}
- public ListSingleField(StanzaNode node) { base(node); }
+ public ListSingleField(StanzaNode node) {
+ base.from_node(node);
+ type_ = Type.LIST_SINGLE;;
+ }
}
public class ListMultiField : Field {
public Gee.List<Option> options { owned get { return get_options(); } }
- public override Type type_ { get; internal set; default=Type.LIST_MULTI; }
public Gee.List<string> value { get; set; }
- public ListMultiField(StanzaNode node) { base(node); }
+ public ListMultiField(StanzaNode node) {
+ base.from_node(node);
+ type_ = Type.LIST_MULTI;
+ }
}
public class TextPrivateField : Field {
- public override Type type_ { get; internal set; default=Type.TEXT_PRIVATE; }
public string value {
owned get { return get_value_string(); }
set { set_value_string(value); }
}
- public TextPrivateField(StanzaNode node) { base(node); }
+ public TextPrivateField(StanzaNode node) {
+ base.from_node(node);
+ type_ = Type.TEXT_PRIVATE;
+ }
}
public class TextSingleField : Field {
- public override Type type_ { get; internal set; default=Type.TEXT_SINGLE; }
public string value {
owned get { return get_value_string(); }
set { set_value_string(value); }
}
- public TextSingleField(StanzaNode node) { base(node); }
+ public TextSingleField(StanzaNode node) {
+ base.from_node(node);
+ type_ = Type.TEXT_SINGLE;
+ }
}
// TODO text-multi
- internal DataForm(StanzaNode node, XmppStream stream, owned OnResult listener) {
+ internal DataForm.from_node(StanzaNode node, XmppStream stream, owned OnResult listener) {
this.stanza_node = node;
this.stream = stream;
this.on_result = (owned)listener;
@@ -183,7 +213,7 @@ public class DataForm {
case "fixed":
fields.add(new FixedField(field_node)); break;
case "hidden":
- fields.add(new HiddenField(field_node)); break;
+ fields.add(new HiddenField.from_node(field_node)); break;
case "jid-multi":
fields.add(new JidMultiField(field_node)); break;
case "list-single":
@@ -198,9 +228,18 @@ public class DataForm {
}
}
+ internal DataForm() {
+ this.stanza_node = new StanzaNode.build("x", NS_URI).add_self_xmlns();
+ }
+
public delegate void OnResult(XmppStream stream, StanzaNode node);
- public static DataForm? create(XmppStream stream, StanzaNode node, owned OnResult listener) {
- return new DataForm(node, stream, (owned)listener);
+ public static DataForm? create_from_node(XmppStream stream, StanzaNode node, owned OnResult listener) {
+ return new DataForm.from_node(node, stream, (owned)listener);
+ }
+
+ public void add_field(Field field) {
+ fields.add(field);
+ stanza_node.put_node(field.node);
}
}