Mercurial > ~mikael > mcabber > hg
comparison mcabber/src/jab_iq.c @ 1004:b57a01ffeed6
Use existing conference bookmarks
Add support for XEP-0048 (Bookmark Storage). The bookmarks are retrieved
when we connect and the conference bookmarks are used.
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Wed, 08 Nov 2006 22:26:27 +0100 |
parents | c8b1a52b2fd6 |
children | e5c10cc29660 |
comparison
equal
deleted
inserted
replaced
1003:c8b1a52b2fd6 | 1004:b57a01ffeed6 |
---|---|
479 jab_send(jc, iqn->xmldata); | 479 jab_send(jc, iqn->xmldata); |
480 | 480 |
481 g_free(barejid); | 481 g_free(barejid); |
482 } | 482 } |
483 | 483 |
484 static void storage_bookmarks_parse_conference(xmlnode xmldata) | |
485 { | |
486 const char *jid, *name, *autojoin; | |
487 char *bjid; | |
488 GSList *room_elt; | |
489 | |
490 jid = xmlnode_get_attrib(xmldata, "jid"); | |
491 if (!jid) | |
492 return; | |
493 name = xmlnode_get_attrib(xmldata, "name"); | |
494 autojoin = xmlnode_get_attrib(xmldata, "autojoin"); | |
495 | |
496 bjid = jidtodisp(jid); // Bare jid | |
497 | |
498 // Make sure this is a room (it can be a conversion user->room) | |
499 room_elt = roster_find(bjid, jidsearch, 0); | |
500 if (!room_elt) { | |
501 room_elt = roster_add_user(bjid, name, NULL, ROSTER_TYPE_ROOM, sub_none); | |
502 } else { | |
503 buddy_settype(room_elt->data, ROSTER_TYPE_ROOM); | |
504 /* | |
505 // If the name is available, should we use it? | |
506 // I don't think so, it would be confusing because this item is already | |
507 // in the roster. | |
508 if (name) | |
509 buddy_setname(room_elt->data, name); | |
510 */ | |
511 } | |
512 | |
513 // Is autojoin set? | |
514 // If it is, we'll look up for more information (nick? password?) and | |
515 // try to join the room. | |
516 if (autojoin && !strcmp(autojoin, "1")) { | |
517 char *nick, *passwd; | |
518 char *tmpnick = NULL; | |
519 nick = xmlnode_get_tag_data(xmldata, "nick"); | |
520 passwd = xmlnode_get_tag_data(xmldata, "password"); | |
521 if (!nick || !*nick) | |
522 nick = tmpnick = default_muc_nickname(); | |
523 // Let's join now | |
524 scr_LogPrint(LPRINT_LOGNORM, "Auto-join bookmark <%s>", bjid); | |
525 jb_room_join(bjid, nick, passwd); | |
526 g_free(tmpnick); | |
527 } | |
528 g_free(bjid); | |
529 } | |
530 | |
531 static void iqscallback_storage_bookmarks(eviqs *iqp, xmlnode xml_result, | |
532 guint iqcontext) | |
533 { | |
534 xmlnode x, ansqry; | |
535 char *p; | |
536 | |
537 // Leave now if we cannot process xml_result | |
538 if (!xml_result || iqcontext) return; | |
539 | |
540 ansqry = xmlnode_get_tag(xml_result, "query"); | |
541 ansqry = xmlnode_get_tag(ansqry, "storage"); | |
542 if (!ansqry) { | |
543 scr_LogPrint(LPRINT_LOG, "Invalid IQ:private result! (storage:bookmarks)"); | |
544 return; | |
545 } | |
546 | |
547 // Walk through the storage tags | |
548 x = xmlnode_get_firstchild(ansqry); | |
549 for ( ; x; x = xmlnode_get_nextsibling(x)) { | |
550 p = xmlnode_get_name(x); | |
551 // If the current node is a conference item, parse it and update the roster | |
552 if (p && !strcmp(p, "conference")) | |
553 storage_bookmarks_parse_conference(x); | |
554 } | |
555 } | |
556 | |
557 static void request_storage_bookmarks(void) | |
558 { | |
559 eviqs *iqn; | |
560 xmlnode x; | |
561 | |
562 iqn = iqs_new(JPACKET__GET, NS_PRIVATE, "storage", IQS_DEFAULT_TIMEOUT); | |
563 | |
564 x = xmlnode_insert_tag(xmlnode_get_tag(iqn->xmldata, "query"), "storage"); | |
565 xmlnode_put_attrib(x, "xmlns", "storage:bookmarks"); | |
566 | |
567 iqn->callback = &iqscallback_storage_bookmarks; | |
568 jab_send(jc, iqn->xmldata); | |
569 } | |
570 | |
484 void iqscallback_auth(eviqs *iqp, xmlnode xml_result) | 571 void iqscallback_auth(eviqs *iqp, xmlnode xml_result) |
485 { | 572 { |
486 if (jstate == STATE_GETAUTH) { | 573 if (jstate == STATE_GETAUTH) { |
487 eviqs *iqn; | 574 eviqs *iqn; |
488 | 575 |
497 jab_auth_mcabber(jc, iqn->xmldata); | 584 jab_auth_mcabber(jc, iqn->xmldata); |
498 jab_send(jc, iqn->xmldata); | 585 jab_send(jc, iqn->xmldata); |
499 jstate = STATE_SENDAUTH; | 586 jstate = STATE_SENDAUTH; |
500 } else if (jstate == STATE_SENDAUTH) { | 587 } else if (jstate == STATE_SENDAUTH) { |
501 request_roster(); | 588 request_roster(); |
589 request_storage_bookmarks(); | |
502 jstate = STATE_LOGGED; | 590 jstate = STATE_LOGGED; |
503 } | 591 } |
504 } | 592 } |
505 | 593 |
506 static void handle_iq_result(jconn conn, char *from, xmlnode xmldata) | 594 static void handle_iq_result(jconn conn, char *from, xmlnode xmldata) |