about summary refs log tree commit diff stats
path: root/src/xmpp
diff options
context:
space:
mode:
authorDmitry Podgorny <pasis.ua@gmail.com>2013-07-14 17:05:46 +0300
committerDmitry Podgorny <pasis.ua@gmail.com>2013-07-14 17:08:49 +0300
commit6e23584575cb2749009255dbd13dde4718d3fb04 (patch)
tree4484b00fe21ade01fb76de00aa7de3062b981540 /src/xmpp
parentccbbd16d5f988bb159fd88f86072730f7f424d33 (diff)
downloadprofani-tty-6e23584575cb2749009255dbd13dde4718d3fb04.tar.gz
improved autojoin logic
Delete id handler after timeout (5sec) if response isn't received
Auto join maximum 5 conferences
Diffstat (limited to 'src/xmpp')
-rw-r--r--src/xmpp/bookmark.c64
1 files changed, 49 insertions, 15 deletions
diff --git a/src/xmpp/bookmark.c b/src/xmpp/bookmark.c
index dd4cebe1..52ac9244 100644
--- a/src/xmpp/bookmark.c
+++ b/src/xmpp/bookmark.c
@@ -1,4 +1,5 @@
 
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -12,15 +13,23 @@
 #include "xmpp/stanza.h"
 #include "xmpp/xmpp.h"
 
+#define BOOKMARK_TIMEOUT 5000
+/* TODO: replace with a preference */
+#define BOOKMARK_AUTOJOIN_MAX 5
+
+static int autojoin_count;
+
 static int _bookmark_handle_result(xmpp_conn_t * const conn,
     xmpp_stanza_t * const stanza, void * const userdata);
+static int _bookmark_handle_delete(xmpp_conn_t * const conn,
+    void * const userdata);
 
 void
 bookmark_request(void)
 {
     char *id;
-    xmpp_conn_t * const conn = connection_get_conn();
-    xmpp_ctx_t * const ctx = connection_get_ctx();
+    xmpp_conn_t *conn = connection_get_conn();
+    xmpp_ctx_t *ctx = connection_get_ctx();
     xmpp_stanza_t *iq;
 
     id = get_unique_id();
@@ -28,22 +37,22 @@ bookmark_request(void)
         return;
     }
 
-    /* TODO: timed handler to remove this id_handler */
-    xmpp_id_handler_add(conn, _bookmark_handle_result, id, ctx);
+    autojoin_count = 0;
+    xmpp_timed_handler_add(conn, _bookmark_handle_delete, BOOKMARK_TIMEOUT, id);
+    xmpp_id_handler_add(conn, _bookmark_handle_result, id, id);
 
     iq = stanza_create_storage_bookmarks(ctx);
     xmpp_stanza_set_id(iq, id);
     xmpp_send(conn, iq);
     xmpp_stanza_release(iq);
-
-    g_free(id);
 }
 
 static int
 _bookmark_handle_result(xmpp_conn_t * const conn,
     xmpp_stanza_t * const stanza, void * const userdata)
 {
-    xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
+    xmpp_ctx_t *ctx = connection_get_ctx();
+    char *id = (char *)userdata;
     xmpp_stanza_t *ptr;
     xmpp_stanza_t *nick;
     char *name;
@@ -51,6 +60,9 @@ _bookmark_handle_result(xmpp_conn_t * const conn,
     char *autojoin;
     Jid *my_jid;
 
+    xmpp_timed_handler_delete(conn, _bookmark_handle_delete);
+    g_free(id);
+
     name = xmpp_stanza_get_name(stanza);
     if (!name || strcmp(name, STANZA_NAME_IQ) != 0) {
         return 0;
@@ -96,15 +108,21 @@ _bookmark_handle_result(xmpp_conn_t * const conn,
             }
 
             if (name) {
-                /* TODO: autojoin maximum (e.g. 5) rooms */
-                log_debug("Autojoin %s with nick=%s", jid, name);
-                Jid *room_jid = jid_create_from_bare_and_resource(jid, name);
-                if (!muc_room_is_active(room_jid)) {
-                    presence_join_room(room_jid);
-                    /* XXX: this should be removed after fixing #195 */
-                    ui_room_join(room_jid);
+                if (autojoin_count < BOOKMARK_AUTOJOIN_MAX) {
+                    Jid *room_jid;
+
+                    log_debug("Autojoin %s with nick=%s", jid, name);
+                    ++autojoin_count;
+                    room_jid = jid_create_from_bare_and_resource(jid, name);
+                    if (!muc_room_is_active(room_jid)) {
+                        presence_join_room(room_jid);
+                        /* TODO: this should be removed after fixing #195 */
+                        ui_room_join(room_jid);
+                    }
+                    jid_destroy(room_jid);
+                } else {
+                    log_debug("Rejected autojoin %s (maximum has been reached)", jid);
                 }
-                jid_destroy(room_jid);
                 free(name);
             }
         }
@@ -118,3 +136,19 @@ _bookmark_handle_result(xmpp_conn_t * const conn,
 
     return 0;
 }
+
+static int
+_bookmark_handle_delete(xmpp_conn_t * const conn,
+    void * const userdata)
+{
+    char *id = (char *)userdata;
+
+    assert(id != NULL);
+
+    log_debug("Timeout for handler with id=%s", id);
+
+    xmpp_id_handler_delete(conn, _bookmark_handle_result, id);
+    g_free(id);
+
+    return 0;
+}