@@ -87,6 +87,7 @@ static int _mam_finish(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, voi
static int _mam_receive_poll(xmpp_conn_t *const conn, void *const userdata);
static int _mam_display_message(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
static int _mam_display_pretty_message(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static void _mam_disconnect_and_free(xmpp_conn_t *conn, mam_run_t *run);
static void _mam_add_field(xmpp_ctx_t *ctx, xmpp_stanza_t *x, const char *var, const char *value, const char *type);
static void _mam_add_ids_field(xmpp_ctx_t *ctx, xmpp_stanza_t *x, const char *ids);
static void _mam_add_text_child(xmpp_ctx_t *ctx, xmpp_stanza_t *parent, const char *name, const char *text);
@@ -348,7 +349,7 @@ static int _mam_finish(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, voi
if (type && strcmp(type, "error") == 0) {
logError(run->xmppc, "MAM request failed\n");
- xmpp_disconnect(conn);
+ _mam_disconnect_and_free(conn, run);
return 0;
}
@@ -357,7 +358,7 @@ static int _mam_finish(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, voi
if (run->receive && run->messages_total == 0 && g_get_monotonic_time() < run->deadline_us) {
xmpp_timed_handler_add(conn, _mam_receive_poll, MAM_POLL_PERIOD_MS, run);
} else {
- xmpp_disconnect(conn);
+ _mam_disconnect_and_free(conn, run);
}
}
return 0;
@@ -367,7 +368,7 @@ static int _mam_receive_poll(xmpp_conn_t *const conn, void *const userdata) {
mam_run_t *run = (mam_run_t *)userdata;
if (g_get_monotonic_time() >= run->deadline_us) {
- xmpp_disconnect(conn);
+ _mam_disconnect_and_free(conn, run);
return 0;
}
@@ -375,6 +376,15 @@ static int _mam_receive_poll(xmpp_conn_t *const conn, void *const userdata) {
return 0;
}
+static void _mam_disconnect_and_free(xmpp_conn_t *conn, mam_run_t *run) {
+ xmpp_handler_delete(conn, _mam_display_message);
+ xmpp_handler_delete(conn, _mam_display_pretty_message);
+ _mam_options_free(&run->options);
+ g_free(run->queryid);
+ g_free(run);
+ xmpp_disconnect(conn);
+}
+
static void _mam_add_field(xmpp_ctx_t *ctx, xmpp_stanza_t *x, const char *var, const char *value, const char *type) {
xmpp_stanza_t* field = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(field,"field");