annotate mcabber/src/roster.c @ 1461:8fa24a6d1a93

Improve Remote Controlling Clients The XEP recommends adding the node to the IQ response. Some clients seem not to understand the answer when it is omitted. Problem reported by Rhaamo and js (thanks to js for spotting the node issue!).
author Mikael Berthe <mikael@lilotux.net>
date Sat, 12 Apr 2008 13:35:03 +0200
parents 3bf11085c6a5
children ef09de538e8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1 /*
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
2 * roster.c -- Local roster implementation
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
3 *
1414
366ef500c522 Update copyrights
Mikael Berthe <mikael@lilotux.net>
parents: 1413
diff changeset
4 * Copyright (C) 2005-2008 Mikael Berthe <mikael@lilotux.net>
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
5 *
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or (at
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
9 * your option) any later version.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
10 *
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful, but
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
14 * General Public License for more details.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
15 *
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
19 * USA
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
20 */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
21
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
22 #include <string.h>
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
23
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
24 #include "roster.h"
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
25 #include "utils.h"
1444
3bf11085c6a5 New external "UNREAD" event (suggested by Viacheslav Chumushuk)
Mikael Berthe <mikael@lilotux.net>
parents: 1438
diff changeset
26 #include "hooks.h"
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
27
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
28 extern void hlog_save_state(void);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
29
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
30 char *strrole[] = { /* Should match enum in roster.h */
584
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
31 "none",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
32 "moderator",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
33 "participant",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
34 "visitor"
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
35 };
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
36
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
37 char *straffil[] = { /* Should match enum in roster.h */
584
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
38 "none",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
39 "owner",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
40 "admin",
1331
a97701d8d735 Fix typo in the straffil structure (reported by gst)
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
41 "member",
584
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
42 "outcast"
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
43 };
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
44
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
45 char *strprintstatus[] = { /* Should match enum in roster.h */
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
46 "default",
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
47 "none",
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
48 "in_and_out",
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
49 "all"
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
50 };
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
51
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
52 char *strautowhois[] = { /* Should match enum in roster.h */
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
53 "default",
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
54 "off",
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
55 "on",
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
56 };
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
57
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
58 /* Resource structure */
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
59
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
60 typedef struct {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
61 gchar *name;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
62 gchar prio;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
63 enum imstatus status;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
64 gchar *status_msg;
625
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
65 time_t status_timestamp;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
66 enum imrole role;
572
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
67 enum imaffiliation affil;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
68 gchar *realjid; /* for chatrooms, if buddy's real jid is known */
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
69 guint events;
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
70 #ifdef JEP0022
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
71 struct jep0022 jep22;
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
72 #endif
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
73 #ifdef JEP0085
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
74 struct jep0085 jep85;
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
75 #endif
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
76 #ifdef HAVE_GPGME
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
77 struct pgp_data pgpdata;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
78 #endif
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
79 } res;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
80
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
81 /* This is a private structure type for the roster */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
82
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
83 typedef struct {
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
84 gchar *name;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
85 gchar *jid;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
86 guint type;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
87 enum subscr subscription;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
88 GSList *resource;
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
89
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
90 /* For groupchats */
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
91 gchar *nickname;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
92 gchar *topic;
952
527d6f234924 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
93 guint inside_room;
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
94 guint print_status;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
95 guint auto_whois;
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
96
1355
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
97 /* on_server is TRUE if the item is present on the server roster */
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
98 guint on_server;
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
99
843
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
100 /* To keep track of last status message */
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
101 gchar *offline_status_message;
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
102
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
103 /* Flag used for the UI */
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
104 guint flags;
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
105
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
106 // list: user -> points to his group; group -> points to its users list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
107 GSList *list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
108 } roster;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
109
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
110
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
111 /* ### Variables ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
112
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
113 static guchar display_filter;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
114 static GSList *groups;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
115 static GSList *unread_list;
662
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
116 static GHashTable *unread_jids;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
117 GList *buddylist;
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
118 GList *current_buddy;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
119 GList *alternate_buddy;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
120
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
121 static roster roster_special;
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
122
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
123 static int unread_jid_del(const char *jid);
662
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
124
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
125 #define DFILTER_ALL 63
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
126 #define DFILTER_ONLINE 62
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
127
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
128
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
129 /* ### Initialization ### */
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
130
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
131 void roster_init(void)
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
132 {
889
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
133 roster_special.name = SPECIAL_BUFFER_STATUS_ID;
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
134 roster_special.type = ROSTER_TYPE_SPECIAL;
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
135 }
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
136
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
137 /* ### Resources functions ### */
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
138
1063
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
139 static inline void free_resource_data(res *p_res)
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
140 {
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
141 if (!p_res)
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
142 return;
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
143 g_free((gchar*)p_res->status_msg);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
144 g_free((gchar*)p_res->name);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
145 g_free((gchar*)p_res->realjid);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
146 #ifdef JEP0022
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
147 g_free(p_res->jep22.last_msgid_sent);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
148 g_free(p_res->jep22.last_msgid_rcvd);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
149 #endif
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
150 #ifdef HAVE_GPGME
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
151 g_free(p_res->pgpdata.sign_keyid);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
152 #endif
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
153 g_free(p_res);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
154 }
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
155
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
156 static void free_all_resources(GSList **reslist)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
157 {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
158 GSList *lip;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
159
1063
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
160 for (lip = *reslist; lip ; lip = g_slist_next(lip))
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
161 free_resource_data((res*)lip->data);
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
162 // Free all nodes but the first (which is static)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
163 g_slist_free(*reslist);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
164 *reslist = NULL;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
165 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
166
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
167 // Resources are sorted in ascending order
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
168 static gint resource_compare_prio(res *a, res *b) {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
169 //return (a->prio - b->prio);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
170 if (a->prio < b->prio) return -1;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
171 else return 1;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
172 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
173
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
174 // get_resource(rost, resname)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
175 // Return a pointer to the resource with name resname, in rost's resources list
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
176 // - if rost has no resources, return NULL
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
177 // - if resname is defined, return the match or NULL
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
178 // - if resname is NULL, the last resource is returned, currently
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
179 // This could change in the future, because we should return the best one
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
180 // (priority? last used? and fall back to the first resource)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
181 //
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
182 static res *get_resource(roster *rost, const char *resname)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
183 {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
184 GSList *p;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
185 res *r = NULL;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
186
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
187 for (p = rost->resource; p; p = g_slist_next(p)) {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
188 r = p->data;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
189 if (resname && !strcmp(r->name, resname))
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
190 return r;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
191 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
192
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
193 // The last resource is one of the resources with the highest priority,
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
194 // however, we don't know if it is the more-recently-used.
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
195 if (!resname) return r;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
196 return NULL;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
197 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
198
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
199 // get_or_add_resource(rost, resname, priority)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
200 // - if there is a "resname" resource in rost's resources, return a pointer
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
201 // on this resource
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
202 // - if not, add the resource, set the name, and return a pointer on this
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
203 // new resource
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
204 static res *get_or_add_resource(roster *rost, const char *resname, gchar prio)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
205 {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
206 GSList *p;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
207 res *nres;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
208
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
209 if (!resname) return NULL;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
210
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
211 for (p = rost->resource; p; p = g_slist_next(p)) {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
212 res *r = p->data;
1092
1ef7572c3096 Sort the resources again when a priority changes
Mikael Berthe <mikael@lilotux.net>
parents: 1088
diff changeset
213 if (!strcmp(r->name, resname)) {
1ef7572c3096 Sort the resources again when a priority changes
Mikael Berthe <mikael@lilotux.net>
parents: 1088
diff changeset
214 if (prio != r->prio) {
1ef7572c3096 Sort the resources again when a priority changes
Mikael Berthe <mikael@lilotux.net>
parents: 1088
diff changeset
215 r->prio = prio;
1ef7572c3096 Sort the resources again when a priority changes
Mikael Berthe <mikael@lilotux.net>
parents: 1088
diff changeset
216 rost->resource = g_slist_sort(rost->resource,
1ef7572c3096 Sort the resources again when a priority changes
Mikael Berthe <mikael@lilotux.net>
parents: 1088
diff changeset
217 (GCompareFunc)&resource_compare_prio);
1ef7572c3096 Sort the resources again when a priority changes
Mikael Berthe <mikael@lilotux.net>
parents: 1088
diff changeset
218 }
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
219 return r;
1092
1ef7572c3096 Sort the resources again when a priority changes
Mikael Berthe <mikael@lilotux.net>
parents: 1088
diff changeset
220 }
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
221 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
222
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
223 // Resource not found
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
224 nres = g_new0(res, 1);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
225 nres->name = g_strdup(resname);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
226 nres->prio = prio;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
227 rost->resource = g_slist_insert_sorted(rost->resource, nres,
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
228 (GCompareFunc)&resource_compare_prio);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
229 return nres;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
230 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
231
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
232 static void del_resource(roster *rost, const char *resname)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
233 {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
234 GSList *p;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
235 GSList *p_res_elt = NULL;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
236 res *p_res;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
237
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
238 if (!resname) return;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
239
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
240 for (p = rost->resource; p; p = g_slist_next(p)) {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
241 res *r = p->data;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
242 if (!strcmp(r->name, resname))
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
243 p_res_elt = p;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
244 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
245
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
246 if (!p_res_elt) return; // Resource not found
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
247
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
248 p_res = p_res_elt->data;
843
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
249
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
250 // Keep a copy of the status message when a buddy goes offline
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
251 if (g_slist_length(rost->resource) == 1) {
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
252 g_free(rost->offline_status_message);
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
253 rost->offline_status_message = p_res->status_msg;
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
254 p_res->status_msg = NULL;
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
255 }
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
256
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
257 // Free allocations and delete resource node
1063
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
258 free_resource_data(p_res);
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
259 rost->resource = g_slist_delete_link(rost->resource, p_res_elt);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
260 return;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
261 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
262
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
263
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
264 /* ### Roster functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
265
1063
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
266 static inline void free_roster_user_data(roster *roster_usr)
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
267 {
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
268 if (!roster_usr)
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
269 return;
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
270 g_free((gchar*)roster_usr->jid);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
271 g_free((gchar*)roster_usr->name);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
272 g_free((gchar*)roster_usr->nickname);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
273 g_free((gchar*)roster_usr->topic);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
274 g_free((gchar*)roster_usr->offline_status_message);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
275 free_all_resources(&roster_usr->resource);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
276 g_free(roster_usr);
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
277 }
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
278
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
279 // Comparison function used to search in the roster (compares jids and types)
336
eb994ee40029 Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents: 331
diff changeset
280 static gint roster_compare_jid_type(roster *a, roster *b) {
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
281 if (! (a->type & b->type))
480
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
282 return -1; // arbitrary (but should be != 0, of course)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
283 return strcasecmp(a->jid, b->jid);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
284 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
285
670
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
286 // Comparison function used to search in the roster (compares names and types)
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
287 static gint roster_compare_name_type(roster *a, roster *b) {
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
288 if (! (a->type & b->type))
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
289 return -1; // arbitrary (but should be != 0, of course)
783
25022410f80f Use case sensitive group names
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
290 return strcmp(a->name, b->name);
670
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
291 }
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
292
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
293 // Comparison function used to sort the roster (by name)
336
eb994ee40029 Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents: 331
diff changeset
294 static gint roster_compare_name(roster *a, roster *b) {
783
25022410f80f Use case sensitive group names
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
295 return strcmp(a->name, b->name);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
296 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
297
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
298 // Finds a roster element (user, group, agent...), by jid or name
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
299 // If roster_type is 0, returns match of any type.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
300 // Returns the roster GSList element, or NULL if jid/name not found
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
301 GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
302 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
303 GSList *sl_roster_elt = groups;
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
304 GSList *resource;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
305 roster sample;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
306 GCompareFunc comp;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
307
192
62bc2992216b [/trunk] Changeset 204 by mikael
mikael
parents: 166
diff changeset
308 if (!jidname) return NULL;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
309
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
310 if (!roster_type)
480
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
311 roster_type = ROSTER_TYPE_USER | ROSTER_TYPE_ROOM |
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
312 ROSTER_TYPE_AGENT | ROSTER_TYPE_GROUP;
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
313
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
314 sample.type = roster_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
315 if (type == jidsearch) {
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
316 sample.jid = (gchar*)jidname;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
317 comp = (GCompareFunc)&roster_compare_jid_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
318 } else if (type == namesearch) {
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
319 sample.name = (gchar*)jidname;
670
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
320 comp = (GCompareFunc)&roster_compare_name_type;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
321 } else
885
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
322 return NULL; // Should not happen...
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
323
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
324 while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
325 roster *roster_elt = (roster*)sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
326 if (roster_type & ROSTER_TYPE_GROUP) {
783
25022410f80f Use case sensitive group names
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
327 if ((type == namesearch) && !strcmp(jidname, roster_elt->name))
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
328 return sl_roster_elt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
329 }
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
330 resource = g_slist_find_custom(roster_elt->list, &sample, comp);
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
331 if (resource) return resource;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
332 sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
333 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
334 return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
335 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
336
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
337 // Returns pointer to new group, or existing group with that name
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
338 GSList *roster_add_group(const char *name)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
339 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
340 roster *roster_grp;
669
2b87065270f3 roster_add_group(): do not call roster_find() twice
Mikael Berthe <mikael@lilotux.net>
parents: 662
diff changeset
341 GSList *p_group;
2b87065270f3 roster_add_group(): do not call roster_find() twice
Mikael Berthe <mikael@lilotux.net>
parents: 662
diff changeset
342
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
343 // #1 Check name doesn't already exist
669
2b87065270f3 roster_add_group(): do not call roster_find() twice
Mikael Berthe <mikael@lilotux.net>
parents: 662
diff changeset
344 p_group = roster_find(name, namesearch, ROSTER_TYPE_GROUP);
2b87065270f3 roster_add_group(): do not call roster_find() twice
Mikael Berthe <mikael@lilotux.net>
parents: 662
diff changeset
345 if (!p_group) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
346 // #2 Create the group node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
347 roster_grp = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
348 roster_grp->name = g_strdup(name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
349 roster_grp->type = ROSTER_TYPE_GROUP;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
350 // #3 Insert (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
351 groups = g_slist_insert_sorted(groups, roster_grp,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
352 (GCompareFunc)&roster_compare_name);
669
2b87065270f3 roster_add_group(): do not call roster_find() twice
Mikael Berthe <mikael@lilotux.net>
parents: 662
diff changeset
353 p_group = roster_find(name, namesearch, ROSTER_TYPE_GROUP);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
354 }
669
2b87065270f3 roster_add_group(): do not call roster_find() twice
Mikael Berthe <mikael@lilotux.net>
parents: 662
diff changeset
355 return p_group;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
356 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
357
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
358 // Returns a pointer to the new user, or existing user with that name
1355
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
359 // Note: if onserver is -1, the flag won't be changed.
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
360 GSList *roster_add_user(const char *jid, const char *name, const char *group,
1355
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
361 guint type, enum subscr esub, gint onserver)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
362 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
363 roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
364 roster *my_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
365 GSList *slist;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
366
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
367 if ((type != ROSTER_TYPE_USER) &&
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
368 (type != ROSTER_TYPE_ROOM) &&
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
369 (type != ROSTER_TYPE_AGENT)) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
370 // XXX Error message?
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
371 return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
372 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
373
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
374 // Let's be arbitrary: default group has an empty name ("").
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
375 if (!group) group = "";
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
376
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
377 // #1 Check this user doesn't already exist
563
b0f1b127bfb6 Prevent from adding a duplicate jid (when types are different)
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
378 slist = roster_find(jid, jidsearch, 0);
607
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
379 if (slist) {
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
380 char *oldgroupname;
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
381 // That's an update
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
382 roster_usr = slist->data;
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
383 roster_usr->subscription = esub;
1366
01e558748379 Fix a race in roster_add_user()
Mikael Berthe <mikael@lilotux.net>
parents: 1355
diff changeset
384 if (onserver >= 0)
01e558748379 Fix a race in roster_add_user()
Mikael Berthe <mikael@lilotux.net>
parents: 1355
diff changeset
385 buddy_setonserverflag(slist->data, onserver);
607
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
386 if (name)
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
387 buddy_setname(slist->data, (char*)name);
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
388 // Let's check if the group name has changed
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
389 oldgroupname = ((roster*)((GSList*)roster_usr->list)->data)->name;
1366
01e558748379 Fix a race in roster_add_user()
Mikael Berthe <mikael@lilotux.net>
parents: 1355
diff changeset
390 if (group && strcmp(oldgroupname, group)) {
607
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
391 buddy_setgroup(slist->data, (char*)group);
1366
01e558748379 Fix a race in roster_add_user()
Mikael Berthe <mikael@lilotux.net>
parents: 1355
diff changeset
392 // Note: buddy_setgroup() updates the user lists so we cannot
01e558748379 Fix a race in roster_add_user()
Mikael Berthe <mikael@lilotux.net>
parents: 1355
diff changeset
393 // use slist anymore.
01e558748379 Fix a race in roster_add_user()
Mikael Berthe <mikael@lilotux.net>
parents: 1355
diff changeset
394 return roster_find(jid, jidsearch, 0);
01e558748379 Fix a race in roster_add_user()
Mikael Berthe <mikael@lilotux.net>
parents: 1355
diff changeset
395 }
607
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
396 return slist;
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
397 }
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
398 // #2 add group if necessary
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
399 slist = roster_add_group(group);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
400 if (!slist) return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
401 my_group = (roster*)slist->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
402 // #3 Create user node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
403 roster_usr = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
404 roster_usr->jid = g_strdup(jid);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
405 if (name) {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
406 roster_usr->name = g_strdup(name);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
407 } else {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
408 gchar *p, *str = g_strdup(jid);
977
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 974
diff changeset
409 p = strchr(str, JID_RESOURCE_SEPARATOR);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
410 if (p) *p = '\0';
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
411 roster_usr->name = g_strdup(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
412 g_free(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
413 }
662
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
414 if (unread_jid_del(jid)) {
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
415 roster_usr->flags |= ROSTER_FLAG_MSG;
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
416 // Append the roster_usr to unread_list
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
417 unread_list = g_slist_append(unread_list, roster_usr);
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
418 }
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
419 roster_usr->type = type;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
420 roster_usr->subscription = esub;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
421 roster_usr->list = slist; // (my_group SList element)
1355
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
422 if (onserver == 1)
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
423 roster_usr->on_server = TRUE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
424 // #4 Insert node (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
425 my_group->list = g_slist_insert_sorted(my_group->list, roster_usr,
564
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
426 (GCompareFunc)&roster_compare_name);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
427 return roster_find(jid, jidsearch, type);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
428 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
429
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
430 // Removes user (jid) from roster, frees allocated memory
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
431 void roster_del_user(const char *jid)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
432 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
433 GSList *sl_user, *sl_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
434 GSList **sl_group_listptr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
435 roster *roster_usr;
246
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
436 GSList *node;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
437
1431
486809ccffc0 Let /del remove a MUC entry from the roster
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
438 sl_user = roster_find(jid, jidsearch,
486809ccffc0 Let /del remove a MUC entry from the roster
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
439 ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM);
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
440 if (sl_user == NULL)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
441 return;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
442 roster_usr = (roster*)sl_user->data;
246
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
443
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
444 // Remove (if present) from unread messages list
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
445 node = g_slist_find(unread_list, roster_usr);
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
446 if (node) unread_list = g_slist_delete_link(unread_list, node);
662
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
447 // If there is a pending unread message, keep track of it
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
448 if (roster_usr->flags & ROSTER_FLAG_MSG)
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
449 unread_jid_add(roster_usr->jid);
246
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
450
1389
cefda9174d62 Fix an old bug in roster_del_user()
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
451 sl_group = roster_usr->list;
cefda9174d62 Fix an old bug in roster_del_user()
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
452
1063
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
453 // Let's free roster_usr memory (jid, name, status message...)
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
454 free_roster_user_data(roster_usr);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
455
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
456 // That's a little complex, we need to dereference twice
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
457 sl_group_listptr = &((roster*)(sl_group->data))->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
458 *sl_group_listptr = g_slist_delete_link(*sl_group_listptr, sl_user);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
459
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
460 // We need to rebuild the list
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
461 if (current_buddy)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
462 buddylist_build();
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
463 // TODO What we could do, too, is to check if the deleted node is
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
464 // current_buddy, in which case we could move current_buddy to the
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
465 // previous (or next) node.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
466 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
467
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
468 // Free all roster data and call buddylist_build() to free the buddylist.
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
469 void roster_free(void)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
470 {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
471 GSList *sl_grp = groups;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
472
301
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
473 // Free unread_list
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
474 if (unread_list) {
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
475 g_slist_free(unread_list);
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
476 unread_list = NULL;
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
477 }
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
478
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
479 // Walk through groups
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
480 while (sl_grp) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
481 roster *roster_grp = (roster*)sl_grp->data;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
482 GSList *sl_usr = roster_grp->list;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
483 // Walk through this group users
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
484 while (sl_usr) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
485 roster *roster_usr = (roster*)sl_usr->data;
662
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
486 // If there is a pending unread message, keep track of it
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
487 if (roster_usr->flags & ROSTER_FLAG_MSG)
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
488 unread_jid_add(roster_usr->jid);
1063
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
489 // Free roster_usr data (jid, name, status message...)
4e62941df777 roster.c: refactor some functions
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
490 free_roster_user_data(roster_usr);
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
491 sl_usr = g_slist_next(sl_usr);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
492 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
493 // Free group's users list
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
494 if (roster_grp->list)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
495 g_slist_free(roster_grp->list);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
496 // Free group's name and jid
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
497 g_free((gchar*)roster_grp->jid);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
498 g_free((gchar*)roster_grp->name);
214
9484ba81ec53 [/trunk] Changeset 226 by mikael
mikael
parents: 212
diff changeset
499 g_free(roster_grp);
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
500 sl_grp = g_slist_next(sl_grp);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
501 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
502 // Free groups list
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
503 if (groups) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
504 g_slist_free(groups);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
505 groups = NULL;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
506 // Update (i.e. free) buddylist
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
507 if (buddylist)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
508 buddylist_build();
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
509 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
510 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
511
468
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
512 // roster_setstatus()
572
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
513 // Note: resname, role, affil and realjid are for room members only
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
514 void roster_setstatus(const char *jid, const char *resname, gchar prio,
468
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
515 enum imstatus bstat, const char *status_msg,
625
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
516 time_t status_time,
572
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
517 enum imrole role, enum imaffiliation affil,
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
518 const char *realjid)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
519 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
520 GSList *sl_user;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
521 roster *roster_usr;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
522 res *p_res;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
523
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
524 sl_user = roster_find(jid, jidsearch,
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
525 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
92
c6270994fb6e [/trunk] Changeset 106 by mikael
mikael
parents: 90
diff changeset
526 // If we can't find it, we add it
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
527 if (sl_user == NULL)
1355
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
528 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER,
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
529 sub_none, -1);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
530
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
531 // If there is no resource name, we can leave now
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
532 if (!resname) return;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
533
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
534 roster_usr = (roster*)sl_user->data;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
535
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
536 // New or updated resource
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
537 p_res = get_or_add_resource(roster_usr, resname, prio);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
538 p_res->status = bstat;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
539 if (p_res->status_msg) {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
540 g_free((gchar*)p_res->status_msg);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
541 p_res->status_msg = NULL;
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
542 }
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
543 if (status_msg)
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
544 p_res->status_msg = g_strdup(status_msg);
625
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
545 if (!status_time)
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
546 time(&status_time);
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
547 p_res->status_timestamp = status_time;
468
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
548
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
549 p_res->role = role;
572
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
550 p_res->affil = affil;
468
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
551
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
552 if (p_res->realjid) {
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
553 g_free((gchar*)p_res->realjid);
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
554 p_res->realjid = NULL;
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
555 }
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
556 if (realjid)
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
557 p_res->realjid = g_strdup(realjid);
843
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
558
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
559 // If bstat is offline, we MUST delete the resource, actually
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
560 if (bstat == offline) {
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
561 del_resource(roster_usr, resname);
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
562 return;
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
563 }
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
564 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
565
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
566 // roster_setflags()
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
567 // Set one or several flags to value (TRUE/FALSE)
80
7fb661f19a77 [/trunk] Changeset 94 by mikael
mikael
parents: 78
diff changeset
568 void roster_setflags(const char *jid, guint flags, guint value)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
569 {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
570 GSList *sl_user;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
571 roster *roster_usr;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
572
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
573 sl_user = roster_find(jid, jidsearch,
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
574 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
575 if (sl_user == NULL)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
576 return;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
577
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
578 roster_usr = (roster*)sl_user->data;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
579 if (value)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
580 roster_usr->flags |= flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
581 else
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
582 roster_usr->flags &= ~flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
583 }
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
584
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
585 // roster_msg_setflag()
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
586 // Set the ROSTER_FLAG_MSG to the given value for the given jid.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
587 // It will update the buddy's group message flag.
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
588 // Update the unread messages list too.
889
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
589 void roster_msg_setflag(const char *jid, guint special, guint value)
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
590 {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
591 GSList *sl_user;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
592 roster *roster_usr, *roster_grp;
860
a8fadbd97858 Rebuild buddylist when setting a new message flag
Mikael Berthe <mikael@lilotux.net>
parents: 848
diff changeset
593 int new_roster_item = FALSE;
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
594 guint unread_list_modified = FALSE;
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
595
889
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
596 if (special) {
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
597 //sl_user = roster_find(jid, namesearch, ROSTER_TYPE_SPECIAL);
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
598 //if (!sl_user) return;
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
599 //roster_usr = (roster*)sl_user->data;
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
600 roster_usr = &roster_special;
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
601 if (value) {
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
602 roster_usr->flags |= ROSTER_FLAG_MSG;
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
603 // Append the roster_usr to unread_list, but avoid duplicates
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
604 if (!g_slist_find(unread_list, roster_usr))
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
605 unread_list = g_slist_append(unread_list, roster_usr);
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
606 } else {
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
607 roster_usr->flags &= ~ROSTER_FLAG_MSG;
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
608 if (unread_list) {
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
609 GSList *node = g_slist_find(unread_list, roster_usr);
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
610 if (node) unread_list = g_slist_delete_link(unread_list, node);
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
611 }
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
612 }
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
613 return;
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
614 }
ae93e69aaaaf Fix up pending message flag for the status special buffer
Mikael Berthe <mikael@lilotux.net>
parents: 885
diff changeset
615
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
616 sl_user = roster_find(jid, jidsearch,
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
617 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
678
e175f5d96f04 Fix a small issue in roster_msg_setflag()
Mikael Berthe <mikael@lilotux.net>
parents: 670
diff changeset
618 // If we can't find it, we add it
e175f5d96f04 Fix a small issue in roster_msg_setflag()
Mikael Berthe <mikael@lilotux.net>
parents: 670
diff changeset
619 if (sl_user == NULL) {
1355
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
620 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, sub_none, -1);
860
a8fadbd97858 Rebuild buddylist when setting a new message flag
Mikael Berthe <mikael@lilotux.net>
parents: 848
diff changeset
621 new_roster_item = TRUE;
678
e175f5d96f04 Fix a small issue in roster_msg_setflag()
Mikael Berthe <mikael@lilotux.net>
parents: 670
diff changeset
622 }
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
623
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
624 roster_usr = (roster*)sl_user->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
625 roster_grp = (roster*)roster_usr->list->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
626 if (value) {
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
627 if (!(roster_usr->flags & ROSTER_FLAG_MSG))
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
628 unread_list_modified = TRUE;
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
629 // Message flag is TRUE. This is easy, we just have to set both flags
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
630 // to TRUE...
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
631 roster_usr->flags |= ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
632 roster_grp->flags |= ROSTER_FLAG_MSG; // group
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
633 // Append the roster_usr to unread_list, but avoid duplicates
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
634 if (!g_slist_find(unread_list, roster_usr))
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
635 unread_list = g_slist_append(unread_list, roster_usr);
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
636 } else {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
637 // Message flag is FALSE.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
638 guint msg = FALSE;
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
639 if (roster_usr->flags & ROSTER_FLAG_MSG)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
640 unread_list_modified = TRUE;
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
641 roster_usr->flags &= ~ROSTER_FLAG_MSG;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
642 if (unread_list) {
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
643 GSList *node = g_slist_find(unread_list, roster_usr);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
644 if (node) unread_list = g_slist_delete_link(unread_list, node);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
645 }
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
646 // For the group value we need to watch all buddies in this group;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
647 // if one is flagged, then the group will be flagged.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
648 // I will re-use sl_user and roster_usr here, as they aren't used
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
649 // anymore.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
650 sl_user = roster_grp->list;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
651 while (sl_user) {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
652 roster_usr = (roster*)sl_user->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
653 if (roster_usr->flags & ROSTER_FLAG_MSG) {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
654 msg = TRUE;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
655 break;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
656 }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
657 sl_user = g_slist_next(sl_user);
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
658 }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
659 if (!msg)
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
660 roster_grp->flags &= ~ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
661 else
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
662 roster_grp->flags |= ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
663 // Actually the "else" part is useless, because the group
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
664 // ROSTER_FLAG_MSG should already be set...
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
665 }
860
a8fadbd97858 Rebuild buddylist when setting a new message flag
Mikael Berthe <mikael@lilotux.net>
parents: 848
diff changeset
666
1010
54405d09b15a Add a call to buddylist_build()
Mikael Berthe <mikael@lilotux.net>
parents: 987
diff changeset
667 if (buddylist && (new_roster_item || !g_list_find(buddylist, roster_usr)))
860
a8fadbd97858 Rebuild buddylist when setting a new message flag
Mikael Berthe <mikael@lilotux.net>
parents: 848
diff changeset
668 buddylist_build();
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
669
1444
3bf11085c6a5 New external "UNREAD" event (suggested by Viacheslav Chumushuk)
Mikael Berthe <mikael@lilotux.net>
parents: 1438
diff changeset
670 if (unread_list_modified) {
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
671 hlog_save_state();
1444
3bf11085c6a5 New external "UNREAD" event (suggested by Viacheslav Chumushuk)
Mikael Berthe <mikael@lilotux.net>
parents: 1438
diff changeset
672 guint unread_count = g_slist_length(unread_list);
3bf11085c6a5 New external "UNREAD" event (suggested by Viacheslav Chumushuk)
Mikael Berthe <mikael@lilotux.net>
parents: 1438
diff changeset
673 /* Call external command */
3bf11085c6a5 New external "UNREAD" event (suggested by Viacheslav Chumushuk)
Mikael Berthe <mikael@lilotux.net>
parents: 1438
diff changeset
674 hk_ext_cmd("", 'U', (guchar)MIN(255, unread_count), NULL);
3bf11085c6a5 New external "UNREAD" event (suggested by Viacheslav Chumushuk)
Mikael Berthe <mikael@lilotux.net>
parents: 1438
diff changeset
675 }
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
676 }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
677
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
678 const char *roster_getname(const char *jid)
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
679 {
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
680 GSList *sl_user;
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
681 roster *roster_usr;
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
682
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
683 sl_user = roster_find(jid, jidsearch,
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
684 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
685 if (sl_user == NULL)
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
686 return NULL; // Not in the roster...
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
687
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
688 roster_usr = (roster*)sl_user->data;
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
689 return roster_usr->name;
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
690 }
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
691
863
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
692 const char *roster_getnickname(const char *jid)
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
693 {
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
694 GSList *sl_user;
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
695 roster *roster_usr;
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
696
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
697 sl_user = roster_find(jid, jidsearch,
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
698 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
699 if (sl_user == NULL)
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
700 return NULL; // Not in the roster...
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
701
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
702 roster_usr = (roster*)sl_user->data;
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
703 return roster_usr->nickname;
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
704 }
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
705
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
706 void roster_settype(const char *jid, guint type)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
707 {
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
708 GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
709 roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
710
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
711 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
712 return;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
713
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
714 roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
715 roster_usr->type = type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
716 }
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
717
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
718 enum imstatus roster_getstatus(const char *jid, const char *resname)
90
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
719 {
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
720 GSList *sl_user;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
721 roster *roster_usr;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
722 res *p_res;
90
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
723
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
724 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
725 if (sl_user == NULL)
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
726 return offline; // Not in the roster, anyway...
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
727
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
728 roster_usr = (roster*)sl_user->data;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
729 p_res = get_resource(roster_usr, resname);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
730 if (p_res)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
731 return p_res->status;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
732 return offline;
90
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
733 }
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
734
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
735 const char *roster_getstatusmsg(const char *jid, const char *resname)
318
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
736 {
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
737 GSList *sl_user;
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
738 roster *roster_usr;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
739 res *p_res;
318
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
740
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
741 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
742 if (sl_user == NULL)
425
03f1e37759a6 roster_getstatusmsg() should return a pointer
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
743 return NULL; // Not in the roster, anyway...
318
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
744
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
745 roster_usr = (roster*)sl_user->data;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
746 p_res = get_resource(roster_usr, resname);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
747 if (p_res)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
748 return p_res->status_msg;
843
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
749 return roster_usr->offline_status_message;
318
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
750 }
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
751
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
752 guint roster_gettype(const char *jid)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
753 {
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
754 GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
755 roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
756
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
757 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
758 return 0;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
759
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
760 roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
761 return roster_usr->type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
762 }
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
763
819
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
764 guint roster_getsubscription(const char *jid)
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
765 {
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
766 GSList *sl_user;
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
767 roster *roster_usr;
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
768
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
769 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
770 return 0;
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
771
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
772 roster_usr = (roster*)sl_user->data;
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
773 return roster_usr->subscription;
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
774 }
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
775
610
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
776 // roster_unsubscribed()
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
777 // We have lost buddy's presence updates; this function clears the status
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
778 // message, sets the buddy offline and frees the resources
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
779 void roster_unsubscribed(const char *jid)
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
780 {
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
781 GSList *sl_user;
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
782 roster *roster_usr;
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
783
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
784 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
785 if (sl_user == NULL)
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
786 return;
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
787
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
788 roster_usr = (roster*)sl_user->data;
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
789 free_all_resources(&roster_usr->resource);
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
790 }
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
791
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
792
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
793 /* ### BuddyList functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
794
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
795 // buddylist_set_hide_offline_buddies(hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
796 // "hide" values: 1=hide 0=show_all -1=invert
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
797 void buddylist_set_hide_offline_buddies(int hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
798 {
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
799 if (hide < 0) { // NEG (invert)
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
800 if (display_filter == DFILTER_ALL)
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
801 display_filter = DFILTER_ONLINE;
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
802 else
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
803 display_filter = DFILTER_ALL;
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
804 } else if (hide == 0) { // FALSE (don't hide -- andfo_)
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
805 display_filter = DFILTER_ALL;
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
806 } else { // TRUE (hide -- andfo)
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
807 display_filter = DFILTER_ONLINE;
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
808 }
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
809 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
810
1413
f89844a0448a Remove useless inlines
Mikael Berthe <mikael@lilotux.net>
parents: 1389
diff changeset
811 int buddylist_isset_filter(void)
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
812 {
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
813 return (display_filter != DFILTER_ALL);
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
814 }
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
815
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
816 void buddylist_set_filter(guchar filter)
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
817 {
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
818 display_filter = filter;
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
819 }
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
820
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
821 guchar buddylist_get_filter(void)
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
822 {
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
823 return display_filter;
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
824 }
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
825
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
826 // buddylist_build()
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
827 // Creates the buddylist from the roster entries.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
828 void buddylist_build(void)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
829 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
830 GSList *sl_roster_elt = groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
831 roster *roster_elt;
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
832 roster *roster_current_buddy = NULL;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
833 roster *roster_alternate_buddy = NULL;
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
834 int shrunk_group;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
835
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
836 // We need to remember which buddy is selected.
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
837 if (current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
838 roster_current_buddy = BUDDATA(current_buddy);
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
839 current_buddy = NULL;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
840 if (alternate_buddy)
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
841 roster_alternate_buddy = BUDDATA(alternate_buddy);
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
842 alternate_buddy = NULL;
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
843
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
844 // Destroy old buddylist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
845 if (buddylist) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
846 g_list_free(buddylist);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
847 buddylist = NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
848 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
849
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
850 buddylist = g_list_append(buddylist, &roster_special);
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
851
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
852 // Create the new list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
853 while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
854 GSList *sl_roster_usrelt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
855 roster *roster_usrelt;
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
856 guint pending_group = TRUE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
857 roster_elt = (roster*) sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
858
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
859 shrunk_group = roster_elt->flags & ROSTER_FLAG_HIDE;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
860
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
861 sl_roster_usrelt = roster_elt->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
862 while (sl_roster_usrelt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
863 roster_usrelt = (roster*) sl_roster_usrelt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
864
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
865 // Buddy will be added if either:
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
866 // - buddy's status matches the display_filter
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
867 // - buddy has a lock (for example the buddy window is currently open)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
868 // - buddy has a pending (non-read) message
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
869 // - group isn't hidden (shrunk)
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
870 // - this is the current_buddy
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
871 if (roster_usrelt == roster_current_buddy ||
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
872 display_filter & 1<<buddy_getstatus((gpointer)roster_usrelt, NULL) ||
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
873 (buddy_getflags((gpointer)roster_usrelt) &
974
36f7753dfb59 Add /roster item_{lock,unlock}
Mikael Berthe <mikael@lilotux.net>
parents: 952
diff changeset
874 (ROSTER_FLAG_LOCK | ROSTER_FLAG_USRLOCK | ROSTER_FLAG_MSG))) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
875 // This user should be added. Maybe the group hasn't been added yet?
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
876 if (pending_group) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
877 // It hasn't been done yet
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
878 buddylist = g_list_append(buddylist, roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
879 pending_group = FALSE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
880 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
881 // Add user
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
882 // XXX Should we add the user if there is a message and
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
883 // the group is shrunk? If so, we'd need to check LOCK flag too,
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
884 // perhaps...
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
885 if (!shrunk_group)
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
886 buddylist = g_list_append(buddylist, roster_usrelt);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
887 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
888
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
889 sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
890 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
891 sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
892 }
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
893
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
894 // Check if we can find our saved current_buddy...
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
895 if (roster_current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
896 current_buddy = g_list_find(buddylist, roster_current_buddy);
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
897 if (roster_alternate_buddy)
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
898 alternate_buddy = g_list_find(buddylist, roster_alternate_buddy);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
899 // current_buddy initialization
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
900 if (!current_buddy || (g_list_position(buddylist, current_buddy) == -1))
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
901 current_buddy = g_list_first(buddylist);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
902 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
903
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
904 // buddy_hide_group(roster, hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
905 // "hide" values: 1=hide 0=show_all -1=invert
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
906 void buddy_hide_group(gpointer rosterdata, int hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
907 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
908 roster *roster_usr = rosterdata;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
909 if (hide > 0) // TRUE (hide)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
910 roster_usr->flags |= ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
911 else if (hide < 0) // NEG (invert)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
912 roster_usr->flags ^= ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
913 else // FALSE (don't hide)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
914 roster_usr->flags &= ~ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
915 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
916
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
917 const char *buddy_getjid(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
918 {
1292
382ec54b584e Muc nick coloring functionality
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1205
diff changeset
919 if (!rosterdata)
382ec54b584e Muc nick coloring functionality
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1205
diff changeset
920 return NULL;
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
921 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
922 return roster_usr->jid;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
923 }
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
924
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
925 // buddy_setgroup()
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
926 // Change the group of current buddy
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
927 //
1366
01e558748379 Fix a race in roster_add_user()
Mikael Berthe <mikael@lilotux.net>
parents: 1355
diff changeset
928 // Note: buddy_setgroup() updates the user lists.
01e558748379 Fix a race in roster_add_user()
Mikael Berthe <mikael@lilotux.net>
parents: 1355
diff changeset
929 //
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
930 void buddy_setgroup(gpointer rosterdata, char *newgroupname)
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
931 {
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
932 roster *roster_usr = rosterdata;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
933 GSList **sl_group;
620
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
934 GSList *sl_newgroup;
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
935 roster *my_newgroup;
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
936
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
937 // A group has no group :)
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
938 if (roster_usr->type & ROSTER_TYPE_GROUP) return;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
939
620
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
940 // Add newgroup if necessary
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
941 if (!newgroupname) newgroupname = "";
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
942 sl_newgroup = roster_add_group(newgroupname);
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
943 if (!sl_newgroup) return;
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
944 my_newgroup = (roster*)sl_newgroup->data;
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
945
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
946 // Remove the buddy from current group
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
947 sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
948 *sl_group = g_slist_remove(*sl_group, rosterdata);
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
949
621
f20c1934a8a7 "/move": remove old group if it is empty
Mikael Berthe <mikael@lilotux.net>
parents: 620
diff changeset
950 // Remove old group if it is empty
f20c1934a8a7 "/move": remove old group if it is empty
Mikael Berthe <mikael@lilotux.net>
parents: 620
diff changeset
951 if (!*sl_group) {
f20c1934a8a7 "/move": remove old group if it is empty
Mikael Berthe <mikael@lilotux.net>
parents: 620
diff changeset
952 roster *roster_grp = (roster*)((GSList*)roster_usr->list)->data;
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
953 g_free((gchar*)roster_grp->jid);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
954 g_free((gchar*)roster_grp->name);
621
f20c1934a8a7 "/move": remove old group if it is empty
Mikael Berthe <mikael@lilotux.net>
parents: 620
diff changeset
955 g_free(roster_grp);
f20c1934a8a7 "/move": remove old group if it is empty
Mikael Berthe <mikael@lilotux.net>
parents: 620
diff changeset
956 groups = g_slist_remove(groups, roster_grp);
f20c1934a8a7 "/move": remove old group if it is empty
Mikael Berthe <mikael@lilotux.net>
parents: 620
diff changeset
957 }
f20c1934a8a7 "/move": remove old group if it is empty
Mikael Berthe <mikael@lilotux.net>
parents: 620
diff changeset
958
620
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
959 // Add the buddy to its new group
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
960 roster_usr->list = sl_newgroup; // (my_newgroup SList element)
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
961 my_newgroup->list = g_slist_insert_sorted(my_newgroup->list, roster_usr,
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
962 (GCompareFunc)&roster_compare_name);
212
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
963
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
964 buddylist_build();
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
965 }
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
966
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
967 void buddy_setname(gpointer rosterdata, char *newname)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
968 {
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
969 roster *roster_usr = rosterdata;
209
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
970 GSList **sl_group;
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
971
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
972 // TODO For groups, we need to check for unicity
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
973 // However, renaming a group boils down to moving all its buddies to
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
974 // another group, so calling this function is not really necessary...
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
975 if (roster_usr->type & ROSTER_TYPE_GROUP) return;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
976
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
977 if (roster_usr->name) {
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
978 g_free((gchar*)roster_usr->name);
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
979 roster_usr->name = NULL;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
980 }
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
981 if (newname)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
982 roster_usr->name = g_strdup(newname);
209
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
983
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
984 // We need to resort the group list
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
985 sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list;
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
986 *sl_group = g_slist_sort(*sl_group, (GCompareFunc)&roster_compare_name);
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
987
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
988 buddylist_build();
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
989 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
990
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
991 const char *buddy_getname(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
992 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
993 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
994 return roster_usr->name;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
995 }
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
996
548
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
997 // buddy_setnickname(buddy, newnickname)
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
998 // Only for chatrooms
469
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
999 void buddy_setnickname(gpointer rosterdata, const char *newname)
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1000 {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1001 roster *roster_usr = rosterdata;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1002
649
3ad6675caaf1 MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents: 644
diff changeset
1003 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; // XXX Error message?
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1004
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1005 if (roster_usr->nickname) {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1006 g_free((gchar*)roster_usr->nickname);
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1007 roster_usr->nickname = NULL;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1008 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1009 if (newname)
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1010 roster_usr->nickname = g_strdup(newname);
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1011 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1012
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1013 const char *buddy_getnickname(gpointer rosterdata)
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1014 {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1015 roster *roster_usr = rosterdata;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1016 return roster_usr->nickname;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1017 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1018
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1019 // buddy_setinsideroom(buddy, inside)
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1020 // Only for chatrooms
952
527d6f234924 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
1021 void buddy_setinsideroom(gpointer rosterdata, guint inside)
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1022 {
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1023 roster *roster_usr = rosterdata;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1024
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1025 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1026
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1027 roster_usr->inside_room = inside;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1028 }
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1029
952
527d6f234924 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
1030 guint buddy_getinsideroom(gpointer rosterdata)
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1031 {
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1032 roster *roster_usr = rosterdata;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1033 return roster_usr->inside_room;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1034 }
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
1035
548
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1036 // buddy_settopic(buddy, newtopic)
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1037 // Only for chatrooms
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1038 void buddy_settopic(gpointer rosterdata, const char *newtopic)
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1039 {
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1040 roster *roster_usr = rosterdata;
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1041
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1042 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return;
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1043
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1044 if (roster_usr->topic) {
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1045 g_free((gchar*)roster_usr->topic);
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1046 roster_usr->topic = NULL;
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1047 }
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1048 if (newtopic)
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1049 roster_usr->topic = g_strdup(newtopic);
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1050 }
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1051
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1052 const char *buddy_gettopic(gpointer rosterdata)
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1053 {
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1054 roster *roster_usr = rosterdata;
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1055 return roster_usr->topic;
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1056 }
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1057
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1058 void buddy_setprintstatus(gpointer rosterdata, enum room_printstatus pstatus)
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1059 {
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1060 roster *roster_usr = rosterdata;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1061 roster_usr->print_status = pstatus;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1062 }
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1063
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1064 enum room_printstatus buddy_getprintstatus(gpointer rosterdata)
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1065 {
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1066 roster *roster_usr = rosterdata;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1067 return roster_usr->print_status;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1068 }
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1069
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1070 void buddy_setautowhois(gpointer rosterdata, enum room_autowhois awhois)
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1071 {
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1072 roster *roster_usr = rosterdata;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1073 roster_usr->auto_whois = awhois;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1074 }
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1075
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1076 enum room_autowhois buddy_getautowhois(gpointer rosterdata)
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1077 {
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1078 roster *roster_usr = rosterdata;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1079 return roster_usr->auto_whois;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1080 }
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1366
diff changeset
1081
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1082 // buddy_getgroupname()
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1083 // Returns a pointer on buddy's group name.
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1084 const char *buddy_getgroupname(gpointer rosterdata)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1085 {
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1086 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1087
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1088 if (roster_usr->type & ROSTER_TYPE_GROUP)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1089 return roster_usr->name;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1090
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
1091 if (roster_usr->type & ROSTER_TYPE_SPECIAL)
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
1092 return NULL;
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
1093
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1094 // This is a user
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1095 return ((roster*)((GSList*)roster_usr->list)->data)->name;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1096 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1097
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
1098 // buddy_getgroup()
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
1099 // Returns a pointer on buddy's group.
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
1100 gpointer buddy_getgroup(gpointer rosterdata)
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
1101 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1102 roster *roster_usr = rosterdata;
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
1103
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1104 if (roster_usr->type & ROSTER_TYPE_GROUP)
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
1105 return rosterdata;
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
1106
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
1107 if (roster_usr->type & ROSTER_TYPE_SPECIAL)
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
1108 return NULL;
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
1109
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
1110 // This is a user
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1111 return (gpointer)((GSList*)roster_usr->list)->data;
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
1112 }
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
1113
489
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
1114 void buddy_settype(gpointer rosterdata, guint type)
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
1115 {
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
1116 roster *roster_usr = rosterdata;
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
1117 roster_usr->type = type;
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
1118 }
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
1119
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1120 guint buddy_gettype(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1121 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1122 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1123 return roster_usr->type;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1124 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1125
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1126 guint buddy_getsubscription(gpointer rosterdata)
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1127 {
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1128 roster *roster_usr = rosterdata;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1129 return roster_usr->subscription;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1130 }
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1131
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1132 enum imstatus buddy_getstatus(gpointer rosterdata, const char *resname)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1133 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1134 roster *roster_usr = rosterdata;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1135 res *p_res = get_resource(roster_usr, resname);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1136 if (p_res)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1137 return p_res->status;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1138 return offline;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1139 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1140
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1141 const char *buddy_getstatusmsg(gpointer rosterdata, const char *resname)
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
1142 {
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
1143 roster *roster_usr = rosterdata;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1144 res *p_res = get_resource(roster_usr, resname);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1145 if (p_res)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1146 return p_res->status_msg;
843
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
1147 return roster_usr->offline_status_message;
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
1148 }
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
1149
625
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1150 time_t buddy_getstatustime(gpointer rosterdata, const char *resname)
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1151 {
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1152 roster *roster_usr = rosterdata;
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1153 res *p_res = get_resource(roster_usr, resname);
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1154 if (p_res)
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1155 return p_res->status_timestamp;
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1156 return 0;
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1157 }
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1158
439
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1159 gchar buddy_getresourceprio(gpointer rosterdata, const char *resname)
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1160 {
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1161 roster *roster_usr = rosterdata;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1162 res *p_res = get_resource(roster_usr, resname);
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1163 if (p_res)
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1164 return p_res->prio;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1165 return 0;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1166 }
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1167
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1168 guint buddy_resource_getevents(gpointer rosterdata, const char *resname)
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1169 {
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1170 roster *roster_usr = rosterdata;
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1171 res *p_res = get_resource(roster_usr, resname);
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1172 if (p_res)
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1173 return p_res->events;
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1174 return ROSTER_EVENT_NONE;
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1175 }
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1176
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1177 void buddy_resource_setevents(gpointer rosterdata, const char *resname,
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1178 guint events)
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1179 {
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1180 roster *roster_usr = rosterdata;
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1181 res *p_res = get_resource(roster_usr, resname);
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1182 if (p_res)
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1183 p_res->events = events;
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1184 }
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1185
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1186 struct jep0022 *buddy_resource_jep22(gpointer rosterdata, const char *resname)
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1187 {
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1188 #ifdef JEP0022
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1189 roster *roster_usr = rosterdata;
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1190 res *p_res = get_resource(roster_usr, resname);
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1191 if (p_res)
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1192 return &p_res->jep22;
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1193 #endif
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1194 return NULL;
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1195 }
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1196
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1197 struct jep0085 *buddy_resource_jep85(gpointer rosterdata, const char *resname)
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1198 {
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1199 #ifdef JEP0085
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1200 roster *roster_usr = rosterdata;
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1201 res *p_res = get_resource(roster_usr, resname);
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1202 if (p_res)
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1203 return &p_res->jep85;
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1204 #endif
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1205 return NULL;
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1206 }
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1207
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
1208 struct pgp_data *buddy_resource_pgp(gpointer rosterdata, const char *resname)
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
1209 {
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
1210 #ifdef HAVE_GPGME
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
1211 roster *roster_usr = rosterdata;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
1212 res *p_res = get_resource(roster_usr, resname);
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
1213 if (p_res)
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
1214 return &p_res->pgpdata;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
1215 #endif
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
1216 return NULL;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
1217 }
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
1218
572
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1219 enum imrole buddy_getrole(gpointer rosterdata, const char *resname)
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1220 {
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1221 roster *roster_usr = rosterdata;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1222 res *p_res = get_resource(roster_usr, resname);
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1223 if (p_res)
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1224 return p_res->role;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1225 return role_none;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1226 }
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1227
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1228 enum imaffiliation buddy_getaffil(gpointer rosterdata, const char *resname)
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1229 {
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1230 roster *roster_usr = rosterdata;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1231 res *p_res = get_resource(roster_usr, resname);
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1232 if (p_res)
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1233 return p_res->affil;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1234 return affil_none;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1235 }
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1236
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1237 const char *buddy_getrjid(gpointer rosterdata, const char *resname)
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1238 {
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1239 roster *roster_usr = rosterdata;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1240 res *p_res = get_resource(roster_usr, resname);
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1241 if (p_res)
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1242 return p_res->realjid;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1243 return NULL;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1244 }
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1245
439
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1246 // buddy_getresources(roster_data)
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1247 // Return a singly-linked-list of resource names
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1248 // Note: the caller should free the list (and data) after use
501
7c1ca00070e8 Add COMPL_RESOURCE (resource completion category)
Mikael Berthe <mikael@lilotux.net>
parents: 494
diff changeset
1249 // If roster_data is null, the current buddy is selected
439
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1250 GSList *buddy_getresources(gpointer rosterdata)
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1251 {
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1252 roster *roster_usr = rosterdata;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1253 GSList *reslist = NULL, *lp;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1254
501
7c1ca00070e8 Add COMPL_RESOURCE (resource completion category)
Mikael Berthe <mikael@lilotux.net>
parents: 494
diff changeset
1255 if (!roster_usr) {
7c1ca00070e8 Add COMPL_RESOURCE (resource completion category)
Mikael Berthe <mikael@lilotux.net>
parents: 494
diff changeset
1256 if (!current_buddy) return NULL;
7c1ca00070e8 Add COMPL_RESOURCE (resource completion category)
Mikael Berthe <mikael@lilotux.net>
parents: 494
diff changeset
1257 roster_usr = BUDDATA(current_buddy);
7c1ca00070e8 Add COMPL_RESOURCE (resource completion category)
Mikael Berthe <mikael@lilotux.net>
parents: 494
diff changeset
1258 }
439
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1259 for (lp = roster_usr->resource; lp; lp = g_slist_next(lp))
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1260 reslist = g_slist_append(reslist, g_strdup(((res*)lp->data)->name));
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1261
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1262 return reslist;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1263 }
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1264
792
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1265 // buddy_getresources_locale(roster_data)
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1266 // Same as buddy_getresources() but names are converted to user's locale
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1267 // Note: the caller should free the list (and data) after use
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1268 GSList *buddy_getresources_locale(gpointer rosterdata)
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1269 {
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1270 GSList *reslist, *lp;
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1271
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1272 reslist = buddy_getresources(rosterdata);
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1273 // Convert each item to UI's locale
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1274 for (lp = reslist; lp; lp = g_slist_next(lp)) {
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1275 gchar *oldname = lp->data;
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1276 lp->data = from_utf8(oldname);
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1277 if (lp->data)
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1278 g_free(oldname);
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1279 else
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1280 lp->data = oldname;
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1281 }
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1282 return reslist;
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1283 }
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1284
652
b243d3b3ff1b We do not need buddy_isresource() anymore
Mikael Berthe <mikael@lilotux.net>
parents: 649
diff changeset
1285 /*
539
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1286 // buddy_isresource(roster_data)
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1287 // Return true if there is at least one resource
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1288 // (which means, for a room, that it isn't empty)
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1289 int buddy_isresource(gpointer rosterdata)
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1290 {
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1291 roster *roster_usr = rosterdata;
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1292 if (!roster_usr)
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1293 return FALSE;
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1294 if (roster_usr->resource)
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1295 return TRUE;
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1296 return FALSE;
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1297 }
652
b243d3b3ff1b We do not need buddy_isresource() anymore
Mikael Berthe <mikael@lilotux.net>
parents: 649
diff changeset
1298 */
539
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1299
468
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1300 // buddy_resource_setname(roster_data, oldname, newname)
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1301 // Useful for nickname change in a MUC room
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1302 void buddy_resource_setname(gpointer rosterdata, const char *resname,
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1303 const char *newname)
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1304 {
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1305 roster *roster_usr = rosterdata;
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1306 res *p_res = get_resource(roster_usr, resname);
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1307 if (p_res) {
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1308 if (p_res->name) {
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1309 g_free((gchar*)p_res->name);
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1310 p_res->name = NULL;
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1311 }
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1312 if (newname)
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1313 p_res->name = g_strdup(newname);
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1314 }
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1315 }
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1316
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1317 // buddy_del_all_resources()
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1318 // Remove all resources from the specified buddy
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1319 void buddy_del_all_resources(gpointer rosterdata)
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1320 {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1321 roster *roster_usr = rosterdata;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1322
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1323 while (roster_usr->resource) {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1324 res *r = roster_usr->resource->data;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1325 del_resource(roster_usr, r->name);
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1326 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1327 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1328
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1329 // buddy_setflags()
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1330 // Set one or several flags to value (TRUE/FALSE)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1331 void buddy_setflags(gpointer rosterdata, guint flags, guint value)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1332 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1333 roster *roster_usr = rosterdata;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1334 if (value)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1335 roster_usr->flags |= flags;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1336 else
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1337 roster_usr->flags &= ~flags;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1338 }
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1339
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1340 guint buddy_getflags(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1341 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1342 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1343 return roster_usr->flags;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1344 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1345
1355
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1346 // buddy_setonserverflag()
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1347 // Set the on_server flag
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1348 void buddy_setonserverflag(gpointer rosterdata, guint onserver)
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1349 {
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1350 roster *roster_usr = rosterdata;
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1351 roster_usr->on_server = onserver;
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1352 }
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1353
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1354 guint buddy_getonserverflag(gpointer rosterdata)
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1355 {
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1356 roster *roster_usr = rosterdata;
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1357 return roster_usr->on_server;
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1358 }
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1331
diff changeset
1359
480
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1360 // buddy_search_jid(jid)
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1361 // Look for a buddy with specified jid.
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1362 // Search begins at buddylist; if no match is found in the the buddylist,
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1363 // return NULL;
1292
382ec54b584e Muc nick coloring functionality
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1205
diff changeset
1364 GList *buddy_search_jid(const char *jid)
480
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1365 {
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1366 GList *buddy;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1367 roster *roster_usr;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1368
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1369 if (!buddylist) return NULL;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1370
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1371 for (buddy = buddylist; buddy; buddy = g_list_next(buddy)) {
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1372 roster_usr = (roster*)buddy->data;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1373 if (roster_usr->jid && !strcasecmp(roster_usr->jid, jid))
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1374 return buddy;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1375 }
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1376 return NULL;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1377 }
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1378
265
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1379 // buddy_search(string)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1380 // Look for a buddy whose name or jid contains string.
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1381 // Search begins at current_buddy; if no match is found in the the buddylist,
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1382 // return NULL;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1383 GList *buddy_search(char *string)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1384 {
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1385 GList *buddy = current_buddy;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1386 roster *roster_usr;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1387 if (!buddylist || !current_buddy) return NULL;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1388 for (;;) {
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1389 gchar *jid_locale, *name_locale;
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1390 char *found = NULL;
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1391
265
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1392 buddy = g_list_next(buddy);
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1393 if (!buddy)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1394 buddy = buddylist;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1395
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1396 roster_usr = (roster*)buddy->data;
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1397
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1398 jid_locale = from_utf8(roster_usr->jid);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1399 if (jid_locale) {
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1400 found = strcasestr(jid_locale, string);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1401 g_free(jid_locale);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1402 if (found)
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1403 return buddy;
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1404 }
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1405 name_locale = from_utf8(roster_usr->name);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1406 if (name_locale) {
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1407 found = strcasestr(name_locale, string);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1408 g_free(name_locale);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1409 if (found)
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1410 return buddy;
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1411 }
265
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1412
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1413 if (buddy == current_buddy)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1414 return NULL; // Back to the beginning, and no match found
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1415 }
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1416 }
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1417
532
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1418 // foreach_buddy(roster_type, pfunction, param)
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1419 // Call pfunction(buddy, param) for each buddy from the roster with
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1420 // type matching roster_type.
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1421 void foreach_buddy(guint roster_type,
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1422 void (*pfunc)(gpointer rosterdata, void *param),
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1423 void *param)
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1424 {
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1425 GSList *sl_roster_elt = groups;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1426 roster *roster_elt;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1427 GSList *sl_roster_usrelt;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1428 roster *roster_usrelt;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1429
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1430 while (sl_roster_elt) { // group list loop
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1431 roster_elt = (roster*) sl_roster_elt->data;
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
1432 if (roster_elt->type & ROSTER_TYPE_SPECIAL)
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
1433 continue; // Skip special items
532
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1434 sl_roster_usrelt = roster_elt->list;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1435 while (sl_roster_usrelt) { // user list loop
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1436 roster_usrelt = (roster*) sl_roster_usrelt->data;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1437
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1438 if (roster_usrelt->type & roster_type)
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1439 pfunc(roster_usrelt, param);
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1440
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1441 sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1442 }
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1443 sl_roster_elt = g_slist_next(sl_roster_elt);
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1444 }
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1445 }
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1446
885
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1447 // foreach_group_member(group, pfunction, param)
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1448 // Call pfunction(buddy, param) for each buddy in the specified group.
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1449 void foreach_group_member(gpointer groupdata,
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1450 void (*pfunc)(gpointer rosterdata, void *param),
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1451 void *param)
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1452 {
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1453 roster *roster_elt;
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1454 GSList *sl_roster_usrelt;
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1455 roster *roster_usrelt;
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1456
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1457 roster_elt = groupdata;
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1458
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1459 if (!(roster_elt->type & ROSTER_TYPE_GROUP))
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1460 return;
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1461
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1462 sl_roster_usrelt = roster_elt->list;
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1463 while (sl_roster_usrelt) { // user list loop
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1464 roster_usrelt = (roster*) sl_roster_usrelt->data;
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1465
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1466 pfunc(roster_usrelt, param);
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1467 sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1468 }
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1469 }
afdd81c2c44d Allow /rename for groups
Mikael Berthe <mikael@lilotux.net>
parents: 863
diff changeset
1470
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1471 // compl_list(type)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1472 // Returns a list of jid's or groups. (For commands completion)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1473 // type: ROSTER_TYPE_USER (jid's) or ROSTER_TYPE_GROUP (group names)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1474 // The list should be freed by the caller after use.
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1475 GSList *compl_list(guint type)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1476 {
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1477 GSList *list = NULL;
1088
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1478 GSList *sl_roster_elt = groups;
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1479 roster *roster_elt;
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1480 GSList *sl_roster_usrelt;
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1481 roster *roster_usrelt;
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1482
1088
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1483 while (sl_roster_elt) { // group list loop
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1484 roster_elt = (roster*) sl_roster_elt->data;
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1485
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1486 if (roster_elt->type & ROSTER_TYPE_SPECIAL)
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1487 continue; // Skip special items
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1488
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1489 if (type == ROSTER_TYPE_GROUP) { // (group names)
1088
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1490 if (roster_elt->name && *(roster_elt->name))
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1491 list = g_slist_append(list, from_utf8(roster_elt->name));
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1492 } else { // ROSTER_TYPE_USER (jid) (or agent, or chatroom...)
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1493 sl_roster_usrelt = roster_elt->list;
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1494 while (sl_roster_usrelt) { // user list loop
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1495 roster_usrelt = (roster*) sl_roster_usrelt->data;
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1496
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1497 if (roster_usrelt->jid)
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1498 list = g_slist_append(list, from_utf8(roster_usrelt->jid));
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1499
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1500 sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1501 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1502 }
1088
c55b24818546 Enable jid completion for hidden buddies (e.g. offline contacts)
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
1503 sl_roster_elt = g_slist_next(sl_roster_elt);
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1504 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1505
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1506 return list;
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1507 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1508
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1509 // unread_msg(rosterdata)
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1510 // Return the next buddy with an unread message. If the parameter is NULL,
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1511 // return the first buddy with an unread message.
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1512 gpointer unread_msg(gpointer rosterdata)
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1513 {
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1514 GSList *unread, *next_unread;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1515
564
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1516 if (!unread_list)
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1517 return NULL;
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1518
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1519 // First unread message
564
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1520 if (!rosterdata)
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1521 return unread_list->data;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1522
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1523 unread = g_slist_find(unread_list, rosterdata);
564
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1524 if (!unread)
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1525 return unread_list->data;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1526
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1527 next_unread = g_slist_next(unread);
564
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1528 if (next_unread)
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1529 return next_unread->data;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1530 return unread_list->data;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1531 }
576
8b3db0b555a1 Add Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 572
diff changeset
1532
662
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1533
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1534 /* ### "unread_jids" functions ###
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1535 *
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1536 * The unread_jids hash table is used to keep track of the buddies with
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1537 * unread messages when a disconnection occurs.
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1538 * When removing a buddy with an unread message from the roster, the
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1539 * jid should be added to the unread_jids table. When adding a buddy to
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1540 * the roster, we check if (s)he had a pending unread message.
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1541 */
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1542
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1543 // unread_jid_add(jid)
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1544 // Add jid to the unread_jids hash table
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1545 void unread_jid_add(const char *jid)
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1546 {
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1547 if (!unread_jids) {
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1548 // Initialize unread_jids hash table
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1549 unread_jids = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1550 }
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1551 // The 2nd unread_jids is an arbitrary non-null pointer:
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1552 g_hash_table_insert(unread_jids, g_strdup(jid), unread_jids);
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1553 }
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1554
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1555 // unread_jid_del(jid)
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1556 // Return TRUE if jid is found in the table (and remove it), FALSE if not
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
1557 static int unread_jid_del(const char *jid)
662
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1558 {
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1559 if (!unread_jids)
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1560 return FALSE;
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1561 return g_hash_table_remove(unread_jids, jid);
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1562 }
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1563
1438
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1564 // Helper function for unread_jid_get_list()
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1565 static void add_to_unreadjids(gpointer key, gpointer value, gpointer udata)
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1566 {
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1567 GList **listp = udata;
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1568 *listp = g_list_append(*listp, key);
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1569 }
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1570
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
1571 // unread_jid_get_list()
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
1572 // Return the JID list.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
1573 // The content of the list should not be modified or freed.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
1574 // The caller should call g_list_free() after use.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
1575 GList *unread_jid_get_list(void)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
1576 {
1438
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1577 GList *list = NULL;
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1578
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
1579 if (!unread_jids)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
1580 return NULL;
1438
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1581
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1582 // g_hash_table_get_keys() is only in glib >= 2.14
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1583 //return g_hash_table_get_keys(unread_jids);
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1584
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1585 g_hash_table_foreach(unread_jids, add_to_unreadjids, &list);
c5d937d5530b g_hash_table_get_keys() is only in glib >= 2.14
Mikael Berthe <mikael@lilotux.net>
parents: 1437
diff changeset
1586 return list;
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
1587 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1431
diff changeset
1588
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
1589 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */