Mercurial > hg
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"); |