~ubuntu-branches/ubuntu/trusty/irssi-plugin-xmpp/trusty

« back to all changes in this revision

Viewing changes to src/core/xmpp-rosters-tools.c

  • Committer: Bazaar Package Importer
  • Author(s): David Ammouial
  • Date: 2008-02-04 21:01:27 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080204210127-qvw99l8m26ksme18
Tags: 0.13+cvs20080121-1
* CVS snapshot.
* Rephrased package description, thanks to Ted Percival (Closes: #444109).
* debian/control: Promote "Homepage" to a real field.
* Update homepage.
* Adapt debian/rules to new upstream Makefile system.
* Bump Standards-Version to 3.7.3 (no changes required).
* Removed empty TODO from debian/docs, added docs/GENERAL, docs/STARTUP,
  docs/XEP.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * $Id: xmpp-rosters-tools.c,v 1.6 2007/11/26 12:55:07 errtu Exp $
 
3
 *
 
4
 * Copyright (C) 2007 Colin DIDIER
 
5
 *
 
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.
 
10
 *
 
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.
 
15
 *
 
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.
 
19
 */
 
20
 
 
21
#include <string.h>
 
22
#include <stdlib.h>
 
23
 
 
24
#include "module.h"
 
25
#include "settings.h"
 
26
 
 
27
#include "xmpp-servers.h"
 
28
#include "xmpp-rosters.h"
 
29
#include "xmpp-tools.h"
 
30
 
 
31
static int
 
32
find_user_func(gconstpointer user, gconstpointer jid)
 
33
{
 
34
        g_return_val_if_fail(user != NULL, -1);
 
35
        g_return_val_if_fail(jid != NULL, -1);
 
36
 
 
37
        return strcmp(((XMPP_ROSTER_USER_REC *)user)->jid, jid);
 
38
}
 
39
 
 
40
static int
 
41
find_username_func(gconstpointer user_pointer, gconstpointer name)
 
42
{
 
43
        XMPP_ROSTER_USER_REC *user = (XMPP_ROSTER_USER_REC *)user_pointer;
 
44
 
 
45
        g_return_val_if_fail(user_pointer != NULL, -1);
 
46
 
 
47
        if (user->name == NULL)
 
48
                return -1;
 
49
        return strcmp(user->name, name);
 
50
}
 
51
 
 
52
static int
 
53
find_resource_func(gconstpointer resource, gconstpointer name)
 
54
{
 
55
        char *res = ((XMPP_ROSTER_RESOURCE_REC *)resource)->name;
 
56
 
 
57
        g_return_val_if_fail(resource != NULL, -1);
 
58
 
 
59
        if(res == NULL && name == NULL)
 
60
                return 0;
 
61
        if (res == NULL || name == NULL)
 
62
                return -1;
 
63
        return strcmp(res, name);
 
64
}
 
65
 
 
66
static int
 
67
func_sort_user(gconstpointer user1_pointer, gconstpointer user2_pointer)
 
68
{
 
69
        GSList *resources1_list, *resources2_list;
 
70
        XMPP_ROSTER_USER_REC *user1, *user2;
 
71
        XMPP_ROSTER_RESOURCE_REC *fisrt_resources1, *fisrt_resources2;
 
72
 
 
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;
 
77
 
 
78
        if (resources1_list == resources2_list
 
79
            || (user1->error == TRUE && user2->error == TRUE))
 
80
                goto by_name;
 
81
        if (user1->error || resources1_list == NULL)
 
82
                return 1;
 
83
        if (user2->error || resources2_list == NULL)
 
84
                return -1;
 
85
 
 
86
        fisrt_resources1 = (XMPP_ROSTER_RESOURCE_REC *)resources1_list->data;
 
87
        fisrt_resources2 = (XMPP_ROSTER_RESOURCE_REC *)resources2_list->data;
 
88
 
 
89
        if (fisrt_resources1->show == fisrt_resources2->show)
 
90
                goto by_name;
 
91
 
 
92
        return fisrt_resources2->show - fisrt_resources1->show;
 
93
 
 
94
by_name:
 
95
        if (user1->name == NULL && user2->name != NULL)
 
96
                return -1;
 
97
        if (user1->name != NULL && user2->name == NULL)
 
98
                return 1;
 
99
        if (user1->name != NULL && user2->name != NULL)
 
100
                 return strcmp(user1->name, user2->name);
 
101
 
 
102
        return strcmp(user1->jid, user2->jid);
 
103
}
 
104
 
 
105
XMPP_ROSTER_GROUP_REC *
 
106
find_group_from_user(XMPP_SERVER_REC *server, XMPP_ROSTER_USER_REC *user)
 
107
{
 
108
        GSList *group_list, *group_list_found;
 
109
 
 
110
        g_return_val_if_fail(IS_XMPP_SERVER(server), NULL);
 
111
 
 
112
        group_list = server->roster;
 
113
        group_list_found = NULL;
 
114
 
 
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;
 
118
        }
 
119
 
 
120
        return (XMPP_ROSTER_GROUP_REC *)group_list->data;
 
121
}
 
122
 
 
123
XMPP_ROSTER_USER_REC *
 
124
xmpp_rosters_find_user(GSList *groups, const char *full_jid,
 
125
    XMPP_ROSTER_GROUP_REC **group)
 
