changeset 35:a8ceaa3005fd

[/trunk] Changeset 51 by mikael Work on libjabber integration. This is a big patch... * Remove socket.[ch] server.[ch] We have now fully switched to libjabber. * Roster is fetched, and buddies are added to the buddylist * Can send/receive messages using libjabber * Presence messages are handled. I have added statuses, as there only were online / offline statuses. * Use halfdelay to have a non-blocking getch(). And use a timeout in jb_main(). * Use utf8_{encode,decode}
author mikael
date Mon, 04 Apr 2005 19:13:58 +0000
parents f78ffe7ce43d
children 8f1a5e79ca40
files mcabber/src/Makefile mcabber/src/buddies.c mcabber/src/buddies.h mcabber/src/harddefines.h mcabber/src/jabglue.c mcabber/src/jabglue.h mcabber/src/main.c mcabber/src/screen.c
diffstat 12 files changed, 121 insertions(+), 933 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/Makefile	Mon Apr 04 18:00:51 2005 +0000
+++ b/mcabber/src/Makefile	Mon Apr 04 19:13:58 2005 +0000
@@ -33,7 +33,7 @@
 endif
 CFLAGS = -Wall -W -pedantic
 LD = $(CC)
-LDLIBS = -lncurses -lpanel -L../libjabber -L../connwrap -llibjabber -lconnwrap -lssl
+LDLIBS = -lncurses -lpanel -lssl -L../libjabber -L../connwrap -llibjabber -lconnwrap
 
 ifeq ($(DEBUG),1)
 CFLAGS += -O0 -g -DDEBUG=1
@@ -55,8 +55,6 @@
     buddies.c \
     parsecfg.c \
     jabglue.c \
-    server.c \
-    socket.c \
     lang.c \
     utf8.c
 
--- a/mcabber/src/buddies.c	Mon Apr 04 18:00:51 2005 +0000
+++ b/mcabber/src/buddies.c	Mon Apr 04 19:13:58 2005 +0000
@@ -8,9 +8,9 @@
 
 #include "lang.h"
 #include "utils.h"
-#include "server.h"
 #include "list.h"
-#include "harddefines.h"
+
+#define STR_EMPTY(s) ((s)[0] == '\0')
 
 /* global vars for BUDDIES.C */
 int buddySelected = 1;		/* Hold the selected Buddy  */
@@ -22,17 +22,18 @@
 #define buddy_entry(n) list_entry(n, buddy_entry_t, list)
 
 
-void bud_SetBuddyStatus(char *jidfrom, int status)
+void bud_SetBuddyStatus(char *jidfrom, enum imstatus status)
 {
   struct list_head *pos, *n;
   buddy_entry_t *tmp;
+  enum imstatus oldstatus;
   int changed = 0;
-  char *buffer = (char *) malloc(4096);
 
   list_for_each_safe(pos, n, &buddy_list) {
     tmp = buddy_entry(pos);
     if (!strcmp(tmp->jid, jidfrom)) {
       if (tmp->flags != status) {
+        oldstatus = tmp->flags;
 	tmp->flags = status;
 	changed = 1;
       }
@@ -41,18 +42,9 @@
   }
   if (changed) {
     bud_DrawRoster(scr_GetRosterWindow());
-    switch (status) {
-    case FLAG_BUDDY_DISCONNECTED:
-      sprintf(buffer, "--> %s %s!", jidfrom, i18n("disconected"));
-      break;
-
-    case FLAG_BUDDY_CONNECTED:
-      sprintf(buffer, "--> %s %s!", jidfrom, i18n("connected"));
-      break;
-    }
-    scr_LogPrint("%s", buffer);
+    scr_LogPrint("<%s> status has changed: %c -> %c", jidfrom,
+            imstatus2char[oldstatus], imstatus2char[status]);
   }
-  free(buffer);
 }
 
 int compara(buddy_entry_t * t1, buddy_entry_t * t2)
@@ -86,91 +78,8 @@
     list_move_tail(&indice->list, &sorted_buddies);
   }
   list_splice(&sorted_buddies, &buddy_list);
-}
 
-void bud_ParseBuddies(char *roster)
-{
-  buddy_entry_t *tmp = NULL;
-  char *aux;
-  char *p, *str;
-
-  ut_WriteLog("[roster]: %s\n\n", roster);
-
-  while ((aux = ut_strrstr(roster, "<item")) != NULL) {
-    char *jid = getattr(aux, "jid='");
-    char *name = getattr(aux, "name='");
-    char *group = gettag(aux, "group='");
-
-    *aux = '\0';
-
-    tmp = (buddy_entry_t *) calloc(1, sizeof(buddy_entry_t));
-
-    tmp->flags = FLAG_BUDDY_DISCONNECTED;
-
-    if (strncmp(jid, "UNK", 3)) {
-      char *res = strstr(jid, "/");
-      if (res)
-	*res = '\0';
-
-      tmp->jid = (char *) malloc(strlen(jid) + 1);
-      strcpy(tmp->jid, jid);
-      free(jid);
-    }
-
-    if (strncmp(name, "UNK", 3)) {
-      tmp->name = (char *) calloc(1, strlen(name) + 1);
-      strcpy(tmp->name, name);
-      free(name);
-    } else {
-      tmp->name = (char *) calloc(1, strlen(tmp->jid) + 1);
-      str = strdup(tmp->jid);
-      p = strstr(str, "@");
-      if (p) {
-	*p = '\0';
-      }
-      strncpy(tmp->name, str, 18);
-      free(str);
-    }
-
-    if (strncmp(group, "UNK", 3)) {
-      tmp->group = (char *) malloc(strlen(group) + 1);
-      strcpy(tmp->group, group);
-      free(group);
-    }
-
-    if (!strncmp(tmp->jid, "msn.", 4)) {
-      sprintf(tmp->name, "%c MSN %c", 254, 254);
-    }
-
-    if (!STR_EMPTY(tmp->jid)) {
-      list_add_tail(&tmp->list, &buddy_list);
-    } else {
-      if (tmp->jid)
-	free(tmp->jid);
-      if (tmp->name)
-	free(tmp->name);
-      if (tmp->group)
-	free(tmp->group);
-      free(tmp);
-    }
-  }
-  free(roster);
-
-  bud_SortRoster();
-}
-
-/* Desc: Initialize buddy list
- * 
- * In : none
- * Out: none
- *
- * Note: none
- */
-void bud_InitBuddies(int sock)
-{
-  char *roster;
-  roster = srv_getroster(sock);
-  bud_ParseBuddies(roster);
+  update_roster = TRUE;
 }
 
 /* Desc: Destroy (and free) buddy list
@@ -245,13 +154,15 @@
       pending = '#';
     }
 
-    if ((tmp->flags && FLAG_BUDDY_CONNECTED) == 1) {
-      status = 'o';
+    if (tmp->flags >= 0 && tmp->flags < imstatus_size) {
+      status = imstatus2char[tmp->flags];
+    }
+    /*{
       if (i == (buddySelected - buddyOffset))
 	wattrset(win, COLOR_PAIR(COLOR_BD_CONSEL));
       else
 	wattrset(win, COLOR_PAIR(COLOR_BD_CON));
-    } else {
+    } else*/ {
       if (i == (buddySelected - buddyOffset))
 	wattrset(win, COLOR_PAIR(COLOR_BD_DESSEL));
       else
@@ -334,43 +245,33 @@
   return NULL;
 }
 
