From 6e23584575cb2749009255dbd13dde4718d3fb04 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sun, 14 Jul 2013 17:05:46 +0300 Subject: [PATCH] improved autojoin logic Delete id handler after timeout (5sec) if response isn't received Auto join maximum 5 conferences --- src/xmpp/bookmark.c | 64 ++++++++++++++++++++++++++++++++++----------- 1 file 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 #include #include #include @@ -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; +}