@@ -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("<sent archive-id=\"");
_message_print_escaped_attr(lookup->archive_id ? lookup->archive_id : "");