-void bud_AddBuddy(int sock)
+buddy_entry_t *bud_AddBuddy(const char *bjid, const char *bname)
 {
-  char *buffer = (char *) calloc(1, 1024);
-  char *buffer2 = (char *) calloc(1, 1024);
   char *p, *str;
   buddy_entry_t *tmp;
 
-  ut_CenterMessage(i18n("write jid here"), 60, buffer2);
-  scr_CreatePopup(i18n("Add jid"), buffer2, 60, 1, buffer);
-
-  if (!STR_EMPTY(buffer)) {
-    tmp = (buddy_entry_t *) calloc(1, sizeof(buddy_entry_t));
-    tmp->jid = (char *) malloc(strlen(buffer) + 1);
-    strcpy(tmp->jid, buffer);
-    tmp->name = (char *) malloc(strlen(buffer) + 1);
+  tmp = calloc(1, sizeof(buddy_entry_t));
+  tmp->jid = strdup(bjid);
 
-    str = strdup(buffer);
-    p = strstr(str, "@");
-    if (p) {
-      *p = '\0';
-    }
-    strcpy(tmp->name, str);
+  if (bname) {
+    tmp->name = strdup(bname);
+  } else {
+    str = strdup(bjid);
+    p = strstr(str, "/");
+    if (p)  *p = '\0';
+    tmp->name = strdup(str);
     free(str);
+  }
 
-    list_add_tail(&tmp->list, &buddy_list);
-    buddySelected = 1;
-    bud_DrawRoster(scr_GetRosterWindow());
-    srv_AddBuddy(sock, tmp->jid);
-  }
-  free(buffer);
+  list_add_tail(&tmp->list, &buddy_list);
+  bud_DrawRoster(scr_GetRosterWindow());
+
+  return tmp;
 }
 
-void bud_DeleteBuddy(int sock)
+void bud_DeleteBuddy(buddy_entry_t *buddy)
 {
-  buddy_entry_t *tmp = bud_SelectedInfo();
-  srv_DelBuddy(sock, tmp->jid);
-  list_del(&tmp->list);
+  list_del(&buddy->list);
   buddySelected = 1;
   bud_DrawRoster(scr_GetRosterWindow());
 }
--- a/mcabber/src/buddies.h	Mon Apr 04 18:00:51 2005 +0000
+++ b/mcabber/src/buddies.h	Mon Apr 04 19:13:58 2005 +0000
@@ -2,6 +2,7 @@
 #define __BUDDIES_H__ 1
 
 #include <ncurses.h>
+#include "jabglue.h"
 #include "list.h"
 
 /* Definición de tipos */
@@ -17,13 +18,12 @@
 void bud_DrawRoster(WINDOW * win);
 void bud_RosterDown(void);
 void bud_RosterUp(void);
-void bud_InitBuddies(int sock);
 void bud_TerminateBuddies(void);
-int bud_BuddyCount(void);
-void bud_SetBuddyStatus(char *jidfrom, int status);
-void bud_ParseBuddies(char *roster);
-void bud_AddBuddy(int sock);
-void bud_DeleteBuddy(int sock);
+int  bud_BuddyCount(void);
+void bud_SetBuddyStatus(char *jidfrom, enum imstatus status);
 buddy_entry_t *bud_SelectedInfo(void);
 
+buddy_entry_t *bud_AddBuddy(const char *bjid, const char *bname);
+void           bud_DeleteBuddy(buddy_entry_t *buddy);
+
 #endif
--- a/mcabber/src/harddefines.h	Mon Apr 04 18:00:51 2005 +0000
+++ b/mcabber/src/harddefines.h	Mon Apr 04 19:13:58 2005 +0000
@@ -4,12 +4,4 @@
 #define VERSION "MCabber v0.6.0-dev -- based on http://cabber.sourceforge.net"
 #define EMAIL "Email: bmikael [at] lists [dot] lilotux [dot] net"
 
-#define STR_EMPTY(s) ((s)[0] == '\0')
-
-#define FLAG_BUDDY_DISCONNECTED         0x00
-#define FLAG_BUDDY_CONNECTED            0x01
-#define FLAG_BUDDY_AWAY                 0x02
-#define FLAG_BUDDY_XAWAY                0x04
-#define FLAG_BUDDY_HASMESSAGE           0x08
-
 #endif
