2
* $Id: fe-rosters.c,v 1.11 2010/07/25 16:29:53 cdidier 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.
24
#include "module-formats.h"
25
#include "printtext.h"
29
#include "xmpp-servers.h"
30
#include "rosters-tools.h"
31
#include "fe-xmpp-status.h"
36
size_t len, i, spaces;
39
for (p1 = s; *p1 != '\0'; ++p1) {
44
while (*(p2++) != '\0' && isspace(*p2))
48
for (i = 0; i < len-spaces+1; ++i)
56
user_is_shown(XMPP_ROSTER_USER_REC *user)
58
g_return_val_if_fail(user != NULL, FALSE);
59
return user->resources != NULL
60
|| (user->subscription == XMPP_SUBSCRIPTION_BOTH
61
&& settings_get_bool("xmpp_roster_show_offline"))
62
|| (user->subscription != XMPP_SUBSCRIPTION_BOTH
63
&& (settings_get_bool("xmpp_roster_show_unsubscribed")
64
|| settings_get_bool("xmpp_roster_show_offline")));
68
show_group(XMPP_SERVER_REC *server, XMPP_ROSTER_GROUP_REC *group)
70
g_return_if_fail(IS_SERVER(server));
71
g_return_if_fail(group != NULL);
72
printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
73
XMPPTXT_ROSTER_GROUP, (group->name != NULL) ?
74
group->name : settings_get_str("xmpp_roster_default_group"));
78
get_first_show(GSList *list)
82
return xmpp_presence_show[
83
((XMPP_ROSTER_RESOURCE_REC *)list->data)->show];
87
get_resources(XMPP_SERVER_REC *server, GSList *list)
91
XMPP_ROSTER_RESOURCE_REC *resource;
92
char *show, *status, *status_str, *priority, *text;
96
resources = g_string_new(NULL);
97
for (tmp = list; tmp != NULL; tmp = tmp->next) {
99
show = (resource->show == XMPP_PRESENCE_AVAILABLE) ? NULL :
100
format_get_text(MODULE_NAME, NULL, server, NULL,
101
XMPPTXT_FORMAT_RESOURCE_SHOW,
102
xmpp_presence_show[resource->show]);
103
status_str = g_strdup(resource->status);
104
if (status_str != NULL)
105
stroneline(status_str);
106
status = (resource->status == NULL) ? NULL :
107
format_get_text(MODULE_NAME, NULL, server, NULL,
108
XMPPTXT_FORMAT_RESOURCE_STATUS, status_str);
110
priority = g_strdup_printf("%d", resource->priority);
111
text = format_get_text(MODULE_NAME, NULL, server, NULL,
112
XMPPTXT_FORMAT_RESOURCE, show, resource->name, priority,
117
g_string_append(resources, text);
120
text = resources->str;
121
g_string_free(resources, FALSE);
126
show_user(XMPP_SERVER_REC *server, XMPP_ROSTER_USER_REC *user)
128
const char *first_show;
129
char *name, *resources, *subscription;
131
g_return_if_fail(IS_SERVER(server));
132
g_return_if_fail(user != NULL);
133
if (user->resources == NULL)
134
first_show = xmpp_presence_show[user->error ?
135
XMPP_PRESENCE_ERROR : XMPP_PRESENCE_UNAVAILABLE];
137
first_show = get_first_show(user->resources);
138
name = user->name != NULL ?
139
format_get_text(MODULE_NAME, NULL, server, NULL,
140
XMPPTXT_FORMAT_NAME, user->name, user->jid) :
141
format_get_text(MODULE_NAME, NULL, server, NULL,
142
XMPPTXT_FORMAT_JID, user->jid);
143
resources = get_resources(server, user->resources);
144
subscription = user->subscription == XMPP_SUBSCRIPTION_BOTH ? NULL :
145
format_get_text(MODULE_NAME, NULL, server, NULL,
146
XMPPTXT_FORMAT_SUBSCRIPTION,
147
xmpp_subscription[user->subscription]);
148
printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
149
XMPPTXT_ROSTER_CONTACT, first_show, name, resources,
153
g_free(subscription);
157
show_begin_of_roster(XMPP_SERVER_REC *server)
159
char *show, *status, *priority, *text, *resources;
161
g_return_if_fail(IS_XMPP_SERVER(server));
162
show = (server->show == XMPP_PRESENCE_AVAILABLE) ? NULL :
163
format_get_text(MODULE_NAME, NULL, server, NULL,
164
XMPPTXT_FORMAT_RESOURCE_SHOW,
165
xmpp_presence_show[server->show]);
166
status = (server->away_reason == NULL
167
|| strcmp(server->away_reason, " ") == 0) ? NULL :
168
format_get_text(MODULE_NAME, NULL, server, NULL,
169
XMPPTXT_FORMAT_RESOURCE_STATUS, server->away_reason);
170
priority = g_strdup_printf("%d", server->priority);
171
text = format_get_text(MODULE_NAME, NULL, server, NULL,
172
XMPPTXT_FORMAT_RESOURCE, show, server->resource, priority,
177
resources = get_resources(server, server->my_resources);
178
printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
179
XMPPTXT_BEGIN_OF_ROSTER, server->jid, text, resources);
185
sig_roster_show(XMPP_SERVER_REC *server)
188
XMPP_ROSTER_GROUP_REC *group;
189
XMPP_ROSTER_USER_REC *user;
191
g_return_if_fail(IS_XMPP_SERVER(server));
192
show_begin_of_roster(server);
193
for (gl = server->roster; gl != NULL; gl = gl->next) {
195
/* don't show groups with only offline users */
196
for (ul = group->users; ul != NULL
197
&& !user_is_shown(ul->data); ul = ul->next);
200
show_group(server, group);
201
for (ul = group->users; ul != NULL; ul = ul->next) {
203
if (user_is_shown(user))
204
show_user(server, user);
207
printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
208
XMPPTXT_END_OF_ROSTER);
212
sig_not_in_roster(XMPP_SERVER_REC *server, const char *jid)
214
g_return_if_fail(IS_SERVER(server));
215
g_return_if_fail(jid != NULL);
216
printformat_module(MODULE_NAME, server, NULL,
217
MSGLEVEL_CLIENTERROR, XMPPTXT_NOT_IN_ROSTER, jid);
221
sig_subscribe(XMPP_SERVER_REC *server, const char *jid, const char *status)
223
XMPP_ROSTER_USER_REC *user;
226
g_return_if_fail(IS_SERVER(server));
227
g_return_if_fail(jid != NULL);
228
user = rosters_find_user(server->roster, jid, NULL, NULL);
229
name = user != NULL && user->name != NULL ?
230
format_get_text(MODULE_NAME, NULL, server, NULL,
231
XMPPTXT_FORMAT_NAME, user->name, jid) :
232
format_get_text(MODULE_NAME, NULL, server, NULL,
233
XMPPTXT_FORMAT_JID, jid);
234
if (settings_get_bool("xmpp_status_window"))
235
printformat_module_window(MODULE_NAME,
236
fe_xmpp_status_get_window(server), MSGLEVEL_CRAP,
237
XMPPTXT_SUBSCRIBE, name, status);
239
printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
240
XMPPTXT_SUBSCRIBE, name, status);
245
sig_subscribed(XMPP_SERVER_REC *server, const char *jid)
247
XMPP_ROSTER_USER_REC *user;
250
g_return_if_fail(IS_SERVER(server));
251
g_return_if_fail(jid != NULL);
252
user = rosters_find_user(server->roster, jid, NULL, NULL);
253
name = user != NULL && user->name != NULL ?
254
format_get_text(MODULE_NAME, NULL, server, NULL,
255
XMPPTXT_FORMAT_NAME, user->name, jid) :
256
format_get_text(MODULE_NAME, NULL, server, NULL,
257
XMPPTXT_FORMAT_JID, jid);
258
if (settings_get_bool("xmpp_status_window"))
259
printformat_module_window(MODULE_NAME,
260
fe_xmpp_status_get_window(server), MSGLEVEL_CRAP,
261
XMPPTXT_SUBSCRIBED, name);
263
printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
264
XMPPTXT_SUBSCRIBED, name);
269
sig_unsubscribe(XMPP_SERVER_REC *server, const char *jid)
271
XMPP_ROSTER_USER_REC *user;
274
g_return_if_fail(IS_SERVER(server));
275
g_return_if_fail(jid != NULL);
277
user = rosters_find_user(server->roster, jid, NULL, NULL);
278
name = user != NULL && user->name != NULL ?
279
format_get_text(MODULE_NAME, NULL, server, NULL,
280
XMPPTXT_FORMAT_NAME, user->name, jid) :
281
format_get_text(MODULE_NAME, NULL, server, NULL,
282
XMPPTXT_FORMAT_JID, jid);
283
if (settings_get_bool("xmpp_status_window"))
284
printformat_module_window(MODULE_NAME,
285
fe_xmpp_status_get_window(server), MSGLEVEL_CRAP,
286
XMPPTXT_UNSUBSCRIBE, name);
288
printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
289
XMPPTXT_UNSUBSCRIBE, name);
294
sig_unsubscribed(XMPP_SERVER_REC *server, const char *jid)
296
XMPP_ROSTER_USER_REC *user;
299
g_return_if_fail(IS_SERVER(server));
300
g_return_if_fail(jid != NULL);
301
user = rosters_find_user(server->roster, jid, NULL, NULL);
302
name = user != NULL && user->name != NULL ?
303
format_get_text(MODULE_NAME, NULL, server, NULL,
304
XMPPTXT_FORMAT_NAME, user->name, jid) :
305
format_get_text(MODULE_NAME, NULL, server, NULL,
306
XMPPTXT_FORMAT_JID, jid);
307
if (settings_get_bool("xmpp_status_window"))
308
printformat_module_window(MODULE_NAME,
309
fe_xmpp_status_get_window(server), MSGLEVEL_CRAP,
310
XMPPTXT_UNSUBSCRIBED, name);
312
printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
313
XMPPTXT_UNSUBSCRIBED, name);
318
fe_rosters_init(void)
320
signal_add("xmpp roster show", sig_roster_show);
321
signal_add("xmpp not in roster", sig_not_in_roster);
322
signal_add("xmpp presence subscribe", sig_subscribe);
323
signal_add("xmpp presence subscribed", sig_subscribed);
324
signal_add("xmpp presence unsubscribe", sig_unsubscribe);
325
signal_add("xmpp presence unsubscribed", sig_unsubscribed);
327
settings_add_str("xmpp_roster", "xmpp_roster_default_group", "General");
328
settings_add_str("xmpp_roster", "xmpp_roster_service_name",
330
settings_add_bool("xmpp_roster", "xmpp_roster_show_offline", TRUE);
331
settings_add_bool("xmpp_roster", "xmpp_roster_show_unsubscribed", TRUE);
335
fe_rosters_deinit(void)
337
signal_remove("xmpp roster show", sig_roster_show);
338
signal_remove("xmpp not in roster", sig_not_in_roster);
339
signal_remove("xmpp presence subscribe", sig_subscribe);
340
signal_remove("xmpp presence subscribed", sig_subscribed);
341
signal_remove("xmpp presence unsubscribe", sig_unsubscribe);
342
signal_remove("xmpp presence unsubscribed", sig_unsubscribed);