diff --git a/src/mode/message.c b/src/mode/message.c index 9faa6da671e67c58645940ad1f459d0491c3e71b..0c35c288c685de215437e2da4ec66081fc1d0f3e 100644 --- a/src/mode/message.c +++ b/src/mode/message.c @@ -77,7 +77,8 @@ static bool _message_has_origin_id(xmpp_stanza_t *message, const char *id); static void _message_add_text_child(xmpp_ctx_t *ctx, xmpp_stanza_t *parent, const char *name, const char *text); static void _message_add_field(xmpp_ctx_t *ctx, xmpp_stanza_t *x, const char *var, const char *value, const char *type); static char *_message_lookup_start_time(void); -static void _message_finish_sent(xmpp_conn_t *conn, message_archive_lookup_t *lookup); +static void _message_finish_sent(xmpp_conn_t *conn, message_archive_lookup_t *lookup, bool delete_id_handler); +static void _message_archive_lookup_free(message_archive_lookup_t *lookup); static void _message_print_sent(message_archive_lookup_t *lookup); static void _message_print_escaped_attr(const char *text); @@ -192,13 +193,13 @@ static int _message_archive_query_finished(xmpp_conn_t *const conn, xmpp_stanza_ } if (lookup->archive_id) { - _message_finish_sent(conn, lookup); + _message_finish_sent(conn, lookup, false); return 0; } if (type && strcmp(type, "error") == 0) { logError(lookup->xmppc, "MAM archive lookup failed\n"); - _message_finish_sent(conn, lookup); + _message_finish_sent(conn, lookup, false); return 0; } @@ -206,7 +207,7 @@ static int _message_archive_query_finished(xmpp_conn_t *const conn, xmpp_stanza_ xmpp_timed_handler_add(conn, _message_archive_query_poll, MESSAGE_ARCHIVE_LOOKUP_POLL_MS, lookup); } else { logError(lookup->xmppc, "MAM archive lookup timed out\n"); - _message_finish_sent(conn, lookup); + _message_finish_sent(conn, lookup, false); } return 0; @@ -221,7 +222,7 @@ static int _message_archive_query_poll(xmpp_conn_t *const conn, void *const user if (g_get_monotonic_time() >= lookup->deadline_us) { logError(lookup->xmppc, "MAM archive lookup timed out\n"); - _message_finish_sent(conn, lookup); + _message_finish_sent(conn, lookup, false); return 0; } @@ -234,7 +235,7 @@ static int _message_archive_lookup_timeout(xmpp_conn_t *const conn, void *const if (!lookup->done) { logError(lookup->xmppc, "MAM archive lookup timed out\n"); - _message_finish_sent(conn, lookup); + _message_finish_sent(conn, lookup, true); } return 0; @@ -314,16 +315,32 @@ static char *_message_lookup_start_time(void) { return formatted; } -static void _message_finish_sent(xmpp_conn_t *conn, message_archive_lookup_t *lookup) { +static void _message_finish_sent(xmpp_conn_t *conn, message_archive_lookup_t *lookup, bool delete_id_handler) { if (lookup->done) { return; } lookup->done = true; _message_print_sent(lookup); + xmpp_handler_delete(conn, _message_archive_result_handler); + xmpp_timed_handler_delete(conn, _message_archive_query_poll); + xmpp_timed_handler_delete(conn, _message_archive_lookup_timeout); + if (delete_id_handler && lookup->queryid) { + xmpp_id_handler_delete(conn, _message_archive_query_finished, lookup->queryid); + } + _message_archive_lookup_free(lookup); xmpp_disconnect(conn); } +static void _message_archive_lookup_free(message_archive_lookup_t *lookup) { + g_free(lookup->to); + g_free(lookup->message_id); + g_free(lookup->start); + g_free(lookup->queryid); + g_free(lookup->archive_id); + g_free(lookup); +} + static void _message_print_sent(message_archive_lookup_t *lookup) { printf("archive_id ? lookup->archive_id : "");