diff options
author | Dmitry Podgorny <pasis.ua@gmail.com> | 2012-10-18 18:18:44 +0300 |
---|---|---|
committer | Dmitry Podgorny <pasis.ua@gmail.com> | 2012-10-18 18:18:44 +0300 |
commit | bfc9e9a72e6061d90f1545671b7602abf3f0a093 (patch) | |
tree | 52ba5729397b1635f35cb5c75cc077609cf60001 /src/jabber.c | |
parent | 7156436805f099e644ff1039029512b0daab06c1 (diff) | |
download | profani-tty-bfc9e9a72e6061d90f1545671b7602abf3f0a093.tar.gz |
handle error messages from server
Diffstat (limited to 'src/jabber.c')
-rw-r--r-- | src/jabber.c | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/src/jabber.c b/src/jabber.c index c8caf415..70162cc4 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -42,6 +42,18 @@ static struct _jabber_conn_t { int tls_disabled; } jabber_conn; +typedef struct _err_code_tbl_t { + int code; + char *condition; +} err_code_tbl_t; + +static err_code_tbl_t err_code_tbl[] = { + {404, "recipient-unavailable"}, + {503, "service-unavailable"}, + {0, NULL}, // termination line +}; + +static char *_get_xmpp_err_by_code(const char * const err_code); static log_level_t _get_log_level(xmpp_log_level_t xmpp_level); static xmpp_log_level_t _get_xmpp_log_level(); static void _xmpp_file_logger(void * const userdata, @@ -275,8 +287,23 @@ _message_handler(xmpp_conn_t * const conn, // message body recieved char *type = xmpp_stanza_get_attribute(stanza, "type"); - if(strcmp(type, "error") == 0) + if(strcmp(type, "error") == 0) { + // error message received + char *from = xmpp_stanza_get_attribute(stanza, "from"); + char *err_msg = NULL; + xmpp_stanza_t *error = xmpp_stanza_get_child_by_name(stanza, "error"); + if (error) { + xmpp_stanza_t *err_cond = xmpp_stanza_get_children(error); + if (err_cond) { + err_msg = xmpp_stanza_get_name(err_cond); + } else { + char *err_code = xmpp_stanza_get_attribute(error, "code"); + err_msg = _get_xmpp_err_by_code(err_code); + } + } + prof_handle_error_message(from, err_msg); return 1; + } char *message = xmpp_stanza_get_text(body); char *from = xmpp_stanza_get_attribute(stanza, "from"); @@ -436,6 +463,25 @@ _presence_handler(xmpp_conn_t * const conn, return 1; } +static char * +_get_xmpp_err_by_code(const char * const err_code) +{ + int code; + int i = 0; + + if (err_code == NULL) + return NULL; + + code = atoi(err_code); + while (err_code_tbl[i].code != 0) { + if (err_code_tbl[i].code == code) { + return err_code_tbl[i].condition; + } + } + + return NULL; +} + static log_level_t _get_log_level(xmpp_log_level_t xmpp_level) { |