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)