--- a/mcabber/src/jabglue.c	Mon Apr 04 18:00:51 2005 +0000
+++ b/mcabber/src/jabglue.c	Mon Apr 04 19:13:58 2005 +0000
@@ -92,9 +92,7 @@
   return alias;
 }
 
-jconn jb_connect(const char *servername, unsigned int port, int ssl,
-                  const char *jid, const char *pass,
-                  const char *resource)
+jconn jb_connect(const char *jid, unsigned int port, int ssl, const char *pass)
 {
   if (!port) {
     if (ssl)
@@ -106,16 +104,14 @@
   if (jc)
     free(jc);
 
-  //jc = jab_new(jid, pass, port, ssl);
-  jc = jab_new("mctest@lilotux.net/mcabber", (char*)pass, (int)port, ssl);
+  jc = jab_new(jid, pass, port, ssl);
 
-  jab_logger(jc, big_logger);
+  jab_logger(jc, file_logger);
   jab_packet_handler(jc, &packethandler);
   jab_state_handler(jc, &statehandler);
 
   if (jc->user) {
     //fonline = TRUE;
-    scr_LogPrint("+ State_Connecting");
     jstate = STATE_CONNECTING;
     statehandler(0, -1);
     jab_start(jc);
@@ -215,7 +211,7 @@
   */
 
   if (!msg || !*msg) {
-    msg  = "unknownStatus";
+    msg  = "unknownStatus"; // FIXME
     //msg = imstatus2str(st);
   }
 
@@ -230,6 +226,13 @@
   // XXX logger.putourstatus(proto, getstatus(), ourstatus = st);
 }
 
+void jb_send_msg(const char *jid, const char *text)
+{
+  xmlnode x = jutil_msgnew(TMSG_CHAT, jid, 0, text);
+  jab_send(jc, x);
+  xmlnode_free(x);
+}
+
 void postlogin()
 {
   //int i;
@@ -239,6 +242,7 @@
 
   //setautostatus(jhook.manualstatus);
 
+  setjabberstatus(1, "I'm here!");
   /*
   for (i = 0; i < clist.count; i++) {
     c = (icqcontact *) clist.at(i);
@@ -309,14 +313,20 @@
     if (z) group = xmlnode_get_data(z);
 
     if (alias) {
-      char *buddyname = jidtodisp(alias);
-      if (buddyname) {
-        scr_LogPrint("New buddy: %s", buddyname);
+      char *buddyname;
+      if (name)
+        buddyname = name;
+      else
+        buddyname = jidtodisp(alias);
+
+      //scr_LogPrint("New buddy: %s", buddyname);
+      bud_AddBuddy(alias, buddyname);
+      if (!name)
         free(buddyname);
-      }
     }
   }
 
+  bud_SortRoster();
   postlogin();
 }
 
@@ -326,20 +336,25 @@
   char *u, *h, *r;
 
   jidsplit(from, &u, &h, &r);
-  if (*r)
-    scr_LogPrint("There is an extra part in message: %s", *r);
-  scr_WriteIncomingMessage(from, body);
+  /*
+  // Maybe we should remember the resource?
+  if (r)
+    scr_LogPrint("There is an extra part in message (resource?): %s", r);
+  */
+
+  scr_LogPrint("Msg from <%s>, type=%s", jidtodisp(from), type);
+  scr_WriteIncomingMessage(jidtodisp(from), body);
 }
 
 void statehandler(jconn conn, int state)
 {
   static int previous_state = -1;
 
-  scr_LogPrint("StateHandler called (%d).\n", state);
-  ut_WriteLog("StateHandler called (%d).\n", state);
+  ut_WriteLog("StateHandler called (state=%d).\n", state);
 
   switch(state) {
     case JCONN_STATE_OFF:
+        scr_LogPrint("+ JCONN_STATE_OFF");
         /*
            jhook.flogged = jhook.fonline = FALSE;
 
@@ -348,22 +363,27 @@
            jhook.log(logDisconnected);
            jhook.roster.clear();
            jhook.agents.clear();
-           clist.setoffline(jhook.proto);
-           face.update();
            }
            */
         break;
 
     case JCONN_STATE_CONNECTED:
+        scr_LogPrint("+ JCONN_STATE_CONNECTED");
         break;
 
     case JCONN_STATE_AUTH:
+        scr_LogPrint("+ JCONN_STATE_AUTH");
         break;
 
     case JCONN_STATE_ON:
+        scr_LogPrint("+ JCONN_STATE_ON");
         // if (regmode) jhook.fonline = TRUE;
         break;
 
+    case JCONN_STATE_CONNECTING:
+        scr_LogPrint("+ JCONN_STATE_CONNECTING");
+        break;
+
     default:
         break;
   }
@@ -378,13 +398,10 @@
   char *from=NULL, *type=NULL, *body=NULL, *enc=NULL;
   char *ns=NULL;
   char *id=NULL;
-  // imstatus ust;
+  enum imstatus ust;
   // int npos;
   // bool isagent;
 
-  scr_LogPrint("Received a packet");
-  ut_WriteLog("Received a packet\n");
-
   jpacket_reset(packet);
 
   p = xmlnode_get_attrib(packet->x, "from"); if (p) from = p;
@@ -417,19 +434,13 @@
               }
         }
 
-        // FIXME:
         if (body) {
-          scr_LogPrint("Message received");
-          scr_LogPrint("Type: %s", type);
           gotmessage(type, from, body, enc);
         }
-
         break;
 
     case JPACKET_IQ:
         if (!strcmp(type, "result")) {
-          scr_LogPrint("Received a result packet");
-          ut_WriteLog("Received a result packet\n");
 
           if (p = xmlnode_get_attrib(packet->x, "id")) {
             int iid = atoi(p);
@@ -588,68 +599,30 @@
 
     case JPACKET_PRESENCE:
         x = xmlnode_get_tag(packet->x, "show");
-        //ust = available;
+        ust = available;
 
         if (x) {
           p = xmlnode_get_data(x); if (p) ns = p;
 
           if (ns) {
-            scr_LogPrint("New status: %s", ns);
-            /*
-            if (ns == "away") ust = away; else
-              if (ns == "dnd") ust = dontdisturb; else
-                if (ns == "xa") ust = notavail; else
-                  if (ns == "chat") ust = freeforchat;
-            */
+            scr_LogPrint("New status: %s (%s)", ns, from);
+            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;
           }
         }
 
-        if (!strcmp(type, "unavailable")) {
+        if (type && !strcmp(type, "unavailable")) {
           scr_LogPrint("New status: unavailable/offline");
-          // XXX
-          //  ust = offline;
+          ust = offline;
         }
 
+        bud_SetBuddyStatus(jidtodisp(from), ust);
         /*
-        jidsplit(from, u, h, s);
-        id = u + "@" + h;
-
-        if (clist.get(imcontact((string) "#" + id, jhook.proto))) {
-          if (ust == offline) {
-            vector<string>::iterator im = find(jhook.chatmembers[id].begin(), jhook.chatmembers[id].end(), s);
-            if (im != jhook.chatmembers[id].end())
-              jhook.chatmembers[id].erase(im);
-
-          } else {
-            jhook.chatmembers[id].push_back(s);
-
-          }
-
-        } else {
-          icqcontact *c = clist.get(ic);
-
-          if (c)
-            if (c->getstatus() != ust) {
-              if (c->getstatus() == offline)
-                jhook.awaymsgs[ic.nickname] = "";
-
-              logger.putonline(c, c->getstatus(), ust);
-              c->setstatus(ust);
-
-              if (x = xmlnode_get_tag(packet->x, "status"))
-                if (p = xmlnode_get_data(x))
-                  jhook.awaymsgs[ic.nickname] = p;
-
-#ifdef HAVE_GPGME
-              if (x = xmlnode_get_tag(packet->x, "x"))
-                if (p = xmlnode_get_attrib(x, "xmlns"))
-                  if ((string) p == "jabber:x:signed")
-                    if (p = xmlnode_get_data(x))
-                      c->setpgpkey(pgp.verify(p, jhook.awaymsgs[ic.nickname]));
-#endif
-
-            }
-        }
+        if (x = xmlnode_get_tag(packet->x, "status"))
+          if (p = xmlnode_get_data(x))
+            scr_LogPrint("Away msg: %s", p);
         */
         break;
 
--- a/mcabber/src/jabglue.h	Mon Apr 04 18:00:51 2005 +0000
+++ b/mcabber/src/jabglue.h	Mon Apr 04 19:13:58 2005 +0000
@@ -21,12 +21,10 @@
     '_', 'o', 'i', 'f', 'd', 'c', 'n', 'a'
 };
 
-jconn jb_connect(const char *servername, unsigned int port, int ssl,
-                 const char *jid, const char *pass,
-                 const char *resource);
+jconn jb_connect(const char *jid, unsigned int port, int ssl, const char *pass);
 void jb_disconnect(void);
 void jb_keepalive();
 void jb_main();
-//int  jb_status();
+void jb_send_msg(const char *, const char *);
 
 #endif /* __JABGLUE_H__ */
--- a/mcabber/src/main.c	Mon Apr 04 18:00:51 2005 +0000
+++ b/mcabber/src/main.c	Mon Apr 04 19:13:58 2005 +0000
@@ -11,9 +11,7 @@
 #include "buddies.h"
 #include "parsecfg.h"
 #include "lang.h"
-#include "server.h"
 #include "harddefines.h"
-#include "socket.h"
 #include "jabglue.h"
 
 //int sock;
@@ -28,8 +26,7 @@
   case SIGTERM:
     bud_TerminateBuddies();
     scr_TerminateCurses();
-    // TODO srv_setpresence(sock, "unavailable");
-    // TODO close(sock);
+    jb_disconnect();
     printf("Killed by SIGTERM\nBye!\n");
     exit(EXIT_SUCCESS);
     break;
@@ -60,6 +57,18 @@
   return (ssize_t)nread;
 }
 
+char *compose_jid(const char *username, const char *servername,
+        const char *resource)
+{
+  char *jid = malloc(strlen(username)+strlen(servername)+strlen(resource)+3);
+  strcpy(jid, username);
+  strcat(jid, "@");
+  strcat(jid, servername);
+  strcat(jid, "/");
+  strcat(jid, resource);
+  return jid;
+}
+
 void credits(void)
 {
   printf(VERSION "\n");
@@ -71,7 +80,7 @@
   char configFile[4096];
   char *username, *password, *resource;
   char *servername;
-  //char *idsession;
+  char *jid;
   char *portstring;
   int key;
   unsigned int port;
@@ -148,13 +157,16 @@
   ut_WriteLog("Drawing main window...\n");
   scr_DrawMainWindow();
 
-  /* Connect to server */
   portstring = cfg_read("port");
   port = (portstring != NULL) ? (unsigned int) atoi(portstring) : -1U;
 
+  /* Connect to server */
   ut_WriteLog("Connecting to server: %s:%d\n", servername, port);
   scr_LogPrint("Connecting to server: %s:%d", servername, port);
-  jc = jb_connect(servername, port, 0, username, password, resource);
+
+  jid = compose_jid(username, servername, resource);
+  jc = jb_connect(jid, port, 0, password);
+  free(jid);
   if (!jc) {
     ut_WriteLog("\terror!!!\n");
     fprintf(stderr, "Error connecting to (%s)\n", servername);
@@ -178,70 +190,20 @@
   ut_WriteLog("Entering into main loop...\n\n");
   ut_WriteLog("Ready to send/receive messages...\n");
 
-  sleep(1);
-  jb_main();
-  sleep(1);
-  jb_main();
-  sleep(2);
-  jb_disconnect();
-  sleep(1);
-  jb_main();
-  scr_TerminateCurses(); exit(0); // XXX
   while (ret != 255) {
-    int x;
     alarm(ping);
-    //x = check_io(sock, 0);
-    x = check_io(0, 0); // FIXME
-    /*
-    if ((x & 1) == 1) {
-      srv_msg *incoming = readserver(sock);
-
-      switch (incoming->m) {
-      case SM_PRESENCE:
-	bud_SetBuddyStatus(incoming->from, incoming->connected);
-	break;
-
-      case SM_MESSAGE:
-	scr_WriteIncomingMessage(incoming->from, incoming->body);
-	free(incoming->body);
-	free(incoming->from);
-	break;
-
-      case SM_UNHANDLED:
-	break;
-      }
-      free(incoming);
-    }
-    if ((x & 2) == 2) {
-    */
-    if (x) {
-      keypad(scr_GetInputWindow(), TRUE);
-      key = scr_Getch();
+    keypad(scr_GetInputWindow(), TRUE);
+    key = scr_Getch();
+    if (key != ERR)
       ret = process_key(key);
-      /*
-      switch (key) {
-      case KEY_IC:
-	bud_AddBuddy(sock);
-	break;
-      case KEY_DC:
-	bud_DeleteBuddy(sock);
-	break;
-
-      case KEY_RESIZE:
-	endwin();
-	printf("\nRedimensionado no implementado\n");
-	printf("Reinicie Cabber.\n\n\n");
-	exit(EXIT_FAILURE);
-	break;
-      }
-      */
-    }
+    jb_main();
     if (update_roster) {
       // scr_LogPrint("Update roster");
       bud_DrawRoster(scr_GetRosterWindow());
     }
   }
 
+  jb_disconnect();
   bud_TerminateBuddies();
   scr_TerminateCurses();
 
--- a/mcabber/src/screen.c	Mon Apr 04 18:00:51 2005 +0000
+++ b/mcabber/src/screen.c	Mon Apr 04 19:13:58 2005 +0000
@@ -12,7 +12,6 @@
 #include "buddies.h"
 #include "parsecfg.h"
 #include "lang.h"
-#include "server.h"
 #include "list.h"
 
 #define window_entry(n) list_entry(n, window_entry_t, list)
@@ -456,7 +455,7 @@
   initscr();
   noecho();
   raw();
-  //cbreak();
+  halfdelay(5);
   start_color();
   use_default_colors();
 
@@ -466,7 +465,7 @@
   inputLine[0] = 0;
   ptr_inputline = inputLine;
 
-  //setlocale(LC_CTYPE, "");
+  setlocale(LC_CTYPE, "");
 
   return;
 }
@@ -500,7 +499,6 @@
   logPanel = new_panel(logWnd);
   wbkgd(logWnd, COLOR_PAIR(COLOR_GENERAL));
   //wattrset(logWnd, COLOR_PAIR(COLOR_GENERAL));
-  scr_LogPrint("Start up.");
 
   scrollok(logWnd,TRUE);
   //idlok(logWnd,TRUE);  // XXX Necessary?
@@ -529,7 +527,7 @@
   int n, i;
   char *buffer = (char *) malloc(5 + strlen(text));
 
-  sprintf(buffer, "<== %s", text);
+  sprintf(buffer, "<== %s", utf8_decode(text));
 
   submsgs =
       ut_SplitMessage(buffer, &n, maxX - scr_WindowHeight(rosterWnd) - 20);
@@ -642,7 +640,7 @@
   refresh();
   sprintf(buffer2, "%s@%s/%s", cfg_read("username"),
           cfg_read("server"), cfg_read("resource"));
-  // FIXME srv_sendtext(sock, tmp->jid, msg, buffer2);
+  jb_send_msg(tmp->jid, utf8_encode(msg));
   free(buffer);
   free(buffer2);
 
@@ -652,7 +650,7 @@
 int process_line(char *line)
 {
   if (*line != '/') {
-    // FIXME send_message(sock, line);
+    send_message(line);
     return 0;
   }
   if (!strcasecmp(line, "/quit")) {
@@ -660,7 +658,7 @@
   }
   // Commands handling
   // TODO
-  // say...
+  // say, send_raw...
 
   scr_LogPrint("Unrecognised command, sorry.");
   return 0;
--- a/mcabber/src/server.c	Mon Apr 04 18:00:51 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,479 +0,0 @@
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/poll.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/select.h>
-
-#include "list.h"
-#include "parsecfg.h"
-#include "screen.h"
-#include "socket.h"
-#include "utf8.h"
-#include "server.h"
-#include "harddefines.h"
-#include "utils.h"
-#include "buddies.h"
-
-#define JABBERPORT 5222
-
-/* Desc: poll data from server
- * 
- * In  : socket
- * Out : pending buffer (or NULL if no incoming data)
- *
- * Note: it is up to the caller to free the returned string
- */
-char *srv_poll(int sock)
-{
-  struct pollfd sock_p;
-  sock_p.fd = sock;
-  sock_p.events = (short int) (POLLIN | POLLPRI);
-  sock_p.revents = 0;
-  poll(&sock_p, 1, 0);
-
-  if (sock_p.revents) {
-    return sk_recv(sock);
-  }
-
-  return NULL;
-}
-
-
-/* Desc: resolve host
- * 
- * In  : hostname
- * Out : 32bit address (or 0 if error)
- *
- * Note: -
- */
-static u_long srv_resolve(const char *host)
-{
-  in_addr_t i;
-  struct hostent *he;
-
-  if ((i = inet_addr(host)) == INADDR_NONE) {
-    if (!(he = gethostbyname(host)))
-      return 0;
-    else
-      return (*(u_long *) he->h_addr); // XXX Memory leak
-  }
-
-  return (u_long) i;
-}
-
-
-/* Desc: connect to jabber server
- * 
- * In  : config
- * Out : socket (or -1 on error)
- *
- * Note: if port is -1, the default Jabber port will be used
- */
-int srv_connect(const char *server, unsigned int port)
-{
-  struct sockaddr_in name;
-  int sock;
-
-  if (server == NULL) {
-    fprintf(stderr, "You must supply a server name\n\r");
-    return -1;
-  }
-
-  if (port == -1U) {
-    port = JABBERPORT;
-  }
-
-  name.sin_family = AF_INET;
-  name.sin_port = htons(port);
-
-  if (!(name.sin_addr.s_addr = srv_resolve(server))) {
-    fprintf(stderr, "Cant resolve \"%s\"\n", server);
-    return -1;
-  }
-
-  if ((sock = sk_conn((struct sockaddr *) &name)) < 0) {
-    fprintf(stderr, "Can't connect to \"%s:%u\"\n", server, port);
-    return -1;
-  }
-
-  return sock;
-}
-
-
-/* Desc: login into jabber server
- * 
- * In  : socket, servername, user, password, resource
- * Out : idsession
- *
- * Note: it is up to the caller to free the returned string
- */
-char *srv_login(int sock, const char *server, const char *user,
-		const char *pass, const char *resource)
-{
-  char *stringtosend = malloc(2048);
-  char *response, *aux;
-  char *idsession = calloc(64, sizeof(char));
-  int pos = 0;
-
-  memset(stringtosend, 0, 2048);
-  strcpy(stringtosend, "<?xml version='1.0' encoding='UTF-8' ?>");
-  strcat(stringtosend, "<stream:stream to='");
-  strcat(stringtosend, server);
-  strcat(stringtosend, "' xmlns='jabber:client' xmlns:stream='");
-  strcat(stringtosend, "http://etherx.jabber.org/streams'>\n");
-
-  if (!sk_send(sock, stringtosend)) {
-    perror("senddata (server.c:132)");
-    free(stringtosend);
-    free(idsession);
-    return NULL;
-  }
-  response = sk_recv(sock);
-  if (strstr(response, "error")) {
-    /* fprintf(stderr, "Response not valid:\n%s\n\n", response); */
-    scr_CreatePopup("Error",
-		    "Bad answer from the server", 60, 0, NULL);
-    free(response);
-    free(idsession);
-    free(stringtosend);
-    return NULL;
-  }
-  aux = response;
-  while (strncmp(aux, "id", 2))
-    aux++;
-  pos = 0;
-  aux += 4;
-  while (strncmp(aux, "'", 1)) {
-    aux++;
-    pos++;
-  }
-  aux -= pos;
-  if (pos > 64-1) {
-    ut_WriteLog("Bad session ID!\n");
-    free(response);
-    free(idsession);
-    free(stringtosend);
-    return NULL;
-  }
-  strncpy(idsession, aux, (size_t)pos);
-
-  free(response);
-
-  strcpy(stringtosend, "<iq type='set' id='1000'>");
-  strcat(stringtosend, "<query xmlns='jabber:iq:auth'>");
-  strcat(stringtosend, "<username>");
-  strcat(stringtosend, user);
-  strcat(stringtosend, "</username><password>");
-  strcat(stringtosend, pass);
-  strcat(stringtosend, "</password><resource>");
-  strcat(stringtosend, resource);
-  strcat(stringtosend, "</resource></query></iq>\n");
-  if (!sk_send(sock, stringtosend)) {
-    perror("senddata (server.c:167)");
-    return NULL;
-  }
-  response = sk_recv(sock);
-  if (strstr(response, "error")) {
-/*	fprintf(stderr, "Response not valid:\n%s\n\n", response);*/
-    scr_CreatePopup("Error",
-		    "Account doesn't exist, or bad password", 60, 0,
-		    NULL);
-
-    /*
-    scr_CreatePopup("Info", "Trying to create the account...", 60, 0, NULL);
-
-    strcpy(stringtosend, "<iq type='set' id='reg' to='");
-    strcat(stringtosend, server);
-    strcat(stringtosend, "'>");
-    strcat(stringtosend, "<query xmlns='jabber:iq:register'>");
-    strcat(stringtosend, "<username>");
-    strcat(stringtosend, user);
-    strcat(stringtosend, "</username><password>");
-    strcat(stringtosend, pass);
-    strcat(stringtosend, "</password>");
-    strcat(stringtosend, "</query></iq>\n");
-    if (!sk_send(sock, stringtosend)) {
-      perror("senddata (server.c:167)");
-      return NULL;
-    }
-
-    response = sk_recv(sock);
-    */
-    scr_TerminateCurses();
-    /* printf("Reinicie cabber!\n\n"); */
-    free(idsession);
-    free(stringtosend);
-    return NULL;
-  }
-  free(response);
-  free(stringtosend);
-
-  return idsession;
-}
-
-
-/* Desc: broadcast presence
- * 
- * In  : socket, presence string
- * Out : ?
- *
- * Note: see `sk_send' for output values
- */
-int srv_setpresence(int sock, const char *type)
-{
-  int rv;
-  char *str = malloc(1024);
-
-  sprintf(str, "<presence><status>%.512s</status></presence>", type);
-  if (!(rv = sk_send(sock, str))) {
-    perror("senddata (server.c:199)");
-  }
-  free(str);
-
-  return rv;
-}
-
-
-/* Desc: request roster
- * 
- * In  : socket
- * Out : roster string
- *
- * Note: it is up to the caller to free the returned string
- */
-char *srv_getroster(int sock)
-{
-  char *str = malloc(1024);
-
-  strcpy(str, "<iq type='get' id='1001'><query xmlns='");
-  strcat(str, "jabber:iq:roster'/></iq>\n");
-  if (!sk_send(sock, str)) {
-    perror("senddata (server.c:222)");
-    free(str);
-    return NULL;
-  }
-  free(str);
-
-  return sk_recv(sock);
-}
-
-
-/* Desc: send text to buddy
- * 
- * In  : socket, destination jid, text, source jid
- * Out : 0 = ok
- *
- * Note: -
- */
-int
-srv_sendtext(int sock, const char *to, const char *text, const char *from)
-{
-  char *stringtosend = malloc(2048);
-  char *utf8inputline = utf8_encode(text);
-
-  sprintf(stringtosend,
-	  "<message from='%s' to='%s' type='chat'><body>%.1536s</body></message>",
-	  from, to, utf8inputline);
-  if (!sk_send(sock, stringtosend)) {
-    perror("senddata (server.c:247)");
-    free(stringtosend);
-    free(utf8inputline);
-    return -1;
-  }
-
-  free(stringtosend);
-  free(utf8inputline);
-  return 0;
-}
-
-int check_io(int fd1, int fd2)
-{
-  int n = 0, i;
-  fd_set fds;
-  int io_pending = 0;
-
-  i = fd1;
-  if (fd2 > fd1)
-    i = fd2;
-
-  FD_ZERO(&fds);
-  if (fd1 >= 0)
-    FD_SET(fd1, &fds);
-  else
-    fd1 = 0;
-  if (fd2 >= 0)
-    FD_SET(fd2, &fds);
-  else
-    fd2 = 0;
-
-  if (fd2 == 0 && io_pending)
-    n = 2;
-  else if (select(i + 1, &fds, NULL, NULL, NULL) > 0)
-    n = 1 * (FD_ISSET(fd1, &fds) > 0) + 2 * (FD_ISSET(fd2, &fds) > 0);
-
-  return (n);
-}
-
-/* Desc: read data from server
- *
- * In  : socket
- * Out : ptr to newly allocated srv_msg struct
- *
- * Note: returns NULL if no input from server
- */
-srv_msg *readserver(int sock)
-{
-  char *buffer = sk_recv(sock);
-
-  if (buffer != NULL) {
-    srv_msg *msg = calloc(1, sizeof(srv_msg));
-    char *to = getattr(buffer, "to='");
-    char *from = getattr(buffer, "from='");
-    char *id = getattr(buffer, "id='");
-    char *type = getattr(buffer, "type='");
-    char *body = gettag(buffer, "body");
-    char *status = gettag(buffer, "status");
-    char *show = gettag(buffer, "show");
-    char *line = (char *) malloc(1024);
-    memset(line, 0, 1024);
-
-    /* scan for buffer */
-    if (!strncmp(buffer, "<message", 8)) {		/* manage messages */
-      msg->m = SM_MESSAGE;
-    } else if (!strncmp(buffer, "<presence", 9)) {	/* manage presences */
-      msg->m = SM_PRESENCE;
-      if (!strncmp(type, "UNK", 3)) {			/* assume online */
-	msg->connected = FLAG_BUDDY_CONNECTED;
-      } else if (!strncmp(type, "unavailable", 11)) {	/* offline */
-	msg->connected = 0;
-      }
-    } else {
-      msg->m = SM_UNHANDLED;
-    }
-
-    /* write the parsed buffer */
-    switch (msg->m) {
-    case SM_MESSAGE:
-      {
-	char *aux = strstr(from, "/");
-	if (aux)
-	  *aux = '\0';
-	msg->from = from;
-	msg->body = utf8_decode(body);
-	ut_WriteLog("+OK [%s]\n", buffer);
-      }
-      break;
-
-    case SM_PRESENCE:
-      {
-	char *aux = strstr(from, "/");
-	if (aux)
-	  *aux = '\0';
-	msg->from = from;
-      }
-      break;
-
-    case SM_UNHANDLED:
-      ut_WriteLog("BAD [%s]\n", buffer);
-      break;
-
-    }
-    free(line);
-    if (strncmp(to, "UNK", 3))
-      free(to);
-    if (strncmp(from, "UNK", 3) && (msg->m != SM_MESSAGE)
-	&& (msg->m != SM_PRESENCE))
-      free(from);
-    if (strncmp(id, "UNK", 3))
-      free(id);
-    if (strncmp(type, "UNK", 3))
-      free(type);
-    if (strncmp(body, "UNK", 3))
-      free(body);
-    if (strncmp(status, "UNK", 3))
-      free(status);
-    if (strncmp(show, "UNK", 3))
-      free(show);
-    free(buffer);
-
-    return msg;
-  }
-
-  return NULL;
-}
-
-void srv_AddBuddy(int sock, char *jidname)
-{
-  char *buffer = (char *) malloc(1024);
-  char *p, *str;
-  int i;
-
-  memset(buffer, 0, 1024);
-  strcpy(buffer, "<iq type='set'>");
-  strcat(buffer, "  <query xmlns='jabber:iq:roster'>");
-  strcat(buffer, "    <item");
-  strcat(buffer, "      jid='");
-  strcat(buffer, jidname);
-  strcat(buffer, "' name='");
-
-  str = strdup(jidname);
-  p = strstr(str, "@");
-  if (p)
-    *p = '\0';
-  strcat(buffer, str);
-  strcat(buffer, "'/></query></iq>");
-  sk_send(sock, buffer);
-  free(buffer);
-
-  for (i = 0; i < 2; i++) {
-    buffer = sk_recv(sock);
-    ut_WriteLog("[Subscription]: %s\n", buffer);
-    free(buffer);
-  }
-
-  buffer = (char *) malloc(1024);
-  memset(buffer, 0, 1024);
-  strcpy(buffer, "<presence to='");
-  strcat(buffer, jidname);
-  strcat(buffer, "' type='subscribe'>");
-  strcat(buffer, "<status>I would like to add you!</status></presence>");
-  sk_send(sock, buffer);
-  free(buffer);
-
-  buffer = sk_recv(sock);
-  ut_WriteLog("[Subscription]: %s\n", buffer);
-  free(buffer);
-
-  buffer = (char *) malloc(1024);
-  memset(buffer, 0, 1024);
-  strcpy(buffer, "<presence to='");
-  strcat(buffer, jidname);
-  strcat(buffer, "' type='subscribed'/>");
-  sk_send(sock, buffer);
-  free(buffer);
-
-  buffer = sk_recv(sock);
-  ut_WriteLog("[Subscription]: %s\n", buffer);
-  free(buffer);
-}
-
-void srv_DelBuddy(int sock, char *jidname)
-{
-  char *buffer = (char *) malloc(1024);
-
-  strcpy(buffer, "<iq type='set'><query xmlns='jabber:iq:roster'>");
-  strcat(buffer, "<item jid='");
-  strcat(buffer, jidname);
-  strcat(buffer, "' subscription='remove'/></query></iq>");
-
-  sk_send(sock, buffer);
-  free(buffer);
-
-  buffer = sk_recv(sock);
-  ut_WriteLog("[SubscriptionRemove]: %s\n", buffer);
-  free(buffer);
-}
--- a/mcabber/src/server.h	Mon Apr 04 18:00:51 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-#ifndef __SERVER_H__
-#define __SERVER_H__ 1
-
-typedef enum {
-  SM_MESSAGE,
-  SM_PRESENCE,
-  SM_UNHANDLED
-} SRV_MSGTYPE;
-
-typedef struct {
-  SRV_MSGTYPE m;		/* message type: see above! */
-  int connected;		/* meaningful only with SM_PRESENCE */
-  char *from;			/* sender */
-  char *body;			/* meaningful only with SM_MESSAGE */
-} srv_msg;
-
-char *srv_poll(int sock);
-int srv_connect(const char *server, unsigned int port);
-char *srv_login(int sock, const char *server, const char *user,
-		const char *pass, const char *resource);
-int srv_setpresence(int sock, const char *type);
-char *srv_getroster(int sock);
-int srv_sendtext(int sock, const char *to, const char *text,
-		 const char *from);
-int check_io(int fd1, int fd2);
-srv_msg *readserver(int sock);
-void srv_DelBuddy(int sock, char *jidname);
-void srv_AddBuddy(int sock, char *jidname);
-#endif
--- a/mcabber/src/socket.c	Mon Apr 04 18:00:51 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include <signal.h>
-
-#include "utils.h"
-#include "socket.h"
-#include "screen.h"
-
-/* Desc: create socket connection
- * 
- * In  : servername, port
- * Out : socket (or -1 on error)
- *
- * Note: -
- */
-int sk_conn(struct sockaddr *name)
-{
-  int sock;
-
-  if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
-    perror("socket (socket.c:23)");
-    return -1;
-  }
-
-  if (connect(sock, (struct sockaddr *) name, sizeof(struct sockaddr)) < 0) {
-    perror("connect (socket.c:29)");
-    return -1;
-  }
-
-  return sock;
-}
-
-
-/* Desc: send data through socket
- * 
- * In  : socket, buffer to send
- * Out : 0 = fail, 1 = pass
- *
- * Note: -
- */
-int sk_send(int sock, char *buffer)
-{
-  //ut_WriteLog("Sending:%s\n", buffer);
-  if ((send(sock, buffer, strlen(buffer), 0)) == -1)
-    return 0;
-  else
-    return 1;
-}
-
-/* Desc: receive data through socket
- * 
- * In  : socket
- * Out : received buffer
- *
- * Note: it is up to the caller to free the returned string
- */
-char *sk_recv(int sock)
-{
-  int i = 1;
-  int tambuffer = 128;
-  char mtag[16];    // For tag name
-
-  char *buffer = calloc(1, tambuffer);
-  char *retval = calloc(1, tambuffer + 1);
-
-  while (1) {
-    char *p1;
-    int n = recv(sock, buffer, tambuffer, 0);
-    if (n == -1) {
-      // Error
-      free(buffer);
-      retval[0] = 0;
-      return retval;
-    }
-
-    if (i == 1) {
-      char *p2;
-      strncpy(retval, buffer, tambuffer);
-      p1 = retval+1;
-      p2 = mtag;
-      while (('a' <= *p1) && (*p1 <= 'z') && (p2-mtag < 14))
-        *p2++ = *p1++;
-      *p2++ = '>'; *p2++ = 0;
-      //fprintf(stderr, "TAG=\"%s\"\n", mtag);
-    } else {
-      char *old_retval = retval;
-      scr_LogPrint("Realloc %d [%d]", i-1, n);
-      if (!n)
-        break;
-      retval = realloc(retval, (tambuffer * i) + 1);
-      if (!retval) {
-        scr_LogPrint("Memory allocation failure!!");
-        ut_WriteLog("Memory allocation failure in sk_recv()\n", retval);
-        free(buffer);
-        return old_retval;
-      }
-      strncat(retval, buffer, tambuffer);
-    }
-    i++;
-    p1 = retval + strlen(retval) - strlen(mtag);
-    //fprintf(stderr, "buffer:[%s]\n", buffer);
-    //fprintf(stderr, "End RET=[%s]\n", p1);
-    if (!strcmp(p1, mtag))
-      break;
-    for (p1 = retval; *p1 && (*p1 != '>'); p1++);
-    if ((*p1 == '>') && (*(p1-1) == '/'))
-      break;
-    memset(buffer, 0, tambuffer);
-  }
-  free(buffer);
-  ut_WriteLog("Received:%s\n", retval);
-  return retval;
-}
--- a/mcabber/src/socket.h	Mon Apr 04 18:00:51 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-#ifndef __SOCKET_H__
-#define __SOCKET_H__ 1
-
-#include <sys/socket.h>
-
-int sk_conn(struct sockaddr *name);
-int sk_send(int sock, char *buffer);
-char *sk_recv(int sock);
-
-#endif