changeset 749:6c633adaae10

Use events system for subscription requests
author Mikael Berthe <mikael@lilotux.net>
date Mon, 13 Mar 2006 19:20:03 +0100
parents 53a000411587
children 938a8791658c
files mcabber/src/events.h mcabber/src/jabglue.c
diffstat 2 files changed, 55 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/events.h	Mon Mar 13 19:18:20 2006 +0100
+++ b/mcabber/src/events.h	Mon Mar 13 19:20:03 2006 +0100
@@ -11,6 +11,10 @@
 #define EVS_CONTEXT_CANCEL  1
 #define EVS_CONTEXT_USER    2
 
+typedef enum {
+  EVS_TYPE_SUBSCRIPTION = 1
+} evs_type;
+
 /* Common structure for events (evs) and IQ requests (iqs) */
 typedef struct {
   char *id;
--- a/mcabber/src/jabglue.c	Mon Mar 13 19:18:20 2006 +0100
+++ b/mcabber/src/jabglue.c	Mon Mar 13 19:20:03 2006 +0100
@@ -1421,6 +1421,50 @@
     g_free(tmp);
 }
 
+static void evscallback_subcription(eviqs *evp, guint evcontext)
+{
+  char *barejid;
+  char *buf;
+
+  if (evcontext == EVS_CONTEXT_TIMEOUT) {
+    scr_LogPrint(LPRINT_LOGNORM, "Event %s timed out, cancelled.",
+                 evp->id);
+    return;
+  }
+  if (evcontext == EVS_CONTEXT_CANCEL) {
+    scr_LogPrint(LPRINT_LOGNORM, "Event %s cancelled.", evp->id);
+    return;
+  }
+  if (!(evcontext & EVS_CONTEXT_USER))
+    return;
+
+  // Sanity check
+  if (!evp->data) {
+    // Shouldn't happen, data should be set to the barejid.
+    scr_LogPrint(LPRINT_LOGNORM, "Error in evs callback.");
+    return;
+  }
+
+  // Ok, let's work now.
+  // evcontext: 0, 1 == reject, accept
+
+  barejid = evp->data;
+
+  if (evcontext & ~EVS_CONTEXT_USER) {
+    // Accept subscription request
+    jb_subscr_send_auth(barejid);
+    buf = g_strdup_printf("<%s> is allowed to receive your presence updates",
+                          barejid);
+  } else {
+    // Reject subscription request
+    jb_subscr_cancel_auth(barejid);
+    buf = g_strdup_printf("<%s> won't receive your presence updates", barejid);
+  }
+  scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_INFO);
+  scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
+  g_free(buf);
+}
+
 static void handle_packet_s10n(jconn conn, char *type, char *from,
                                xmlnode xmldata)
 {
@@ -1433,6 +1477,7 @@
     /* The sender wishes to subscribe to our presence */
     char *msg;
     int isagent;
+    eviqs *evn;
 
     isagent = (roster_gettype(r) & ROSTER_TYPE_AGENT) != 0;
     msg = xmlnode_get_tag_data(xmldata, "status");
@@ -1455,10 +1500,12 @@
       }
     }
 
-    // FIXME We accept everybody...
-    jb_subscr_send_auth(from);
-    buf = g_strdup_printf("<%s> is allowed to receive your presence updates",
-                          from);
+    // Create a new event item
+    evn = evs_new(EVS_TYPE_SUBSCRIPTION, EVS_MAX_TIMEOUT);
+    evn->callback = &evscallback_subcription;
+    evn->data = g_strdup(r);
+
+    buf = g_strdup_printf("Please use /event %s accept|reject", evn->id);
     scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO);
     scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
     g_free(buf);