diff --git a/src/server_events.c b/src/server_events.c index 938572a0..e9dd7997 100644 --- a/src/server_events.c +++ b/src/server_events.c @@ -61,6 +61,18 @@ handle_recipient_not_found(const char * const recipient, const char * const err_ } } +void +handle_recipient_error(const char * const recipient, const char * const err_msg) +{ + ui_handle_recipient_error(recipient, err_msg); +} + +void +handle_error(const char * const err_msg) +{ + ui_handle_error(err_msg); +} + void handle_login_account_success(char *account_name) { diff --git a/src/server_events.h b/src/server_events.h index 794d96dc..ab2e29fd 100644 --- a/src/server_events.h +++ b/src/server_events.h @@ -76,5 +76,7 @@ void handle_roster_remove(const char * const barejid); void handle_roster_add(const char * const barejid, const char * const name); void handle_autoping_cancel(void); void handle_recipient_not_found(const char * const recipient, const char * const err_msg); +void handle_recipient_error(const char * const recipient, const char * const err_msg); +void handle_error(const char * const err_msg); #endif diff --git a/src/ui/core.c b/src/ui/core.c index a59225c8..cdac6e8f 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -387,6 +387,39 @@ _ui_handle_recipient_not_found(const char * const recipient, const char * const g_string_free(msg, TRUE); } +static void +_ui_handle_recipient_error(const char * const recipient, const char * const err_msg) +{ + ProfWin *win = wins_get_by_recipient(recipient); + GString *msg = g_string_new(""); + g_string_printf(msg, "Error from %s: %s", recipient, err_msg); + + // always show in console + cons_show_error(msg->str); + + // show in window if exists for recipient + if (win != NULL) { + win_print_line(win, '!', COLOUR_ERROR, msg->str); + } + + wins_refresh_current(); + + g_string_free(msg, TRUE); +} + +static void +_ui_handle_error(const char * const err_msg) +{ + GString *msg = g_string_new(""); + g_string_printf(msg, "Error %s", err_msg); + + cons_show_error(msg->str); + + wins_refresh_current(); + + g_string_free(msg, TRUE); +} + static void _ui_disconnected(void) { @@ -1752,4 +1785,6 @@ ui_init_module(void) ui_chat_win_contact_online = _ui_chat_win_contact_online; ui_chat_win_contact_offline = _ui_chat_win_contact_offline; ui_handle_recipient_not_found = _ui_handle_recipient_not_found; + ui_handle_recipient_error = _ui_handle_recipient_error; + ui_handle_error = _ui_handle_error; } diff --git a/src/ui/ui.h b/src/ui/ui.h index 837a8a3a..9d7ba282 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -131,6 +131,8 @@ void (*ui_group_removed)(const char * const contact, const char * const group); void (*ui_chat_win_contact_online)(PContact contact, Resource *resource, GDateTime *last_activity); void (*ui_chat_win_contact_offline)(PContact contact, char *resource, char *status); void (*ui_handle_recipient_not_found)(const char * const recipient, const char * const err_msg); +void (*ui_handle_recipient_error)(const char * const recipient, const char * const err_msg); +void (*ui_handle_error)(const char * const err_msg); // contact status functions void (*ui_status_room)(const char * const contact); diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 57699e31..6f340b2d 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -193,9 +193,10 @@ static int _message_error_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata) { - // log message, function never returns NULL char *id = xmpp_stanza_get_id(stanza); char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); + + // stanza_get_error never returns NULL char *err_msg = stanza_get_error_message(stanza); GString *log_msg = g_string_new("Error receievd"); @@ -211,7 +212,7 @@ _message_error_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, } g_string_append(log_msg, ", error: "); g_string_append(log_msg, err_msg); - + log_info(log_msg->str); g_string_free(log_msg, TRUE); @@ -225,6 +226,14 @@ _message_error_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, // handle recipient not found ('from' contains a value and type is 'cancel') if ((from != NULL) && ((type != NULL && (strcmp(type, "cancel") == 0)))) { handle_recipient_not_found(from, err_msg); + + // handle any other error from recipient + } else if (from != NULL) { + handle_recipient_error(from, err_msg); + + // handle errors from no recipient + } else { + handle_error(err_msg); } return 1;