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

« back to all changes in this revision

Viewing changes to .pc/kill-the-stroneline-function-which-was-supposed-to-n.patch/src/fe-common/fe-rosters.c

  • Committer: Package Import Robot
  • Author(s): Florian Schlichting, Florian Schlichting
  • Date: 2014-01-03 00:25:20 UTC
  • mfrom: (1.3.6)
  • Revision ID: package-import@ubuntu.com-20140103002520-zc3sfydzt1wp03i0
Tags: 0.52+git20140102-1
[ Florian Schlichting ]
* Import Upstream version 0.52+git20140102
* Add VCS-* fields for collab-maint on alioth
* Add upstream git URL to Source field in debian/copyright
* Drop patches plucked from upstream CVS
* Refresh hardening.patch (offset, drop hunk fixed upstream)
* Provide xmpp-admin.pl script by Seth Difley
* Add GTalk-MUC-support.patch, plucked from github/freemandrew
* Add support for XMPP-PGP, plucked from github/singpolyma
* New useless-dependency-on-libidn.patch, to fix a lintian warning
* Declare compliance with Debian Policy 3.9.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * $Id: fe-rosters.c,v 1.11 2010/07/25 16:29:53 cdidier 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 version 2 as
8
 
 * published by the Free Software Foundation.
9
 
 *
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.
14
 
 *
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.
18
 
 */
19
 
 
20
 
#include <string.h>
21
 
 
22
 
#include "module.h"
23
 
#include "levels.h"
24
 
#include "module-formats.h"
25
 
#include "printtext.h"
26
 
#include "settings.h"
27
 
#include "signals.h"
28
 
 
29
 
#include "xmpp-servers.h"
30
 
#include "rosters-tools.h"
31
 
#include "fe-xmpp-status.h"
32
 
 
33
 
static void
34
 
stroneline(char *s)
35
 
{
36
 
        size_t len, i, spaces;
37
 
        char *p1, *p2;
38
 
              
39
 
        for (p1 = s; *p1 != '\0'; ++p1) {
40
 
                if (isspace(*p1)) {
41
 
                        *p1 = ' ';
42
 
                        p2 = p1;
43
 
                        spaces = 0;
44
 
                        while (*(p2++) != '\0' && isspace(*p2))
45
 
                        ++spaces;
46
 
                        if (spaces > 0) {
47
 
                                len = strlen(p1);
48
 
                                for (i = 0; i < len-spaces+1; ++i)
49
 
                                        p1[i-spaces] = p1[i];
50
 
                        }
51
 
                }
52
 
        }
53
 
}
54
 
 
55
 
static gboolean
56
 
user_is_shown(XMPP_ROSTER_USER_REC *user)
57
 
{
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")));
65
 
}
66
 
 
67
 
static void
68
 
show_group(XMPP_SERVER_REC *server, XMPP_ROSTER_GROUP_REC *group)
69
 
{
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"));
75
 
}
76
 
 
77
 
static const char *
78
 
get_first_show(GSList *list)
79
 
{
80
 
        if (list == NULL)
81
 
                return NULL;
82
 
        return xmpp_presence_show[
83
 
            ((XMPP_ROSTER_RESOURCE_REC *)list->data)->show];
84
 
}
85
 
 
86
 
static char *
87
 
get_resources(XMPP_SERVER_REC *server, GSList *list)
88
 
{
89
 
        GSList *tmp;
90
 
        GString *resources;
91
 
        XMPP_ROSTER_RESOURCE_REC *resource;
92
 
        char *show, *status, *status_str, *priority, *text;
93
 
 
94
 
        if (list == NULL)
95
 
                return NULL;
96
 
        resources = g_string_new(NULL);
97
 
        for (tmp = list; tmp != NULL; tmp = tmp->next) {
98
 
                resource = tmp->data;
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);
109
 
                g_free(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,
113
 
                    status);
114
 
                g_free(show);
115
 
                g_free(status);
116
 
                g_free(priority);
117
 
                g_string_append(resources, text);
118
 
                g_free(text);
119
 
        }
120
 
        text = resources->str;
121
 
        g_string_free(resources, FALSE);
122
 
        return text;
123
 
}
124
 
 
125
 
