diff mcabber/src/jabglue.c @ 438:b44be19d6229

Handle multiple resources for the same buddy
author Mikael Berthe <mikael@lilotux.net>
date Mon, 19 Sep 2005 23:32:42 +0200
parents 802da817a684
children 51b8f10cfeb8
line wrap: on
line diff
--- a/mcabber/src/jabglue.c	Fri Sep 16 21:49:39 2005 +0200
+++ b/mcabber/src/jabglue.c	Mon Sep 19 23:32:42 2005 +0200
@@ -99,8 +99,7 @@
   char *ptr;
   char *alias;
 
-  while ((alias = g_strdup(jid)) == NULL)
-    safe_usleep(100);
+  alias = g_strdup(jid);
 
   if ((ptr = strchr(alias, '/')) != NULL) {
     *ptr = 0;
@@ -710,12 +709,13 @@
 void packethandler(jconn conn, jpacket packet)
 {
   char *p, *r;
-  const char *m;
+  const char *m, *rname;
   xmlnode x, y;
   char *from=NULL, *type=NULL, *body=NULL, *enc=NULL;
   char *ns=NULL;
   char *id=NULL;
   enum imstatus ust;
+  char bpprio;
 
   jb_reset_keepalive(); // reset keepalive delay
   jpacket_reset(packet);
@@ -903,18 +903,18 @@
           g_free(r);
           break;
         }
-        x = xmlnode_get_tag(packet->x, "show");
-        ust = available;
 
-        if (x) {
-          p = xmlnode_get_data(x); if (p) ns = p;
+        p = xmlnode_get_tag_data(packet->x, "priority");
+        if (p && *p) bpprio = (gchar)atoi(p);
+        else         bpprio = 0;
 
-          if (ns) {
-            if (!strcmp(ns, "away"))      ust = away;
-            else if (!strcmp(ns, "dnd"))  ust = dontdisturb;
-            else if (!strcmp(ns, "xa"))   ust = notavail;
-            else if (!strcmp(ns, "chat")) ust = freeforchat;
-          }
+        ust = available;
+        p = xmlnode_get_tag_data(packet->x, "show");
+        if (p) {
+          if (!strcmp(p, "away"))      ust = away;
+          else if (!strcmp(p, "dnd"))  ust = dontdisturb;
+          else if (!strcmp(p, "xa"))   ust = notavail;
+          else if (!strcmp(p, "chat")) ust = freeforchat;
         }
 
         if (type && !strcmp(type, "unavailable"))
@@ -927,9 +927,11 @@
 
         // Call hk_statuschange() if status has changed or if the
         // status message is different
-        m = roster_getstatusmsg(r);
-        if ((ust != roster_getstatus(r)) || (p && (!m || strcmp(p, m))))
-          hk_statuschange(r, 0, ust, p);
+        rname = strchr(from, '/');
+        if (rname) rname++;
+        m = roster_getstatusmsg(r, rname);
+        if ((ust != roster_getstatus(r, rname)) || (p && (!m || strcmp(p, m))))
+          hk_statuschange(r, rname, bpprio, 0, ust, p);
         g_free(r);
         if (p) g_free(p);
         break;