diff mcabber/src/jabglue.c @ 469:a926523d2392

Use UTF8 to handle resources and room nicknames
author Mikael Berthe <mikael@lilotux.net>
date Sat, 01 Oct 2005 23:17:05 +0200
parents 644b8bf9ca4d
children eaa2ad773192
line wrap: on
line diff
--- a/mcabber/src/jabglue.c	Sat Oct 01 18:53:14 2005 +0200
+++ b/mcabber/src/jabglue.c	Sat Oct 01 23:17:05 2005 +0200
@@ -36,9 +36,6 @@
 
 #define JABBER_AGENT_GROUP "Jabber Agents"
 
-#define to_utf8(s)   ((s) ? g_locale_to_utf8((s),   -1, NULL,NULL,NULL) : NULL)
-#define from_utf8(s) ((s) ? g_locale_from_utf8((s), -1, NULL,NULL,NULL) : NULL)
-
 jconn jc;
 static time_t LastPingTime;
 static unsigned int KeepaliveDelay;
@@ -126,6 +123,7 @@
 jconn jb_connect(const char *jid, const char *server, unsigned int port,
                  int ssl, const char *pass)
 {
+  char *utf8_jid;
   if (!port) {
     if (ssl)
       port = JABBERSSLPORT;
@@ -135,8 +133,12 @@
 
   jb_disconnect();
 
+  utf8_jid = to_utf8(jid);
+  if (!utf8_jid) return jc;
+
   s_id = 1;
-  jc = jab_new((char*)jid, (char*)pass, (char*)server, port, ssl);
+  jc = jab_new(utf8_jid, (char*)pass, (char*)server, port, ssl);
+  g_free(utf8_jid);
 
   /* These 3 functions can deal with a NULL jc, no worry... */
   jab_logger(jc, logger);
@@ -470,23 +472,40 @@
 }
 
 // Join a MUC room
-// room syntax: "room@server/nick"
-void jb_room_join(const char *room)
+void jb_room_join(const char *room, const char *nickname)
 {
   xmlnode x, y;
+  gchar *roomid, *utf8_nickname;
+  GSList *roster_usr;
 
-  if (!online) return;
-  if (!room)   return;
+  if (!online || !room || !nickname) return;
 
+  utf8_nickname = to_utf8(nickname);
+  roomid = g_strdup_printf("%s/%s", room, utf8_nickname);
+  g_free(utf8_nickname);
+  if (check_jid_syntax(roomid)) {
+    scr_LogPrint(LPRINT_NORMAL, "<%s/%s> is not a valid Jabber room", room,
+                 nickname);
+    g_free(roomid);
+    return;
+  }
+
+  // We need to save the nickname for future use
+  roster_usr = roster_add_user(room, NULL, NULL, ROSTER_TYPE_ROOM);
+  if (roster_usr)
+    buddy_setnickname(roster_usr->data, nickname);
+
+  // Send the XML request
   x = jutil_presnew(JPACKET__UNKNOWN, 0, 0);
   xmlnode_put_attrib(x, "from", jid_full(jc->user));
-  xmlnode_put_attrib(x, "to", room);
+  xmlnode_put_attrib(x, "to", roomid);
   y = xmlnode_insert_tag(x, "x");
   xmlnode_put_attrib(y, "xmlns", "http://jabber.org/protocol/muc");
 
   jab_send(jc, x);
   xmlnode_free(x);
   jb_reset_keepalive();
+  g_free(roomid);
 }
 
 // Unlock a MUC room
@@ -777,11 +796,36 @@
   enum imstatus ust;
   char bpprio;
 
-  jb_reset_keepalive(); // reset keepalive delay
+  jb_reset_keepalive(); // reset keepalive timeout
   jpacket_reset(packet);
 
-  p = xmlnode_get_attrib(packet->x, "from"); if (p) from = p;
   p = xmlnode_get_attrib(packet->x, "type"); if (p) type = p;
+  p = xmlnode_get_attrib(packet->x, "from");
+  if (p) {   // Convert from UTF8
+    // We need to be careful because from_utf8() can fail on some chars
+    // Thus we only convert the resource part
+    from = g_new0(char, strlen(p)+1);
+    strcpy(from, p);
+    r = strchr(from, '/');
+    m = strchr(p, '/');
+    if (m++) {
+      s = from_utf8(m);
+      if (s) {
+        // The length should be enough because from_utf should only
+        // reduce the string length
+        strcpy(r+1, s);
+        g_free(s);
+      } else {
+        *(r+1) = 0;
+        scr_LogPrint(LPRINT_LOGNORM, "Decoding of message sender has failed");
+      }
+    }
+  }
+
+  if (!from && packet->type != JPACKET_IQ) {
+    scr_LogPrint(LPRINT_LOGNORM, "Error in packet (could be UTF8-related)");
+    return;
+  }
 
   switch (packet->type) {
     case JPACKET_MESSAGE:
@@ -1053,10 +1097,15 @@
             p = xmlnode_get_attrib(y, "code");
             if (p && !strcmp(p, "303")) {
               gchar *mbuf;
-              mbuf = g_strdup_printf("%s is now known as %s", rname, mbnewnick);
+              gchar *newname_noutf8 = from_utf8(mbnewnick);
+              mbuf = g_strdup_printf("%s is now known as %s", rname,
+                      (newname_noutf8 ? newname_noutf8 : "(?)"));
               scr_WriteIncomingMessage(r, mbuf, 0, HBB_PREFIX_INFO);
               g_free(mbuf);
-              buddy_resource_setname(room_elt->data, rname, mbnewnick);
+              if (newname_noutf8) {
+                buddy_resource_setname(room_elt->data, rname, newname_noutf8);
+                g_free(newname_noutf8);
+              }
             }
           }
 
@@ -1128,5 +1177,6 @@
     default:
         break;
   }
+  g_free(from);
 }