diff --git a/src/server_events.c b/src/server_events.c index 051ce1a3..3d640fa1 100644 --- a/src/server_events.c +++ b/src/server_events.c @@ -62,6 +62,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 54236cfb..b364d49d 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -390,6 +390,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) { @@ -1757,4 +1790,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 cd72e6fa..0dfe6c99 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/connection.c b/src/xmpp/connection.c index b7ffe410..e4239ff1 100644 --- a/src/xmpp/connection.c +++ b/src/xmpp/connection.c @@ -326,49 +326,6 @@ _connection_free_session_data(void) presence_clear_sub_requests(); } -int -connection_error_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, - void * const userdata) -{ - xmpp_ctx_t *ctx = connection_get_ctx(); - gchar *err_msg = NULL; - gchar *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); - xmpp_stanza_t *error_stanza = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_ERROR); - xmpp_stanza_t *text_stanza = xmpp_stanza_get_child_by_name(error_stanza, STANZA_NAME_TEXT); - - if (error_stanza == NULL) { - log_debug("error message without received"); - } else { - - // check for text - if (text_stanza != NULL) { - err_msg = xmpp_stanza_get_text(text_stanza); - if (err_msg != NULL) { - handle_error_message(from, err_msg); - xmpp_free(ctx, err_msg); - } - - // TODO : process 'type' attribute from [RFC6120, 8.3.2] - - // otherwise show defined-condition - } else { - xmpp_stanza_t *err_cond = xmpp_stanza_get_children(error_stanza); - - if (err_cond == NULL) { - log_debug("error message without or received"); - - } else { - err_msg = xmpp_stanza_get_name(err_cond); - handle_error_message(from, err_msg); - - // TODO : process 'type' attribute from [RFC6120, 8.3.2] - } - } - } - - return 1; -} - static jabber_conn_status_t _jabber_connect(const char * const fulljid, const char * const passwd, const char * const altdomain, int port) diff --git a/src/xmpp/connection.h b/src/xmpp/connection.h index f11bc8c8..bf7d145e 100644 --- a/src/xmpp/connection.h +++ b/src/xmpp/connection.h @@ -29,8 +29,6 @@ xmpp_conn_t *connection_get_conn(void); xmpp_ctx_t *connection_get_ctx(void); -int connection_error_handler(xmpp_conn_t * const conn, - xmpp_stanza_t * const stanza, void * const userdata); void connection_set_priority(int priority); void connection_set_presence_message(const char * const message); void connection_add_available_resource(Resource *resource); diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 236999b9..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); @@ -222,10 +223,17 @@ _message_error_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, type = xmpp_stanza_get_attribute(error_stanza, STANZA_ATTR_TYPE); } - // handle recipient not found + // handle recipient not found ('from' contains a value and type is 'cancel') if ((from != NULL) && ((type != NULL && (strcmp(type, "cancel") == 0)))) { - char *cpy = strdup(from); - handle_recipient_not_found(cpy, err_msg); + 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; diff --git a/src/xmpp/presence.c b/src/xmpp/presence.c index 9b11c898..f61d605d 100644 --- a/src/xmpp/presence.c +++ b/src/xmpp/presence.c @@ -55,6 +55,8 @@ static int _available_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata); static int _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata); +static int _presence_error_handler(xmpp_conn_t * const conn, + xmpp_stanza_t * const stanza, void * const userdata); static char* _get_caps_key(xmpp_stanza_t * const stanza); static void _send_room_presence(xmpp_conn_t *conn, xmpp_stanza_t *presence); @@ -72,7 +74,7 @@ presence_add_handlers(void) xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); - HANDLE(NULL, STANZA_TYPE_ERROR, connection_error_handler); + HANDLE(NULL, STANZA_TYPE_ERROR, _presence_error_handler); HANDLE(STANZA_NS_MUC_USER, NULL, _muc_user_handler); HANDLE(NULL, STANZA_TYPE_UNAVAILABLE, _unavailable_handler); HANDLE(NULL, STANZA_TYPE_SUBSCRIBE, _subscribe_handler); @@ -329,6 +331,50 @@ _presence_leave_chat_room(const char * const room_jid) } } +static int +_presence_error_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, + void * const userdata) +{ + xmpp_ctx_t *ctx = connection_get_ctx(); + gchar *err_msg = NULL; + gchar *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); + xmpp_stanza_t *error_stanza = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_ERROR); + xmpp_stanza_t *text_stanza = xmpp_stanza_get_child_by_name(error_stanza, STANZA_NAME_TEXT); + + if (error_stanza == NULL) { + log_debug("error message without received"); + } else { + + // check for text + if (text_stanza != NULL) { + err_msg = xmpp_stanza_get_text(text_stanza); + if (err_msg != NULL) { + handle_error_message(from, err_msg); + xmpp_free(ctx, err_msg); + } + + // TODO : process 'type' attribute from [RFC6120, 8.3.2] + + // otherwise show defined-condition + } else { + xmpp_stanza_t *err_cond = xmpp_stanza_get_children(error_stanza); + + if (err_cond == NULL) { + log_debug("error message without or received"); + + } else { + err_msg = xmpp_stanza_get_name(err_cond); + handle_error_message(from, err_msg); + + // TODO : process 'type' attribute from [RFC6120, 8.3.2] + } + } + } + + return 1; +} + + static int _unsubscribed_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata)