diff mcabber/src/jabglue.c @ 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 bb9172f2cbf1
children 8f1a5e79ca40
line wrap: on
line diff
--- 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;