2
* $Id: xmpp-rosters-tools.c,v 1.8 2008/04/05 20:50:45 errtu Exp $
4
* Copyright (C) 2007 Colin DIDIER
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License version 2 as
8
* published by the Free Software Foundation.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License along
16
* with this program; if not, write to the Free Software Foundation, Inc.,
17
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26
#include "xmpp-servers.h"
27
#include "xmpp-rosters.h"
28
#include "xmpp-rosters-tools.h"
29
#include "xmpp-tools.h"
32
find_user_func(gconstpointer user, gconstpointer jid)
34
g_return_val_if_fail(user != NULL, -1);
35
g_return_val_if_fail(jid != NULL, -1);
37
return strcmp(((XMPP_ROSTER_USER_REC *)user)->jid, jid);
41
find_username_func(gconstpointer user_pointer, gconstpointer name)
43
XMPP_ROSTER_USER_REC *user = (XMPP_ROSTER_USER_REC *)user_pointer;
45
g_return_val_if_fail(user_pointer != NULL, -1);
47
if (user->name == NULL)
49
return strcmp(user->name, name);
53
find_resource_func(gconstpointer resource, gconstpointer name)
55
char *res = ((XMPP_ROSTER_RESOURCE_REC *)resource)->name;
57
g_return_val_if_fail(resource != NULL, -1);
59
if(res == NULL && name == NULL)
61
if (res == NULL || name == NULL)
63
return strcmp(res, name);
67
func_sort_user(gconstpointer user1_pointer, gconstpointer user2_pointer)
69
GSList *resources1_list, *resources2_list;
70
XMPP_ROSTER_USER_REC *user1, *user2;
71
XMPP_ROSTER_RESOURCE_REC *fisrt_resources1, *fisrt_resources2;
73
user1 = (XMPP_ROSTER_USER_REC *)user1_pointer;
74
resources1_list = user1->resources;
75
user2 = (XMPP_ROSTER_USER_REC *)user2_pointer;
76
resources2_list = user2->resources;
78
if (resources1_list == resources2_list
79
|| (user1->error == TRUE && user2->error == TRUE))
81
if (user1->error || resources1_list == NULL)
83
if (user2->error || resources2_list == NULL)
86
fisrt_resources1 = (XMPP_ROSTER_RESOURCE_REC *)resources1_list->data;
87
fisrt_resources2 = (XMPP_ROSTER_RESOURCE_REC *)resources2_list->data;
89
if (fisrt_resources1->show == fisrt_resources2->show)
92
return fisrt_resources2->show - fisrt_resources1->show;
95
if (user1->name == NULL && user2->name != NULL)
97
if (user1->name != NULL && user2->name == NULL)
99
if (user1->name != NULL && user2->name != NULL)
100
return strcmp(user1->name, user2->name);
102
return strcmp(user1->jid, user2->jid);
105
XMPP_ROSTER_GROUP_REC *
106
find_group_from_user(XMPP_SERVER_REC *server, XMPP_ROSTER_USER_REC *user)
108
GSList *group_list, *group_list_found;
110
g_return_val_if_fail(IS_XMPP_SERVER(server), NULL);
112
group_list = server->roster;
113
group_list_found = NULL;
115
while (group_list_found != NULL && group_list != NULL) {
116
group_list_found = g_slist_find(group_list, user);
117
group_list = group_list->next;
120
return (XMPP_ROSTER_GROUP_REC *)group_list->data;
123
XMPP_ROSTER_USER_REC *
124
xmpp_rosters_find_user(GSList *groups, const char *jid,
125
XMPP_ROSTER_GROUP_REC **group, XMPP_ROSTER_RESOURCE_REC **resource)
127
GSList *g, *gl, *ul, *rl;
130
if ((pos = xmpp_find_resource_sep(jid)) != NULL)
134
for (gl = groups; ul == NULL && gl != NULL; gl = gl->next) {
135
ul = g_slist_find_custom(
136
((XMPP_ROSTER_GROUP_REC *)gl->data)->users, jid,
137
(GCompareFunc)find_user_func);
142
*group = ul != NULL ?
143
(XMPP_ROSTER_GROUP_REC *)g->data : NULL;
145
if (&*resource != NULL)
146
*resource = ul != NULL && pos != NULL ?
147
xmpp_rosters_find_resource(
148
(XMPP_ROSTER_USER_REC *)ul->data, pos+1) : NULL;
154
(XMPP_ROSTER_USER_REC *)ul->data : NULL;
157
XMPP_ROSTER_USER_REC *
158
find_username(GSList *groups, const char *name, XMPP_ROSTER_GROUP_REC **group)
160
GSList *group_list, *group_tmp, *user_list;
166
while (user_list == NULL && group_list != NULL) {
167
user_list = g_slist_find_custom(
168
((XMPP_ROSTER_GROUP_REC *)group_list->data)->users, name,
169
(GCompareFunc)find_username_func);
171
group_tmp = group_list;
172
group_list = g_slist_next(group_list);
175
if (group != NULL && group_tmp != NULL)
176
*group = group_tmp->data;
178
return user_list ? (XMPP_ROSTER_USER_REC *)user_list->data : NULL;
181
XMPP_ROSTER_RESOURCE_REC *
182
xmpp_rosters_find_resource(XMPP_ROSTER_USER_REC *user, const char *resource)
184
GSList *resource_list;
186
g_return_val_if_fail(user != NULL, NULL);
188
resource_list = g_slist_find_custom(user->resources, resource,
189
(GCompareFunc)find_resource_func);
191
return resource_list ?
192
(XMPP_ROSTER_RESOURCE_REC *)resource_list->data : NULL;
195
XMPP_ROSTER_RESOURCE_REC *
196
xmpp_rosters_find_own_resource(XMPP_SERVER_REC *server, const char *resource)
198
GSList *resource_list;
200
g_return_val_if_fail(server != NULL, NULL);
202
resource_list = g_slist_find_custom(server->resources, resource,
203
(GCompareFunc)find_resource_func);
205
return resource_list ?
206
(XMPP_ROSTER_RESOURCE_REC *)resource_list->data : NULL;
210
xmpp_rosters_resolve_name(XMPP_SERVER_REC *server, const char *name)
212
XMPP_ROSTER_USER_REC *user;
213
XMPP_ROSTER_RESOURCE_REC *resource;
216
g_return_val_if_fail(IS_XMPP_SERVER(server), NULL);
217
g_return_val_if_fail(name != NULL, NULL);
219
g_strstrip((char *)name);
221
user = find_username(server->roster, name, NULL);
223
user = xmpp_rosters_find_user(server->roster, name, NULL,
227
if (!xmpp_have_resource(name)) {
228
/* if unspecified, use the highest resource */
229
if (user->resources != NULL) {
230
resource = user->resources->data;
231
if (resource->name != NULL)
232
return g_strconcat(user->jid, "/",
233
resource->name, NULL);
235
return g_strdup(user->jid);
238
res = xmpp_extract_resource(name);
239
str = g_strconcat(user->jid, "/", res, NULL);
248
xmpp_rosters_show_user(XMPP_ROSTER_USER_REC *user)
250
g_return_val_if_fail(user != NULL, FALSE);
252
return (user->resources != NULL &&
253
user->subscription == XMPP_SUBSCRIPTION_BOTH) ||
254
(user->subscription != XMPP_SUBSCRIPTION_BOTH &&
255
settings_get_bool("roster_show_offline_unsuscribed"))
256
|| settings_get_bool("roster_show_offline");
260
xmpp_rosters_reorder(XMPP_ROSTER_GROUP_REC *group)
262
g_return_if_fail(group != NULL);
264
group->users = g_slist_sort(group->users,
265
(GCompareFunc)func_sort_user);
269
xmpp_presence_get_show(const char *show)
272
if (g_ascii_strcasecmp(show,
273
xmpp_presence_show[XMPP_PRESENCE_CHAT]) == 0)
274
return XMPP_PRESENCE_CHAT;
276
else if (g_ascii_strcasecmp(show,
277
xmpp_presence_show[XMPP_PRESENCE_DND]) == 0)
278
return XMPP_PRESENCE_DND;
280
else if (g_ascii_strcasecmp(show,
281
xmpp_presence_show[XMPP_PRESENCE_XA]) == 0)
282
return XMPP_PRESENCE_XA;
284
else if (g_ascii_strcasecmp(show,
285
xmpp_presence_show[XMPP_PRESENCE_AWAY]) == 0)
286
return XMPP_PRESENCE_AWAY;
288
return XMPP_PRESENCE_AVAILABLE;