126
{
 
127
        GSList *group_list, *group_tmp, *user_list;
 
128
        char *jid;
 
129
 
 
130
        jid = xmpp_strip_resource(full_jid);
 
131
 
 
132
        group_list = groups;
 
133
        group_tmp = NULL;
 
134
        user_list = NULL;
 
135
 
 
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);
 
140
 
 
141
                group_tmp = group_list;
 
142
                group_list = group_list->next;
 
143
        }
 
144
 
 
145
        g_free(jid);
 
146
 
 
147
        if (&*group != NULL)
 
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;
 
152
}
 
153
 
 
154
XMPP_ROSTER_USER_REC *
 
155
find_username(GSList *groups, const char *name, XMPP_ROSTER_GROUP_REC **group)
 
156
{
 
157
        GSList *group_list, *group_tmp, *user_list;
 
158
 
 
159
        group_list = groups;
 
160
        group_tmp = NULL;
 
161
        user_list = NULL;
 
162
 
 
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);
 
167
 
 
168
                group_tmp = group_list;
 
169
                group_list = g_slist_next(group_list);
 
170
        }
 
171
 
 
172
        if (group != NULL && group_tmp != NULL)
 
173
                *group = group_tmp->data;
 
174
 
 
175
        return user_list ? (XMPP_ROSTER_USER_REC *)user_list->data : NULL;
 
176
}
 
177
 
 
178
XMPP_ROSTER_RESOURCE_REC *
 
179
xmpp_rosters_find_resource(XMPP_ROSTER_USER_REC *user, const char *resource)
 
180
{
 
181
        GSList *resource_list;
 
182
 
 
183
        g_return_val_if_fail(user != NULL, NULL);
 
184
 
 
185
        resource_list = g_slist_find_custom(user->resources, resource,
 
186
            (GCompareFunc)find_resource_func);
 
187
 
 
188
        return resource_list ?
 
189
            (XMPP_ROSTER_RESOURCE_REC *)resource_list->data : NULL;
 
190
}
 
191
 
 
192
XMPP_ROSTER_RESOURCE_REC *
 
193
xmpp_rosters_find_own_resource(XMPP_SERVER_REC *server, const char *resource)
 
194
{
 
195
        GSList *resource_list;
 
196
 
 
197
        g_return_val_if_fail(server != NULL, NULL);
 
198
 
 
199
        resource_list = g_slist_find_custom(server->resources, resource,
 
200
            (GCompareFunc)find_resource_func);
 
201
 
 
202
        return resource_list ?
 
203
            (XMPP_ROSTER_RESOURCE_REC *)resource_list->data : NULL;
 
204
}
 
205
 
 
206
char *
 
207
xmpp_rosters_resolve_name(XMPP_SERVER_REC *server, const char *name)
 
208
{
 
209
        XMPP_ROSTER_USER_REC *user;
 
210
        XMPP_ROSTER_RESOURCE_REC *resource;
 
211
        char *res, *str;
 
212
 
 
213
        g_return_val_if_fail(IS_XMPP_SERVER(server), NULL);
 
214
        g_return_val_if_fail(name != NULL, NULL);
 
215
 
 
216
        g_strstrip((char *)name);
 
217
 
 
218
        user = find_username(server->roster, name, NULL);
 
219
        if (user == NULL)
 
220
                user = xmpp_rosters_find_user(server->roster, name, NULL);
 
221
 
 
222
        if (user != 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);
 
230
                        }
 
231
                        return g_strdup(user->jid);
 
232
                }
 
233
 
 
234
                res = xmpp_extract_resource(name);
 
235
                str = g_strconcat(user->jid, "/", res, NULL);
 
236
                g_free(res);
 
237
                return str;
 
238
        }
 
239
 
 
240
        return NULL;
 
241
}
 
242
 
 
243
gboolean
 
244
xmpp_rosters_show_user(XMPP_ROSTER_USER_REC *user)
 
245
{
 
246
        g_return_val_if_fail(user != NULL, FALSE);
 
247
 
 
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");
 
253
}
 
254
 
 
255
void
 
256
xmpp_rosters_reorder(XMPP_ROSTER_GROUP_REC *group)
 
257
{
 
258
        g_return_if_fail(group != NULL);
 
259
 
 
260
        group->users = g_slist_sort(group->users,
 
261
            (GCompareFunc)func_sort_user);
 
262
}
 
263
 
 
264
int
 
265
xmpp_presence_get_show(const char *show)
 
266
{
 
267
        if (show != NULL) {
 
268
                if (g_ascii_strcasecmp(show,
 
269
                    xmpp_presence_show[XMPP_PRESENCE_CHAT]) == 0)
 
270
                        return XMPP_PRESENCE_CHAT;
 
271
 
 
272
                else if (g_ascii_strcasecmp(show,
 
273
                    xmpp_presence_show[XMPP_PRESENCE_DND]) == 0)
 
274
                        return XMPP_PRESENCE_DND;
 
275
 
 
276
                else if (g_ascii_strcasecmp(show,
 
277
                    xmpp_presence_show[XMPP_PRESENCE_XA]) == 0)
 
278
                        return XMPP_PRESENCE_XA;
 
279
 
 
280
                else if (g_ascii_strcasecmp(show,
 
281
                    xmpp_presence_show[XMPP_PRESENCE_AWAY]) == 0)
 
282
                        return XMPP_PRESENCE_AWAY;
 
283
        }
 
284
        return XMPP_PRESENCE_AVAILABLE;
 
285
}