aboutsummaryrefslogtreecommitdiff
path: root/vala-xmpp/src/module/message
diff options
context:
space:
mode:
Diffstat (limited to 'vala-xmpp/src/module/message')
-rw-r--r--vala-xmpp/src/module/message/module.vala50
-rw-r--r--vala-xmpp/src/module/message/stanza.vala63
2 files changed, 113 insertions, 0 deletions
diff --git a/vala-xmpp/src/module/message/module.vala b/vala-xmpp/src/module/message/module.vala
new file mode 100644
index 00000000..10d83693
--- /dev/null
+++ b/vala-xmpp/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/vala-xmpp/src/module/message/stanza.vala b/vala-xmpp/src/module/message/stanza.vala
new file mode 100644
index 00000000..811fbd22
--- /dev/null
+++ b/vala-xmpp/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 = UUID.generate_random_unparsed()) {
+ base.outgoing(new StanzaNode.build("message"));
+ stanza.set_attribute(ATTRIBUTE_ID, id);
+ }
+
+ 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