comparison 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
comparison
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");