changeset 989:859ab76e5093

Send JEP-22 delivered messages
author Mikael Berthe <mikael@lilotux.net>
date Tue, 31 Oct 2006 20:30:29 +0100
parents 6e2bfd1ffded
children 35e7913affb7
files mcabber/src/jabglue.c
diffstat 1 files changed, 67 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/jabglue.c	Mon Oct 30 23:37:58 2006 +0100
+++ b/mcabber/src/jabglue.c	Tue Oct 31 20:30:29 2006 +0100
@@ -494,11 +494,18 @@
     xmlnode_insert_tag(event, "composing");
 
     // An id is mandatory when using JEP-0022.
-    if (!msgid) {
+    if (!msgid && (text || subject)) {
+      struct jep0022 *jep22;
       msgid = new_msgid();
-      // FIXME update last_msgid_sent
-      // We do not update it when the msgid is provided by the caller,
-      // because this is probably a special message (e.g. delivered...)
+      // Let's update last_msgid_sent
+      // (We do not update it when the msgid is provided by the caller,
+      // because this is probably a special message...)
+      if (sl_buddy)
+        jep22 = buddy_resource_jep22(sl_buddy->data, rname);
+      if (jep22) {
+        g_free(jep22->last_msgid_sent);
+        jep22->last_msgid_sent = g_strdup(msgid);
+      }
     }
   }
 #endif
@@ -511,6 +518,52 @@
   jb_reset_keepalive();
 }
 
+#ifdef JEP0022
+//  jb_send_jep22_event()
+// Send a JEP-22 message event (delivered, composing...).
+void jb_send_jep22_event(const char *jid, guint type)
+{
+  xmlnode x;
+  xmlnode event;
+  const char *msgid;
+  char *rname, *barejid;
+  GSList *sl_buddy;
+  struct jep0022 *jep22 = NULL;
+
+  if (!online) return;
+
+  rname = strchr(jid, JID_RESOURCE_SEPARATOR);
+  barejid = jidtodisp(jid);
+  sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
+  g_free(barejid);
+
+  // If we can get a resource name, we use it.  Else we use NULL,
+  // which hopefully will give us the most likely resource.
+  if (rname)
+    rname++;
+  if (sl_buddy)
+    jep22 = buddy_resource_jep22(sl_buddy->data, rname);
+
+  if (jep22)
+    msgid = jep22->last_msgid_rcvd;
+
+  x = jutil_msgnew(TMSG_CHAT, (char*)jid, NULL, NULL);
+
+  event = xmlnode_insert_tag(x, "x");
+  xmlnode_put_attrib(event, "xmlns", NS_EVENT);
+  if (type == ROSTER_EVENT_DELIVERED)
+    xmlnode_insert_tag(event, "delivered");
+  else if (type == ROSTER_EVENT_COMPOSING)
+    xmlnode_insert_tag(event, "composing");
+  xmlnode_put_attrib(event, "id", (msgid ? msgid : ""));
+
+  jab_send(jc, x);
+  xmlnode_free(x);
+
+  jb_reset_keepalive();
+}
+#endif
+
 //  jb_subscr_send_auth(jid)
 // Allow jid to receive our presence updates
 void jb_subscr_send_auth(const char *jid)
@@ -1586,6 +1639,7 @@
     else
       events = ROSTER_EVENT_NONE;
   } else {              /* JEP-0022 */
+#ifdef JEP0022
     const char *msgid;
     jep22->support = CHATSTATES_SUPPORT_OK;
     jep22->last_state_rcvd = ROSTER_EVENT_NONE;
@@ -1604,15 +1658,21 @@
       events &= ~ROSTER_EVENT_COMPOSING;
     }
 
-    if (xmlnode_get_tag(state_ns, "delivered"))
-        jep22->last_state_rcvd |= ROSTER_EVENT_DELIVERED;
-
     // Cache the message id
     g_free(jep22->last_msgid_rcvd);
     if (msgid)
       jep22->last_msgid_rcvd = g_strdup(msgid);
     else
       jep22->last_msgid_rcvd = NULL;
+
+    if (xmlnode_get_tag(state_ns, "delivered")) {
+      jep22->last_state_rcvd |= ROSTER_EVENT_DELIVERED;
+
+      // Do we have to send back an ACK?
+      if (body)
+        jb_send_jep22_event(from, ROSTER_EVENT_DELIVERED);
+    }
+#endif
   }
 
   buddy_resource_setevents(sl_buddy->data, rname, events);