682 p = xmlnode_get_name(x); |
684 p = xmlnode_get_name(x); |
683 // If the current node is a conference item, parse it and update the roster |
685 // If the current node is a conference item, parse it and update the roster |
684 if (p && !strcmp(p, "conference")) |
686 if (p && !strcmp(p, "conference")) |
685 storage_bookmarks_parse_conference(x); |
687 storage_bookmarks_parse_conference(x); |
686 } |
688 } |
|
689 // Copy the bookmarks node |
687 xmlnode_free(bookmarks); |
690 xmlnode_free(bookmarks); |
688 bookmarks = xmlnode_dup(ansqry); |
691 bookmarks = xmlnode_dup(ansqry); |
689 } |
692 } |
690 |
693 |
691 static void request_storage_bookmarks(void) |
694 static void request_storage_bookmarks(void) |
697 |
700 |
698 x = xmlnode_insert_tag(xmlnode_get_tag(iqn->xmldata, "query"), "storage"); |
701 x = xmlnode_insert_tag(xmlnode_get_tag(iqn->xmldata, "query"), "storage"); |
699 xmlnode_put_attrib(x, "xmlns", "storage:bookmarks"); |
702 xmlnode_put_attrib(x, "xmlns", "storage:bookmarks"); |
700 |
703 |
701 iqn->callback = &iqscallback_storage_bookmarks; |
704 iqn->callback = &iqscallback_storage_bookmarks; |
|
705 jab_send(jc, iqn->xmldata); |
|
706 } |
|
707 |
|
708 static void iqscallback_storage_rosternotes(eviqs *iqp, xmlnode xml_result, |
|
709 guint iqcontext) |
|
710 { |
|
711 xmlnode ansqry; |
|
712 |
|
713 // Leave now if we cannot process xml_result |
|
714 if (!xml_result || iqcontext) return; |
|
715 |
|
716 ansqry = xmlnode_get_tag(xml_result, "query"); |
|
717 ansqry = xmlnode_get_tag(ansqry, "storage"); |
|
718 if (!ansqry) { |
|
719 scr_LogPrint(LPRINT_LOG, "Invalid IQ:private result! " |
|
720 "(storage:rosternotes)"); |
|
721 return; |
|
722 } |
|
723 // Copy the rosternotes node |
|
724 xmlnode_free(rosternotes); |
|
725 rosternotes = xmlnode_dup(ansqry); |
|
726 } |
|
727 |
|
728 static void request_storage_rosternotes(void) |
|
729 { |
|
730 eviqs *iqn; |
|
731 xmlnode x; |
|
732 |
|
733 iqn = iqs_new(JPACKET__GET, NS_PRIVATE, "storage", IQS_DEFAULT_TIMEOUT); |
|
734 |
|
735 x = xmlnode_insert_tag(xmlnode_get_tag(iqn->xmldata, "query"), "storage"); |
|
736 xmlnode_put_attrib(x, "xmlns", "storage:rosternotes"); |
|
737 |
|
738 iqn->callback = &iqscallback_storage_rosternotes; |
702 jab_send(jc, iqn->xmldata); |
739 jab_send(jc, iqn->xmldata); |
703 } |
740 } |
704 |
741 |
705 void iqscallback_auth(eviqs *iqp, xmlnode xml_result) |
742 void iqscallback_auth(eviqs *iqp, xmlnode xml_result) |
706 { |
743 { |
719 jab_send(jc, iqn->xmldata); |
756 jab_send(jc, iqn->xmldata); |
720 jstate = STATE_SENDAUTH; |
757 jstate = STATE_SENDAUTH; |
721 } else if (jstate == STATE_SENDAUTH) { |
758 } else if (jstate == STATE_SENDAUTH) { |
722 request_roster(); |
759 request_roster(); |
723 request_storage_bookmarks(); |
760 request_storage_bookmarks(); |
|
761 request_storage_rosternotes(); |
724 jstate = STATE_LOGGED; |
762 jstate = STATE_LOGGED; |
725 } |
763 } |
726 } |
764 } |
727 |
765 |
728 static void handle_iq_result(jconn conn, char *from, xmlnode xmldata) |
766 static void handle_iq_result(jconn conn, char *from, xmlnode xmldata) |
987 |
1025 |
988 jab_send(jc, iqn->xmldata); |
1026 jab_send(jc, iqn->xmldata); |
989 iqs_del(iqn->id); // XXX |
1027 iqs_del(iqn->id); // XXX |
990 } |
1028 } |
991 |
1029 |
|
1030 // send_storage_rosternotes() |
|
1031 // Send the current rosternotes node to update the server. |
|
1032 // Note: the sender should check we're online. |
|
1033 void send_storage_rosternotes(void) |
|
1034 { |
|
1035 eviqs *iqn; |
|
1036 |
|
1037 if (!rosternotes) return; |
|
1038 |
|
1039 iqn = iqs_new(JPACKET__SET, NS_PRIVATE, "storage", IQS_DEFAULT_TIMEOUT); |
|
1040 xmlnode_insert_node(xmlnode_get_tag(iqn->xmldata, "query"), rosternotes); |
|
1041 |
|
1042 jab_send(jc, iqn->xmldata); |
|
1043 iqs_del(iqn->id); // XXX |
|
1044 } |
|
1045 |
992 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ |
1046 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ |