1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-12-04 14:46:46 -05:00

Merge pull request #46 from pasis/master

Improved error handling. Handles when user does not exist at server, and when the server cannot be contacted (for example if the server name is typed incorrectly in the JID).
This commit is contained in:
James Booth 2012-10-21 11:37:11 -07:00
commit 382e961563
5 changed files with 95 additions and 28 deletions

View File

@ -255,6 +255,32 @@ static int
_message_handler(xmpp_conn_t * const conn,
xmpp_stanza_t * const stanza, void * const userdata)
{
char *type;
char *from;
type = xmpp_stanza_get_attribute(stanza, "type");
from = xmpp_stanza_get_attribute(stanza, "from");
if (strcmp(type, "error") == 0) {
char *err_msg = NULL;
xmpp_stanza_t *error = xmpp_stanza_get_child_by_name(stanza, "error");
if (error == NULL) {
log_debug("error message without <error/> received");
return 1;
} else {
xmpp_stanza_t *err_cond = xmpp_stanza_get_children(error);
if (err_cond == NULL) {
log_debug("error message without <defined-condition/> received");
return 1;
} else {
err_msg = xmpp_stanza_get_name(err_cond);
}
// TODO: process 'type' attribute from <error/> [RFC6120, 8.3.2]
}
prof_handle_error_message(from, err_msg);
return 1;
}
xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(stanza, "body");
// if no message, check for chatstates
@ -265,7 +291,6 @@ _message_handler(xmpp_conn_t * const conn,
// active
} else if (xmpp_stanza_get_child_by_name(stanza, "composing") != NULL) {
// composing
char *from = xmpp_stanza_get_attribute(stanza, "from");
prof_handle_typing(from);
}
}
@ -274,12 +299,7 @@ _message_handler(xmpp_conn_t * const conn,
}
// message body recieved
char *type = xmpp_stanza_get_attribute(stanza, "type");
if(strcmp(type, "error") == 0)
return 1;
char *message = xmpp_stanza_get_text(body);
char *from = xmpp_stanza_get_attribute(stanza, "from");
prof_handle_incoming_message(from, message);
return 1;

View File

@ -114,6 +114,24 @@ prof_handle_incoming_message(char *from, char *message)
}
}
void
prof_handle_error_message(const char *from, const char *err_msg)
{
char *msg, *fmt;
if (err_msg != NULL) {
fmt = "Error received from server: %s";
msg = (char *)malloc(strlen(err_msg) + strlen(fmt) - 1);
if (msg == NULL)
goto loop_out;
sprintf(msg, fmt, err_msg);
cons_bad_show(msg);
free(msg);
}
loop_out:
win_show_error_msg(from, err_msg);
}
void
prof_handle_login_success(const char *jid)
{

View File

@ -37,6 +37,7 @@ void prof_handle_typing(char *from);
void prof_handle_contact_online(char *contact, char *show, char *status);
void prof_handle_contact_offline(char *contact, char *show, char *status);
void prof_handle_incoming_message(char *from, char *message);
void prof_handle_error_message(const char *from, const char *err_msg);
void prof_handle_roster(GSList *roster);
#endif

View File

@ -88,6 +88,7 @@ int win_in_chat(void);
char *win_get_recipient(void);
void win_show_typing(const char * const from);
void win_show_incomming_msg(const char * const from, const char * const message);
void win_show_error_msg(const char * const from, const char *err_msg);
void win_show_outgoing_msg(const char * const from, const char * const to,
const char * const message);
void win_handle_special_keys(const int * const ch);

View File

@ -73,6 +73,7 @@ static void _win_switch_if_active(const int i);
static void _win_show_time(WINDOW *win);
static void _win_show_user(WINDOW *win, const char * const user, const int colour);
static void _win_show_message(WINDOW *win, const char * const message);
static void _win_show_error_msg(WINDOW *win, const char * const message);
static void _show_status_string(WINDOW *win, const char * const from,
const char * const show, const char * const status, const char * const pre,
const char * const default_show);
@ -302,6 +303,27 @@ win_show_incomming_msg(const char * const from, const char * const message)
#endif
}
void
win_show_error_msg(const char * const from, const char *err_msg)
{
int win_index;
WINDOW *win;
if (from == NULL || err_msg == NULL)
return;
win_index = _find_prof_win_index(from);
// chat window exists
if (win_index < NUM_WINS) {
win = _wins[win_index].win;
_win_show_time(win);
_win_show_error_msg(win, err_msg);
if (win_index == _curr_prof_win) {
dirty = TRUE;
}
}
}
#ifdef HAVE_LIBNOTIFY
static void
_win_notify(const char * const message, int timeout,
@ -371,38 +393,35 @@ win_show_outgoing_msg(const char * const from, const char * const to,
{
// if the contact is offline, show a message
PContact contact = contact_list_get_contact(to);
if (contact == NULL) {
cons_show("%s is not one of your contacts.");
} else {
int win_index = _find_prof_win_index(to);
WINDOW *win = NULL;
int win_index = _find_prof_win_index(to);
WINDOW *win = NULL;
// create new window
if (win_index == NUM_WINS) {
win_index = _new_prof_win(to);
win = _wins[win_index].win;
if (prefs_get_chlog() && prefs_get_history()) {
_win_show_history(win, win_index, to);
}
// create new window
if (win_index == NUM_WINS) {
win_index = _new_prof_win(to);
win = _wins[win_index].win;
if (prefs_get_chlog() && prefs_get_history()) {
_win_show_history(win, win_index, to);
}
if (contact != NULL) {
if (strcmp(p_contact_show(contact), "offline") == 0) {
const char const *show = p_contact_show(contact);
const char const *status = p_contact_status(contact);
_show_status_string(win, to, show, status, "--", "offline");
}
// use existing window
} else {
win = _wins[win_index].win;
}
_win_show_time(win);
_win_show_user(win, from, 0);
_win_show_message(win, message);
_win_switch_if_active(win_index);
// use existing window
} else {
win = _wins[win_index].win;
}
_win_show_time(win);
_win_show_user(win, from, 0);
_win_show_message(win, message);
_win_switch_if_active(win_index);
}
void
@ -901,6 +920,14 @@ _win_show_message(WINDOW *win, const char * const message)
wprintw(win, "%s\n", message);
}
static void
_win_show_error_msg(WINDOW *win, const char * const message)
{
wattron(win, COLOUR_ERR);
wprintw(win, "%s\n", message);
wattroff(win, COLOUR_ERR);
}
static void
_current_window_refresh(void)
{