mcabber/src/jabglue.c
changeset 35 a8ceaa3005fd
parent 33 bb9172f2cbf1
child 36 8f1a5e79ca40
equal deleted inserted replaced
34:f78ffe7ce43d 35:a8ceaa3005fd
    90     *ptr = 0;
    90     *ptr = 0;
    91   }
    91   }
    92   return alias;
    92   return alias;
    93 }
    93 }
    94 
    94 
    95 jconn jb_connect(const char *servername, unsigned int port, int ssl,
    95 jconn jb_connect(const char *jid, unsigned int port, int ssl, const char *pass)
    96                   const char *jid, const char *pass,
       
    97                   const char *resource)
       
    98 {
    96 {
    99   if (!port) {
    97   if (!port) {
   100     if (ssl)
    98     if (ssl)
   101       port = JABBERSSLPORT;
    99       port = JABBERSSLPORT;
   102     else
   100     else
   104   }
   102   }
   105 
   103 
   106   if (jc)
   104   if (jc)
   107     free(jc);
   105     free(jc);
   108 
   106 
   109   //jc = jab_new(jid, pass, port, ssl);
   107   jc = jab_new(jid, pass, port, ssl);
   110   jc = jab_new("mctest@lilotux.net/mcabber", (char*)pass, (int)port, ssl);
   108 
   111 
   109   jab_logger(jc, file_logger);
   112   jab_logger(jc, big_logger);
       
   113   jab_packet_handler(jc, &packethandler);
   110   jab_packet_handler(jc, &packethandler);
   114   jab_state_handler(jc, &statehandler);
   111   jab_state_handler(jc, &statehandler);
   115 
   112 
   116   if (jc->user) {
   113   if (jc->user) {
   117     //fonline = TRUE;
   114     //fonline = TRUE;
   118     scr_LogPrint("+ State_Connecting");
       
   119     jstate = STATE_CONNECTING;
   115     jstate = STATE_CONNECTING;
   120     statehandler(0, -1);
   116     statehandler(0, -1);
   121     jab_start(jc);
   117     jab_start(jc);
   122   }
   118   }
   123 
   119 
   213     xmlnode_insert_cdata(xmlnode_insert_tag(x, "priority"),
   209     xmlnode_insert_cdata(xmlnode_insert_tag(x, "priority"),
   214             add["prio"].c_str(), (unsigned) -1);
   210             add["prio"].c_str(), (unsigned) -1);
   215   */
   211   */
   216 
   212 
   217   if (!msg || !*msg) {
   213   if (!msg || !*msg) {
   218     msg  = "unknownStatus";
   214     msg  = "unknownStatus"; // FIXME
   219     //msg = imstatus2str(st);
   215     //msg = imstatus2str(st);
   220   }
   216   }
   221 
   217 
   222   xmlnode_insert_cdata(xmlnode_insert_tag(x, "status"), msg,
   218   xmlnode_insert_cdata(xmlnode_insert_tag(x, "status"), msg,
   223           (unsigned) -1);
   219           (unsigned) -1);
   228   //sendvisibility();
   224   //sendvisibility();
   229 
   225 
   230   // XXX logger.putourstatus(proto, getstatus(), ourstatus = st);
   226   // XXX logger.putourstatus(proto, getstatus(), ourstatus = st);
   231 }
   227 }
   232 
   228 
       
   229 void jb_send_msg(const char *jid, const char *text)
       
   230 {
       
   231   xmlnode x = jutil_msgnew(TMSG_CHAT, jid, 0, text);
       
   232   jab_send(jc, x);
       
   233   xmlnode_free(x);
       
   234 }
       
   235 
   233 void postlogin()
   236 void postlogin()
   234 {
   237 {
   235   //int i;
   238   //int i;
   236 
   239 
   237   //flogged = TRUE;
   240   //flogged = TRUE;
   238   //ourstatus = available;
   241   //ourstatus = available;
   239 
   242 
   240   //setautostatus(jhook.manualstatus);
   243   //setautostatus(jhook.manualstatus);
   241 
   244 
       
   245   setjabberstatus(1, "I'm here!");
   242   /*
   246   /*
   243   for (i = 0; i < clist.count; i++) {
   247   for (i = 0; i < clist.count; i++) {
   244     c = (icqcontact *) clist.at(i);
   248     c = (icqcontact *) clist.at(i);
   245 
   249 
   246     if (c->getdesc().pname == proto)
   250     if (c->getdesc().pname == proto)
   307 
   311 
   308     z = xmlnode_get_tag(y, "group");
   312     z = xmlnode_get_tag(y, "group");
   309     if (z) group = xmlnode_get_data(z);
   313     if (z) group = xmlnode_get_data(z);
   310 
   314 
   311     if (alias) {
   315     if (alias) {
   312       char *buddyname = jidtodisp(alias);
   316       char *buddyname;
   313       if (buddyname) {
   317       if (name)
   314         scr_LogPrint("New buddy: %s", buddyname);
   318         buddyname = name;
       
   319       else
       
   320         buddyname = jidtodisp(alias);
       
   321 
       
   322       //scr_LogPrint("New buddy: %s", buddyname);
       
   323       bud_AddBuddy(alias, buddyname);
       
   324       if (!name)
   315         free(buddyname);
   325         free(buddyname);
   316       }
       
   317     }
   326     }
   318   }
   327   }
   319 
   328 
       
   329   bud_SortRoster();
   320   postlogin();
   330   postlogin();
   321 }
   331 }
   322 
   332 
   323 void gotmessage(char *type, const char *from, const char *body,
   333 void gotmessage(char *type, const char *from, const char *body,
   324         const char *enc)
   334         const char *enc)
   325 {
   335 {
   326   char *u, *h, *r;
   336   char *u, *h, *r;
   327 
   337 
   328   jidsplit(from, &u, &h, &r);
   338   jidsplit(from, &u, &h, &r);
   329   if (*r)
   339   /*
   330     scr_LogPrint("There is an extra part in message: %s", *r);
   340   // Maybe we should remember the resource?
   331   scr_WriteIncomingMessage(from, body);
   341   if (r)
       
   342     scr_LogPrint("There is an extra part in message (resource?): %s", r);
       
   343   */
       
   344 
       
   345   scr_LogPrint("Msg from <%s>, type=%s", jidtodisp(from), type);
       
   346   scr_WriteIncomingMessage(jidtodisp(from), body);
   332 }
   347 }
   333 
   348 
   334 void statehandler(jconn conn, int state)
   349 void statehandler(jconn conn, int state)
   335 {
   350 {
   336   static int previous_state = -1;
   351   static int previous_state = -1;
   337 
   352 
   338   scr_LogPrint("StateHandler called (%d).\n", state);
   353   ut_WriteLog("StateHandler called (state=%d).\n", state);
   339   ut_WriteLog("StateHandler called (%d).\n", state);
       
   340 
   354 
   341   switch(state) {
   355   switch(state) {
   342     case JCONN_STATE_OFF:
   356     case JCONN_STATE_OFF:
       
   357         scr_LogPrint("+ JCONN_STATE_OFF");
   343         /*
   358         /*
   344            jhook.flogged = jhook.fonline = FALSE;
   359            jhook.flogged = jhook.fonline = FALSE;
   345 
   360 
   346            if (previous_state != JCONN_STATE_OFF) {
   361            if (previous_state != JCONN_STATE_OFF) {
   347            logger.putourstatus(jhook.proto, jhook.getstatus(), jhook.ourstatus = offline);
   362            logger.putourstatus(jhook.proto, jhook.getstatus(), jhook.ourstatus = offline);
   348            jhook.log(logDisconnected);
   363            jhook.log(logDisconnected);
   349            jhook.roster.clear();
   364            jhook.roster.clear();
   350            jhook.agents.clear();
   365            jhook.agents.clear();
   351            clist.setoffline(jhook.proto);
       
   352            face.update();
       
   353            }
   366            }
   354            */
   367            */
   355         break;
   368         break;
   356 
   369 
   357     case JCONN_STATE_CONNECTED:
   370     case JCONN_STATE_CONNECTED:
       
   371         scr_LogPrint("+ JCONN_STATE_CONNECTED");
   358         break;
   372         break;
   359 
   373 
   360     case JCONN_STATE_AUTH:
   374     case JCONN_STATE_AUTH:
       
   375         scr_LogPrint("+ JCONN_STATE_AUTH");
   361         break;
   376         break;
   362 
   377 
   363     case JCONN_STATE_ON:
   378     case JCONN_STATE_ON:
       
   379         scr_LogPrint("+ JCONN_STATE_ON");
   364         // if (regmode) jhook.fonline = TRUE;
   380         // if (regmode) jhook.fonline = TRUE;
       
   381         break;
       
   382 
       
   383     case JCONN_STATE_CONNECTING:
       
   384         scr_LogPrint("+ JCONN_STATE_CONNECTING");
   365         break;
   385         break;
   366 
   386 
   367     default:
   387     default:
   368         break;
   388         break;
   369   }
   389   }
   376   xmlnode x; // , y;
   396   xmlnode x; // , y;
   377   // string from, type, body, enc, ns, id, u, h, s;
   397   // string from, type, body, enc, ns, id, u, h, s;
   378   char *from=NULL, *type=NULL, *body=NULL, *enc=NULL;
   398   char *from=NULL, *type=NULL, *body=NULL, *enc=NULL;
   379   char *ns=NULL;
   399   char *ns=NULL;
   380   char *id=NULL;
   400   char *id=NULL;
   381   // imstatus ust;
   401   enum imstatus ust;
   382   // int npos;
   402   // int npos;
   383   // bool isagent;
   403   // bool isagent;
   384 
       
   385   scr_LogPrint("Received a packet");
       
   386   ut_WriteLog("Received a packet\n");
       
   387 
   404 
   388   jpacket_reset(packet);
   405   jpacket_reset(packet);
   389 
   406 
   390   p = xmlnode_get_attrib(packet->x, "from"); if (p) from = p;
   407   p = xmlnode_get_attrib(packet->x, "from"); if (p) from = p;
   391   p = xmlnode_get_attrib(packet->x, "type"); if (p) type = p;
   408   p = xmlnode_get_attrib(packet->x, "type"); if (p) type = p;
   415                 enc = p;
   432                 enc = p;
   416                 break;
   433                 break;
   417               }
   434               }
   418         }
   435         }
   419 
   436 
   420         // FIXME:
       
   421         if (body) {
   437         if (body) {
   422           scr_LogPrint("Message received");
       
   423           scr_LogPrint("Type: %s", type);
       
   424           gotmessage(type, from, body, enc);
   438           gotmessage(type, from, body, enc);
   425         }
   439         }
   426 
       
   427         break;
   440         break;
   428 
   441 
   429     case JPACKET_IQ:
   442     case JPACKET_IQ:
   430         if (!strcmp(type, "result")) {
   443         if (!strcmp(type, "result")) {
   431           scr_LogPrint("Received a result packet");
       
   432           ut_WriteLog("Received a result packet\n");
       
   433 
   444 
   434           if (p = xmlnode_get_attrib(packet->x, "id")) {
   445           if (p = xmlnode_get_attrib(packet->x, "id")) {
   435             int iid = atoi(p);
   446             int iid = atoi(p);
   436 
   447 
   437             ut_WriteLog("iid = %d\n", iid);
   448             ut_WriteLog("iid = %d\n", iid);
   586         }
   597         }
   587         break;
   598         break;
   588 
   599 
   589     case JPACKET_PRESENCE:
   600     case JPACKET_PRESENCE:
   590         x = xmlnode_get_tag(packet->x, "show");
   601         x = xmlnode_get_tag(packet->x, "show");
   591         //ust = available;
   602         ust = available;
   592 
   603 
   593         if (x) {
   604         if (x) {
   594           p = xmlnode_get_data(x); if (p) ns = p;
   605           p = xmlnode_get_data(x); if (p) ns = p;
   595 
   606 
   596           if (ns) {
   607           if (ns) {
   597             scr_LogPrint("New status: %s", ns);
   608             scr_LogPrint("New status: %s (%s)", ns, from);
   598             /*
   609             if (!strcmp(ns, "away"))      ust = away;
   599             if (ns == "away") ust = away; else
   610             else if (!strcmp(ns, "dnd"))  ust = dontdisturb;
   600               if (ns == "dnd") ust = dontdisturb; else
   611             else if (!strcmp(ns, "xa"))   ust = notavail;
   601                 if (ns == "xa") ust = notavail; else
   612             else if (!strcmp(ns, "chat")) ust = freeforchat;
   602                   if (ns == "chat") ust = freeforchat;
       
   603             */
       
   604           }
   613           }
   605         }
   614         }
   606 
   615 
   607         if (!strcmp(type, "unavailable")) {
   616         if (type && !strcmp(type, "unavailable")) {
   608           scr_LogPrint("New status: unavailable/offline");
   617           scr_LogPrint("New status: unavailable/offline");
   609           // XXX
   618           ust = offline;
   610           //  ust = offline;
       
   611         }
   619         }
   612 
   620 
       
   621         bud_SetBuddyStatus(jidtodisp(from), ust);
   613         /*
   622         /*
   614         jidsplit(from, u, h, s);
   623         if (x = xmlnode_get_tag(packet->x, "status"))
   615         id = u + "@" + h;
   624           if (p = xmlnode_get_data(x))
   616 
   625             scr_LogPrint("Away msg: %s", p);
   617         if (clist.get(imcontact((string) "#" + id, jhook.proto))) {
       
   618           if (ust == offline) {
       
   619             vector<string>::iterator im = find(jhook.chatmembers[id].begin(), jhook.chatmembers[id].end(), s);
       
   620             if (im != jhook.chatmembers[id].end())
       
   621               jhook.chatmembers[id].erase(im);
       
   622 
       
   623           } else {
       
   624             jhook.chatmembers[id].push_back(s);
       
   625 
       
   626           }
       
   627 
       
   628         } else {
       
   629           icqcontact *c = clist.get(ic);
       
   630 
       
   631           if (c)
       
   632             if (c->getstatus() != ust) {
       
   633               if (c->getstatus() == offline)
       
   634                 jhook.awaymsgs[ic.nickname] = "";
       
   635 
       
   636               logger.putonline(c, c->getstatus(), ust);
       
   637               c->setstatus(ust);
       
   638 
       
   639               if (x = xmlnode_get_tag(packet->x, "status"))
       
   640                 if (p = xmlnode_get_data(x))
       
   641                   jhook.awaymsgs[ic.nickname] = p;
       
   642 
       
   643 #ifdef HAVE_GPGME
       
   644               if (x = xmlnode_get_tag(packet->x, "x"))
       
   645                 if (p = xmlnode_get_attrib(x, "xmlns"))
       
   646                   if ((string) p == "jabber:x:signed")
       
   647                     if (p = xmlnode_get_data(x))
       
   648                       c->setpgpkey(pgp.verify(p, jhook.awaymsgs[ic.nickname]));
       
   649 #endif
       
   650 
       
   651             }
       
   652         }
       
   653         */
   626         */
   654         break;
   627         break;
   655 
   628 
   656     case JPACKET_S10N:
   629     case JPACKET_S10N:
   657         scr_LogPrint("Received subscription packet");
   630         scr_LogPrint("Received subscription packet");