about summary refs log tree commit diff stats
path: root/src/jabber.c
diff options
context:
space:
mode:
authorDmitry Podgorny <pasis.ua@gmail.com>2012-10-18 18:18:44 +0300
committerDmitry Podgorny <pasis.ua@gmail.com>2012-10-18 18:18:44 +0300
commitbfc9e9a72e6061d90f1545671b7602abf3f0a093 (patch)
tree52ba5729397b1635f35cb5c75cc077609cf60001 /src/jabber.c
parent7156436805f099e644ff1039029512b0daab06c1 (diff)
downloadprofani-tty-bfc9e9a72e6061d90f1545671b7602abf3f0a093.tar.gz
handle error messages from server
Diffstat (limited to 'src/jabber.c')
-rw-r--r--src/jabber.c48
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)
 {