2
* $Id: xmpp-rosters-tools.c,v 1.6 2007/11/26 12:55:07 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 as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License along
17
* with this program; if not, write to the Free Software Foundation, Inc.,
18
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27
#include "xmpp-servers.h"
28
#include "xmpp-rosters.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 *full_jid,
125
XMPP_ROSTER_GROUP_REC **group)
127
GSList *group_list, *group_tmp, *user_list;
130
jid = xmpp_strip_resource(full_jid);
136
while (user_list == NULL && group_list != NULL) {
137
user_list = g_slist_find_custom(
138
((XMPP_ROSTER_GROUP_REC *)group_list->data)->users, jid,
139
(GCompareFunc)find_user_func);
141
group_tmp = group_list;
142
group_list = group_list->next;
148
*group = (user_list != NULL) ?
149
(XMPP_ROSTER_GROUP_REC *)group_tmp->data : NULL;
150
return (user_list != NULL) ?
151
(XMPP_ROSTER_USER_REC *)user_list->data : NULL;
154
XMPP_ROSTER_USER_REC *
155
find_username(GSList *groups, const char *name, XMPP_ROSTER_GROUP_REC **group)
157
GSList *group_list, *group_tmp, *user_list;
163
while (user_list == NULL && group_list != NULL) {
164
user_list = g_slist_find_custom(
165
((XMPP_ROSTER_GROUP_REC *)group_list->data)->users, name,
166
(GCompareFunc)find_username_func);
168
group_tmp = group_list;
169
group_list = g_slist_next(group_list);
172
if (group != NULL && group_tmp != NULL)
173
*group = group_tmp->data;
175
return user_list ? (XMPP_ROSTER_USER_REC *)user_list->data : NULL;
178
XMPP_ROSTER_RESOURCE_REC *
179
xmpp_rosters_find_resource(XMPP_ROSTER_USER_REC *user, const char *resource)
181
GSList *resource_list;
183
g_return_val_if_fail(user != NULL, NULL);
185
resource_list = g_slist_find_custom(user->resources, resource,
186
(GCompareFunc)find_resource_func);
188
return resource_list ?
189
(XMPP_ROSTER_RESOURCE_REC *)resource_list->data : NULL;
192
XMPP_ROSTER_RESOURCE_REC *
193
xmpp_rosters_find_own_resource(XMPP_SERVER_REC *server, const char *resource)
195
GSList *resource_list;
197
g_return_val_if_fail(server != NULL, NULL);
199
resource_list = g_slist_find_custom(server->resources, resource,
200
(GCompareFunc)find_resource_func);
202
return resource_list ?
203
(XMPP_ROSTER_RESOURCE_REC *)resource_list->data : NULL;
207
xmpp_rosters_resolve_name(XMPP_SERVER_REC *server, const char *name)
209
XMPP_ROSTER_USER_REC *user;
210
XMPP_ROSTER_RESOURCE_REC *resource;
213
g_return_val_if_fail(IS_XMPP_SERVER(server), NULL);
214
g_return_val_if_fail(name != NULL, NULL);
216
g_strstrip((char *)name);
218
user = find_username(server->roster, name, NULL);
220
user = xmpp_rosters_find_user(server->roster, name, NULL);
223
if (!xmpp_have_resource(name)) {
224
/* if unspecified, use the highest resource */
225
if (user->resources != NULL) {
226
resource = user->resources->data;
227
if (resource->name != NULL)
228
return g_strconcat(user->jid, "/",
229
resource->name, NULL);
231
return g_strdup(user->jid);
234
res = xmpp_extract_resource(name);
235
str = g_strconcat(user->jid, "/", res, NULL);
244
xmpp_rosters_show_user(XMPP_ROSTER_USER_REC *user)
246
g_return_val_if_fail(user != NULL, FALSE);
248
return (user->resources != NULL &&
249
user->subscription == XMPP_SUBSCRIPTION_BOTH) ||
250
(user->subscription != XMPP_SUBSCRIPTION_BOTH &&
251
settings_get_bool("roster_show_offline_unsuscribed"))
252
|| settings_get_bool("roster_show_offline");
256
xmpp_rosters_reorder(XMPP_ROSTER_GROUP_REC *group)
258
g_return_if_fail(group != NULL);
260
group->users = g_slist_sort(group->users,
261
(GCompareFunc)func_sort_user);
265
xmpp_presence_get_show(const char *show)
268
if (g_ascii_strcasecmp(show,
269
xmpp_presence_show[XMPP_PRESENCE_CHAT]) == 0)
270
return XMPP_PRESENCE_CHAT;
272
else if (g_ascii_strcasecmp(show,
273
xmpp_presence_show[XMPP_PRESENCE_DND]) == 0)
274
return XMPP_PRESENCE_DND;
276
else if (g_ascii_strcasecmp(show,
277
xmpp_presence_show[XMPP_PRESENCE_XA]) == 0)
278
return XMPP_PRESENCE_XA;
280
else if (g_ascii_strcasecmp(show,
281
xmpp_presence_show[XMPP_PRESENCE_AWAY]) == 0)
282
return XMPP_PRESENCE_AWAY;
284
return XMPP_PRESENCE_AVAILABLE;