204 // get_or_add_resource(rost, resname, priority) |
204 // get_or_add_resource(rost, resname, priority) |
205 // - if there is a "resname" resource in rost's resources, return a pointer |
205 // - if there is a "resname" resource in rost's resources, return a pointer |
206 // on this resource |
206 // on this resource |
207 // - if not, add the resource, set the name, and return a pointer on this |
207 // - if not, add the resource, set the name, and return a pointer on this |
208 // new resource |
208 // new resource |
209 static res *get_or_add_resource(roster *rost, const char *resname, gchar prio) |
209 static res_t *get_or_add_resource(roster_t *rost, const char *resname, gchar prio) |
210 { |
210 { |
211 GSList *p; |
211 GSList *p; |
212 res *nres; |
212 res_t *nres; |
213 |
213 |
214 if (!resname) return NULL; |
214 if (!resname) return NULL; |
215 |
215 |
216 for (p = rost->resource; p; p = g_slist_next(p)) { |
216 for (p = rost->resource; p; p = g_slist_next(p)) { |
217 res *r = p->data; |
217 res_t *r = p->data; |
218 if (!strcmp(r->name, resname)) { |
218 if (!strcmp(r->name, resname)) { |
219 if (prio != r->prio) { |
219 if (prio != r->prio) { |
220 r->prio = prio; |
220 r->prio = prio; |
221 rost->resource = g_slist_sort(rost->resource, |
221 rost->resource = g_slist_sort(rost->resource, |
222 (GCompareFunc)&resource_compare_prio); |
222 (GCompareFunc)&resource_compare_prio); |
284 free_all_resources(&roster_usr->resource); |
284 free_all_resources(&roster_usr->resource); |
285 g_free(roster_usr); |
285 g_free(roster_usr); |
286 } |
286 } |
287 |
287 |
288 // Comparison function used to search in the roster (compares jids and types) |
288 // Comparison function used to search in the roster (compares jids and types) |
289 static gint roster_compare_jid_type(roster *a, roster *b) { |
289 static gint roster_compare_jid_type(roster_t *a, roster_t *b) { |
290 if (! (a->type & b->type)) |
290 if (! (a->type & b->type)) |
291 return -1; // arbitrary (but should be != 0, of course) |
291 return -1; // arbitrary (but should be != 0, of course) |
292 return strcasecmp(a->jid, b->jid); |
292 return strcasecmp(a->jid, b->jid); |
293 } |
293 } |
294 |
294 |
295 // Comparison function used to search in the roster (compares names and types) |
295 // Comparison function used to search in the roster (compares names and types) |
296 static gint roster_compare_name_type(roster *a, roster *b) { |
296 static gint roster_compare_name_type(roster_t *a, roster_t *b) { |
297 if (! (a->type & b->type)) |
297 if (! (a->type & b->type)) |
298 return -1; // arbitrary (but should be != 0, of course) |
298 return -1; // arbitrary (but should be != 0, of course) |
299 return strcmp(a->name, b->name); |
299 return strcmp(a->name, b->name); |
300 } |
300 } |
301 |
301 |
302 // Comparison function used to sort the roster (by name) |
302 // Comparison function used to sort the roster (by name) |
303 static gint roster_compare_name(roster *a, roster *b) { |
303 static gint roster_compare_name(roster_t *a, roster_t *b) { |
304 return strcmp(a->name, b->name); |
304 return strcmp(a->name, b->name); |
305 } |
305 } |
306 |
306 |
307 // Finds a roster element (user, group, agent...), by jid or name |
307 // Finds a roster element (user, group, agent...), by jid or name |
308 // If roster_type is 0, returns match of any type. |
308 // If roster_type is 0, returns match of any type. |
309 // Returns the roster GSList element, or NULL if jid/name not found |
309 // Returns the roster GSList element, or NULL if jid/name not found |
310 GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type) |
310 GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type) |
311 { |
311 { |
312 GSList *sl_roster_elt = groups; |
312 GSList *sl_roster_elt = groups; |
313 GSList *resource; |
313 GSList *resource; |
314 roster sample; |
314 roster_t sample; |
315 GCompareFunc comp; |
315 GCompareFunc comp; |
316 |
316 |
317 if (!jidname) return NULL; |
317 if (!jidname) return NULL; |
318 |
318 |
319 if (!roster_type) |
319 if (!roster_type) |
363 } |
363 } |
364 return p_group; |
364 return p_group; |
365 } |
365 } |
366 |
366 |
367 // Comparison function used to sort the unread list by ui (attn) priority |
367 // Comparison function used to sort the unread list by ui (attn) priority |
368 static gint _roster_compare_uiprio(roster *a, roster *b) { |
368 static gint _roster_compare_uiprio(roster_t *a, roster_t *b) { |
369 return (b->ui_prio - a->ui_prio); |
369 return (b->ui_prio - a->ui_prio); |
370 } |
370 } |
371 |
371 |
372 // Returns a pointer to the new user, or existing user with that name |
372 // Returns a pointer to the new user, or existing user with that name |
373 // Note: if onserver is -1, the flag won't be changed. |
373 // Note: if onserver is -1, the flag won't be changed. |
374 GSList *roster_add_user(const char *jid, const char *name, const char *group, |
374 GSList *roster_add_user(const char *jid, const char *name, const char *group, |
375 guint type, enum subscr esub, gint onserver) |
375 guint type, enum subscr esub, gint onserver) |
376 { |
376 { |
377 roster *roster_usr; |
377 roster_t *roster_usr; |
378 roster *my_group; |
378 roster_t *my_group; |
379 GSList *slist; |
379 GSList *slist; |
380 |
380 |
381 if ((type != ROSTER_TYPE_USER) && |
381 if ((type != ROSTER_TYPE_USER) && |
382 (type != ROSTER_TYPE_ROOM) && |
382 (type != ROSTER_TYPE_ROOM) && |
383 (type != ROSTER_TYPE_AGENT)) { |
383 (type != ROSTER_TYPE_AGENT)) { |
446 // Removes user (jid) from roster, frees allocated memory |
446 // Removes user (jid) from roster, frees allocated memory |
447 void roster_del_user(const char *jid) |
447 void roster_del_user(const char *jid) |
448 { |
448 { |
449 GSList *sl_user, *sl_group; |
449 GSList *sl_user, *sl_group; |
450 GSList **sl_group_listptr; |
450 GSList **sl_group_listptr; |
451 roster *roster_usr; |
451 roster_t *roster_usr; |
452 GSList *node; |
452 GSList *node; |
453 |
453 |
454 sl_user = roster_find(jid, jidsearch, |
454 sl_user = roster_find(jid, jidsearch, |
455 ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM); |
455 ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM); |
456 if (sl_user == NULL) |
456 if (sl_user == NULL) |
457 return; |
457 return; |
458 roster_usr = (roster*)sl_user->data; |
458 roster_usr = (roster_t *)sl_user->data; |
459 |
459 |
460 // Remove (if present) from unread messages list |
460 // Remove (if present) from unread messages list |
461 node = g_slist_find(unread_list, roster_usr); |
461 node = g_slist_find(unread_list, roster_usr); |
462 if (node) unread_list = g_slist_delete_link(unread_list, node); |
462 if (node) unread_list = g_slist_delete_link(unread_list, node); |
463 // If there is a pending unread message, keep track of it |
463 // If there is a pending unread message, keep track of it |
633 // It will update the buddy's group message flag. |
633 // It will update the buddy's group message flag. |
634 // Update the unread messages list too. |
634 // Update the unread messages list too. |
635 void roster_msg_setflag(const char *jid, guint special, guint value) |
635 void roster_msg_setflag(const char *jid, guint special, guint value) |
636 { |
636 { |
637 GSList *sl_user; |
637 GSList *sl_user; |
638 roster *roster_usr, *roster_grp; |
638 roster_t *roster_usr, *roster_grp; |
639 int new_roster_item = FALSE; |
639 int new_roster_item = FALSE; |
640 guint unread_list_modified = FALSE; |
640 guint unread_list_modified = FALSE; |
641 |
641 |
642 if (special) { |
642 if (special) { |
643 //sl_user = roster_find(jid, namesearch, ROSTER_TYPE_SPECIAL); |
643 //sl_user = roster_find(jid, namesearch, ROSTER_TYPE_SPECIAL); |
644 //if (!sl_user) return; |
644 //if (!sl_user) return; |
645 //roster_usr = (roster*)sl_user->data; |
645 //roster_usr = (roster_t *)sl_user->data; |
646 roster_usr = &roster_special; |
646 roster_usr = &roster_special; |
647 if (value) { |
647 if (value) { |
648 if (!(roster_usr->flags & ROSTER_FLAG_MSG)) |
648 if (!(roster_usr->flags & ROSTER_FLAG_MSG)) |
649 unread_list_modified = TRUE; |
649 unread_list_modified = TRUE; |
650 roster_usr->flags |= ROSTER_FLAG_MSG; |
650 roster_usr->flags |= ROSTER_FLAG_MSG; |
756 // Note that this function doesn't create the roster item if it doesn't exist. |
756 // Note that this function doesn't create the roster item if it doesn't exist. |
757 void roster_setuiprio(const char *jid, guint special, guint value, |
757 void roster_setuiprio(const char *jid, guint special, guint value, |
758 enum setuiprio_ops action) |
758 enum setuiprio_ops action) |
759 { |
759 { |
760 guint oldval, newval; |
760 guint oldval, newval; |
761 roster *roster_usr; |
761 roster_t *roster_usr; |
762 |
762 |
763 if (special) { |
763 if (special) { |
764 roster_usr = &roster_special; |
764 roster_usr = &roster_special; |
765 } else { |
765 } else { |
766 GSList *sl_user = roster_find(jid, jidsearch, |
766 GSList *sl_user = roster_find(jid, jidsearch, |
767 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
767 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
768 if (!sl_user) |
768 if (!sl_user) |
769 return; |
769 return; |
770 |
770 |
771 roster_usr = (roster*)sl_user->data; |
771 roster_usr = (roster_t *)sl_user->data; |
772 } |
772 } |
773 oldval = roster_usr->ui_prio; |
773 oldval = roster_usr->ui_prio; |
774 |
774 |
775 if (action == prio_max) |
775 if (action == prio_max) |
776 newval = MAX(oldval, value); |
776 newval = MAX(oldval, value); |
797 |
797 |
798 sl_user = roster_find(jid, jidsearch, |
798 sl_user = roster_find(jid, jidsearch, |
799 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
799 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
800 if (!sl_user) |
800 if (!sl_user) |
801 return 0; |
801 return 0; |
802 roster_usr = (roster*)sl_user->data; |
802 roster_usr = (roster_t *)sl_user->data; |
803 return roster_usr->ui_prio; |
803 return roster_usr->ui_prio; |
804 } |
804 } |
805 |
805 |
806 const char *roster_getname(const char *jid) |
806 const char *roster_getname(const char *jid) |
807 { |
807 { |
808 GSList *sl_user; |
808 GSList *sl_user; |
809 roster *roster_usr; |
809 roster_t *roster_usr; |
810 |
810 |
811 sl_user = roster_find(jid, jidsearch, |
811 sl_user = roster_find(jid, jidsearch, |
812 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
812 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
813 if (sl_user == NULL) |
813 if (sl_user == NULL) |
814 return NULL; // Not in the roster... |
814 return NULL; // Not in the roster... |
815 |
815 |
816 roster_usr = (roster*)sl_user->data; |
816 roster_usr = (roster_t *)sl_user->data; |
817 return roster_usr->name; |
817 return roster_usr->name; |
818 } |
818 } |
819 |
819 |
820 const char *roster_getnickname(const char *jid) |
820 const char *roster_getnickname(const char *jid) |
821 { |
821 { |
822 GSList *sl_user; |
822 GSList *sl_user; |
823 roster *roster_usr; |
823 roster_t *roster_usr; |
824 |
824 |
825 sl_user = roster_find(jid, jidsearch, |
825 sl_user = roster_find(jid, jidsearch, |
826 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
826 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
827 if (sl_user == NULL) |
827 if (sl_user == NULL) |
828 return NULL; // Not in the roster... |
828 return NULL; // Not in the roster... |
829 |
829 |
830 roster_usr = (roster*)sl_user->data; |
830 roster_usr = (roster_t *)sl_user->data; |
831 return roster_usr->nickname; |
831 return roster_usr->nickname; |
832 } |
832 } |
833 |
833 |
834 void roster_settype(const char *jid, guint type) |
834 void roster_settype(const char *jid, guint type) |
835 { |
835 { |
836 GSList *sl_user; |
836 GSList *sl_user; |
837 roster *roster_usr; |
837 roster_t *roster_usr; |
838 |
838 |
839 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) |
839 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) |
840 return; |
840 return; |
841 |
841 |
842 roster_usr = (roster*)sl_user->data; |
842 roster_usr = (roster_t *)sl_user->data; |
843 roster_usr->type = type; |
843 roster_usr->type = type; |
844 } |
844 } |
845 |
845 |
846 enum imstatus roster_getstatus(const char *jid, const char *resname) |
846 enum imstatus roster_getstatus(const char *jid, const char *resname) |
847 { |
847 { |
848 GSList *sl_user; |
848 GSList *sl_user; |
849 roster *roster_usr; |
849 roster_t *roster_usr; |
850 res *p_res; |
850 res_t *p_res; |
851 |
851 |
852 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
852 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
853 if (sl_user == NULL) |
853 if (sl_user == NULL) |
854 return offline; // Not in the roster, anyway... |
854 return offline; // Not in the roster, anyway... |
855 |
855 |
856 roster_usr = (roster*)sl_user->data; |
856 roster_usr = (roster_t *)sl_user->data; |
857 p_res = get_resource(roster_usr, resname); |
857 p_res = get_resource(roster_usr, resname); |
858 if (p_res) |
858 if (p_res) |
859 return p_res->status; |
859 return p_res->status; |
860 return offline; |
860 return offline; |
861 } |
861 } |
862 |
862 |
863 const char *roster_getstatusmsg(const char *jid, const char *resname) |
863 const char *roster_getstatusmsg(const char *jid, const char *resname) |
864 { |
864 { |
865 GSList *sl_user; |
865 GSList *sl_user; |
866 roster *roster_usr; |
866 roster_t *roster_usr; |
867 res *p_res; |
867 res_t *p_res; |
868 |
868 |
869 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
869 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
870 if (sl_user == NULL) |
870 if (sl_user == NULL) |
871 return NULL; // Not in the roster, anyway... |
871 return NULL; // Not in the roster, anyway... |
872 |
872 |
873 roster_usr = (roster*)sl_user->data; |
873 roster_usr = (roster_t *)sl_user->data; |
874 p_res = get_resource(roster_usr, resname); |
874 p_res = get_resource(roster_usr, resname); |
875 if (p_res) |
875 if (p_res) |
876 return p_res->status_msg; |
876 return p_res->status_msg; |
877 return roster_usr->offline_status_message; |
877 return roster_usr->offline_status_message; |
878 } |
878 } |
879 |
879 |
880 char roster_getprio(const char *jid, const char *resname) |
880 char roster_getprio(const char *jid, const char *resname) |
881 { |
881 { |
882 GSList *sl_user; |
882 GSList *sl_user; |
883 roster *roster_usr; |
883 roster_t *roster_usr; |
884 res *p_res; |
884 res_t *p_res; |
885 |
885 |
886 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
886 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
887 if (sl_user == NULL) |
887 if (sl_user == NULL) |
888 return offline; // Not in the roster, anyway... |
888 return offline; // Not in the roster, anyway... |
889 |
889 |
890 roster_usr = (roster*)sl_user->data; |
890 roster_usr = (roster_t *)sl_user->data; |
891 p_res = get_resource(roster_usr, resname); |
891 p_res = get_resource(roster_usr, resname); |
892 if (p_res) |
892 if (p_res) |
893 return p_res->prio; |
893 return p_res->prio; |
894 return 0; |
894 return 0; |
895 } |
895 } |
896 |
896 |
897 guint roster_gettype(const char *jid) |
897 guint roster_gettype(const char *jid) |
898 { |
898 { |
899 GSList *sl_user; |
899 GSList *sl_user; |
900 roster *roster_usr; |
900 roster_t *roster_usr; |
901 |
901 |
902 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) |
902 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) |
903 return 0; |
903 return 0; |
904 |
904 |
905 roster_usr = (roster*)sl_user->data; |
905 roster_usr = (roster_t *)sl_user->data; |
906 return roster_usr->type; |
906 return roster_usr->type; |
907 } |
907 } |
908 |
908 |
909 guint roster_getsubscription(const char *jid) |
909 guint roster_getsubscription(const char *jid) |
910 { |
910 { |
911 GSList *sl_user; |
911 GSList *sl_user; |
912 roster *roster_usr; |
912 roster_t *roster_usr; |
913 |
913 |
914 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) |
914 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) |
915 return 0; |
915 return 0; |
916 |
916 |
917 roster_usr = (roster*)sl_user->data; |
917 roster_usr = (roster_t *)sl_user->data; |
918 return roster_usr->subscription; |
918 return roster_usr->subscription; |
919 } |
919 } |
920 |
920 |
921 // roster_unsubscribed() |
921 // roster_unsubscribed() |
922 // We have lost buddy's presence updates; this function clears the status |
922 // We have lost buddy's presence updates; this function clears the status |
923 // message, sets the buddy offline and frees the resources |
923 // message, sets the buddy offline and frees the resources |
924 void roster_unsubscribed(const char *jid) |
924 void roster_unsubscribed(const char *jid) |
925 { |
925 { |
926 GSList *sl_user; |
926 GSList *sl_user; |
927 roster *roster_usr; |
927 roster_t *roster_usr; |
928 |
928 |
929 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
929 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
930 if (sl_user == NULL) |
930 if (sl_user == NULL) |
931 return; |
931 return; |
932 |
932 |
933 roster_usr = (roster*)sl_user->data; |
933 roster_usr = (roster_t *)sl_user->data; |
934 free_all_resources(&roster_usr->resource); |
934 free_all_resources(&roster_usr->resource); |
935 } |
935 } |
936 |
936 |
937 |
937 |
938 /* ### BuddyList functions ### */ |
938 /* ### BuddyList functions ### */ |
1014 buddylist = g_list_append(buddylist, &roster_special); |
1014 buddylist = g_list_append(buddylist, &roster_special); |
1015 |
1015 |
1016 // Create the new list |
1016 // Create the new list |
1017 while (sl_roster_elt) { |
1017 while (sl_roster_elt) { |
1018 GSList *sl_roster_usrelt; |
1018 GSList *sl_roster_usrelt; |
1019 roster *roster_usrelt; |
1019 roster_t *roster_usrelt; |
1020 guint pending_group = TRUE; |
1020 guint pending_group = TRUE; |
1021 roster_elt = (roster*) sl_roster_elt->data; |
1021 roster_elt = (roster_t *) sl_roster_elt->data; |
1022 |
1022 |
1023 shrunk_group = roster_elt->flags & ROSTER_FLAG_HIDE; |
1023 shrunk_group = roster_elt->flags & ROSTER_FLAG_HIDE; |
1024 |
1024 |
1025 sl_roster_usrelt = roster_elt->list; |
1025 sl_roster_usrelt = roster_elt->list; |
1026 while (sl_roster_usrelt) { |
1026 while (sl_roster_usrelt) { |
1027 roster_usrelt = (roster*) sl_roster_usrelt->data; |
1027 roster_usrelt = (roster_t *) sl_roster_usrelt->data; |
1028 |
1028 |
1029 // Buddy will be added if either: |
1029 // Buddy will be added if either: |
1030 // - buddy's status matches the display_filter |
1030 // - buddy's status matches the display_filter |
1031 // - buddy has a lock (for example the buddy window is currently open) |
1031 // - buddy has a lock (for example the buddy window is currently open) |
1032 // - buddy has a pending (non-read) message |
1032 // - buddy has a pending (non-read) message |
1094 // |
1094 // |
1095 // Note: buddy_setgroup() updates the user lists. |
1095 // Note: buddy_setgroup() updates the user lists. |
1096 // |
1096 // |
1097 void buddy_setgroup(gpointer rosterdata, char *newgroupname) |
1097 void buddy_setgroup(gpointer rosterdata, char *newgroupname) |
1098 { |
1098 { |
1099 roster *roster_usr = rosterdata; |
1099 roster_t *roster_usr = rosterdata; |
1100 GSList **sl_group; |
1100 GSList **sl_group; |
1101 GSList *sl_newgroup; |
1101 GSList *sl_newgroup; |
1102 roster *my_newgroup; |
1102 roster_t *my_newgroup; |
1103 |
1103 |
1104 // A group has no group :) |
1104 // A group has no group :) |
1105 if (roster_usr->type & ROSTER_TYPE_GROUP) return; |
1105 if (roster_usr->type & ROSTER_TYPE_GROUP) return; |
1106 |
1106 |
1107 // Add newgroup if necessary |
1107 // Add newgroup if necessary |
1108 if (!newgroupname) newgroupname = ""; |
1108 if (!newgroupname) newgroupname = ""; |
1109 sl_newgroup = roster_add_group(newgroupname); |
1109 sl_newgroup = roster_add_group(newgroupname); |
1110 if (!sl_newgroup) return; |
1110 if (!sl_newgroup) return; |
1111 my_newgroup = (roster*)sl_newgroup->data; |
1111 my_newgroup = (roster_t *)sl_newgroup->data; |
1112 |
1112 |
1113 // Remove the buddy from current group |
1113 // Remove the buddy from current group |
1114 sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list; |
1114 sl_group = &((roster_t *)((GSList*)roster_usr->list)->data)->list; |
1115 *sl_group = g_slist_remove(*sl_group, rosterdata); |
1115 *sl_group = g_slist_remove(*sl_group, rosterdata); |
1116 |
1116 |
1117 // Remove old group if it is empty |
1117 // Remove old group if it is empty |
1118 if (!*sl_group) { |
1118 if (!*sl_group) { |
1119 roster *roster_grp = (roster*)((GSList*)roster_usr->list)->data; |
1119 roster_t *roster_grp = (roster_t *)((GSList*)roster_usr->list)->data; |
1120 g_free((gchar*)roster_grp->jid); |
1120 g_free((gchar*)roster_grp->jid); |
1121 g_free((gchar*)roster_grp->name); |
1121 g_free((gchar*)roster_grp->name); |
1122 g_free(roster_grp); |
1122 g_free(roster_grp); |
1123 groups = g_slist_remove(groups, roster_grp); |
1123 groups = g_slist_remove(groups, roster_grp); |
1124 } |
1124 } |
1147 } |
1147 } |
1148 if (newname) |
1148 if (newname) |
1149 roster_usr->name = g_strdup(newname); |
1149 roster_usr->name = g_strdup(newname); |
1150 |
1150 |
1151 // We need to resort the group list |
1151 // We need to resort the group list |
1152 sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list; |
1152 sl_group = &((roster_t *)((GSList*)roster_usr->list)->data)->list; |
1153 *sl_group = g_slist_sort(*sl_group, (GCompareFunc)&roster_compare_name); |
1153 *sl_group = g_slist_sort(*sl_group, (GCompareFunc)&roster_compare_name); |
1154 |
1154 |
1155 buddylist_defer_build(); |
1155 buddylist_defer_build(); |
1156 } |
1156 } |
1157 |
1157 |
1158 const char *buddy_getname(gpointer rosterdata) |
1158 const char *buddy_getname(gpointer rosterdata) |
1159 { |
1159 { |
1160 roster *roster_usr = rosterdata; |
1160 roster_t *roster_usr = rosterdata; |
1161 return roster_usr->name; |
1161 return roster_usr->name; |
1162 } |
1162 } |
1163 |
1163 |
1164 // buddy_setnickname(buddy, newnickname) |
1164 // buddy_setnickname(buddy, newnickname) |
1165 // Only for chatrooms |
1165 // Only for chatrooms |
1166 void buddy_setnickname(gpointer rosterdata, const char *newname) |
1166 void buddy_setnickname(gpointer rosterdata, const char *newname) |
1167 { |
1167 { |
1168 roster *roster_usr = rosterdata; |
1168 roster_t *roster_usr = rosterdata; |
1169 |
1169 |
1170 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; // XXX Error message? |
1170 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; // XXX Error message? |
1171 |
1171 |
1172 if (roster_usr->nickname) { |
1172 if (roster_usr->nickname) { |
1173 g_free((gchar*)roster_usr->nickname); |
1173 g_free((gchar*)roster_usr->nickname); |
1177 roster_usr->nickname = g_strdup(newname); |
1177 roster_usr->nickname = g_strdup(newname); |
1178 } |
1178 } |
1179 |
1179 |
1180 const char *buddy_getnickname(gpointer rosterdata) |
1180 const char *buddy_getnickname(gpointer rosterdata) |
1181 { |
1181 { |
1182 roster *roster_usr = rosterdata; |
1182 roster_t *roster_usr = rosterdata; |
1183 return roster_usr->nickname; |
1183 return roster_usr->nickname; |
1184 } |
1184 } |
1185 |
1185 |
1186 // buddy_setinsideroom(buddy, inside) |
1186 // buddy_setinsideroom(buddy, inside) |
1187 // Only for chatrooms |
1187 // Only for chatrooms |
1188 void buddy_setinsideroom(gpointer rosterdata, guint inside) |
1188 void buddy_setinsideroom(gpointer rosterdata, guint inside) |
1189 { |
1189 { |
1190 roster *roster_usr = rosterdata; |
1190 roster_t *roster_usr = rosterdata; |
1191 |
1191 |
1192 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; |
1192 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; |
1193 |
1193 |
1194 roster_usr->inside_room = inside; |
1194 roster_usr->inside_room = inside; |
1195 } |
1195 } |
1196 |
1196 |
1197 guint buddy_getinsideroom(gpointer rosterdata) |
1197 guint buddy_getinsideroom(gpointer rosterdata) |
1198 { |
1198 { |
1199 roster *roster_usr = rosterdata; |
1199 roster_t *roster_usr = rosterdata; |
1200 return roster_usr->inside_room; |
1200 return roster_usr->inside_room; |
1201 } |
1201 } |
1202 |
1202 |
1203 // buddy_settopic(buddy, newtopic) |
1203 // buddy_settopic(buddy, newtopic) |
1204 // Only for chatrooms |
1204 // Only for chatrooms |
1205 void buddy_settopic(gpointer rosterdata, const char *newtopic) |
1205 void buddy_settopic(gpointer rosterdata, const char *newtopic) |
1206 { |
1206 { |
1207 roster *roster_usr = rosterdata; |
1207 roster_t *roster_usr = rosterdata; |
1208 |
1208 |
1209 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; |
1209 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; |
1210 |
1210 |
1211 if (roster_usr->topic) { |
1211 if (roster_usr->topic) { |
1212 g_free((gchar*)roster_usr->topic); |
1212 g_free((gchar*)roster_usr->topic); |
1216 roster_usr->topic = g_strdup(newtopic); |
1216 roster_usr->topic = g_strdup(newtopic); |
1217 } |
1217 } |
1218 |
1218 |
1219 const char *buddy_gettopic(gpointer rosterdata) |
1219 const char *buddy_gettopic(gpointer rosterdata) |
1220 { |
1220 { |
1221 roster *roster_usr = rosterdata; |
1221 roster_t *roster_usr = rosterdata; |
1222 return roster_usr->topic; |
1222 return roster_usr->topic; |
1223 } |
1223 } |
1224 |
1224 |
1225 void buddy_setprintstatus(gpointer rosterdata, enum room_printstatus pstatus) |
1225 void buddy_setprintstatus(gpointer rosterdata, enum room_printstatus pstatus) |
1226 { |
1226 { |
1227 roster *roster_usr = rosterdata; |
1227 roster_t *roster_usr = rosterdata; |
1228 roster_usr->print_status = pstatus; |
1228 roster_usr->print_status = pstatus; |
1229 } |
1229 } |
1230 |
1230 |
1231 enum room_printstatus buddy_getprintstatus(gpointer rosterdata) |
1231 enum room_printstatus buddy_getprintstatus(gpointer rosterdata) |
1232 { |
1232 { |
1233 roster *roster_usr = rosterdata; |
1233 roster_t *roster_usr = rosterdata; |
1234 return roster_usr->print_status; |
1234 return roster_usr->print_status; |
1235 } |
1235 } |
1236 |
1236 |
1237 void buddy_setautowhois(gpointer rosterdata, enum room_autowhois awhois) |
1237 void buddy_setautowhois(gpointer rosterdata, enum room_autowhois awhois) |
1238 { |
1238 { |
1239 roster *roster_usr = rosterdata; |
1239 roster_t *roster_usr = rosterdata; |
1240 roster_usr->auto_whois = awhois; |
1240 roster_usr->auto_whois = awhois; |
1241 } |
1241 } |
1242 |
1242 |
1243 enum room_autowhois buddy_getautowhois(gpointer rosterdata) |
1243 enum room_autowhois buddy_getautowhois(gpointer rosterdata) |
1244 { |
1244 { |
1245 roster *roster_usr = rosterdata; |
1245 roster_t *roster_usr = rosterdata; |
1246 return roster_usr->auto_whois; |
1246 return roster_usr->auto_whois; |
1247 } |
1247 } |
1248 |
1248 |
1249 void buddy_setflagjoins(gpointer rosterdata, enum room_flagjoins fjoins) |
1249 void buddy_setflagjoins(gpointer rosterdata, enum room_flagjoins fjoins) |
1250 { |
1250 { |
1251 roster *roster_usr = rosterdata; |
1251 roster_t *roster_usr = rosterdata; |
1252 roster_usr->flag_joins = fjoins; |
1252 roster_usr->flag_joins = fjoins; |
1253 } |
1253 } |
1254 |
1254 |
1255 enum room_flagjoins buddy_getflagjoins(gpointer rosterdata) |
1255 enum room_flagjoins buddy_getflagjoins(gpointer rosterdata) |
1256 { |
1256 { |
1257 roster *roster_usr = rosterdata; |
1257 roster_t *roster_usr = rosterdata; |
1258 return roster_usr->flag_joins; |
1258 return roster_usr->flag_joins; |
1259 } |
1259 } |
1260 |
1260 |
1261 // buddy_getgroupname() |
1261 // buddy_getgroupname() |
1262 // Returns a pointer on buddy's group name. |
1262 // Returns a pointer on buddy's group name. |
1263 const char *buddy_getgroupname(gpointer rosterdata) |
1263 const char *buddy_getgroupname(gpointer rosterdata) |
1264 { |
1264 { |
1265 roster *roster_usr = rosterdata; |
1265 roster_t *roster_usr = rosterdata; |
1266 |
1266 |
1267 if (roster_usr->type & ROSTER_TYPE_GROUP) |
1267 if (roster_usr->type & ROSTER_TYPE_GROUP) |
1268 return roster_usr->name; |
1268 return roster_usr->name; |
1269 |
1269 |
1270 if (roster_usr->type & ROSTER_TYPE_SPECIAL) |
1270 if (roster_usr->type & ROSTER_TYPE_SPECIAL) |
1271 return NULL; |
1271 return NULL; |
1272 |
1272 |
1273 // This is a user |
1273 // This is a user |
1274 return ((roster*)((GSList*)roster_usr->list)->data)->name; |
1274 return ((roster_t *)((GSList*)roster_usr->list)->data)->name; |
1275 } |
1275 } |
1276 |
1276 |
1277 // buddy_getgroup() |
1277 // buddy_getgroup() |
1278 // Returns a pointer on buddy's group. |
1278 // Returns a pointer on buddy's group. |
1279 gpointer buddy_getgroup(gpointer rosterdata) |
1279 gpointer buddy_getgroup(gpointer rosterdata) |
1280 { |
1280 { |
1281 roster *roster_usr = rosterdata; |
1281 roster_t *roster_usr = rosterdata; |
1282 |
1282 |
1283 if (roster_usr->type & ROSTER_TYPE_GROUP) |
1283 if (roster_usr->type & ROSTER_TYPE_GROUP) |
1284 return rosterdata; |
1284 return rosterdata; |
1285 |
1285 |
1286 if (roster_usr->type & ROSTER_TYPE_SPECIAL) |
1286 if (roster_usr->type & ROSTER_TYPE_SPECIAL) |
1290 return (gpointer)((GSList*)roster_usr->list)->data; |
1290 return (gpointer)((GSList*)roster_usr->list)->data; |
1291 } |
1291 } |
1292 |
1292 |
1293 void buddy_settype(gpointer rosterdata, guint type) |
1293 void buddy_settype(gpointer rosterdata, guint type) |
1294 { |
1294 { |
1295 roster *roster_usr = rosterdata; |
1295 roster_t *roster_usr = rosterdata; |
1296 roster_usr->type = type; |
1296 roster_usr->type = type; |
1297 } |
1297 } |
1298 |
1298 |
1299 guint buddy_gettype(gpointer rosterdata) |
1299 guint buddy_gettype(gpointer rosterdata) |
1300 { |
1300 { |
1301 roster *roster_usr = rosterdata; |
1301 roster_t *roster_usr = rosterdata; |
1302 return roster_usr->type; |
1302 return roster_usr->type; |
1303 } |
1303 } |
1304 |
1304 |
1305 guint buddy_getsubscription(gpointer rosterdata) |
1305 guint buddy_getsubscription(gpointer rosterdata) |
1306 { |
1306 { |
1307 roster *roster_usr = rosterdata; |
1307 roster_t *roster_usr = rosterdata; |
1308 return roster_usr->subscription; |
1308 return roster_usr->subscription; |
1309 } |
1309 } |
1310 |
1310 |
1311 enum imstatus buddy_getstatus(gpointer rosterdata, const char *resname) |
1311 enum imstatus buddy_getstatus(gpointer rosterdata, const char *resname) |
1312 { |
1312 { |
1313 roster *roster_usr = rosterdata; |
1313 roster_t *roster_usr = rosterdata; |
1314 res *p_res = get_resource(roster_usr, resname); |
1314 res_t *p_res = get_resource(roster_usr, resname); |
1315 if (p_res) |
1315 if (p_res) |
1316 return p_res->status; |
1316 return p_res->status; |
1317 return offline; |
1317 return offline; |
1318 } |
1318 } |
1319 |
1319 |
1320 const char *buddy_getstatusmsg(gpointer rosterdata, const char *resname) |
1320 const char *buddy_getstatusmsg(gpointer rosterdata, const char *resname) |
1321 { |
1321 { |
1322 roster *roster_usr = rosterdata; |
1322 roster_t *roster_usr = rosterdata; |
1323 res *p_res = get_resource(roster_usr, resname); |
1323 res_t *p_res = get_resource(roster_usr, resname); |
1324 if (p_res) |
1324 if (p_res) |
1325 return p_res->status_msg; |
1325 return p_res->status_msg; |
1326 return roster_usr->offline_status_message; |
1326 return roster_usr->offline_status_message; |
1327 } |
1327 } |
1328 |
1328 |
1329 time_t buddy_getstatustime(gpointer rosterdata, const char *resname) |
1329 time_t buddy_getstatustime(gpointer rosterdata, const char *resname) |
1330 { |
1330 { |
1331 roster *roster_usr = rosterdata; |
1331 roster_t *roster_usr = rosterdata; |
1332 res *p_res = get_resource(roster_usr, resname); |
1332 res_t *p_res = get_resource(roster_usr, resname); |
1333 if (p_res) |
1333 if (p_res) |
1334 return p_res->status_timestamp; |
1334 return p_res->status_timestamp; |
1335 return 0; |
1335 return 0; |
1336 } |
1336 } |
1337 |
1337 |
1338 gchar buddy_getresourceprio(gpointer rosterdata, const char *resname) |
1338 gchar buddy_getresourceprio(gpointer rosterdata, const char *resname) |
1339 { |
1339 { |
1340 roster *roster_usr = rosterdata; |
1340 roster_t *roster_usr = rosterdata; |
1341 res *p_res = get_resource(roster_usr, resname); |
1341 res_t *p_res = get_resource(roster_usr, resname); |
1342 if (p_res) |
1342 if (p_res) |
1343 return p_res->prio; |
1343 return p_res->prio; |
1344 return 0; |
1344 return 0; |
1345 } |
1345 } |
1346 |
1346 |
1347 guint buddy_resource_getevents(gpointer rosterdata, const char *resname) |
1347 guint buddy_resource_getevents(gpointer rosterdata, const char *resname) |
1348 { |
1348 { |
1349 roster *roster_usr = rosterdata; |
1349 roster_t *roster_usr = rosterdata; |
1350 res *p_res = get_resource(roster_usr, resname); |
1350 res_t *p_res = get_resource(roster_usr, resname); |
1351 if (p_res) |
1351 if (p_res) |
1352 return p_res->events; |
1352 return p_res->events; |
1353 return ROSTER_EVENT_NONE; |
1353 return ROSTER_EVENT_NONE; |
1354 } |
1354 } |
1355 |
1355 |
1356 void buddy_resource_setevents(gpointer rosterdata, const char *resname, |
1356 void buddy_resource_setevents(gpointer rosterdata, const char *resname, |
1357 guint events) |
1357 guint events) |
1358 { |
1358 { |
1359 roster *roster_usr = rosterdata; |
1359 roster_t *roster_usr = rosterdata; |
1360 res *p_res = get_resource(roster_usr, resname); |
1360 res_t *p_res = get_resource(roster_usr, resname); |
1361 if (p_res) |
1361 if (p_res) |
1362 p_res->events = events; |
1362 p_res->events = events; |
1363 } |
1363 } |
1364 |
1364 |
1365 char *buddy_resource_getcaps(gpointer rosterdata, const char *resname) |
1365 char *buddy_resource_getcaps(gpointer rosterdata, const char *resname) |
1366 { |
1366 { |
1367 roster *roster_usr = rosterdata; |
1367 roster_t *roster_usr = rosterdata; |
1368 res *p_res = get_resource(roster_usr, resname); |
1368 res_t *p_res = get_resource(roster_usr, resname); |
1369 if (p_res) |
1369 if (p_res) |
1370 return p_res->caps; |
1370 return p_res->caps; |
1371 return NULL; |
1371 return NULL; |
1372 } |
1372 } |
1373 |
1373 |
1374 void buddy_resource_setcaps(gpointer rosterdata, const char *resname, |
1374 void buddy_resource_setcaps(gpointer rosterdata, const char *resname, |
1375 const char *caps) |
1375 const char *caps) |
1376 { |
1376 { |
1377 roster *roster_usr = rosterdata; |
1377 roster_t *roster_usr = rosterdata; |
1378 res *p_res = get_resource(roster_usr, resname); |
1378 res_t *p_res = get_resource(roster_usr, resname); |
1379 if (p_res) { |
1379 if (p_res) { |
1380 g_free(p_res->caps); |
1380 g_free(p_res->caps); |
1381 p_res->caps = g_strdup(caps); |
1381 p_res->caps = g_strdup(caps); |
1382 } |
1382 } |
1383 } |
1383 } |
1384 |
1384 |
1385 struct xep0085 *buddy_resource_xep85(gpointer rosterdata, const char *resname) |
1385 struct xep0085 *buddy_resource_xep85(gpointer rosterdata, const char *resname) |
1386 { |
1386 { |
1387 #ifdef XEP0085 |
1387 #ifdef XEP0085 |
1388 roster *roster_usr = rosterdata; |
1388 roster_t *roster_usr = rosterdata; |
1389 res *p_res = get_resource(roster_usr, resname); |
1389 res_t *p_res = get_resource(roster_usr, resname); |
1390 if (p_res) |
1390 if (p_res) |
1391 return &p_res->xep85; |
1391 return &p_res->xep85; |
1392 #endif |
1392 #endif |
1393 return NULL; |
1393 return NULL; |
1394 } |
1394 } |
1395 |
1395 |
1396 struct pgp_data *buddy_resource_pgp(gpointer rosterdata, const char *resname) |
1396 struct pgp_data *buddy_resource_pgp(gpointer rosterdata, const char *resname) |
1397 { |
1397 { |
1398 #ifdef HAVE_GPGME |
1398 #ifdef HAVE_GPGME |
1399 roster *roster_usr = rosterdata; |
1399 roster_t *roster_usr = rosterdata; |
1400 res *p_res = get_resource(roster_usr, resname); |
1400 res_t *p_res = get_resource(roster_usr, resname); |
1401 if (p_res) |
1401 if (p_res) |
1402 return &p_res->pgpdata; |
1402 return &p_res->pgpdata; |
1403 #endif |
1403 #endif |
1404 return NULL; |
1404 return NULL; |
1405 } |
1405 } |
1406 |
1406 |
1407 enum imrole buddy_getrole(gpointer rosterdata, const char *resname) |
1407 enum imrole buddy_getrole(gpointer rosterdata, const char *resname) |
1408 { |
1408 { |
1409 roster *roster_usr = rosterdata; |
1409 roster_t *roster_usr = rosterdata; |
1410 res *p_res = get_resource(roster_usr, resname); |
1410 res_t *p_res = get_resource(roster_usr, resname); |
1411 if (p_res) |
1411 if (p_res) |
1412 return p_res->role; |
1412 return p_res->role; |
1413 return role_none; |
1413 return role_none; |
1414 } |
1414 } |
1415 |
1415 |
1416 enum imaffiliation buddy_getaffil(gpointer rosterdata, const char *resname) |
1416 enum imaffiliation buddy_getaffil(gpointer rosterdata, const char *resname) |
1417 { |
1417 { |
1418 roster *roster_usr = rosterdata; |
1418 roster_t *roster_usr = rosterdata; |
1419 res *p_res = get_resource(roster_usr, resname); |
1419 res_t *p_res = get_resource(roster_usr, resname); |
1420 if (p_res) |
1420 if (p_res) |
1421 return p_res->affil; |
1421 return p_res->affil; |
1422 return affil_none; |
1422 return affil_none; |
1423 } |
1423 } |
1424 |
1424 |
1425 const char *buddy_getrjid(gpointer rosterdata, const char *resname) |
1425 const char *buddy_getrjid(gpointer rosterdata, const char *resname) |
1426 { |
1426 { |
1427 roster *roster_usr = rosterdata; |
1427 roster_t *roster_usr = rosterdata; |
1428 res *p_res = get_resource(roster_usr, resname); |
1428 res_t *p_res = get_resource(roster_usr, resname); |
1429 if (p_res) |
1429 if (p_res) |
1430 return p_res->realjid; |
1430 return p_res->realjid; |
1431 return NULL; |
1431 return NULL; |
1432 } |
1432 } |
1433 |
1433 |
1530 |
1530 |
1531 // buddy_del_all_resources() |
1531 // buddy_del_all_resources() |
1532 // Remove all resources from the specified buddy |
1532 // Remove all resources from the specified buddy |
1533 void buddy_del_all_resources(gpointer rosterdata) |
1533 void buddy_del_all_resources(gpointer rosterdata) |
1534 { |
1534 { |
1535 roster *roster_usr = rosterdata; |
1535 roster_t *roster_usr = rosterdata; |
1536 |
1536 |
1537 while (roster_usr->resource) { |
1537 while (roster_usr->resource) { |
1538 res *r = roster_usr->resource->data; |
1538 res_t *r = roster_usr->resource->data; |
1539 del_resource(roster_usr, r->name); |
1539 del_resource(roster_usr, r->name); |
1540 } |
1540 } |
1541 } |
1541 } |
1542 |
1542 |
1543 // buddy_setflags() |
1543 // buddy_setflags() |
1544 // Set one or several flags to value (TRUE/FALSE) |
1544 // Set one or several flags to value (TRUE/FALSE) |
1545 void buddy_setflags(gpointer rosterdata, guint flags, guint value) |
1545 void buddy_setflags(gpointer rosterdata, guint flags, guint value) |
1546 { |
1546 { |
1547 roster *roster_usr = rosterdata; |
1547 roster_t *roster_usr = rosterdata; |
1548 if (value) |
1548 if (value) |
1549 roster_usr->flags |= flags; |
1549 roster_usr->flags |= flags; |
1550 else |
1550 else |
1551 roster_usr->flags &= ~flags; |
1551 roster_usr->flags &= ~flags; |
1552 } |
1552 } |
1553 |
1553 |
1554 guint buddy_getflags(gpointer rosterdata) |
1554 guint buddy_getflags(gpointer rosterdata) |
1555 { |
1555 { |
1556 roster *roster_usr = rosterdata; |
1556 roster_t *roster_usr = rosterdata; |
1557 return roster_usr->flags; |
1557 return roster_usr->flags; |
1558 } |
1558 } |
1559 |
1559 |
1560 guint buddy_getuiprio(gpointer rosterdata) |
1560 guint buddy_getuiprio(gpointer rosterdata) |
1561 { |
1561 { |
1562 roster *roster_usr = rosterdata; |
1562 roster_t *roster_usr = rosterdata; |
1563 return roster_usr->ui_prio; |
1563 return roster_usr->ui_prio; |
1564 } |
1564 } |
1565 |
1565 |
1566 guint buddy_getunread(gpointer rosterdata) |
1566 guint buddy_getunread(gpointer rosterdata) |
1567 { |
1567 { |
1568 roster *roster_usr = rosterdata; |
1568 roster_t *roster_usr = rosterdata; |
1569 return roster_usr->unread; |
1569 return roster_usr->unread; |
1570 } |
1570 } |
1571 |
1571 |
1572 // buddy_setonserverflag() |
1572 // buddy_setonserverflag() |
1573 // Set the on_server flag |
1573 // Set the on_server flag |
1574 void buddy_setonserverflag(gpointer rosterdata, guint onserver) |
1574 void buddy_setonserverflag(gpointer rosterdata, guint onserver) |
1575 { |
1575 { |
1576 roster *roster_usr = rosterdata; |
1576 roster_t *roster_usr = rosterdata; |
1577 roster_usr->on_server = onserver; |
1577 roster_usr->on_server = onserver; |
1578 } |
1578 } |
1579 |
1579 |
1580 guint buddy_getonserverflag(gpointer rosterdata) |
1580 guint buddy_getonserverflag(gpointer rosterdata) |
1581 { |
1581 { |
1582 roster *roster_usr = rosterdata; |
1582 roster_t *roster_usr = rosterdata; |
1583 return roster_usr->on_server; |
1583 return roster_usr->on_server; |
1584 } |
1584 } |
1585 |
1585 |
1586 // buddy_search_jid(jid) |
1586 // buddy_search_jid(jid) |
1587 // Look for a buddy with specified jid. |
1587 // Look for a buddy with specified jid. |
1588 // Search begins at buddylist; if no match is found in the the buddylist, |
1588 // Search begins at buddylist; if no match is found in the the buddylist, |
1589 // return NULL; |
1589 // return NULL; |
1590 GList *buddy_search_jid(const char *jid) |
1590 GList *buddy_search_jid(const char *jid) |
1591 { |
1591 { |
1592 GList *buddy; |
1592 GList *buddy; |
1593 roster *roster_usr; |
1593 roster_t *roster_usr; |
1594 |
1594 |
1595 buddylist_build(); |
1595 buddylist_build(); |
1596 if (!buddylist) return NULL; |
1596 if (!buddylist) return NULL; |
1597 |
1597 |
1598 for (buddy = buddylist; buddy; buddy = g_list_next(buddy)) { |
1598 for (buddy = buddylist; buddy; buddy = g_list_next(buddy)) { |
1599 roster_usr = (roster*)buddy->data; |
1599 roster_usr = (roster_t *)buddy->data; |
1600 if (roster_usr->jid && !strcasecmp(roster_usr->jid, jid)) |
1600 if (roster_usr->jid && !strcasecmp(roster_usr->jid, jid)) |
1601 return buddy; |
1601 return buddy; |
1602 } |
1602 } |
1603 return NULL; |
1603 return NULL; |
1604 } |
1604 } |
1649 void foreach_buddy(guint roster_type, |
1649 void foreach_buddy(guint roster_type, |
1650 void (*pfunc)(gpointer rosterdata, void *param), |
1650 void (*pfunc)(gpointer rosterdata, void *param), |
1651 void *param) |
1651 void *param) |
1652 { |
1652 { |
1653 GSList *sl_roster_elt = groups; |
1653 GSList *sl_roster_elt = groups; |
1654 roster *roster_elt; |
1654 roster_t *roster_elt; |
1655 GSList *sl_roster_usrelt; |
1655 GSList *sl_roster_usrelt; |
1656 roster *roster_usrelt; |
1656 roster_t *roster_usrelt; |
1657 |
1657 |
1658 while (sl_roster_elt) { // group list loop |
1658 while (sl_roster_elt) { // group list loop |
1659 roster_elt = (roster*) sl_roster_elt->data; |
1659 roster_elt = (roster_t *) sl_roster_elt->data; |
1660 if (roster_elt->type & ROSTER_TYPE_SPECIAL) |
1660 if (roster_elt->type & ROSTER_TYPE_SPECIAL) |
1661 continue; // Skip special items |
1661 continue; // Skip special items |
1662 sl_roster_usrelt = roster_elt->list; |
1662 sl_roster_usrelt = roster_elt->list; |
1663 while (sl_roster_usrelt) { // user list loop |
1663 while (sl_roster_usrelt) { // user list loop |
1664 roster_usrelt = (roster*) sl_roster_usrelt->data; |
1664 roster_usrelt = (roster_t *) sl_roster_usrelt->data; |
1665 |
1665 |
1666 if (roster_usrelt->type & roster_type) |
1666 if (roster_usrelt->type & roster_type) |
1667 pfunc(roster_usrelt, param); |
1667 pfunc(roster_usrelt, param); |
1668 |
1668 |
1669 sl_roster_usrelt = g_slist_next(sl_roster_usrelt); |
1669 sl_roster_usrelt = g_slist_next(sl_roster_usrelt); |
1676 // Call pfunction(buddy, param) for each buddy in the specified group. |
1676 // Call pfunction(buddy, param) for each buddy in the specified group. |
1677 void foreach_group_member(gpointer groupdata, |
1677 void foreach_group_member(gpointer groupdata, |
1678 void (*pfunc)(gpointer rosterdata, void *param), |
1678 void (*pfunc)(gpointer rosterdata, void *param), |
1679 void *param) |
1679 void *param) |
1680 { |
1680 { |
1681 roster *roster_elt; |
1681 roster_t *roster_elt; |
1682 GSList *sl_roster_usrelt; |
1682 GSList *sl_roster_usrelt; |
1683 roster *roster_usrelt; |
1683 roster_t *roster_usrelt; |
1684 |
1684 |
1685 roster_elt = groupdata; |
1685 roster_elt = groupdata; |
1686 |
1686 |
1687 if (!(roster_elt->type & ROSTER_TYPE_GROUP)) |
1687 if (!(roster_elt->type & ROSTER_TYPE_GROUP)) |
1688 return; |
1688 return; |
1689 |
1689 |
1690 sl_roster_usrelt = roster_elt->list; |
1690 sl_roster_usrelt = roster_elt->list; |
1691 while (sl_roster_usrelt) { // user list loop |
1691 while (sl_roster_usrelt) { // user list loop |
1692 GSList *next_sl_usrelt; |
1692 GSList *next_sl_usrelt; |
1693 roster_usrelt = (roster*) sl_roster_usrelt->data; |
1693 roster_usrelt = (roster_t *) sl_roster_usrelt->data; |
1694 |
1694 |
1695 next_sl_usrelt = g_slist_next(sl_roster_usrelt); |
1695 next_sl_usrelt = g_slist_next(sl_roster_usrelt); |
1696 pfunc(roster_usrelt, param); |
1696 pfunc(roster_usrelt, param); |
1697 sl_roster_usrelt = next_sl_usrelt; |
1697 sl_roster_usrelt = next_sl_usrelt; |
1698 } |
1698 } |
1704 // The list should be freed by the caller after use. |
1704 // The list should be freed by the caller after use. |
1705 GSList *compl_list(guint type) |
1705 GSList *compl_list(guint type) |
1706 { |
1706 { |
1707 GSList *list = NULL; |
1707 GSList *list = NULL; |
1708 GSList *sl_roster_elt = groups; |
1708 GSList *sl_roster_elt = groups; |
1709 roster *roster_elt; |
1709 roster_t *roster_elt; |
1710 GSList *sl_roster_usrelt; |
1710 GSList *sl_roster_usrelt; |
1711 roster *roster_usrelt; |
1711 roster_t *roster_usrelt; |
1712 |
1712 |
1713 while (sl_roster_elt) { // group list loop |
1713 while (sl_roster_elt) { // group list loop |
1714 roster_elt = (roster*) sl_roster_elt->data; |
1714 roster_elt = (roster_t *) sl_roster_elt->data; |
1715 |
1715 |
1716 if (roster_elt->type & ROSTER_TYPE_SPECIAL) |
1716 if (roster_elt->type & ROSTER_TYPE_SPECIAL) |
1717 continue; // Skip special items |
1717 continue; // Skip special items |
1718 |
1718 |
1719 if (type == ROSTER_TYPE_GROUP) { // (group names) |
1719 if (type == ROSTER_TYPE_GROUP) { // (group names) |
1720 if (roster_elt->name && *(roster_elt->name)) |
1720 if (roster_elt->name && *(roster_elt->name)) |
1721 list = g_slist_append(list, from_utf8(roster_elt->name)); |
1721 list = g_slist_append(list, from_utf8(roster_elt->name)); |
1722 } else { // ROSTER_TYPE_USER (jid) (or agent, or chatroom...) |
1722 } else { // ROSTER_TYPE_USER (jid) (or agent, or chatroom...) |
1723 sl_roster_usrelt = roster_elt->list; |
1723 sl_roster_usrelt = roster_elt->list; |
1724 while (sl_roster_usrelt) { // user list loop |
1724 while (sl_roster_usrelt) { // user list loop |
1725 roster_usrelt = (roster*) sl_roster_usrelt->data; |
1725 roster_usrelt = (roster_t *) sl_roster_usrelt->data; |
1726 |
1726 |
1727 if (roster_usrelt->jid) |
1727 if (roster_usrelt->jid) |
1728 list = g_slist_append(list, from_utf8(roster_usrelt->jid)); |
1728 list = g_slist_append(list, from_utf8(roster_usrelt->jid)); |
1729 |
1729 |
1730 sl_roster_usrelt = g_slist_next(sl_roster_usrelt); |
1730 sl_roster_usrelt = g_slist_next(sl_roster_usrelt); |