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

jabber: rewrite error handling

This commit is contained in:
Dmitry Podgorny 2012-10-20 09:19:59 +03:00
parent 1aff8a2144
commit 46b8a21cfb

View File

@ -42,18 +42,6 @@ static struct _jabber_conn_t {
int tls_disabled; int tls_disabled;
} jabber_conn; } 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 log_level_t _get_log_level(xmpp_log_level_t xmpp_level);
static xmpp_log_level_t _get_xmpp_log_level(); static xmpp_log_level_t _get_xmpp_log_level();
static void _xmpp_file_logger(void * const userdata, static void _xmpp_file_logger(void * const userdata,
@ -267,6 +255,32 @@ static int
_message_handler(xmpp_conn_t * const conn, _message_handler(xmpp_conn_t * const conn,
xmpp_stanza_t * const stanza, void * const userdata) 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"); xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(stanza, "body");
// if no message, check for chatstates // if no message, check for chatstates
@ -277,7 +291,6 @@ _message_handler(xmpp_conn_t * const conn,
// active // active
} else if (xmpp_stanza_get_child_by_name(stanza, "composing") != NULL) { } else if (xmpp_stanza_get_child_by_name(stanza, "composing") != NULL) {
// composing // composing
char *from = xmpp_stanza_get_attribute(stanza, "from");
prof_handle_typing(from); prof_handle_typing(from);
} }
} }
@ -286,27 +299,7 @@ _message_handler(xmpp_conn_t * const conn,
} }
// message body recieved // message body recieved
char *type = xmpp_stanza_get_attribute(stanza, "type");
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 *message = xmpp_stanza_get_text(body);
char *from = xmpp_stanza_get_attribute(stanza, "from");
prof_handle_incoming_message(from, message); prof_handle_incoming_message(from, message);
return 1; return 1;
@ -463,25 +456,6 @@ _presence_handler(xmpp_conn_t * const conn,
return 1; 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 static log_level_t
_get_log_level(xmpp_log_level_t xmpp_level) _get_log_level(xmpp_log_level_t xmpp_level)
{ {