diff options
Diffstat (limited to 'xmpp-vala/src/module/message')
-rw-r--r-- | xmpp-vala/src/module/message/module.vala | 50 | ||||
-rw-r--r-- | xmpp-vala/src/module/message/stanza.vala | 63 |
2 files changed, 113 insertions, 0 deletions
diff --git a/xmpp-vala/src/module/message/module.vala b/xmpp-vala/src/module/message/module.vala new file mode 100644 index 00000000..10d83693 --- /dev/null +++ b/xmpp-vala/src/module/message/module.vala @@ -0,0 +1,50 @@ +using Gee; + +using Xmpp.Core; + +namespace Xmpp.Message { + private const string NS_URI = "jabber:client"; + + public class Module : XmppStreamModule { + public const string ID = "message_module"; + + public signal void pre_send_message(XmppStream stream, Message.Stanza message); + public signal void pre_received_message(XmppStream stream, Message.Stanza message); + public signal void received_message(XmppStream stream, Message.Stanza message); + + public void send_message(XmppStream stream, Message.Stanza message) { + pre_send_message(stream, message); + stream.write(message.stanza); + } + + public void received_message_stanza(XmppStream stream, StanzaNode node) { + Message.Stanza message = new Message.Stanza.from_stanza(node, Bind.Flag.get_flag(stream).my_jid); + do { + message.rerun_parsing = false; + pre_received_message(stream, message); + } while(message.rerun_parsing); + received_message(stream, message); + } + + public static Module? get_module(XmppStream stream) { + return (Module?) stream.get_module(NS_URI, ID); + } + + public static void require(XmppStream stream) { + if (get_module(stream) == null) stream.add_module(new Message.Module()); + } + + public override void attach(XmppStream stream) { + Bind.Module.require(stream); + stream.received_message_stanza.connect(received_message_stanza); + } + + public override void detach(XmppStream stream) { + stream.received_message_stanza.disconnect(received_message_stanza); + } + + public override string get_ns() { return NS_URI; } + public override string get_id() { return ID; } + } + +} diff --git a/xmpp-vala/src/module/message/stanza.vala b/xmpp-vala/src/module/message/stanza.vala new file mode 100644 index 00000000..8a9064a5 --- /dev/null +++ b/xmpp-vala/src/module/message/stanza.vala @@ -0,0 +1,63 @@ +using Gee; + +using Xmpp.Core; + +namespace Xmpp.Message { + +public class Stanza : 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 Stanza(string? id = null) { + base.outgoing(new StanzaNode.build("message")); + stanza.set_attribute(ATTRIBUTE_ID, id ?? random_uuid()); + } + + public Stanza.from_stanza(StanzaNode stanza_node, string 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(); +} + +}
\ No newline at end of file |