annotate mcabber/src/roster.c @ 403:17aa60c6dc63

Allow a different server name than the jid domain name Sync libjabber with upstream (centericq). The libjabber patch is from Ian Johannesen. This allows connecting to Google Talk, for example.
author Mikael Berthe <mikael@lilotux.net>
date Sat, 27 Aug 2005 11:21:27 +0200
parents f8f3c7493457
children 03f1e37759a6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1 /*
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
2 * roster.c -- Local roster implementation
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
3 *
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
4 * Copyright (C) 2005 Mikael Berthe <bmikael@lists.lilotux.net>
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
5 *
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or (at
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
9 * your option) any later version.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
10 *
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful, but
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
14 * General Public License for more details.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
15 *
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
19 * USA
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
20 */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
21
265
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
22 #define _GNU_SOURCE /* for strcasestr() */
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
23 #include <string.h>
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
24
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
25 #include "roster.h"
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
26
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
27
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
28 /* This is a private structure type for the roster */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
29
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
30 typedef struct {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
31 const gchar *name;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
32 const gchar *jid;
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
33 const gchar *status_msg;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
34 guint type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
35 enum imstatus status;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
36 guint flags;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
37 // list: user -> points to his group; group -> points to its users list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
38 GSList *list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
39 } roster;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
40
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
41
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
42 /* ### Variables ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
43
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
44 static int hide_offline_buddies;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
45 static GSList *groups;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
46 static GSList *unread_list;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
47 GList *buddylist;
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
48 GList *current_buddy;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
49 GList *alternate_buddy;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
50
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
51
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
52 /* ### Roster functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
53
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
54 // Comparison function used to search in the roster (compares jids and types)
336
eb994ee40029 Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents: 331
diff changeset
55 static gint roster_compare_jid_type(roster *a, roster *b) {
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
56 if (! (a->type & b->type))
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
57 return -1; // arbitrary (but should be != , of course)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
58 return strcasecmp(a->jid, b->jid);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
59 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
60
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
61 // Comparison function used to sort the roster (by name)
336
eb994ee40029 Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents: 331
diff changeset
62 static gint roster_compare_name(roster *a, roster *b) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
63 return strcasecmp(a->name, b->name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
64 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
65
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
66 // Finds a roster element (user, group, agent...), by jid or name
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
67 // If roster_type is 0, returns match of any type.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
68 // Returns the roster GSList element, or NULL if jid/name not found
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
69 GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
70 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
71 GSList *sl_roster_elt = groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
72 GSList *res;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
73 roster sample;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
74 GCompareFunc comp;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
75
192
62bc2992216b [/trunk] Changeset 204 by mikael
mikael
parents: 166
diff changeset
76 if (!jidname) return NULL;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
77
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
78 if (!roster_type)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
79 roster_type = ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_GROUP;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
80
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
81 sample.type = roster_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
82 if (type == jidsearch) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
83 sample.jid = jidname;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
84 comp = (GCompareFunc)&roster_compare_jid_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
85 } else if (type == namesearch) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
86 sample.name = jidname;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
87 comp = (GCompareFunc)&roster_compare_name;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
88 } else
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
89 return NULL; // should not happen
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
90
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
91 while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
92 roster *roster_elt = (roster*)sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
93 if (roster_type & ROSTER_TYPE_GROUP) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
94 if ((type == namesearch) && !strcasecmp(jidname, roster_elt->name))
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
95 return sl_roster_elt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
96 } else {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
97 res = g_slist_find_custom(roster_elt->list, &sample, comp);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
98 if (res)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
99 return res;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
100 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
101 sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
102 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
103 return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
104 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
105
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
106 // Returns pointer to new group, or existing group with that name
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
107 GSList *roster_add_group(const char *name)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
108 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
109 roster *roster_grp;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
110 // #1 Check name doesn't already exist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
111 if (!roster_find(name, namesearch, ROSTER_TYPE_GROUP)) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
112 // #2 Create the group node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
113 roster_grp = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
114 roster_grp->name = g_strdup(name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
115 roster_grp->type = ROSTER_TYPE_GROUP;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
116 // #3 Insert (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
117 groups = g_slist_insert_sorted(groups, roster_grp,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
118 (GCompareFunc)&roster_compare_name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
119 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
120 return roster_find(name, namesearch, ROSTER_TYPE_GROUP);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
121 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
122
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
123 // Returns a pointer to the new user, or existing user with that name
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
124 GSList *roster_add_user(const char *jid, const char *name, const char *group,
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
125 guint type)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
126 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
127 roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
128 roster *my_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
129 GSList *slist;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
130
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
131 if ((type != ROSTER_TYPE_USER) && (type != ROSTER_TYPE_AGENT)) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
132 // XXX Error message?
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
133 return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
134 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
135
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
136 // Let's be arbitrary: default group has an empty name ("").
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
137 if (!group) group = "";
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
138
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
139 // #1 Check this user doesn't already exist
192
62bc2992216b [/trunk] Changeset 204 by mikael
mikael
parents: 166
diff changeset
140 slist = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
62bc2992216b [/trunk] Changeset 204 by mikael
mikael
parents: 166
diff changeset
141 if (slist) return slist;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
142 // #2 add group if necessary
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
143 slist = roster_add_group(group);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
144 if (!slist) return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
145 my_group = (roster*)slist->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
146 // #3 Create user node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
147 roster_usr = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
148 roster_usr->jid = g_strdup(jid);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
149 if (name) {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
150 roster_usr->name = g_strdup(name);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
151 } else {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
152 gchar *p, *str = g_strdup(jid);
80
7fb661f19a77 [/trunk] Changeset 94 by mikael
mikael
parents: 78
diff changeset
153 p = strstr(str, "/");
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
154 if (p) *p = '\0';
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
155 roster_usr->name = g_strdup(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
156 g_free(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
157 }
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
158 roster_usr->type = type; //ROSTER_TYPE_USER;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
159 roster_usr->list = slist; // (my_group SList element)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
160 // #4 Insert node (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
161 my_group->list = g_slist_insert_sorted(my_group->list, roster_usr,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
162 (GCompareFunc)&roster_compare_name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
163 return roster_find(jid, jidsearch, type);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
164 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
165
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
166 // Removes user (jid) from roster, frees allocated memory
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
167 void roster_del_user(const char *jid)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
168 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
169 GSList *sl_user, *sl_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
170 GSList **sl_group_listptr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
171 roster *roster_usr;
246
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
172 GSList *node;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
173
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
174 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
175 if (sl_user == NULL)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
176 return;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
177 roster_usr = (roster*)sl_user->data;
246
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
178
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
179 // Remove (if present) from unread messages list
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
180 node = g_slist_find(unread_list, roster_usr);
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
181 if (node) unread_list = g_slist_delete_link(unread_list, node);
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
182
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
183 // Let's free memory (jid, name, status message)
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
184 if (roster_usr->jid) g_free((gchar*)roster_usr->jid);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
185 if (roster_usr->name) g_free((gchar*)roster_usr->name);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
186 if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg);
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
187 g_free(roster_usr);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
188
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
189 // That's a little complex, we need to dereference twice
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
190 sl_group = ((roster*)sl_user->data)->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
191 sl_group_listptr = &((roster*)(sl_group->data))->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
192 *sl_group_listptr = g_slist_delete_link(*sl_group_listptr, sl_user);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
193
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
194 // We need to rebuild the list
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
195 if (current_buddy)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
196 buddylist_build();
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
197 // TODO What we could do, too, is to check if the deleted node is
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
198 // current_buddy, in which case we could move current_buddy to the
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
199 // previous (or next) node.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
200 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
201
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
202 // Free all roster data and call buddylist_build() to free the buddylist.
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
203 void roster_free(void)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
204 {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
205 GSList *sl_grp = groups;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
206
301
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
207 // Free unread_list
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
208 if (unread_list) {
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
209 g_slist_free(unread_list);
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
210 unread_list = NULL;
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
211 }
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
212
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
213 // Walk through groups
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
214 while (sl_grp) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
215 roster *roster_grp = (roster*)sl_grp->data;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
216 GSList *sl_usr = roster_grp->list;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
217 // Walk through this group users
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
218 while (sl_usr) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
219 roster *roster_usr = (roster*)sl_usr->data;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
220 // Free name and jid
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
221 if (roster_usr->jid) g_free((gchar*)roster_usr->jid);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
222 if (roster_usr->name) g_free((gchar*)roster_usr->name);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
223 if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg);
214
9484ba81ec53 [/trunk] Changeset 226 by mikael
mikael
parents: 212
diff changeset
224 g_free(roster_usr);
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
225 sl_usr = g_slist_next(sl_usr);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
226 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
227 // Free group's users list
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
228 if (roster_grp->list)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
229 g_slist_free(roster_grp->list);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
230 // Free group's name and jid
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
231 if (roster_grp->jid) g_free((gchar*)roster_grp->jid);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
232 if (roster_grp->name) g_free((gchar*)roster_grp->name);
214
9484ba81ec53 [/trunk] Changeset 226 by mikael
mikael
parents: 212
diff changeset
233 g_free(roster_grp);
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
234 sl_grp = g_slist_next(sl_grp);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
235 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
236 // Free groups list
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
237 if (groups) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
238 g_slist_free(groups);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
239 groups = NULL;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
240 // Update (i.e. free) buddylist
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
241 if (buddylist)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
242 buddylist_build();
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
243 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
244 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
245
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
246 void roster_setstatus(const char *jid, enum imstatus bstat,
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
247 const char *status_msg)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
248 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
249 GSList *sl_user;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
250 roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
251
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
252 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
92
c6270994fb6e [/trunk] Changeset 106 by mikael
mikael
parents: 90
diff changeset
253 // If we can't find it, we add it
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
254 if (sl_user == NULL)
92
c6270994fb6e [/trunk] Changeset 106 by mikael
mikael
parents: 90
diff changeset
255 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
256
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
257 roster_usr = (roster*)sl_user->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
258 roster_usr->status = bstat;
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
259 if (roster_usr->status_msg) {
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
260 g_free((gchar*)roster_usr->status_msg);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
261 roster_usr->status_msg = NULL;
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
262 }
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
263 if (status_msg)
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
264 roster_usr->status_msg = g_strdup(status_msg);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
265 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
266
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
267 // roster_setflags()
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
268 // Set one or several flags to value (TRUE/FALSE)
80
7fb661f19a77 [/trunk] Changeset 94 by mikael
mikael
parents: 78
diff changeset
269 void roster_setflags(const char *jid, guint flags, guint value)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
270 {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
271 GSList *sl_user;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
272 roster *roster_usr;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
273
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
274 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
275 if (sl_user == NULL)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
276 return;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
277
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
278 roster_usr = (roster*)sl_user->data;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
279 if (value)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
280 roster_usr->flags |= flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
281 else
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
282 roster_usr->flags &= ~flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
283 }
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
284
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
285 // roster_msg_setflag()
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
286 // Set the ROSTER_FLAG_MSG to the given value for the given jid.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
287 // It will update the buddy's group message flag.
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
288 // Update the unread messages list too.
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
289 void roster_msg_setflag(const char *jid, guint value)
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
290 {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
291 GSList *sl_user;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
292 roster *roster_usr, *roster_grp;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
293
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
294 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
295 if (sl_user == NULL)
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
296 return;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
297
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
298 roster_usr = (roster*)sl_user->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
299 roster_grp = (roster*)roster_usr->list->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
300 if (value) {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
301 // Message flag is TRUE. This is easy, we just have to set both flags
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
302 // to TRUE...
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
303 roster_usr->flags |= ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
304 roster_grp->flags |= ROSTER_FLAG_MSG; // group
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
305 // Append the roster_usr to unread_list, but avoid duplicates
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
306 if (!g_slist_find(unread_list, roster_usr))
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
307 unread_list = g_slist_append(unread_list, roster_usr);
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
308 } else {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
309 // Message flag is FALSE.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
310 guint msg = FALSE;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
311 roster_usr->flags &= ~ROSTER_FLAG_MSG;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
312 if (unread_list) {
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
313 GSList *node = g_slist_find(unread_list, roster_usr);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
314 if (node) unread_list = g_slist_delete_link(unread_list, node);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
315 }
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
316 // For the group value we need to watch all buddies in this group;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
317 // if one is flagged, then the group will be flagged.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
318 // I will re-use sl_user and roster_usr here, as they aren't used
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
319 // anymore.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
320 sl_user = roster_grp->list;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
321 while (sl_user) {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
322 roster_usr = (roster*)sl_user->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
323 if (roster_usr->flags & ROSTER_FLAG_MSG) {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
324 msg = TRUE;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
325 break;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
326 }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
327 sl_user = g_slist_next(sl_user);
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
328 }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
329 if (!msg)
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
330 roster_grp->flags &= ~ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
331 else
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
332 roster_grp->flags |= ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
333 // Actually the "else" part is useless, because the group
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
334 // ROSTER_FLAG_MSG should already be set...
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
335 }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
336 }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
337
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
338 void roster_settype(const char *jid, guint type)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
339 {
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
340 GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
341 roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
342
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
343 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
344 return;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
345
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
346 roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
347 roster_usr->type = type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
348 }
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
349
90
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
350 enum imstatus roster_getstatus(const char *jid)
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
351 {
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
352 GSList *sl_user;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
353 roster *roster_usr;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
354
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
355 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
356 if (sl_user == NULL)
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
357 return offline; // Not in the roster, anyway...
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
358
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
359 roster_usr = (roster*)sl_user->data;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
360 return roster_usr->status;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
361 }
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
362
318
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
363 const char *roster_getstatusmsg(const char *jid)
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
364 {
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
365 GSList *sl_user;
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
366 roster *roster_usr;
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
367
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
368 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
369 if (sl_user == NULL)
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
370 return offline; // Not in the roster, anyway...
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
371
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
372 roster_usr = (roster*)sl_user->data;
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
373 return roster_usr->status_msg;
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
374 }
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
375
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
376 guint roster_gettype(const char *jid)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
377 {
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
378 GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
379 roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
380
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
381 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
382 return 0;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
383
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
384 roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
385 return roster_usr->type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
386 }
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
387
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
388 inline guint roster_exists(const char *jidname, enum findwhat type,
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
389 guint roster_type)
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
390 {
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
391 if (roster_find(jidname, type, roster_type))
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
392 return TRUE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
393 return FALSE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
394 }
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
395
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
396
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
397 /* ### BuddyList functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
398
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
399 // buddylist_set_hide_offline_buddies(hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
400 // "hide" values: 1=hide 0=show_all -1=invert
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
401 void buddylist_set_hide_offline_buddies(int hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
402 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
403 if (hide < 0) // NEG (invert)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
404 hide_offline_buddies = !hide_offline_buddies;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
405 else if (hide == 0) // FALSE (don't hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
406 hide_offline_buddies = 0;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
407 else // TRUE (hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
408 hide_offline_buddies = 1;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
409 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
410
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
411 inline int buddylist_get_hide_offline_buddies(void)
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
412 {
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
413 return hide_offline_buddies;
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
414 }
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
415
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
416 // buddylist_build()
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
417 // Creates the buddylist from the roster entries.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
418 void buddylist_build(void)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
419 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
420 GSList *sl_roster_elt = groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
421 roster *roster_elt;
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
422 roster *roster_current_buddy = NULL;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
423 roster *roster_alternate_buddy = NULL;
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
424 int shrunk_group;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
425
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
426 // We need to remember which buddy is selected.
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
427 if (current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
428 roster_current_buddy = BUDDATA(current_buddy);
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
429 current_buddy = NULL;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
430 if (alternate_buddy)
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
431 roster_alternate_buddy = BUDDATA(alternate_buddy);
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
432 alternate_buddy = NULL;
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
433
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
434 // Destroy old buddylist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
435 if (buddylist) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
436 g_list_free(buddylist);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
437 buddylist = NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
438 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
439
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
440 // Create the new list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
441 while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
442 GSList *sl_roster_usrelt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
443 roster *roster_usrelt;
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
444 guint pending_group = FALSE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
445 roster_elt = (roster*) sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
446
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
447 // Add the group now unless hide_offline_buddies is set,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
448 // in which case we'll add it only if an online buddy belongs to it.
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
449 // We take care to keep the current_buddy in the list, too.
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
450 if (!hide_offline_buddies || roster_elt == roster_current_buddy)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
451 buddylist = g_list_append(buddylist, roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
452 else
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
453 pending_group = TRUE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
454
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
455 shrunk_group = roster_elt->flags & ROSTER_FLAG_HIDE;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
456
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
457 sl_roster_usrelt = roster_elt->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
458 while (sl_roster_usrelt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
459 roster_usrelt = (roster*) sl_roster_usrelt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
460
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
461 // Buddy will be added if either:
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
462 // - hide_offline_buddies is FALSE
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
463 // - buddy is not offline
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
464 // - buddy has a lock (for example the buddy window is currently open)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
465 // - buddy has a pending (non-read) message
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
466 // - group isn't hidden (shrunk)
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
467 // - this is the current_buddy
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
468 if (!hide_offline_buddies || roster_usrelt == roster_current_buddy ||
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
469 (buddy_getstatus((gpointer)roster_usrelt) != offline) ||
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
470 (buddy_getflags((gpointer)roster_usrelt) &
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
471 (ROSTER_FLAG_LOCK | ROSTER_FLAG_MSG))) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
472 // This user should be added. Maybe the group hasn't been added yet?
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
473 if (pending_group &&
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
474 (hide_offline_buddies || roster_usrelt == roster_current_buddy)) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
475 // It hasn't been done yet
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
476 buddylist = g_list_append(buddylist, roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
477 pending_group = FALSE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
478 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
479 // Add user
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
480 // XXX Should we add the user if there is a message and
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
481 // the group is shrunk? If so, we'd need to check LOCK flag too,
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
482 // perhaps...
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
483 if (!shrunk_group)
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
484 buddylist = g_list_append(buddylist, roster_usrelt);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
485 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
486
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
487 sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
488 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
489 sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
490 }
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
491
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
492 // Check if we can find our saved current_buddy...
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
493 if (roster_current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
494 current_buddy = g_list_find(buddylist, roster_current_buddy);
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
495 if (roster_alternate_buddy)
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
496 alternate_buddy = g_list_find(buddylist, roster_alternate_buddy);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
497 // current_buddy initialization
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
498 if (!current_buddy || (g_list_position(buddylist, current_buddy) == -1))
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
499 current_buddy = g_list_first(buddylist);
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
500 // XXX Maybe we should set update_roster to TRUE there?
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
501 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
502
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
503 // buddy_hide_group(roster, hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
504 // "hide" values: 1=hide 0=show_all -1=invert
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
505 void buddy_hide_group(gpointer rosterdata, int hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
506 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
507 roster *roster_usr = rosterdata;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
508 if (hide > 0) // TRUE (hide)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
509 roster_usr->flags |= ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
510 else if (hide < 0) // NEG (invert)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
511 roster_usr->flags ^= ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
512 else // FALSE (don't hide)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
513 roster_usr->flags &= ~ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
514 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
515
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
516 const char *buddy_getjid(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
517 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
518 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
519 return roster_usr->jid;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
520 }
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
521
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
522 // buddy_setgroup()
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
523 // Change the group of current buddy
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
524 //
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
525 // Warning! This function changes current_buddy!
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
526 // Warning! Old buddy is deleted, so you can't acces to its jid/name after
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
527 // calling this function.
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
528 void buddy_setgroup(gpointer rosterdata, char *newgroupname)
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
529 {
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
530 roster *roster_usr = rosterdata;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
531 GSList **sl_group;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
532 GSList *sl_clone;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
533 roster *roster_clone;
331
1510dda4ad71 Don't loose alternate_buddy when the buddy is moved ("/move")
Mikael Berthe <mikael@lilotux.net>
parents: 330
diff changeset
534 int is_alternate;
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
535
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
536 // A group has no group :)
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
537 if (roster_usr->type & ROSTER_TYPE_GROUP) return;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
538
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
539 // Remove the buddy from current group
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
540 sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
541 *sl_group = g_slist_remove(*sl_group, rosterdata);
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
542
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
543 // Add the buddy to its new group; actually we "clone" this buddy...
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
544 sl_clone = roster_add_user(roster_usr->jid, roster_usr->name,
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
545 newgroupname, roster_usr->type);
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
546 roster_clone = (roster*)sl_clone->data;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
547 roster_clone->status = roster_usr->status;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
548 roster_clone->flags = roster_usr->flags;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
549
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
550 // Free old buddy
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
551 if (roster_usr->jid) g_free((gchar*)roster_usr->jid);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
552 if (roster_usr->name) g_free((gchar*)roster_usr->name);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
553 if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg);
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
554 g_free(roster_usr);
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
555
212
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
556 // If new new group is folded, the curren_buddy will be lost, and the
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
557 // chat window won't be correctly refreshed. So we make sure it isn't...
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
558 ((roster*)((GSList*)roster_clone->list)->data)->flags &= ~ROSTER_FLAG_HIDE;
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
559
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
560 // Little trick to have current_body pointing to the cloned buddy
331
1510dda4ad71 Don't loose alternate_buddy when the buddy is moved ("/move")
Mikael Berthe <mikael@lilotux.net>
parents: 330
diff changeset
561 is_alternate = (alternate_buddy == current_buddy);
212
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
562 buddylist = g_list_append(buddylist, roster_clone);
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
563 current_buddy = g_list_find(buddylist, roster_clone);
331
1510dda4ad71 Don't loose alternate_buddy when the buddy is moved ("/move")
Mikael Berthe <mikael@lilotux.net>
parents: 330
diff changeset
564 if (is_alternate)
1510dda4ad71 Don't loose alternate_buddy when the buddy is moved ("/move")
Mikael Berthe <mikael@lilotux.net>
parents: 330
diff changeset
565 alternate_buddy = current_buddy;
212
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
566
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
567 buddylist_build();
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
568 }
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
569
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
570 void buddy_setname(gpointer rosterdata, char *newname)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
571 {
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
572 roster *roster_usr = rosterdata;
209
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
573 GSList **sl_group;
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
574
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
575 // TODO For groups, we need to check for unicity
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
576 // However, renaming a group boils down to moving all its buddies to
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
577 // another group, so calling this function is not really necessary...
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
578 if (roster_usr->type & ROSTER_TYPE_GROUP) return;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
579
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
580 if (roster_usr->name) {
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
581 g_free((gchar*)roster_usr->name);
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
582 roster_usr->name = NULL;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
583 }
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
584 if (newname)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
585 roster_usr->name = g_strdup(newname);
209
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
586
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
587 // We need to resort the group list
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
588 sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list;
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
589 *sl_group = g_slist_sort(*sl_group, (GCompareFunc)&roster_compare_name);
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
590
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
591 buddylist_build();
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
592 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
593
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
594 const char *buddy_getname(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
595 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
596 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
597 return roster_usr->name;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
598 }
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
599
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
600 // buddy_getgroupname()
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
601 // Returns a pointer on buddy's group name.
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
602 const char *buddy_getgroupname(gpointer rosterdata)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
603 {
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
604 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
605
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
606 if (roster_usr->type & ROSTER_TYPE_GROUP)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
607 return roster_usr->name;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
608
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
609 // This is a user
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
610 return ((roster*)((GSList*)roster_usr->list)->data)->name;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
611 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
612
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
613 // buddy_getgroup()
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
614 // Returns a pointer on buddy's group.
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
615 gpointer buddy_getgroup(gpointer rosterdata)
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
616 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
617 roster *roster_usr = rosterdata;
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
618
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
619 if (roster_usr->type & ROSTER_TYPE_GROUP)
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
620 return rosterdata;
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
621
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
622 // This is a user
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
623 return (gpointer)((GSList*)roster_usr->list)->data;
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
624 }
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
625
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
626 guint buddy_gettype(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
627 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
628 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
629 return roster_usr->type;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
630 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
631
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
632 enum imstatus buddy_getstatus(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
633 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
634 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
635 return roster_usr->status;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
636 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
637
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
638 const char *buddy_getstatusmsg(gpointer rosterdata)
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
639 {
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
640 roster *roster_usr = rosterdata;
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
641 return roster_usr->status_msg;
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
642 }
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
643
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
644 // buddy_setflags()
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
645 // Set one or several flags to value (TRUE/FALSE)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
646 void buddy_setflags(gpointer rosterdata, guint flags, guint value)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
647 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
648 roster *roster_usr = rosterdata;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
649 if (value)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
650 roster_usr->flags |= flags;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
651 else
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
652 roster_usr->flags &= ~flags;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
653 }
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
654
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
655 guint buddy_getflags(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
656 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
657 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
658 return roster_usr->flags;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
659 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
660
265
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
661 // buddy_search(string)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
662 // Look for a buddy whose name or jid contains string.
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
663 // Search begins at current_buddy; if no match is found in the the buddylist,
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
664 // return NULL;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
665 GList *buddy_search(char *string)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
666 {
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
667 GList *buddy = current_buddy;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
668 roster *roster_usr;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
669 if (!buddylist || !current_buddy) return NULL;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
670 for (;;) {
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
671 buddy = g_list_next(buddy);
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
672 if (!buddy)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
673 buddy = buddylist;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
674
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
675 roster_usr = (roster*)buddy->data;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
676 if (roster_usr->jid && strcasestr(roster_usr->jid, string))
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
677 return buddy;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
678 if (roster_usr->name && strcasestr(roster_usr->name, string))
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
679 return buddy;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
680
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
681 if (buddy == current_buddy)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
682 return NULL; // Back to the beginning, and no match found
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
683 }
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
684 }
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
685
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
686 // compl_list(type)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
687 // Returns a list of jid's or groups. (For commands completion)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
688 // type: ROSTER_TYPE_USER (jid's) or ROSTER_TYPE_GROUP (group names)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
689 // The list should be freed by the caller after use.
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
690 GSList *compl_list(guint type)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
691 {
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
692 GSList *list = NULL;
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
693 GList *buddy = buddylist;
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
694
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
695 for ( ; buddy ; buddy = g_list_next(buddy)) {
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
696 guint btype = buddy_gettype(BUDDATA(buddy));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
697
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
698 if (type == ROSTER_TYPE_GROUP) { // (group names)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
699 if (btype == ROSTER_TYPE_GROUP) {
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
700 const char *bname = buddy_getname(BUDDATA(buddy));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
701 if ((bname) && (*bname))
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
702 list = g_slist_append(list, g_strdup(bname));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
703 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
704 } else { // ROSTER_TYPE_USER (jid)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
705 const char *bjid = buddy_getjid(BUDDATA(buddy));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
706 if (bjid)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
707 list = g_slist_append(list, g_strdup(bjid));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
708 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
709 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
710
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
711 return list;
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
712 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
713
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
714 // unread_msg(rosterdata)
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
715 // Return the next buddy with an unread message. If the parameter is NULL,
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
716 // return the first buddy with an unread message.
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
717 gpointer unread_msg(gpointer rosterdata)
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
718 {
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
719 GSList *unread, *next_unread;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
720
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
721 if (!unread_list) return NULL;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
722 // First unread message
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
723 if (!rosterdata) return unread_list->data;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
724
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
725 unread = g_slist_find(unread_list, rosterdata);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
726 if (!unread) return unread_list->data;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
727
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
728 next_unread = g_slist_next(unread);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
729 if (next_unread) return next_unread->data;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
730
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
731 return unread_list->data;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
732 }
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
733