static void
126
 
show_user(XMPP_SERVER_REC *server, XMPP_ROSTER_USER_REC *user)
127
 
{
128
 
        const char *first_show;
129
 
        char *name, *resources, *subscription;
130
 
 
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];
136
 
        else
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,
150
 
            subscription);
151
 
        g_free(name);
152
 
        g_free(resources);
153
 
        g_free(subscription);
154
 
}
155
 
 
156
 
static void
157
 
show_begin_of_roster(XMPP_SERVER_REC *server)
158
 
{
159
 
        char *show, *status, *priority, *text, *resources;
160
 
 
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,
173
 
            status);
174
 
        g_free(show);
175
 
        g_free(status);
176
 
        g_free(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);
180
 
        g_free(text);
181
 
        g_free(resources);
182
 
}
183
 
 
184
 
static void
185
 
sig_roster_show(XMPP_SERVER_REC *server)
186
 
{
187
 
        GSList *gl, *ul;
188
 
        XMPP_ROSTER_GROUP_REC *group;
189
 
        XMPP_ROSTER_USER_REC *user;
190
 
 
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) {
194
 
                group = gl->data;
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);
198
 
                if (ul == NULL)
199
 
                        continue;
200
 
                show_group(server, group);
201
 
                 for (ul = group->users; ul != NULL; ul = ul->next) {
202
 
                        user = ul->data;
203
 
                        if (user_is_shown(user))
204
 
                                show_user(server, user);
205
 
                }
206
 
        }
207
 
        printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
208
 
            XMPPTXT_END_OF_ROSTER);
209
 
}
210
 
 
211
 
static void
212
 
sig_not_in_roster(XMPP_SERVER_REC *server, const char *jid)
213
 
{
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);
218
 
}
219
 
 
220
 
static void
221
 
sig_subscribe(XMPP_SERVER_REC *server, const char *jid, const char *status)
222
 
{
223
 
        XMPP_ROSTER_USER_REC *user;
224
 
        char *name;
225
 
 
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);
238
 
        else
239
 
                printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
240
 
                    XMPPTXT_SUBSCRIBE, name, status);
241
 
        g_free(name);
242
 
}
243
 
 
244
 
static void
245
 
sig_subscribed(XMPP_SERVER_REC *server, const char *jid)
246
 
{
247
 
        XMPP_ROSTER_USER_REC *user;
248
 
        char *name;
249
 
 
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);
262
 
        else
263
 
                printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
264
 
                    XMPPTXT_SUBSCRIBED, name);
265
 
        g_free(name);
266
 
}
267
 
 
268
 
static void
269
 
sig_unsubscribe(XMPP_SERVER_REC *server, const char *jid)
270
 
{
271
 
        XMPP_ROSTER_USER_REC *user;
272
 
        char *name;
273
 
 
274
 
        g_return_if_fail(IS_SERVER(server));
275
 
        g_return_if_fail(jid != NULL);
276
 
 
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);
287
 
        else
288
 
                printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
289
 
                    XMPPTXT_UNSUBSCRIBE, name);
290
 
        g_free(name);
291
 
}
292
 
 
293
 
static void
294
 
sig_unsubscribed(XMPP_SERVER_REC *server, const char *jid)
295
 
{
296
 
        XMPP_ROSTER_USER_REC *user;
297
 
        char *name;
298
 
 
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);
311
 
        else
312
 
                printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP,
313
 
                    XMPPTXT_UNSUBSCRIBED, name);
314
 
        g_free(name);
315
 
}
316
 
 
317
 
void
318
 
fe_rosters_init(void)
319
 
{
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);
326
 
 
327
 
        settings_add_str("xmpp_roster", "xmpp_roster_default_group", "General");
328
 
        settings_add_str("xmpp_roster", "xmpp_roster_service_name",
329
 
            "Agents/Services");
330
 
        settings_add_bool("xmpp_roster", "xmpp_roster_show_offline", TRUE);
331
 
        settings_add_bool("xmpp_roster", "xmpp_roster_show_unsubscribed", TRUE);
332
 
}
333
 
 
334
 
void
335
 
fe_rosters_deinit(void)
336
 
{
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);
343
 
}