From 9cb0d52e7df9c829c256b62ad2cd365a66e39446 Mon Sep 17 00:00:00 2001 From: James Booth Date: Mon, 5 Jan 2015 23:39:43 +0000 Subject: Added removal of chat sessions, only send gone when messages have been exchanged --- src/chat_session.c | 126 ++++++++++++++++++++++++++++++++++++++++------------- src/chat_session.h | 1 - src/ui/core.c | 1 - 3 files changed, 95 insertions(+), 33 deletions(-) diff --git a/src/chat_session.c b/src/chat_session.c index 8fcf1ecb..67104fa6 100644 --- a/src/chat_session.c +++ b/src/chat_session.c @@ -62,6 +62,7 @@ typedef struct chat_session_t { chat_state_t state; GTimer *active_timer; gboolean sent; + gboolean includes_message; } ChatSession; static GHashTable *sessions; @@ -80,6 +81,7 @@ _chat_session_new(const char * const barejid, const char * const resource, gbool new_session->state = CHAT_STATE_STARTED; new_session->active_timer = g_timer_new(); new_session->sent = FALSE; + new_session->includes_message = FALSE; return new_session; } @@ -142,17 +144,57 @@ void chat_session_on_incoming_message(const char * const barejid, const char * const resource, gboolean send_states) { ChatSession *session = g_hash_table_lookup(sessions, barejid); + GString *log_msg = g_string_new(""); + // no session exists, create one if (!session) { + g_string_append(log_msg, "Creating chat session for "); + g_string_append(log_msg, barejid); + if (resource) { + g_string_append(log_msg, "/"); + g_string_append(log_msg, resource); + } session = _chat_session_new(barejid, resource, send_states); g_hash_table_insert(sessions, strdup(barejid), session); + + // session exists for different resource, replace session } else if (g_strcmp0(session->resource, resource) != 0) { + g_string_append(log_msg, "Replacing chat session for "); + g_string_append(log_msg, barejid); + if (session->resource) { + g_string_append(log_msg, "/"); + g_string_append(log_msg, session->resource); + } + g_string_append(log_msg, " with session for "); + g_string_append(log_msg, barejid); + if (resource) { + g_string_append(log_msg, "/"); + g_string_append(log_msg, resource); + } g_hash_table_remove(sessions, session); session = _chat_session_new(barejid, resource, send_states); + session->includes_message = TRUE; g_hash_table_insert(sessions, strdup(barejid), session); + + // session exists for resource, update state } else { + g_string_append(log_msg, "Updating chat session for "); + g_string_append(log_msg, session->barejid); + if (session->resource) { + g_string_append(log_msg, "/"); + g_string_append(log_msg, session->resource); + } session->send_states = send_states; + session->includes_message = TRUE; } + if (send_states) { + g_string_append(log_msg, ", chat states supported"); + } else { + g_string_append(log_msg, ", chat states not supported"); + } + + log_debug(log_msg->str); + g_string_free(log_msg, TRUE); } void @@ -162,6 +204,7 @@ chat_session_on_message_send(const char * const barejid) // if no session exists, create one with no resource, and send states if (!session) { + log_debug("Creating chat session for %s, chat states supported", barejid); session = _chat_session_new(barejid, NULL, TRUE); g_hash_table_insert(sessions, strdup(barejid), session); } @@ -169,44 +212,33 @@ chat_session_on_message_send(const char * const barejid) session->state = CHAT_STATE_ACTIVE; g_timer_start(session->active_timer); session->sent = TRUE; -} - -void -chat_session_on_window_open(const char * const barejid) -{ - ChatSession *session = g_hash_table_lookup(sessions, barejid); - if (!session) { - session = _chat_session_new(barejid, NULL, TRUE); - g_hash_table_insert(sessions, strdup(barejid), session); - } + session->includes_message = TRUE; } void chat_session_on_window_close(const char * const barejid) { ChatSession *session = g_hash_table_lookup(sessions, barejid); - assert(session != NULL); - if (prefs_get_boolean(PREF_STATES) && session->send_states) { - GString *jid = g_string_new(session->barejid); - if (session->resource) { - g_string_append(jid, "/"); - g_string_append(jid, session->resource); + if (session) { + if (prefs_get_boolean(PREF_STATES) && session->send_states && session->includes_message) { + GString *jid = g_string_new(session->barejid); + if (session->resource) { + g_string_append(jid, "/"); + g_string_append(jid, session->resource); + } + message_send_gone(jid->str); + g_string_free(jid, TRUE); } - message_send_gone(jid->str); - g_string_free(jid, TRUE); - } -} - -void -chat_session_on_cancel(const char * const jid) -{ - Jid *jidp = jid_create(jid); - if (jidp) { - ChatSession *session = g_hash_table_lookup(sessions, jidp->barejid); - if (session) { - session->send_states = FALSE; + GString *log_msg = g_string_new("Removing chat session for "); + g_string_append(log_msg, barejid); + if (session->resource) { + g_string_append(log_msg, "/"); + g_string_append(log_msg, session->resource); } + log_debug(log_msg->str); + g_string_free(log_msg, TRUE); + g_hash_table_remove(sessions, barejid); } } @@ -214,8 +246,11 @@ void chat_session_on_activity(const char * const barejid) { ChatSession *session = g_hash_table_lookup(sessions, barejid); + if (!session) { - return; + log_debug("Creating chat session for %s, chat states supported", barejid); + session = _chat_session_new(barejid, NULL, TRUE); + g_hash_table_insert(sessions, strdup(barejid), session); } if (session->state != CHAT_STATE_COMPOSING) { @@ -277,10 +312,19 @@ chat_session_on_inactivity(const char * const barejid) g_string_append(jid, session->resource); } if (session->state == CHAT_STATE_GONE) { - if (prefs_get_boolean(PREF_STATES) && session->send_states) { + if (prefs_get_boolean(PREF_STATES) && session->send_states && session->includes_message) { message_send_gone(jid->str); } session->sent = TRUE; + GString *log_msg = g_string_new("Removing chat session for "); + g_string_append(log_msg, barejid); + if (session->resource) { + g_string_append(log_msg, "/"); + g_string_append(log_msg, session->resource); + } + log_debug(log_msg->str); + g_string_free(log_msg, TRUE); + g_hash_table_remove(sessions, barejid); } else if (session->state == CHAT_STATE_INACTIVE) { if (prefs_get_boolean(PREF_STATES) && session->send_states) { message_send_inactive(jid->str); @@ -294,4 +338,24 @@ chat_session_on_inactivity(const char * const barejid) } g_string_free(jid, TRUE); } +} + +void +chat_session_on_cancel(const char * const jid) +{ + Jid *jidp = jid_create(jid); + if (jidp) { + ChatSession *session = g_hash_table_lookup(sessions, jidp->barejid); + if (session) { + GString *log_msg = g_string_new("Removing chat session for "); + g_string_append(log_msg, jidp->barejid); + if (session->resource) { + g_string_append(log_msg, "/"); + g_string_append(log_msg, session->resource); + } + log_debug(log_msg->str); + g_string_free(log_msg, TRUE); + g_hash_table_remove(sessions, jidp->barejid); + } + } } \ No newline at end of file diff --git a/src/chat_session.h b/src/chat_session.h index 6f5ab4c7..441f9096 100644 --- a/src/chat_session.h +++ b/src/chat_session.h @@ -45,7 +45,6 @@ char* chat_session_get_resource(const char * const barejid); gboolean chat_session_send_states(const char * const barejid); void chat_session_on_message_send(const char * const barejid); -void chat_session_on_window_open(const char * const barejid); void chat_session_on_window_close(const char * const barejid); void chat_session_on_incoming_message(const char * const barejid, const char * const resource, gboolean send_states); void chat_session_on_cancel(const char * const jid); diff --git a/src/ui/core.c b/src/ui/core.c index fb4f78ff..d5e01d94 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -1333,7 +1333,6 @@ ui_new_chat_win(const char * const barejid) // create new window if (window == NULL) { window = wins_new_chat(barejid); - chat_session_on_window_open(barejid); num = wins_get_num(window); -- cgit 1.4.1-2-gfad0