From daf3d193e226648a2b3f0021731ec006956727e5 Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Tue, 9 May 2023 19:31:35 +0200 Subject: [PATCH 01/10] Remove parsing of /avatar cmd This is done in `/executable avatar set` since d7848e38b. The command help also didn't mention this anymore. Seems like it was forgotten to remove the actual parsing of this. --- src/command/cmd_funcs.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 6e9ca259..b0e287f2 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -9309,9 +9309,6 @@ cmd_avatar(ProfWin* window, const char* const command, gchar** args) avatar_get_by_nick(args[1], false); } else if (g_strcmp0(args[0], "open") == 0) { avatar_get_by_nick(args[1], true); - } else if (g_strcmp0(args[0], "cmd") == 0) { - prefs_set_string(PREF_AVATAR_CMD, args[1]); - cons_show("Avatar cmd set to: %s", args[1]); } else { cons_bad_cmd_usage(command); } From 8075b32ebc6311d7985e94c780fafecc4e8def9f Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Tue, 9 May 2023 19:58:21 +0200 Subject: [PATCH 02/10] Align avatar behaviour with urlopen `/executable avatar` now also uses cmdtemplate and parse %p. It seems to me that the `/avatar` command was actually completely broken on master. --- src/command/cmd_defs.c | 8 +++++--- src/command/cmd_funcs.c | 33 ++++++++++++++++++--------------- src/config/preferences.c | 2 +- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index c6e886a5..ceb84d05 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -2437,7 +2437,7 @@ static const struct cmd_t command_defs[] = { { "set ", "Set avatar to the image at ." }, { "disable", "Disable avatar publishing; your avatar will not display to others." }, { "get ", "Download the avatar. barejid is the JID to download avatar from." }, - { "open ", "Download avatar and open it with command." }) + { "open ", "Download avatar and open it with command. See /executable." }) CMD_EXAMPLES( "/avatar set ~/images/avatar.png", "/avatar disable", @@ -2534,7 +2534,8 @@ static const struct cmd_t command_defs[] = { CMD_TAGS( CMD_TAG_DISCOVERY) CMD_SYN( - "/executable avatar ", + "/executable avatar set ", + "/executable avatar default", "/executable urlopen set ", "/executable urlopen default", "/executable urlsave set ", @@ -2545,7 +2546,8 @@ static const struct cmd_t command_defs[] = { CMD_DESC( "Configure executable that should be called upon a certain command.") CMD_ARGS( - { "avatar", "Set executable that is run by /avatar open. Use your favorite image viewer." }, + { "avatar set", "Set executable that is run by /avatar open. Use your favorite image viewer." }, + { "avatar default", "Restore to default settings." }, { "urlopen set", "Set executable that is run by /url open. Takes a command template that replaces %u and %p with the URL and path respectively." }, { "urlopen default", "Restore to default settings." }, { "urlsave set", "Set executable that is run by /url save. Takes a command template that replaces %u and %p with the URL and path respectively." }, diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index b0e287f2..e18498c6 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -9617,15 +9617,7 @@ out: } gboolean -cmd_executable_avatar(ProfWin* window, const char* const command, gchar** args) -{ - prefs_set_string(PREF_AVATAR_CMD, args[1]); - cons_show("`avatar` command set to invoke '%s'", args[1]); - return TRUE; -} - -gboolean -cmd_executable_urlopen(ProfWin* window, const char* const command, gchar** args) +_cmd_executable_template(const preference_t setting, const char* command, gchar** args) { guint num_args = g_strv_length(args); if (num_args < 2) { @@ -9635,14 +9627,14 @@ cmd_executable_urlopen(ProfWin* window, const char* const command, gchar** args) if (g_strcmp0(args[1], "set") == 0 && num_args >= 3) { gchar* str = g_strjoinv(" ", &args[2]); - prefs_set_string(PREF_URL_OPEN_CMD, str); - cons_show("`url open` command set to invoke '%s'", str); + prefs_set_string(setting, str); + cons_show("`%s` command set to invoke '%s'", command, str); g_free(str); } else if (g_strcmp0(args[1], "default") == 0) { - prefs_set_string(PREF_URL_OPEN_CMD, NULL); - gchar* def = prefs_get_string(PREF_URL_OPEN_CMD); - cons_show("`url open` command set to invoke %s (default)", def); + prefs_set_string(setting, NULL); + gchar* def = prefs_get_string(setting); + cons_show("`%s` command set to invoke %s (default)", command, def); g_free(def); } else { cons_bad_cmd_usage(command); @@ -9651,10 +9643,21 @@ cmd_executable_urlopen(ProfWin* window, const char* const command, gchar** args) return TRUE; } +gboolean +cmd_executable_avatar(ProfWin* window, const char* const command, gchar** args) +{ + return _cmd_executable_template(PREF_AVATAR_CMD, args[0], args); +} + +gboolean +cmd_executable_urlopen(ProfWin* window, const char* const command, gchar** args) +{ + return _cmd_executable_template(PREF_URL_OPEN_CMD, args[0], args); +} + gboolean cmd_executable_urlsave(ProfWin* window, const char* const command, gchar** args) { - guint num_args = g_strv_length(args); if (num_args < 2) { cons_bad_cmd_usage(command); diff --git a/src/config/preferences.c b/src/config/preferences.c index 2d975e39..f1b4154e 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -2314,7 +2314,7 @@ _get_default_string(preference_t pref) case PREF_COLOR_NICK: return "false"; case PREF_AVATAR_CMD: - return "xdg-open"; + return "xdg-open %p"; case PREF_URL_OPEN_CMD: return "xdg-open %u"; case PREF_VCARD_PHOTO_CMD: From a7159c5954c71efcf750c76f8861f19821d5e9b8 Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Tue, 9 May 2023 20:00:05 +0200 Subject: [PATCH 03/10] Add vcard_photo to /executable autocompletion Was forgotten in f934c5b59. --- src/command/cmd_ac.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index deda8abe..17d08888 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -1115,6 +1115,7 @@ cmd_ac_init(void) autocomplete_add(executable_ac, "urlopen"); autocomplete_add(executable_ac, "urlsave"); autocomplete_add(executable_ac, "editor"); + autocomplete_add(executable_ac, "vcard_photo"); intype_ac = autocomplete_new(); autocomplete_add(intype_ac, "console"); From 46c90bc68138ca0268ef2562e4f8c9917daf257f Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Tue, 9 May 2023 20:04:31 +0200 Subject: [PATCH 04/10] Make it possible to reset editor to default All the other commands (avatar, vcard_photo, urlsave, urlopen) have the ability to reset to default already. --- src/command/cmd_defs.c | 2 ++ src/command/cmd_funcs.c | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index ceb84d05..9828ab1a 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -2541,6 +2541,7 @@ static const struct cmd_t command_defs[] = { "/executable urlsave set ", "/executable urlsave default", "/executable editor set ", + "/executable editor default", "/executable vcard_photo set ", "/executable vcard_photo default") CMD_DESC( @@ -2553,6 +2554,7 @@ static const struct cmd_t command_defs[] = { { "urlsave set", "Set executable that is run by /url save. Takes a command template that replaces %u and %p with the URL and path respectively." }, { "urlsave default", "Use the built-in download method for saving." }, { "editor set", "Set editor to be used with /editor. Needs a terminal editor or a script to run a graphical editor." }, + { "editor default", "Restore to default settings." }, { "vcard_photo set", "Set executable that is run by /vcard photo open. Takes a command template that replaces %p with the path" }, { "vcard_photo default", "Restore to default settings." }) CMD_EXAMPLES( diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index e18498c6..3c982213 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -9688,6 +9688,9 @@ cmd_executable_editor(ProfWin* window, const char* const command, gchar** args) if (g_strcmp0(args[1], "set") == 0 && num_args >= 3) { prefs_set_string(PREF_COMPOSE_EDITOR, args[2]); cons_show("`editor` command set to invoke '%s'", args[2]); + } else if (g_strcmp0(args[1], "default") == 0) { + prefs_set_string(PREF_COMPOSE_EDITOR, NULL); + cons_show("`editor` will use built-in download method (default)"); } else { cons_bad_cmd_usage(command); } From 79efe56d64fb639f96f3ed3e421b9bb7ee37957e Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Tue, 9 May 2023 20:10:55 +0200 Subject: [PATCH 05/10] Add autocompletion for /executable parameters We autocompleted `/executable` to `avatar`, `vcard_photo`, `editor` etc. But didn't autocomplete the next parameter. Namely `set` and `default`. --- src/command/cmd_ac.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 17d08888..d93633c3 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -277,6 +277,7 @@ static Autocomplete correction_ac; static Autocomplete avatar_ac; static Autocomplete url_ac; static Autocomplete executable_ac; +static Autocomplete executable_param_ac; static Autocomplete intype_ac; static Autocomplete mood_ac; static Autocomplete mood_type_ac; @@ -1117,6 +1118,10 @@ cmd_ac_init(void) autocomplete_add(executable_ac, "editor"); autocomplete_add(executable_ac, "vcard_photo"); + executable_param_ac = autocomplete_new(); + autocomplete_add(executable_param_ac, "set"); + autocomplete_add(executable_param_ac, "default"); + intype_ac = autocomplete_new(); autocomplete_add(intype_ac, "console"); autocomplete_add(intype_ac, "titlebar"); @@ -1702,6 +1707,7 @@ cmd_ac_reset(ProfWin* window) autocomplete_reset(avatar_ac); autocomplete_reset(url_ac); autocomplete_reset(executable_ac); + autocomplete_reset(executable_param_ac); autocomplete_reset(intype_ac); autocomplete_reset(mood_ac); autocomplete_reset(mood_type_ac); @@ -1889,6 +1895,7 @@ cmd_ac_uninit(void) autocomplete_free(avatar_ac); autocomplete_free(url_ac); autocomplete_free(executable_ac); + autocomplete_free(executable_param_ac); autocomplete_free(intype_ac); autocomplete_free(adhoc_cmd_ac); autocomplete_free(lastactivity_ac); @@ -4382,6 +4389,31 @@ _executable_autocomplete(ProfWin* window, const char* const input, gboolean prev { char* result = NULL; + result = autocomplete_param_with_ac(input, "/executable avatar", executable_param_ac, TRUE, previous); + if (result) { + return result; + } + + result = autocomplete_param_with_ac(input, "/executable urlopen", executable_param_ac, TRUE, previous); + if (result) { + return result; + } + + result = autocomplete_param_with_ac(input, "/executable urlsave", executable_param_ac, TRUE, previous); + if (result) { + return result; + } + + result = autocomplete_param_with_ac(input, "/executable vcard_photo", executable_param_ac, TRUE, previous); + if (result) { + return result; + } + + result = autocomplete_param_with_ac(input, "/executable editor", executable_param_ac, TRUE, previous); + if (result) { + return result; + } + result = autocomplete_param_with_ac(input, "/executable", executable_ac, TRUE, previous); return result; From 60c197487daee968d504a5f73fac391b6a6c6971 Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Wed, 10 May 2023 09:41:59 +0200 Subject: [PATCH 06/10] Add helper function for individual cmd_executable_*() functions Each of the cmd_executable_editor(), cmd_executable_urlopen() etc calls this helper function since they were all doing the same just for different configurations. --- src/command/cmd_funcs.c | 53 ++++++----------------------------------- 1 file changed, 7 insertions(+), 46 deletions(-) diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 3c982213..ccba8827 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -9634,6 +9634,9 @@ _cmd_executable_template(const preference_t setting, const char* command, gchar* } else if (g_strcmp0(args[1], "default") == 0) { prefs_set_string(setting, NULL); gchar* def = prefs_get_string(setting); + if (def == NULL) { + def = g_strdup("built-in method"); + } cons_show("`%s` command set to invoke %s (default)", command, def); g_free(def); } else { @@ -9658,63 +9661,21 @@ cmd_executable_urlopen(ProfWin* window, const char* const command, gchar** args) gboolean cmd_executable_urlsave(ProfWin* window, const char* const command, gchar** args) { - guint num_args = g_strv_length(args); - if (num_args < 2) { - cons_bad_cmd_usage(command); - return TRUE; - } - - if (g_strcmp0(args[1], "set") == 0 && num_args >= 3) { - gchar* str = g_strjoinv(" ", &args[2]); - prefs_set_string(PREF_URL_SAVE_CMD, str); - cons_show("`url save` command set to invoke '%s'", str); - g_free(str); - - } else if (g_strcmp0(args[1], "default") == 0) { - prefs_set_string(PREF_URL_SAVE_CMD, NULL); - cons_show("`url save` will use built-in download method (default)"); - } else { - cons_bad_cmd_usage(command); - } - - return TRUE; + return _cmd_executable_template(PREF_URL_SAVE_CMD, args[0], args); } gboolean cmd_executable_editor(ProfWin* window, const char* const command, gchar** args) { - guint num_args = g_strv_length(args); - - if (g_strcmp0(args[1], "set") == 0 && num_args >= 3) { - prefs_set_string(PREF_COMPOSE_EDITOR, args[2]); - cons_show("`editor` command set to invoke '%s'", args[2]); - } else if (g_strcmp0(args[1], "default") == 0) { - prefs_set_string(PREF_COMPOSE_EDITOR, NULL); - cons_show("`editor` will use built-in download method (default)"); - } else { - cons_bad_cmd_usage(command); - } - - return TRUE; + return _cmd_executable_template(PREF_COMPOSE_EDITOR, args[0], args); } gboolean cmd_executable_vcard_photo(ProfWin* window, const char* const command, gchar** args) { - if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) { - prefs_set_string(PREF_VCARD_PHOTO_CMD, args[2]); - cons_show("`vcard photo open` command set to invoke '%s'", args[2]); - } else if (g_strcmp0(args[1], "default") == 0) { - prefs_set_string(PREF_VCARD_PHOTO_CMD, NULL); - char* cmd = prefs_get_string(PREF_VCARD_PHOTO_CMD); - cons_show("`vcard photo open` command set to invoke '%s' (default)", cmd); - g_free(cmd); - } else { - cons_bad_cmd_usage(command); - } - - return TRUE; + return _cmd_executable_template(PREF_VCARD_PHOTO_CMD, args[0], args); } + gboolean cmd_mam(ProfWin* window, const char* const command, gchar** args) { From 7d9c3c1b32fcf0804a384b80a3e205b646a69b71 Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Fri, 14 Apr 2023 13:18:58 +0200 Subject: [PATCH 07/10] fix "window `NULL` issue" (hopefully) There were multiple reports where after a reconnect the window of the MUC that was last opened, was empty. `muc_join()` creates an instance of a MUC, `presence_join_room()` works with this instance. Therefore the instance has to exist before working on it. I'm not sure if this really fixes the issue, but at least it didn't happen anymore after I applied this modification. I can't remember how I stumbled over this, either while looking at debug logs or while looking at Valgrind output while a reconnect happened, but something went wrong. Then I came to the conclusion that this may fix the issue and for now it did ... maybe it comes back, then my RCA was wrong. Signed-off-by: Steffen Jaeckel --- src/event/server_events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event/server_events.c b/src/event/server_events.c index 0f6df2ac..89eefef6 100644 --- a/src/event/server_events.c +++ b/src/event/server_events.c @@ -1332,8 +1332,8 @@ sv_ev_bookmark_autojoin(Bookmark* bookmark) log_debug("Autojoin %s with nick=%s", bookmark->barejid, nick); if (!muc_active(bookmark->barejid)) { - presence_join_room(bookmark->barejid, nick, bookmark->password); muc_join(bookmark->barejid, nick, bookmark->password, TRUE); + presence_join_room(bookmark->barejid, nick, bookmark->password); iq_room_affiliation_list(bookmark->barejid, "member", false); iq_room_affiliation_list(bookmark->barejid, "admin", false); iq_room_affiliation_list(bookmark->barejid, "owner", false); From 08d68d329bac4417a8c7a9c44d7398e460fc0751 Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Wed, 10 May 2023 11:08:44 +0200 Subject: [PATCH 08/10] more `auto_char` Signed-off-by: Steffen Jaeckel --- src/event/client_events.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/event/client_events.c b/src/event/client_events.c index 67ffec20..4dcda4f3 100644 --- a/src/event/client_events.c +++ b/src/event/client_events.c @@ -85,9 +85,8 @@ cl_ev_connect_account(ProfAccount* account) void cl_ev_disconnect(void) { - char* mybarejid = connection_get_barejid(); + auto_char char* mybarejid = connection_get_barejid(); cons_show("%s logged out successfully.", mybarejid); - free(mybarejid); ui_close_all_wins(); ev_disconnect_cleanup(); From 8cd53acfd7450b4c1d22c956021af28135c38240 Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Wed, 10 May 2023 15:07:07 +0200 Subject: [PATCH 09/10] fix `/reconnect now` This fixes #1846 Issue introduced by a0aa26b6fa65ba625f4a6d3495a345c7120ff16d Signed-off-by: Steffen Jaeckel --- src/command/cmd_funcs.c | 3 ++- src/event/client_events.c | 13 +++++++++++++ src/event/client_events.h | 1 + src/xmpp/connection.h | 1 - src/xmpp/session.h | 1 - src/xmpp/xmpp.h | 2 ++ tests/unittests/xmpp/stub_xmpp.c | 4 ++++ 7 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 6e9ca259..7f44c116 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -6575,7 +6575,8 @@ cmd_reconnect(ProfWin* window, const char* const command, gchar** args) int intval = 0; char* err_msg = NULL; if (g_strcmp0(value, "now") == 0) { - session_reconnect_now(); + cons_show("Reconnecting now."); + cl_ev_reconnect(); } else if (strtoi_range(value, &intval, 0, INT_MAX, &err_msg)) { prefs_set_reconnect(intval); if (intval == 0) { diff --git a/src/event/client_events.c b/src/event/client_events.c index 4dcda4f3..c393ccd4 100644 --- a/src/event/client_events.c +++ b/src/event/client_events.c @@ -47,6 +47,7 @@ #include "plugins/plugins.h" #include "ui/window_list.h" #include "xmpp/chat_session.h" +#include "xmpp/session.h" #include "xmpp/xmpp.h" #ifdef HAVE_LIBOTR @@ -94,6 +95,18 @@ cl_ev_disconnect(void) ev_reset_connection_counter(); } +void +cl_ev_reconnect(void) +{ + if (connection_get_status() != JABBER_DISCONNECTED) { + connection_disconnect(); + ev_disconnect_cleanup(); + // on intentional disconnect reset the counter + ev_reset_connection_counter(); + } + session_reconnect_now(); +} + void cl_ev_presence_send(const resource_presence_t presence_type, const int idle_secs) { diff --git a/src/event/client_events.h b/src/event/client_events.h index fed2bb37..a35e97b5 100644 --- a/src/event/client_events.h +++ b/src/event/client_events.h @@ -42,6 +42,7 @@ jabber_conn_status_t cl_ev_connect_jid(const char* const jid, const char* const jabber_conn_status_t cl_ev_connect_account(ProfAccount* account); void cl_ev_disconnect(void); +void cl_ev_reconnect(void); void cl_ev_presence_send(const resource_presence_t presence_type, const int idle_secs); diff --git a/src/xmpp/connection.h b/src/xmpp/connection.h index 79bee1d4..d4ade03a 100644 --- a/src/xmpp/connection.h +++ b/src/xmpp/connection.h @@ -48,7 +48,6 @@ jabber_conn_status_t connection_connect(const char* const fulljid, const char* c const char* const tls_policy, const char* const auth_policy); jabber_conn_status_t connection_register(const char* const altdomain, int port, const char* const tls_policy, const char* const username, const char* const password); -void connection_disconnect(void); void connection_set_disconnected(void); void connection_set_priority(const int priority); diff --git a/src/xmpp/session.h b/src/xmpp/session.h index e6facb93..d8565fa4 100644 --- a/src/xmpp/session.h +++ b/src/xmpp/session.h @@ -47,6 +47,5 @@ void session_init_activity(void); void session_check_autoaway(void); void session_reconnect(gchar* altdomain, unsigned short altport); -void session_reconnect_now(void); #endif diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h index 539126cd..2babe536 100644 --- a/src/xmpp/xmpp.h +++ b/src/xmpp/xmpp.h @@ -186,7 +186,9 @@ void session_disconnect(void); void session_shutdown(void); void session_process_events(void); char* session_get_account_name(void); +void session_reconnect_now(void); +void connection_disconnect(void); jabber_conn_status_t connection_get_status(void); char* connection_get_presence_msg(void); void connection_set_presence_msg(const char* const message); diff --git a/tests/unittests/xmpp/stub_xmpp.c b/tests/unittests/xmpp/stub_xmpp.c index a7dc9ebf..ffa7565d 100644 --- a/tests/unittests/xmpp/stub_xmpp.c +++ b/tests/unittests/xmpp/stub_xmpp.c @@ -54,6 +54,10 @@ void session_process_events(void) { } +void +connection_disconnect(void) +{ +} const char* connection_get_fulljid(void) { From 8d3c1f79ac7cc2b0830f0afed48dc1fb9008ab0e Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Wed, 10 May 2023 16:32:04 +0200 Subject: [PATCH 10/10] fix memory leaks Signed-off-by: Steffen Jaeckel --- src/xmpp/connection.c | 2 ++ src/xmpp/iq.c | 41 ++++++++++++++++++++--------------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/xmpp/connection.c b/src/xmpp/connection.c index eef395f1..2a022cc4 100644 --- a/src/xmpp/connection.c +++ b/src/xmpp/connection.c @@ -964,6 +964,7 @@ _connection_handler(xmpp_conn_t* const xmpp_conn, const xmpp_conn_event_t status conn.domain = strdup(my_jid->domainpart); jid_destroy(my_jid); + connection_clear_data(); conn.features_by_jid = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)g_hash_table_destroy); g_hash_table_insert(conn.features_by_jid, strdup(conn.domain), g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL)); @@ -990,6 +991,7 @@ _connection_handler(xmpp_conn_t* const xmpp_conn, const xmpp_conn_event_t status conn.domain = strdup(my_raw_jid->domainpart); jid_destroy(my_raw_jid); + connection_clear_data(); conn.features_by_jid = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)g_hash_table_destroy); g_hash_table_insert(conn.features_by_jid, strdup(conn.domain), g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL)); diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c index f09deead..4f6eea40 100644 --- a/src/xmpp/iq.c +++ b/src/xmpp/iq.c @@ -265,6 +265,7 @@ iq_handlers_init(void) xmpp_timed_handler_add(conn, _autoping_timed_send, millis, ctx); } + iq_rooms_cache_clear(); iq_handlers_clear(); id_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)_iq_id_handler_free); @@ -2651,6 +2652,18 @@ iq_mam_request_older(ProfChatWin* win) return; } +static void +_mam_userdata_free(MamRsmUserdata* data) +{ + free(data->end_datestr); + data->end_datestr = NULL; + free(data->start_datestr); + data->start_datestr = NULL; + free(data->barejid); + data->barejid = NULL; + free(data); +} + void _iq_mam_request(ProfChatWin* win, GDateTime* startdate, GDateTime* enddate) { @@ -2694,7 +2707,7 @@ _iq_mam_request(ProfChatWin* win, GDateTime* startdate, GDateTime* enddate) data->fetch_next = fetch_next; data->win = win; - iq_id_handler_add(xmpp_stanza_get_id(iq), _mam_rsm_id_handler, NULL, data); + iq_id_handler_add(xmpp_stanza_get_id(iq), _mam_rsm_id_handler, (ProfIqFreeCallback)_mam_userdata_free, data); } iq_send_stanza(iq); @@ -2742,13 +2755,13 @@ _mam_rsm_id_handler(xmpp_stanza_t* const stanza, void* const userdata) buffer_remove_entry(window->layout->buffer, 0); - char* start_str = NULL; + auto_char char* start_str = NULL; if (data->start_datestr) { start_str = strdup(data->start_datestr); // Convert to iso8601 start_str[strlen(start_str) - 3] = '\0'; } - char* end_str = NULL; + auto_char char* end_str = NULL; if (data->end_datestr) { end_str = strdup(data->end_datestr); // Convert to iso8601 @@ -2757,24 +2770,10 @@ _mam_rsm_id_handler(xmpp_stanza_t* const stanza, void* const userdata) if (is_complete || !data->fetch_next) { chatwin_db_history(data->win, is_complete ? NULL : start_str, end_str, TRUE); - // TODO free memory - if (start_str) { - free(start_str); - free(data->start_datestr); - } - - if (end_str) { - free(data->end_datestr); - } - - free(data->barejid); - free(data); return 0; } chatwin_db_history(data->win, start_str, end_str, TRUE); - if (start_str) - free(start_str); xmpp_stanza_t* set = xmpp_stanza_get_child_by_name_and_ns(fin, STANZA_TYPE_SET, STANZA_NS_RSM); if (set) { @@ -2787,14 +2786,14 @@ _mam_rsm_id_handler(xmpp_stanza_t* const stanza, void* const userdata) // 4.3.2. send same stanza with set,max stanza xmpp_ctx_t* const ctx = connection_get_ctx(); - if (end_str) { + if (data->end_datestr) { free(data->end_datestr); + data->end_datestr = NULL; } - data->end_datestr = NULL; - xmpp_stanza_t* iq = stanza_create_mam_iq(ctx, data->barejid, data->start_datestr, data->end_datestr, firstid, NULL); + xmpp_stanza_t* iq = stanza_create_mam_iq(ctx, data->barejid, data->start_datestr, NULL, firstid, NULL); free(firstid); - iq_id_handler_add(xmpp_stanza_get_id(iq), _mam_rsm_id_handler, NULL, data); + iq_id_handler_add(xmpp_stanza_get_id(iq), _mam_rsm_id_handler, (ProfIqFreeCallback)_mam_userdata_free, data); iq_send_stanza(iq); xmpp_stanza_release(iq);