mirror of
https://github.com/profanity-im/profanity.git
synced 2024-09-01 19:24:15 -04:00
commit
b18b6cbd29
@ -932,21 +932,23 @@ void
|
|||||||
plugins_shutdown(void)
|
plugins_shutdown(void)
|
||||||
{
|
{
|
||||||
GList* values = g_hash_table_get_values(plugins);
|
GList* values = g_hash_table_get_values(plugins);
|
||||||
GList* curr = values;
|
GList *curr = values, *next;
|
||||||
|
|
||||||
while (curr) {
|
while (curr) {
|
||||||
|
next = g_list_next(curr);
|
||||||
#ifdef HAVE_PYTHON
|
#ifdef HAVE_PYTHON
|
||||||
if (((ProfPlugin*)curr->data)->lang == LANG_PYTHON) {
|
if (curr && ((ProfPlugin*)curr->data)->lang == LANG_PYTHON) {
|
||||||
python_plugin_destroy(curr->data);
|
python_plugin_destroy(curr->data);
|
||||||
|
curr = NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_C
|
#ifdef HAVE_C
|
||||||
if (((ProfPlugin*)curr->data)->lang == LANG_C) {
|
if (curr && ((ProfPlugin*)curr->data)->lang == LANG_C) {
|
||||||
c_plugin_destroy(curr->data);
|
c_plugin_destroy(curr->data);
|
||||||
|
curr = NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
curr = next;
|
||||||
curr = g_list_next(curr);
|
|
||||||
}
|
}
|
||||||
g_list_free(values);
|
g_list_free(values);
|
||||||
#ifdef HAVE_PYTHON
|
#ifdef HAVE_PYTHON
|
||||||
|
@ -256,9 +256,9 @@ _shutdown(void)
|
|||||||
accounts_close();
|
accounts_close();
|
||||||
tlscerts_close();
|
tlscerts_close();
|
||||||
log_stderr_close();
|
log_stderr_close();
|
||||||
log_close();
|
|
||||||
plugins_shutdown();
|
plugins_shutdown();
|
||||||
cmd_uninit();
|
cmd_uninit();
|
||||||
ui_close();
|
ui_close();
|
||||||
prefs_close();
|
prefs_close();
|
||||||
|
log_close();
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,8 @@ ui_close_win(int index)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove the IQ handlers
|
||||||
|
iq_handlers_remove_win(window);
|
||||||
wins_close_by_num(index);
|
wins_close_by_num(index);
|
||||||
title_bar_console();
|
title_bar_console();
|
||||||
status_bar_current(1);
|
status_bar_current(1);
|
||||||
|
@ -190,7 +190,6 @@ _conn_apply_settings(const char* const jid, const char* const passwd, const char
|
|||||||
|
|
||||||
_compute_identifier(jidp->barejid);
|
_compute_identifier(jidp->barejid);
|
||||||
|
|
||||||
xmpp_ctx_set_verbosity(conn.xmpp_ctx, 0);
|
|
||||||
xmpp_conn_set_jid(conn.xmpp_conn, jid);
|
xmpp_conn_set_jid(conn.xmpp_conn, jid);
|
||||||
if (passwd)
|
if (passwd)
|
||||||
xmpp_conn_set_pass(conn.xmpp_conn, passwd);
|
xmpp_conn_set_pass(conn.xmpp_conn, passwd);
|
||||||
@ -561,7 +560,7 @@ connection_disconnect(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(prof_identifier);
|
g_free(prof_identifier);
|
||||||
prof_identifier = NULL;
|
prof_identifier = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -998,22 +997,25 @@ _connection_handler(xmpp_conn_t* const xmpp_conn, const xmpp_conn_event_t status
|
|||||||
log_debug("Connection handler: XMPP_CONN_DISCONNECT");
|
log_debug("Connection handler: XMPP_CONN_DISCONNECT");
|
||||||
|
|
||||||
// lost connection for unknown reason
|
// lost connection for unknown reason
|
||||||
if (conn.conn_status == JABBER_CONNECTED) {
|
if (conn.conn_status == JABBER_CONNECTED || conn.conn_status == JABBER_DISCONNECTING) {
|
||||||
if (prefs_get_boolean(PREF_STROPHE_SM_ENABLED)) {
|
if (prefs_get_boolean(PREF_STROPHE_SM_ENABLED)) {
|
||||||
int send_queue_len = xmpp_conn_send_queue_len(conn.xmpp_conn);
|
int send_queue_len = xmpp_conn_send_queue_len(conn.xmpp_conn);
|
||||||
log_debug("Connection handler: Lost connection for unknown reason");
|
log_debug("Connection handler: Lost connection for unknown reason, %d messages in send queue", send_queue_len);
|
||||||
conn.sm_state = xmpp_conn_get_sm_state(conn.xmpp_conn);
|
conn.sm_state = xmpp_conn_get_sm_state(conn.xmpp_conn);
|
||||||
if (send_queue_len > 0 && prefs_get_boolean(PREF_STROPHE_SM_RESEND)) {
|
if (send_queue_len > 0 && prefs_get_boolean(PREF_STROPHE_SM_RESEND)) {
|
||||||
conn.queued_messages = calloc(send_queue_len + 1, sizeof(*conn.queued_messages));
|
conn.queued_messages = calloc(send_queue_len + 1, sizeof(*conn.queued_messages));
|
||||||
for (int n = 0; n < send_queue_len && conn.queued_messages[n]; ++n) {
|
for (int n = 0; n < send_queue_len && conn.queued_messages[n]; ++n) {
|
||||||
conn.queued_messages[n] = xmpp_conn_send_queue_drop_element(conn.xmpp_conn, XMPP_QUEUE_OLDEST);
|
conn.queued_messages[n] = xmpp_conn_send_queue_drop_element(conn.xmpp_conn, XMPP_QUEUE_OLDEST);
|
||||||
}
|
}
|
||||||
|
} else if (send_queue_len > 0) {
|
||||||
|
log_debug("Connection handler: dropping those messages since SM RESEND is disabled");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
session_lost_connection();
|
if (conn.conn_status == JABBER_CONNECTED)
|
||||||
|
session_lost_connection();
|
||||||
|
|
||||||
// login attempt failed
|
// login attempt failed
|
||||||
} else if (conn.conn_status != JABBER_DISCONNECTING) {
|
} else {
|
||||||
gchar* host;
|
gchar* host;
|
||||||
int port;
|
int port;
|
||||||
if (stream_error && stream_error->stanza && _get_other_host(stream_error->stanza, &host, &port)) {
|
if (stream_error && stream_error->stanza && _get_other_host(stream_error->stanza, &host, &port)) {
|
||||||
@ -1126,7 +1128,7 @@ static void
|
|||||||
_compute_identifier(const char* barejid)
|
_compute_identifier(const char* barejid)
|
||||||
{
|
{
|
||||||
// in case of reconnect (lost connection)
|
// in case of reconnect (lost connection)
|
||||||
free(prof_identifier);
|
g_free(prof_identifier);
|
||||||
|
|
||||||
prof_identifier = g_compute_hmac_for_string(G_CHECKSUM_SHA256,
|
prof_identifier = g_compute_hmac_for_string(G_CHECKSUM_SHA256,
|
||||||
(guchar*)profanity_instance_id, strlen(profanity_instance_id),
|
(guchar*)profanity_instance_id, strlen(profanity_instance_id),
|
||||||
|
@ -259,6 +259,7 @@ iq_handlers_init(void)
|
|||||||
int millis = prefs_get_autoping() * 1000;
|
int millis = prefs_get_autoping() * 1000;
|
||||||
xmpp_timed_handler_add(conn, _autoping_timed_send, millis, ctx);
|
xmpp_timed_handler_add(conn, _autoping_timed_send, millis, ctx);
|
||||||
}
|
}
|
||||||
|
received_disco_items = FALSE;
|
||||||
|
|
||||||
iq_rooms_cache_clear();
|
iq_rooms_cache_clear();
|
||||||
iq_handlers_clear();
|
iq_handlers_clear();
|
||||||
@ -267,8 +268,56 @@ iq_handlers_init(void)
|
|||||||
rooms_cache = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)xmpp_stanza_release);
|
rooms_cache = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)xmpp_stanza_release);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct iq_win_finder
|
||||||
|
{
|
||||||
|
gsize max, cur;
|
||||||
|
char** to_be_removed;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
_win_find(char* key,
|
||||||
|
ProfIqHandler* handler,
|
||||||
|
struct iq_win_finder* finder)
|
||||||
|
{
|
||||||
|
if (handler->func == _mam_rsm_id_handler) {
|
||||||
|
if (finder->cur >= finder->max) {
|
||||||
|
finder->max *= 2;
|
||||||
|
finder->to_be_removed = g_realloc_n(finder->to_be_removed, finder->max, sizeof(char*));
|
||||||
|
}
|
||||||
|
finder->to_be_removed[finder->cur++] = g_strdup(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
iq_handlers_clear()
|
iq_handlers_remove_win(ProfWin* window)
|
||||||
|
{
|
||||||
|
log_debug("Remove window %p of type %d", window, window ? window->type : -1);
|
||||||
|
if (!window)
|
||||||
|
return;
|
||||||
|
GSList *cur = late_delivery_windows, *next;
|
||||||
|
while (cur) {
|
||||||
|
LateDeliveryUserdata* del_data = cur->data;
|
||||||
|
next = g_slist_next(cur);
|
||||||
|
if (del_data->win == (void*)window)
|
||||||
|
late_delivery_windows = g_slist_delete_link(late_delivery_windows,
|
||||||
|
cur);
|
||||||
|
cur = next;
|
||||||
|
}
|
||||||
|
struct iq_win_finder st = { 0 };
|
||||||
|
st.max = g_hash_table_size(id_handlers);
|
||||||
|
if (st.max == 0)
|
||||||
|
return;
|
||||||
|
st.to_be_removed = g_new(char*, st.max);
|
||||||
|
g_hash_table_foreach(id_handlers, (GHFunc)_win_find, &st);
|
||||||
|
for (gsize n = 0; n < st.cur; ++n) {
|
||||||
|
g_hash_table_remove(id_handlers, st.to_be_removed[n]);
|
||||||
|
g_free(st.to_be_removed[n]);
|
||||||
|
}
|
||||||
|
g_free(st.to_be_removed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
iq_handlers_clear(void)
|
||||||
{
|
{
|
||||||
if (id_handlers) {
|
if (id_handlers) {
|
||||||
g_hash_table_remove_all(id_handlers);
|
g_hash_table_remove_all(id_handlers);
|
||||||
@ -2696,6 +2745,10 @@ _mam_rsm_id_handler(xmpp_stanza_t* const stanza, void* const userdata)
|
|||||||
gboolean is_complete = g_strcmp0(xmpp_stanza_get_attribute(fin, "complete"), "true") == 0;
|
gboolean is_complete = g_strcmp0(xmpp_stanza_get_attribute(fin, "complete"), "true") == 0;
|
||||||
MamRsmUserdata* data = (MamRsmUserdata*)userdata;
|
MamRsmUserdata* data = (MamRsmUserdata*)userdata;
|
||||||
ProfWin* window = (ProfWin*)data->win;
|
ProfWin* window = (ProfWin*)data->win;
|
||||||
|
if (wins_get_num(window) == -1) {
|
||||||
|
log_error("Window %p should not get any events anymore", window);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
buffer_remove_entry(window->layout->buffer, 0);
|
buffer_remove_entry(window->layout->buffer, 0);
|
||||||
|
|
||||||
|
@ -1261,7 +1261,7 @@ _handle_muc_private_message(xmpp_stanza_t* const stanza)
|
|||||||
ProfMessage* message = message_init();
|
ProfMessage* message = message_init();
|
||||||
message->type = PROF_MSG_TYPE_MUCPM;
|
message->type = PROF_MSG_TYPE_MUCPM;
|
||||||
|
|
||||||
const gchar* from = xmpp_stanza_get_from(stanza);
|
const char* from = xmpp_stanza_get_from(stanza);
|
||||||
if (!from) {
|
if (!from) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -1360,7 +1360,7 @@ _handle_chat(xmpp_stanza_t* const stanza, gboolean is_mam, gboolean is_carbon, c
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const gchar* from = xmpp_stanza_get_from(stanza);
|
const char* from = xmpp_stanza_get_from(stanza);
|
||||||
if (!from) {
|
if (!from) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -240,7 +240,8 @@ void iq_enable_carbons(void);
|
|||||||
void iq_disable_carbons(void);
|
void iq_disable_carbons(void);
|
||||||
void iq_send_software_version(const char* const fulljid);
|
void iq_send_software_version(const char* const fulljid);
|
||||||
void iq_rooms_cache_clear(void);
|
void iq_rooms_cache_clear(void);
|
||||||
void iq_handlers_clear();
|
void iq_handlers_remove_win(ProfWin* window);
|
||||||
|
void iq_handlers_clear(void);
|
||||||
void iq_room_list_request(gchar* conferencejid, gchar* filter);
|
void iq_room_list_request(gchar* conferencejid, gchar* filter);
|
||||||
void iq_disco_info_request(gchar* jid);
|
void iq_disco_info_request(gchar* jid);
|
||||||
void iq_disco_items_request(gchar* jid);
|
void iq_disco_items_request(gchar* jid);
|
||||||
|
Loading…
Reference in New Issue
Block a user