diff --git a/src/jabber.c b/src/jabber.c
index c8caf415..d7809b03 100644
--- a/src/jabber.c
+++ b/src/jabber.c
@@ -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 received");
+ return 1;
+ } else {
+ xmpp_stanza_t *err_cond = xmpp_stanza_get_children(error);
+ if (err_cond == NULL) {
+ log_debug("error message without received");
+ return 1;
+ } else {
+ err_msg = xmpp_stanza_get_name(err_cond);
+ }
+ // TODO: process 'type' attribute from [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;
diff --git a/src/profanity.c b/src/profanity.c
index 0b909935..7795389d 100644
--- a/src/profanity.c
+++ b/src/profanity.c
@@ -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)
{
diff --git a/src/profanity.h b/src/profanity.h
index 3731f2c1..3d37d85e 100644
--- a/src/profanity.h
+++ b/src/profanity.h
@@ -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
diff --git a/src/ui.h b/src/ui.h
index 66a41e07..d1d56276 100644
--- a/src/ui.h
+++ b/src/ui.h
@@ -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);
diff --git a/src/windows.c b/src/windows.c
index 8ffc5005..bc39bfb3 100644
--- a/src/windows.c
+++ b/src/windows.c
@@ -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)
{