annotate mcabber/src/roster.c @ 147:7571de4aed73

[/trunk] Changeset 159 by mikael * Fix a bug in buddylist_build() * We now lock the current buddy even not when being in chat mode. For example, if we're writing to s.o. and he leaves just before we press enter, we won't write to the wrong buddy... If the current_buddy is a group, we lock it too. * Remove MCABBER_TESTUNIT ifdef in roster.h (test program isn't up-to-date anymore...)
author mikael
date Fri, 29 Apr 2005 19:56:28 +0000
parents 6533a231a65e
children c3624b2a7059
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
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
3 *
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
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
22 #include <string.h>
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
23
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
24 #include "roster.h"
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
25
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
26
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
27 /* This is a private structure type for the roster */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
28
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
29 typedef struct {
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
30 const char *name;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
31 const char *jid;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
32 guint type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
33 enum imstatus status;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
34 guint flags;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
35 // list: user -> points to his group; group -> points to its users list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
36 GSList *list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
37 } roster;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
38
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
39
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
40 /* ### Variables ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
41
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
42 static int hide_offline_buddies;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
43 static GSList *groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
44 GList *buddylist;
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
45 GList *current_buddy;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
46
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
47 #ifdef MCABBER_TESTUNIT
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
48 // Export groups for testing routines
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
49 GSList **pgroups = &groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
50 #endif
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
51
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
52
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
53 /* ### Roster functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
54
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
55 // Comparison function used to search in the roster (compares jids and types)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
56 gint roster_compare_jid_type(roster *a, roster *b) {
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
57 if (! (a->type & b->type))
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
58 return -1; // arbitrary (but should be != , of course)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
59 return strcasecmp(a->jid, b->jid);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
60 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
61
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
62 // Comparison function used to sort the roster (by name)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
63 gint roster_compare_name(roster *a, roster *b) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
64 return strcasecmp(a->name, b->name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
65 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
66
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
67 // Finds a roster element (user, group, agent...), by jid or name
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
68 // If roster_type is 0, returns match of any type.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
69 // Returns the roster GSList element, or NULL if jid/name not found
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
70 GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
71 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
72 GSList *sl_roster_elt = groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
73 GSList *res;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
74 roster sample;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
75 GCompareFunc comp;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
76
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
77 if (!jidname)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
78 return NULL; // should not happen
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
79
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
80 if (!roster_type)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
81 roster_type = ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_GROUP;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
82
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
83 sample.type = roster_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
84 if (type == jidsearch) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
85 sample.jid = jidname;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
86 comp = (GCompareFunc)&roster_compare_jid_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
87 } else if (type == namesearch) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
88 sample.name = jidname;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
89 comp = (GCompareFunc)&roster_compare_name;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
90 } else
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
91 return NULL; // should not happen
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
92
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
93 while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
94 roster *roster_elt = (roster*)sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
95 if (roster_type & ROSTER_TYPE_GROUP) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
96 if ((type == namesearch) && !strcasecmp(jidname, roster_elt->name))
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
97 return sl_roster_elt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
98 } else {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
99 res = g_slist_find_custom(roster_elt->list, &sample, comp);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
100 if (res)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
101 return res;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
102 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
103 sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
104 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
105 return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
106 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
107
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
108 // Returns pointer to new group, or existing group with that name
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
109 GSList *roster_add_group(const char *name)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
110 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
111 roster *roster_grp;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
112 // #1 Check name doesn't already exist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
113 if (!roster_find(name, namesearch, ROSTER_TYPE_GROUP)) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
114 // #2 Create the group node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
115 roster_grp = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
116 roster_grp->name = g_strdup(name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
117 roster_grp->type = ROSTER_TYPE_GROUP;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
118 // #3 Insert (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
119 groups = g_slist_insert_sorted(groups, roster_grp,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
120 (GCompareFunc)&roster_compare_name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
121 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
122 return roster_find(name, namesearch, ROSTER_TYPE_GROUP);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
123 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
124
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
125 // 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
126 GSList *roster_add_user(const char *jid, const char *name, const char *group,
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
127 guint type)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
128 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
129 roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
130 roster *my_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
131 GSList *slist;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
132
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
133 if ((type != ROSTER_TYPE_USER) && (type != ROSTER_TYPE_AGENT)) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
134 // XXX Error message?
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
135 return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
136 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
137
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
138 // Let's be arbitrary: default group has an empty name ("").
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
139 if (!group) group = "";
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
140
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
141 // #1 Check this user doesn't already exist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
142 if ((slist = roster_find(jid, jidsearch, type)) != NULL)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
143 return slist;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
144 // #2 add group if necessary
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
145 slist = roster_add_group(group);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
146 if (!slist) return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
147 my_group = (roster*)slist->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
148 // #3 Create user node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
149 roster_usr = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
150 roster_usr->jid = g_strdup(jid);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
151 if (name) {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
152 roster_usr->name = g_strdup(name);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
153 } else {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
154 gchar *p, *str = g_strdup(jid);
80
7fb661f19a77 [/trunk] Changeset 94 by mikael
mikael
parents: 78
diff changeset
155 p = strstr(str, "/");
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
156 if (p) *p = '\0';
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
157 roster_usr->name = g_strdup(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
158 g_free(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
159 }
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
160 roster_usr->type = type; //ROSTER_TYPE_USER;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
161 roster_usr->list = slist; // (my_group SList element)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
162 // #4 Insert node (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
163 my_group->list = g_slist_insert_sorted(my_group->list, roster_usr,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
164 (GCompareFunc)&roster_compare_name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
165 return roster_find(jid, jidsearch, type);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
166 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
167
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
168 // Removes user (jid) from roster, frees allocated memory
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
169 void roster_del_user(const char *jid)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
170 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
171 GSList *sl_user, *sl_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
172 GSList **sl_group_listptr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
173 roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
174
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
175 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
176 if (sl_user == NULL)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
177 return;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
178 // Let's free memory (jid, name)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
179 roster_usr = (roster*)sl_user->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
180 if (roster_usr->jid)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
181 g_free((gchar*)roster_usr->jid);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
182 if (roster_usr->name)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
183 g_free((gchar*)roster_usr->name);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
184
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
185 // That's a little complex, we need to dereference twice
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
186 sl_group = ((roster*)sl_user->data)->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
187 sl_group_listptr = &((roster*)(sl_group->data))->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
188 *sl_group_listptr = g_slist_delete_link(*sl_group_listptr, sl_user);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
189
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
190 // We need to rebuild the list
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
191 if (current_buddy)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
192 buddylist_build();
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
193 // TODO What we should do, too, is to check if the deleted node is
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
194 // current_buddy, in which case we could move current_buddy to the
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
195 // previous (or next) node.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
196 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
197
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
198 void roster_setstatus(const char *jid, enum imstatus bstat)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
199 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
200 GSList *sl_user;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
201 roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
202
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
203 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
92
c6270994fb6e [/trunk] Changeset 106 by mikael
mikael
parents: 90
diff changeset
204 // If we can't find it, we add it
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
205 if (sl_user == NULL)
92
c6270994fb6e [/trunk] Changeset 106 by mikael
mikael
parents: 90
diff changeset
206 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
207
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
208 roster_usr = (roster*)sl_user->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
209 roster_usr->status = bstat;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
210 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
211
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
212 // roster_setflags()
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
213 // Set one or several flags to value (TRUE/FALSE)
80
7fb661f19a77 [/trunk] Changeset 94 by mikael
mikael
parents: 78
diff changeset
214 void roster_setflags(const char *jid, guint flags, guint value)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
215 {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
216 GSList *sl_user;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
217 roster *roster_usr;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
218
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
219 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
220 if (sl_user == NULL)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
221 return;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
222
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
223 roster_usr = (roster*)sl_user->data;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
224 if (value)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
225 roster_usr->flags |= flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
226 else
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
227 roster_usr->flags &= ~flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
228 }
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
229
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
230 void roster_settype(const char *jid, guint type)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
231 {
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
232 GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
233 roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
234
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
235 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
236 return;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
237
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
238 roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
239 roster_usr->type = type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
240 }
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
241
90
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
242 enum imstatus roster_getstatus(const char *jid)
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
243 {
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
244 GSList *sl_user;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
245 roster *roster_usr;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
246
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
247 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
248 if (sl_user == NULL)
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
249 return offline; // Not in the roster, anyway...
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
250
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
251 roster_usr = (roster*)sl_user->data;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
252 return roster_usr->status;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
253 }
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
254
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
255 guint roster_gettype(const char *jid)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
256 {
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
257 GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
258 roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
259
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
260 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
261 return 0;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
262
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
263 roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
264 return roster_usr->type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
265 }
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
266
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
267 inline guint roster_exists(const char *jidname, enum findwhat type,
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
268 guint roster_type)
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
269 {
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
270 if (roster_find(jidname, type, roster_type))
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
271 return TRUE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
272 return FALSE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
273 }
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
274
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
275 // char *roster_getgroup(...) / Or *GSList? Which use??
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
276 // ... setgroup(char*) ??
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
277 // guchar roster_getflags(...)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
278 // guchar roster_getname(...) / setname ??
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
279 // roster_del_group?
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
280
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
281
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
282 /* ### BuddyList functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
283
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
284 // buddylist_set_hide_offline_buddies(hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
285 // "hide" values: 1=hide 0=show_all -1=invert
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
286 void buddylist_set_hide_offline_buddies(int hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
287 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
288 if (hide < 0) // NEG (invert)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
289 hide_offline_buddies = !hide_offline_buddies;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
290 else if (hide == 0) // FALSE (don't hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
291 hide_offline_buddies = 0;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
292 else // TRUE (hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
293 hide_offline_buddies = 1;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
294 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
295
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
296 inline int buddylist_get_hide_offline_buddies(void)
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
297 {
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
298 return hide_offline_buddies;
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
299 }
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
300
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
301 // buddylist_build()
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
302 // Creates the buddylist from the roster entries.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
303 void buddylist_build(void)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
304 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
305 GSList *sl_roster_elt = groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
306 roster *roster_elt;
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
307 roster *roster_current_buddy = NULL;
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
308 int shrunk_group;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
309
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
310 // We need to remember which buddy is selected.
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
311 if (current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
312 roster_current_buddy = BUDDATA(current_buddy);
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
313 current_buddy = NULL;
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
314
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
315 // Destroy old buddylist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
316 if (buddylist) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
317 g_list_free(buddylist);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
318 buddylist = NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
319 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
320
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
321 // Create the new list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
322 while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
323 GSList *sl_roster_usrelt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
324 roster *roster_usrelt;
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
325 guint pending_group = FALSE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
326 roster_elt = (roster*) sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
327
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
328 // Add the group now unless hide_offline_buddies is set,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
329 // 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
330 // We take care to keep the current_buddy in the list, too.
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
331 if (!hide_offline_buddies || roster_elt == roster_current_buddy)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
332 buddylist = g_list_append(buddylist, roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
333 else
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
334 pending_group = TRUE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
335
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
336 shrunk_group = roster_elt->flags & ROSTER_FLAG_HIDE;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
337
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
338 sl_roster_usrelt = roster_elt->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
339 while (sl_roster_usrelt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
340 roster_usrelt = (roster*) sl_roster_usrelt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
341
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
342 // Buddy will be added if either:
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
343 // - hide_offline_buddies is FALSE
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
344 // - buddy is not offline
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
345 // - buddy has a lock (for example the buddy window is currently open)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
346 // - buddy has a pending (non-read) message
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
347 // - group isn't hidden (shrunk)
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
348 // - this is the current_buddy
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
349 if (!hide_offline_buddies || roster_usrelt == roster_current_buddy ||
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
350 (buddy_getstatus((gpointer)roster_usrelt) != offline) ||
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
351 (buddy_getflags((gpointer)roster_usrelt) &
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
352 (ROSTER_FLAG_LOCK | ROSTER_FLAG_MSG))) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
353 // 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
354 if (pending_group &&
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
355 (hide_offline_buddies || roster_usrelt == roster_current_buddy)) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
356 // It hasn't been done yet
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
357 buddylist = g_list_append(buddylist, roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
358 pending_group = FALSE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
359 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
360 // Add user
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
361 // XXX Should we add the user if there is a message and
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
362 // 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
363 // perhaps...
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
364 if (!shrunk_group)
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
365 buddylist = g_list_append(buddylist, roster_usrelt);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
366 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
367
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
368 sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
369 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
370 sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
371 }
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
372
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
373 // Check if we can find our saved current_buddy...
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
374 if (roster_current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
375 current_buddy = g_list_find(buddylist, roster_current_buddy);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
376 // current_buddy initialization
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
377 if (!current_buddy || (g_list_position(buddylist, current_buddy) == -1))
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
378 current_buddy = g_list_first(buddylist);
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
379 // XXX Maybe we should set update_roster to TRUE there?
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
380 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
381
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
382 // buddy_hide_group(roster, hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
383 // "hide" values: 1=hide 0=show_all -1=invert
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
384 void buddy_hide_group(gpointer rosterdata, int hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
385 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
386 roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
387 if (hide > 0) // TRUE (hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
388 roster->flags |= ROSTER_FLAG_HIDE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
389 else if (hide < 0) // NEG (invert)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
390 roster->flags ^= ROSTER_FLAG_HIDE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
391 else // FALSE (don't hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
392 roster->flags &= ~ROSTER_FLAG_HIDE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
393 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
394
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
395 const char *buddy_getjid(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
396 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
397 roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
398 return roster->jid;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
399 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
400
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
401 const char *buddy_getname(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
402 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
403 roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
404 return roster->name;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
405 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
406
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
407 guint buddy_gettype(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
408 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
409 roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
410 return roster->type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
411 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
412
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
413 enum imstatus buddy_getstatus(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
414 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
415 roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
416 return roster->status;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
417 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
418
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
419 // buddy_setflags()
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
420 // Set one or several flags to value (TRUE/FALSE)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
421 void buddy_setflags(gpointer rosterdata, guint flags, guint value)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
422 {
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
423 roster *roster = rosterdata;
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
424 if (value)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
425 roster->flags |= flags;
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
426 else
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
427 roster->flags &= ~flags;
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
428 }
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
429
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
430 guint buddy_getflags(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
431 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
432 roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
433 return roster->flags;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
434 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
435