changeset 426:2706ef3e25a7

Better handling of server error codes/messages
author Mikael Berthe <mikael@lilotux.net>
date Mon, 05 Sep 2005 22:56:57 +0200
parents 03f1e37759a6
children ac85ce87f539
files mcabber/src/jabglue.c
diffstat 1 files changed, 37 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/jabglue.c	Sun Sep 04 13:51:23 2005 +0200
+++ b/mcabber/src/jabglue.c	Mon Sep 05 22:56:57 2005 +0200
@@ -577,7 +577,7 @@
   g_free(buffer);
 }
 
-const char *errormsg(int code)
+const char *defaulterrormsg(int code)
 {
   const char *desc;
 
@@ -621,6 +621,30 @@
   return desc;
 }
 
+void display_server_error(xmlnode x)
+{
+  char *s;
+  const char *desc;
+  int code;
+
+  if ((s = xmlnode_get_attrib(x, "code")) != NULL) {
+    code = atoi(s);
+
+    // Default message
+    desc = defaulterrormsg(atoi(s));
+
+    // Error tag data is better, if available
+    s = xmlnode_get_data(x);
+    if (s && *s) desc = s;
+
+    // And sometimes there is a text message
+    s = xmlnode_get_tag_data(x, "text");
+    if (s && *s) desc = s; // FIXME utf8??
+
+    scr_LogPrint(LPRINT_LOGNORM, "Error code from server: %d %s", code, desc);
+  }
+}
+
 void statehandler(jconn conn, int state)
 {
   static int previous_state = -1;
@@ -719,15 +743,8 @@
           }
 
           if (type && !strcmp(type, "error")) {
-            if ((x = xmlnode_get_tag(packet->x, "error")) != NULL) {
-              if ((p = xmlnode_get_attrib(x, "code")) != NULL) {
-                const char *desc;
-                int code = atoi(p);
-                desc = errormsg(atoi(p));
-                scr_LogPrint(LPRINT_LOGNORM, "Error code from server: %d %s",
-                             code, (desc ? desc : ""));
-              }
-            }
+            if ((x = xmlnode_get_tag(packet->x, "error")) != NULL)
+              display_server_error(x);
           }
           if (from && body)
             gotmessage(type, from, body, enc, timestamp);
@@ -852,33 +869,20 @@
           }
         } else if (!strcmp(type, "set")) {
         } else if (!strcmp(type, "error")) {
-          char *name=NULL;
-          char *text=NULL;
-          int code = 0;
-          const char *desc;
-
-          x = xmlnode_get_tag(packet->x, "error");
-          p = xmlnode_get_attrib(x, "code"); if (p) code = atoi(p);
-          p = xmlnode_get_attrib(x, "id"); if (p) name = p;
-          p = xmlnode_get_tag_data(packet->x, "error"); if (p) desc = p;
-
-          // Sometimes there is a text message
-          x = xmlnode_get_tag(x, "text");
-          p = xmlnode_get_data(x); if (p) text = p;
-
-          desc = errormsg(code);
-
-          scr_LogPrint(LPRINT_LOGNORM, "Error code from server: %d %s",
-                       code, (desc ? desc : ""));
-          if (text)
-            scr_LogPrint(LPRINT_LOGNORM, "Server message: %s", text);
-
-          if (name)
-            scr_LogPrint(LPRINT_DEBUG, "Error id: %s", name);
+          if ((x = xmlnode_get_tag(packet->x, "error")) != NULL)
+            display_server_error(x);
         }
         break;
 
     case JPACKET_PRESENCE:
+        r = jidtodisp(from);
+        if (type && !strcmp(type, "error")) {
+          scr_LogPrint(LPRINT_LOGNORM, "Error presence packet from <%s>", r);
+          if ((x = xmlnode_get_tag(packet->x, "error")) != NULL)
+            display_server_error(x);
+          g_free(r);
+          break;
+        }
         x = xmlnode_get_tag(packet->x, "show");
         ust = available;
 
@@ -901,7 +905,6 @@
         else
           p = NULL;
 
-        r = jidtodisp(from);
         // Call hk_statuschange() if status has changed or if the
         // status message is different
         m = roster_getstatusmsg(r);