aboutsummaryrefslogtreecommitdiff
path: root/xmpp-vala/src/module/message/stanza.vala
blob: 640f2796e44e84b93d679e3d9795a9af32d07e2f (plain) (blame)
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
using Gee;

namespace Xmpp {

public class MessageStanza : Xmpp.Stanza {
    public const string NODE_BODY = "body";
    public const string NODE_SUBJECT = "subject";
    public const string NODE_THREAD = "thread";

    public const string TYPE_CHAT = "chat";
    public const string TYPE_GROUPCHAT = "groupchat";
    public const string TYPE_HEADLINE = "headline";
    public const string TYPE_NORMAL = "normal";

    public bool rerun_parsing = false;
    private ArrayList<MessageFlag> flags = new ArrayList<MessageFlag>();

    public string body {
        get {
            StanzaNode? body_node = stanza.get_subnode(NODE_BODY);
            return body_node == null? null : body_node.get_string_content();
        }
        set {
            StanzaNode? body_node = stanza.get_subnode(NODE_BODY);
            if (body_node == null) {
                body_node = new StanzaNode.build(NODE_BODY);
                stanza.put_node(body_node);
            }
            body_node.sub_nodes.clear();
            body_node.put_node(new StanzaNode.text(value));
        }
    }

    public override string? type_ {
        get {
            return base.type_ ?? TYPE_NORMAL;
        }
        set { base.type_ = value; }
    }

    public MessageStanza(string? id = null) {
        base.outgoing(new StanzaNode.build("message"));
        stanza.set_attribute(ATTRIBUTE_ID, id ?? random_uuid());
    }

    public MessageStanza.from_stanza(StanzaNode stanza_node, Jid my_jid) {
        base.incoming(stanza_node, my_jid);
    }

    public void add_flag(MessageFlag flag) {
        flags.add(flag);
    }

    public MessageFlag? get_flag(string ns, string id) {
        foreach (MessageFlag flag in flags) {
            if (flag.get_ns() == ns && flag.get_id() == id) return flag;
        }
        return null;
    }
}

public abstract class MessageFlag : Object {
    public abstract string get_ns();

    public abstract string get_id();
}

}