annotate mcabber/src/roster.c @ 880:ea983a945eba

/buffer scroll_unlock: Don't always jump to the end of the buffer If there is no pending message, do not jump to the bottom of the buffer. For special buffers (e.g. for the status buffer) pending flag is currently disabled so we jump unconditionally.
author Mikael Berthe <mikael@lilotux.net>
date Sat, 27 May 2006 15:59:05 +0200
parents 4f1a93faffea
children afdd81c2c44d
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 *
699
ee03b56b93ee Update Copyright (2006)
Mikael Berthe <mikael@lilotux.net>
parents: 678
diff changeset
4 * Copyright (C) 2005, 2006 Mikael Berthe <bmikael@lists.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
265
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
22 #define _GNU_SOURCE /* for strcasestr() */
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
23 #include <string.h>
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
24
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
25 #include "roster.h"
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
26 #include "utils.h"
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
27
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
28
584
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
29 char *strrole[] = { /* Should match enum in roster.h */
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
30 "none",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
31 "moderator",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
32 "participant",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
33 "visitor"
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
34 };
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 char *straffil[] = { /* Should match enum roster.h */
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
37 "none",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
38 "owner",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
39 "admin",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
40 "memeber",
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
41 "outcast"
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
42 };
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
43
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
44 /* Resource structure */
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
45
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
46 typedef struct {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
47 gchar *name;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
48 gchar prio;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
49 enum imstatus status;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
50 gchar *status_msg;
625
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
51 time_t status_timestamp;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
52 enum imrole role;
572
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
53 enum imaffiliation affil;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
54 gchar *realjid; /* for chatrooms, if buddy's real jid is known */
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
55 } res;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
56
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
57 /* This is a private structure type for the roster */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
58
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
59 typedef struct {
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
60 gchar *name;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
61 gchar *jid;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
62 guint type;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
63 enum subscr subscription;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
64 GSList *resource;
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
65
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
66 /* For groupchats */
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
67 gchar *nickname;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
68 gchar *topic;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
69 guint8 inside_room;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
70
843
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
71 /* 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
72 gchar *offline_status_message;
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
73
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
74 /* Flag used for the UI */
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
75 guint flags;
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
76
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
77 // list: user -> points to his group; group -> points to its users list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
78 GSList *list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
79 } roster;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
80
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
81
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
82 /* ### Variables ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
83
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
84 static int hide_offline_buddies;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
85 static GSList *groups;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
86 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
87 static GHashTable *unread_jids;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
88 GList *buddylist;
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
89 GList *current_buddy;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
90 GList *alternate_buddy;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
91
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
92 static roster roster_special;
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
93
662
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
94 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
95 int unread_jid_del(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
96
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
97
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
98 /* ### Initialization ### */
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
99
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
100 void roster_init(void)
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
101 {
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
102 roster_special.name = "[status]";
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
103 roster_special.type = ROSTER_TYPE_SPECIAL;
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
104 }
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
105
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
106 /* ### Resources functions ### */
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
107
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
108 static void free_all_resources(GSList **reslist)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
109 {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
110 GSList *lip;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
111 res *p_res;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
112
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
113 for ( lip = *reslist; lip ; lip = g_slist_next(lip)) {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
114 p_res = (res*)lip->data;
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
115 g_free((gchar*)p_res->status_msg);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
116 g_free((gchar*)p_res->name);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
117 g_free((gchar*)p_res->realjid);
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
118 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
119 // 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
120 g_slist_free(*reslist);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
121 *reslist = NULL;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
122 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
123
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
124 // Resources are sorted in ascending order
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
125 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
126 //return (a->prio - b->prio);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
127 if (a->prio < b->prio) return -1;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
128 else return 1;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
129 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
130
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
131 // get_resource(rost, resname)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
132 // 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
133 // - if rost has no resources, return NULL
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
134 // - 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
135 // - 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
136 // 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
137 // (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
138 //
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
139 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
140 {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
141 GSList *p;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
142 res *r = NULL;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
143
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
144 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
145 r = p->data;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
146 if (resname && !strcmp(r->name, resname))
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
147 return r;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
148 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
149
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
150 // 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
151 // 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
152 if (!resname) return r;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
153 return NULL;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
154 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
155
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
156 // get_or_add_resource(rost, resname, priority)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
157 // - 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
158 // on this resource
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
159 // - 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
160 // new resource
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
161 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
162 {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
163 GSList *p;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
164 res *nres;
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 if (!resname) return NULL;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
167
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
168 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
169 res *r = p->data;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
170 if (!strcmp(r->name, resname))
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
171 return r;
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 // Resource not found
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
175 nres = g_new0(res, 1);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
176 nres->name = g_strdup(resname);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
177 nres->prio = prio;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
178 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
179 (GCompareFunc)&resource_compare_prio);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
180 return nres;
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
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
183 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
184 {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
185 GSList *p;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
186 GSList *p_res_elt = NULL;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
187 res *p_res;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
188
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
189 if (!resname) return;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
190
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
191 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
192 res *r = p->data;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
193 if (!strcmp(r->name, resname))
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
194 p_res_elt = p;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
195 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
196
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
197 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
198
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
199 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
200
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
201 // 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
202 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
203 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
204 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
205 p_res->status_msg = NULL;
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
206 }
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
207
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
208 // Free allocations and delete resource node
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
209 g_free(p_res->name);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
210 g_free(p_res->status_msg);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
211 g_free(p_res->realjid);
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
212 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
213 return;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
214 }
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
215
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
216
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
217 /* ### Roster functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
218
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
219 // 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
220 static gint roster_compare_jid_type(roster *a, roster *b) {
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
221 if (! (a->type & b->type))
480
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
222 return -1; // arbitrary (but should be != 0, of course)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
223 return strcasecmp(a->jid, b->jid);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
224 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
225
670
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
226 // 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
227 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
228 if (! (a->type & b->type))
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
229 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
230 return strcmp(a->name, b->name);
670
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
231 }
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
232
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
233 // Comparison function used to sort the roster (by name)
336
eb994ee40029 Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents: 331
diff changeset
234 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
235 return strcmp(a->name, b->name);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
236 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
237
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
238 // Finds a roster element (user, group, agent...), by jid or name
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
239 // If roster_type is 0, returns match of any type.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
240 // Returns the roster GSList element, or NULL if jid/name not found
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
241 GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
242 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
243 GSList *sl_roster_elt = groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
244 GSList *res;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
245 roster sample;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
246 GCompareFunc comp;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
247
192
62bc2992216b [/trunk] Changeset 204 by mikael
mikael
parents: 166
diff changeset
248 if (!jidname) return NULL;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
249
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
250 if (!roster_type)
480
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
251 roster_type = ROSTER_TYPE_USER | ROSTER_TYPE_ROOM |
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
252 ROSTER_TYPE_AGENT | ROSTER_TYPE_GROUP;
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
253
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
254 sample.type = roster_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
255 if (type == jidsearch) {
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
256 sample.jid = (gchar*)jidname;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
257 comp = (GCompareFunc)&roster_compare_jid_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
258 } else if (type == namesearch) {
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
259 sample.name = (gchar*)jidname;
670
2cd0805515a4 Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 669
diff changeset
260 comp = (GCompareFunc)&roster_compare_name_type;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
261 } else
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
262 return NULL; // should not happen
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
263
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
264 while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
265 roster *roster_elt = (roster*)sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
266 if (roster_type & ROSTER_TYPE_GROUP) {
783
25022410f80f Use case sensitive group names
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
267 if ((type == namesearch) && !strcmp(jidname, roster_elt->name))
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
268 return sl_roster_elt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
269 }
483
4a10c04ac2fb Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 480
diff changeset
270 res = g_slist_find_custom(roster_elt->list, &sample, comp);
4a10c04ac2fb Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 480
diff changeset
271 if (res) return res;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
272 sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
273 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
274 return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
275 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
276
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
277 // Returns pointer to new group, or existing group with that name
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
278 GSList *roster_add_group(const char *name)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
279 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
280 roster *roster_grp;
669
2b87065270f3 roster_add_group(): do not call roster_find() twice
Mikael Berthe <mikael@lilotux.net>
parents: 662
diff changeset
281 GSList *p_group;
2b87065270f3 roster_add_group(): do not call roster_find() twice
Mikael Berthe <mikael@lilotux.net>
parents: 662
diff changeset
282
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
283 // #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
284 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
285 if (!p_group) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
286 // #2 Create the group node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
287 roster_grp = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
288 roster_grp->name = g_strdup(name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
289 roster_grp->type = ROSTER_TYPE_GROUP;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
290 // #3 Insert (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
291 groups = g_slist_insert_sorted(groups, roster_grp,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
292 (GCompareFunc)&roster_compare_name);
669
2b87065270f3 roster_add_group(): do not call roster_find() twice
Mikael Berthe <mikael@lilotux.net>
parents: 662
diff changeset
293 p_group = roster_find(name, namesearch, ROSTER_TYPE_GROUP);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
294 }
669
2b87065270f3 roster_add_group(): do not call roster_find() twice
Mikael Berthe <mikael@lilotux.net>
parents: 662
diff changeset
295 return p_group;
2b87065270f3 roster_add_group(): do not call roster_find() twice
Mikael Berthe <mikael@lilotux.net>
parents: 662
diff changeset
296
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
297 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
298
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
299 // Returns a pointer to the new user, or existing user with that name
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
300 GSList *roster_add_user(const char *jid, const char *name, const char *group,
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
301 guint type, enum subscr esub)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
302 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
303 roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
304 roster *my_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
305 GSList *slist;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
306
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
307 if ((type != ROSTER_TYPE_USER) &&
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
308 (type != ROSTER_TYPE_ROOM) &&
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
309 (type != ROSTER_TYPE_AGENT)) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
310 // XXX Error message?
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
311 return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
312 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
313
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
314 // Let's be arbitrary: default group has an empty name ("").
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
315 if (!group) group = "";
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
316
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
317 // #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
318 slist = roster_find(jid, jidsearch, 0);
607
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
319 if (slist) {
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
320 char *oldgroupname;
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
321 // That's an update
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
322 roster_usr = slist->data;
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
323 roster_usr->subscription = esub;
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
324 if (name)
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
325 buddy_setname(slist->data, (char*)name);
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
326 // Let's check if the group name has changed
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
327 oldgroupname = ((roster*)((GSList*)roster_usr->list)->data)->name;
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
328 if (group && strcmp(oldgroupname, group))
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
329 buddy_setgroup(slist->data, (char*)group);
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
330 return slist;
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
331 }
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
332 // #2 add group if necessary
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
333 slist = roster_add_group(group);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
334 if (!slist) return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
335 my_group = (roster*)slist->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
336 // #3 Create user node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
337 roster_usr = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
338 roster_usr->jid = g_strdup(jid);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
339 if (name) {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
340 roster_usr->name = g_strdup(name);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
341 } else {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
342 gchar *p, *str = g_strdup(jid);
80
7fb661f19a77 [/trunk] Changeset 94 by mikael
mikael
parents: 78
diff changeset
343 p = strstr(str, "/");
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
344 if (p) *p = '\0';
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
345 roster_usr->name = g_strdup(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
346 g_free(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
347 }
662
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
348 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
349 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
350 // 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
351 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
352 }
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
353 roster_usr->type = type;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
354 roster_usr->subscription = esub;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
355 roster_usr->list = slist; // (my_group SList element)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
356 // #4 Insert node (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
357 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
358 (GCompareFunc)&roster_compare_name);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
359 return roster_find(jid, jidsearch, type);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
360 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
361
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
362 // Removes user (jid) from roster, frees allocated memory
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
363 void roster_del_user(const char *jid)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
364 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
365 GSList *sl_user, *sl_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
366 GSList **sl_group_listptr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
367 roster *roster_usr;
246
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
368 GSList *node;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
369
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
370 sl_user = roster_find(jid, jidsearch,
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
371 ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM);
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
372 if (sl_user == NULL)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
373 return;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
374 roster_usr = (roster*)sl_user->data;
246
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
375
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
376 // Remove (if present) from unread messages list
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
377 node = g_slist_find(unread_list, roster_usr);
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
378 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
379 // 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
380 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
381 unread_jid_add(roster_usr->jid);
246
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
382
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
383 // Let's free memory (jid, name, status message)
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
384 g_free((gchar*)roster_usr->jid);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
385 g_free((gchar*)roster_usr->name);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
386 g_free((gchar*)roster_usr->nickname);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
387 g_free((gchar*)roster_usr->topic);
843
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
388 g_free((gchar*)roster_usr->offline_status_message);
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
389 free_all_resources(&roster_usr->resource);
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
390 g_free(roster_usr);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
391
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
392 // That's a little complex, we need to dereference twice
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
393 sl_group = ((roster*)sl_user->data)->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
394 sl_group_listptr = &((roster*)(sl_group->data))->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
395 *sl_group_listptr = g_slist_delete_link(*sl_group_listptr, sl_user);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
396
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
397 // We need to rebuild the list
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
398 if (current_buddy)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
399 buddylist_build();
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
400 // 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
401 // current_buddy, in which case we could move current_buddy to the
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
402 // previous (or next) node.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
403 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
404
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
405 // Free all roster data and call buddylist_build() to free the buddylist.
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
406 void roster_free(void)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
407 {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
408 GSList *sl_grp = groups;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
409
301
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
410 // Free unread_list
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
411 if (unread_list) {
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
412 g_slist_free(unread_list);
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
413 unread_list = NULL;
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
414 }
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
415
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
416 // Walk through groups
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
417 while (sl_grp) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
418 roster *roster_grp = (roster*)sl_grp->data;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
419 GSList *sl_usr = roster_grp->list;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
420 // Walk through this group users
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
421 while (sl_usr) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
422 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
423 // 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
424 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
425 unread_jid_add(roster_usr->jid);
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
426 // Free name and jid
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
427 g_free((gchar*)roster_usr->jid);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
428 g_free((gchar*)roster_usr->name);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
429 g_free((gchar*)roster_usr->nickname);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
430 g_free((gchar*)roster_usr->topic);
843
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
431 g_free((gchar*)roster_usr->offline_status_message);
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
432 free_all_resources(&roster_usr->resource);
214
9484ba81ec53 [/trunk] Changeset 226 by mikael
mikael
parents: 212
diff changeset
433 g_free(roster_usr);
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
434 sl_usr = g_slist_next(sl_usr);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
435 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
436 // Free group's users list
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
437 if (roster_grp->list)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
438 g_slist_free(roster_grp->list);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
439 // Free group's name and jid
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
440 g_free((gchar*)roster_grp->jid);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
441 g_free((gchar*)roster_grp->name);
214
9484ba81ec53 [/trunk] Changeset 226 by mikael
mikael
parents: 212
diff changeset
442 g_free(roster_grp);
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
443 sl_grp = g_slist_next(sl_grp);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
444 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
445 // Free groups list
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
446 if (groups) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
447 g_slist_free(groups);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
448 groups = NULL;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
449 // Update (i.e. free) buddylist
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
450 if (buddylist)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
451 buddylist_build();
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
452 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
453 }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
454
468
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
455 // roster_setstatus()
572
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
456 // 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
457 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
458 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
459 time_t status_time,
572
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
460 enum imrole role, enum imaffiliation affil,
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
461 const char *realjid)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
462 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
463 GSList *sl_user;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
464 roster *roster_usr;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
465 res *p_res;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
466
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
467 sl_user = roster_find(jid, jidsearch,
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
468 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
92
c6270994fb6e [/trunk] Changeset 106 by mikael
mikael
parents: 90
diff changeset
469 // If we can't find it, we add it
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
470 if (sl_user == NULL)
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
471 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, sub_none);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
472
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
473 // 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
474 if (!resname) return;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
475
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
476 roster_usr = (roster*)sl_user->data;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
477
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
478 // New or updated resource
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
479 p_res = get_or_add_resource(roster_usr, resname, prio);
494
3f5aa4852684 Fix small bug in roster_setstatus()
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
480 p_res->prio = prio;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
481 p_res->status = bstat;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
482 if (p_res->status_msg) {
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
483 g_free((gchar*)p_res->status_msg);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
484 p_res->status_msg = NULL;
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
485 }
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
486 if (status_msg)
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
487 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
488 if (!status_time)
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
489 time(&status_time);
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
490 p_res->status_timestamp = status_time;
468
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
491
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
492 p_res->role = role;
572
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
493 p_res->affil = affil;
468
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
494
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
495 if (p_res->realjid) {
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
496 g_free((gchar*)p_res->realjid);
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
497 p_res->realjid = NULL;
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
498 }
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
499 if (realjid)
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
500 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
501
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
502 // 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
503 if (bstat == offline) {
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
504 del_resource(roster_usr, resname);
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
505 return;
915a7f17474a Remember the status message when a buddy goes offline
Mikael Berthe <mikael@lilotux.net>
parents: 819
diff changeset
506 }
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
507 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
508
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
509 // roster_setflags()
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
510 // Set one or several flags to value (TRUE/FALSE)
80
7fb661f19a77 [/trunk] Changeset 94 by mikael
mikael
parents: 78
diff changeset
511 void roster_setflags(const char *jid, guint flags, guint value)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
512 {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
513 GSList *sl_user;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
514 roster *roster_usr;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
515
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
516 sl_user = roster_find(jid, jidsearch,
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
517 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
518 if (sl_user == NULL)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
519 return;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
520
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
521 roster_usr = (roster*)sl_user->data;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
522 if (value)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
523 roster_usr->flags |= flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
524 else
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
525 roster_usr->flags &= ~flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
526 }
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
527
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
528 // roster_msg_setflag()
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
529 // Set the ROSTER_FLAG_MSG to the given value for the given jid.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
530 // It will update the buddy's group message flag.
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
531 // Update the unread messages list too.
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
532 void roster_msg_setflag(const char *jid, guint value)
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
533 {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
534 GSList *sl_user;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
535 roster *roster_usr, *roster_grp;
860
a8fadbd97858 Rebuild buddylist when setting a new message flag
Mikael Berthe <mikael@lilotux.net>
parents: 848
diff changeset
536 int new_roster_item = FALSE;
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
537
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
538 sl_user = roster_find(jid, jidsearch,
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
539 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
540 // 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
541 if (sl_user == NULL) {
e175f5d96f04 Fix a small issue in roster_msg_setflag()
Mikael Berthe <mikael@lilotux.net>
parents: 670
diff changeset
542 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, sub_none);
860
a8fadbd97858 Rebuild buddylist when setting a new message flag
Mikael Berthe <mikael@lilotux.net>
parents: 848
diff changeset
543 new_roster_item = TRUE;
678
e175f5d96f04 Fix a small issue in roster_msg_setflag()
Mikael Berthe <mikael@lilotux.net>
parents: 670
diff changeset
544 }
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
545
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
546 roster_usr = (roster*)sl_user->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
547 roster_grp = (roster*)roster_usr->list->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
548 if (value) {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
549 // 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
550 // to TRUE...
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
551 roster_usr->flags |= ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
552 roster_grp->flags |= ROSTER_FLAG_MSG; // group
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
553 // Append the roster_usr to unread_list, but avoid duplicates
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
554 if (!g_slist_find(unread_list, roster_usr))
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
555 unread_list = g_slist_append(unread_list, roster_usr);
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
556 } else {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
557 // Message flag is FALSE.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
558 guint msg = FALSE;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
559 roster_usr->flags &= ~ROSTER_FLAG_MSG;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
560 if (unread_list) {
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
561 GSList *node = g_slist_find(unread_list, roster_usr);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
562 if (node) unread_list = g_slist_delete_link(unread_list, node);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
563 }
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
564 // For the group value we need to watch all buddies in this group;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
565 // if one is flagged, then the group will be flagged.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
566 // 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
567 // anymore.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
568 sl_user = roster_grp->list;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
569 while (sl_user) {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
570 roster_usr = (roster*)sl_user->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
571 if (roster_usr->flags & ROSTER_FLAG_MSG) {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
572 msg = TRUE;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
573 break;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
574 }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
575 sl_user = g_slist_next(sl_user);
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
576 }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
577 if (!msg)
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
578 roster_grp->flags &= ~ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
579 else
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
580 roster_grp->flags |= ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
581 // Actually the "else" part is useless, because the group
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
582 // ROSTER_FLAG_MSG should already be set...
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
583 }
860
a8fadbd97858 Rebuild buddylist when setting a new message flag
Mikael Berthe <mikael@lilotux.net>
parents: 848
diff changeset
584
a8fadbd97858 Rebuild buddylist when setting a new message flag
Mikael Berthe <mikael@lilotux.net>
parents: 848
diff changeset
585 if (buddylist && new_roster_item)
a8fadbd97858 Rebuild buddylist when setting a new message flag
Mikael Berthe <mikael@lilotux.net>
parents: 848
diff changeset
586 buddylist_build();
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
587 }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
588
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
589 const char *roster_getname(const char *jid)
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
590 {
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
591 GSList *sl_user;
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
592 roster *roster_usr;
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
593
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
594 sl_user = roster_find(jid, jidsearch,
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
595 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
596 if (sl_user == NULL)
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
597 return NULL; // Not in the roster...
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
598
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
599 roster_usr = (roster*)sl_user->data;
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
600 return roster_usr->name;
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
601 }
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 509
diff changeset
602
863
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
603 const char *roster_getnickname(const char *jid)
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
604 {
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
605 GSList *sl_user;
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
606 roster *roster_usr;
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
607
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
608 sl_user = roster_find(jid, jidsearch,
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
609 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
610 if (sl_user == NULL)
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
611 return NULL; // Not in the roster...
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
612
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
613 roster_usr = (roster*)sl_user->data;
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
614 return roster_usr->nickname;
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
615 }
4f1a93faffea Add roster_getnickname()
Mikael Berthe <mikael@lilotux.net>
parents: 860
diff changeset
616
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
617 void roster_settype(const char *jid, guint type)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
618 {
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
619 GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
620 roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
621
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
622 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
623 return;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
624
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
625 roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
626 roster_usr->type = type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
627 }
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
628
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
629 enum imstatus roster_getstatus(const char *jid, const char *resname)
90
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
630 {
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
631 GSList *sl_user;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
632 roster *roster_usr;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
633 res *p_res;
90
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
634
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
635 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
636 if (sl_user == NULL)
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
637 return offline; // Not in the roster, anyway...
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
638
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
639 roster_usr = (roster*)sl_user->data;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
640 p_res = get_resource(roster_usr, resname);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
641 if (p_res)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
642 return p_res->status;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
643 return offline;
90
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
644 }
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
645
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
646 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
647 {
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
648 GSList *sl_user;
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
649 roster *roster_usr;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
650 res *p_res;
318
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
651
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
652 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
653 if (sl_user == NULL)
425
03f1e37759a6 roster_getstatusmsg() should return a pointer
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
654 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
655
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
656 roster_usr = (roster*)sl_user->data;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
657 p_res = get_resource(roster_usr, resname);
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
658 if (p_res)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
659 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
660 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
661 }
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
662
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
663 guint roster_gettype(const char *jid)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
664 {
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
665 GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
666 roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
667
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
668 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
669 return 0;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
670
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
671 roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
672 return roster_usr->type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
673 }
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
674
819
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
675 guint roster_getsubscription(const char *jid)
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
676 {
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
677 GSList *sl_user;
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
678 roster *roster_usr;
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
679
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
680 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
681 return 0;
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
682
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
683 roster_usr = (roster*)sl_user->data;
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
684 return roster_usr->subscription;
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
685 }
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 792
diff changeset
686
610
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
687 // roster_unsubscribed()
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
688 // 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
689 // 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
690 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
691 {
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
692 GSList *sl_user;
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
693 roster *roster_usr;
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
694
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
695 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
696 if (sl_user == NULL)
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
697 return;
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
698
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
699 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
700 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
701 }
0e8247cf2bd1 Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
702
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
703
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
704 /* ### BuddyList functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
705
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
706 // buddylist_set_hide_offline_buddies(hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
707 // "hide" values: 1=hide 0=show_all -1=invert
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
708 void buddylist_set_hide_offline_buddies(int hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
709 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
710 if (hide < 0) // NEG (invert)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
711 hide_offline_buddies = !hide_offline_buddies;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
712 else if (hide == 0) // FALSE (don't hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
713 hide_offline_buddies = 0;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
714 else // TRUE (hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
715 hide_offline_buddies = 1;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
716 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
717
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
718 inline int buddylist_get_hide_offline_buddies(void)
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
719 {
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
720 return hide_offline_buddies;
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
721 }
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
722
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
723 // buddylist_build()
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
724 // Creates the buddylist from the roster entries.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
725 void buddylist_build(void)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
726 {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
727 GSList *sl_roster_elt = groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
728 roster *roster_elt;
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
729 roster *roster_current_buddy = NULL;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
730 roster *roster_alternate_buddy = NULL;
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
731 int shrunk_group;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
732
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
733 // We need to remember which buddy is selected.
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
734 if (current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
735 roster_current_buddy = BUDDATA(current_buddy);
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
736 current_buddy = NULL;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
737 if (alternate_buddy)
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
738 roster_alternate_buddy = BUDDATA(alternate_buddy);
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
739 alternate_buddy = NULL;
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
740
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
741 // Destroy old buddylist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
742 if (buddylist) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
743 g_list_free(buddylist);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
744 buddylist = NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
745 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
746
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
747 buddylist = g_list_append(buddylist, &roster_special);
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
748
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
749 // Create the new list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
750 while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
751 GSList *sl_roster_usrelt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
752 roster *roster_usrelt;
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
753 guint pending_group = FALSE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
754 roster_elt = (roster*) sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
755
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
756 // Add the group now unless hide_offline_buddies is set,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
757 // in which case we'll add it only if an online buddy belongs to it.
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
758 // We take care to keep the current_buddy in the list, too.
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
759 if (!hide_offline_buddies || roster_elt == roster_current_buddy)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
760 buddylist = g_list_append(buddylist, roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
761 else
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
762 pending_group = TRUE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
763
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
764 shrunk_group = roster_elt->flags & ROSTER_FLAG_HIDE;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
765
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
766 sl_roster_usrelt = roster_elt->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
767 while (sl_roster_usrelt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
768 roster_usrelt = (roster*) sl_roster_usrelt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
769
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
770 // Buddy will be added if either:
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
771 // - hide_offline_buddies is FALSE
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
772 // - buddy is not offline
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
773 // - buddy has a lock (for example the buddy window is currently open)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
774 // - buddy has a pending (non-read) message
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
775 // - group isn't hidden (shrunk)
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
776 // - this is the current_buddy
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
777 if (!hide_offline_buddies || roster_usrelt == roster_current_buddy ||
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
778 (buddy_getstatus((gpointer)roster_usrelt, NULL) != offline) ||
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
779 (buddy_getflags((gpointer)roster_usrelt) &
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
780 (ROSTER_FLAG_LOCK | ROSTER_FLAG_MSG))) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
781 // This user should be added. Maybe the group hasn't been added yet?
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
782 if (pending_group &&
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
783 (hide_offline_buddies || roster_usrelt == roster_current_buddy)) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
784 // It hasn't been done yet
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
785 buddylist = g_list_append(buddylist, roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
786 pending_group = FALSE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
787 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
788 // Add user
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
789 // XXX Should we add the user if there is a message and
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
790 // 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
791 // perhaps...
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
792 if (!shrunk_group)
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
793 buddylist = g_list_append(buddylist, roster_usrelt);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
794 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
795
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
796 sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
797 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
798 sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
799 }
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
800
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
801 // Check if we can find our saved current_buddy...
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
802 if (roster_current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
803 current_buddy = g_list_find(buddylist, roster_current_buddy);
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
804 if (roster_alternate_buddy)
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
805 alternate_buddy = g_list_find(buddylist, roster_alternate_buddy);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
806 // current_buddy initialization
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
807 if (!current_buddy || (g_list_position(buddylist, current_buddy) == -1))
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
808 current_buddy = g_list_first(buddylist);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
809 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
810
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
811 // buddy_hide_group(roster, hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
812 // "hide" values: 1=hide 0=show_all -1=invert
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
813 void buddy_hide_group(gpointer rosterdata, int hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
814 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
815 roster *roster_usr = rosterdata;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
816 if (hide > 0) // TRUE (hide)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
817 roster_usr->flags |= ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
818 else if (hide < 0) // NEG (invert)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
819 roster_usr->flags ^= ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
820 else // FALSE (don't hide)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
821 roster_usr->flags &= ~ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
822 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
823
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
824 const char *buddy_getjid(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
825 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
826 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
827 return roster_usr->jid;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
828 }
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
829
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
830 // buddy_setgroup()
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
831 // Change the group of current buddy
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
832 //
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
833 void buddy_setgroup(gpointer rosterdata, char *newgroupname)
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
834 {
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
835 roster *roster_usr = rosterdata;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
836 GSList **sl_group;
620
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
837 GSList *sl_newgroup;
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
838 roster *my_newgroup;
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
839
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
840 // A group has no group :)
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
841 if (roster_usr->type & ROSTER_TYPE_GROUP) return;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
842
620
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
843 // Add newgroup if necessary
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
844 if (!newgroupname) newgroupname = "";
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
845 sl_newgroup = roster_add_group(newgroupname);
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
846 if (!sl_newgroup) return;
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
847 my_newgroup = (roster*)sl_newgroup->data;
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
848
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
849 // Remove the buddy from current group
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
850 sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
851 *sl_group = g_slist_remove(*sl_group, rosterdata);
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
852
621
f20c1934a8a7 "/move": remove old group if it is empty
Mikael Berthe <mikael@lilotux.net>
parents: 620
diff changeset
853 // 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
854 if (!*sl_group) {
f20c1934a8a7 "/move": remove old group if it is empty
Mikael Berthe <mikael@lilotux.net>
parents: 620
diff changeset
855 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
856 g_free((gchar*)roster_grp->jid);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
857 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
858 g_free(roster_grp);
f20c1934a8a7 "/move": remove old group if it is empty
Mikael Berthe <mikael@lilotux.net>
parents: 620
diff changeset
859 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
860 }
f20c1934a8a7 "/move": remove old group if it is empty
Mikael Berthe <mikael@lilotux.net>
parents: 620
diff changeset
861
620
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
862 // Add the buddy to its new group
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
863 roster_usr->list = sl_newgroup; // (my_newgroup SList element)
97dd14e22b2a Rewrite buddy_setgroup()
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
864 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
865 (GCompareFunc)&roster_compare_name);
212
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
866
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
867 buddylist_build();
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
868 }
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
869
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
870 void buddy_setname(gpointer rosterdata, char *newname)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
871 {
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
872 roster *roster_usr = rosterdata;
209
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
873 GSList **sl_group;
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
874
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
875 // TODO For groups, we need to check for unicity
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
876 // However, renaming a group boils down to moving all its buddies to
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
877 // another group, so calling this function is not really necessary...
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
878 if (roster_usr->type & ROSTER_TYPE_GROUP) return;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
879
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
880 if (roster_usr->name) {
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
881 g_free((gchar*)roster_usr->name);
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
882 roster_usr->name = NULL;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
883 }
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
884 if (newname)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
885 roster_usr->name = g_strdup(newname);
209
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
886
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
887 // We need to resort the group list
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
888 sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list;
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
889 *sl_group = g_slist_sort(*sl_group, (GCompareFunc)&roster_compare_name);
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
890
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
891 buddylist_build();
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
892 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
893
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
894 const char *buddy_getname(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
895 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
896 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
897 return roster_usr->name;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
898 }
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
899
548
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
900 // buddy_setnickname(buddy, newnickname)
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
901 // Only for chatrooms
469
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
902 void buddy_setnickname(gpointer rosterdata, const char *newname)
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
903 {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
904 roster *roster_usr = rosterdata;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
905
649
3ad6675caaf1 MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents: 644
diff changeset
906 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
907
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
908 if (roster_usr->nickname) {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
909 g_free((gchar*)roster_usr->nickname);
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
910 roster_usr->nickname = NULL;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
911 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
912 if (newname)
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
913 roster_usr->nickname = g_strdup(newname);
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
914 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
915
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
916 const char *buddy_getnickname(gpointer rosterdata)
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
917 {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
918 roster *roster_usr = rosterdata;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
919 return roster_usr->nickname;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
920 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
921
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
922 // buddy_setinsideroom(buddy, inside)
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
923 // Only for chatrooms
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
924 void buddy_setinsideroom(gpointer rosterdata, guint8 inside)
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
925 {
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
926 roster *roster_usr = rosterdata;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
927
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
928 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
929
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
930 roster_usr->inside_room = inside;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
931 }
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
932
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
933 guint8 buddy_getinsideroom(gpointer rosterdata)
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
934 {
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
935 roster *roster_usr = rosterdata;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
936 return roster_usr->inside_room;
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
937 }
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
938
548
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
939 // buddy_settopic(buddy, newtopic)
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
940 // Only for chatrooms
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
941 void buddy_settopic(gpointer rosterdata, const char *newtopic)
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
942 {
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
943 roster *roster_usr = rosterdata;
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
944
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
945 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return;
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
946
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
947 if (roster_usr->topic) {
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
948 g_free((gchar*)roster_usr->topic);
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
949 roster_usr->topic = NULL;
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
950 }
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
951 if (newtopic)
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
952 roster_usr->topic = g_strdup(newtopic);
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
953 }
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
954
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
955 const char *buddy_gettopic(gpointer rosterdata)
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
956 {
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
957 roster *roster_usr = rosterdata;
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
958 return roster_usr->topic;
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
959 }
265c50238a48 Add buddy_{get,set}topic()
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
960
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
961 // buddy_getgroupname()
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
962 // Returns a pointer on buddy's group name.
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
963 const char *buddy_getgroupname(gpointer rosterdata)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
964 {
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
965 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
966
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
967 if (roster_usr->type & ROSTER_TYPE_GROUP)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
968 return roster_usr->name;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
969
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
970 if (roster_usr->type & ROSTER_TYPE_SPECIAL)
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
971 return NULL;
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
972
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
973 // This is a user
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
974 return ((roster*)((GSList*)roster_usr->list)->data)->name;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
975 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
976
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
977 // buddy_getgroup()
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
978 // Returns a pointer on buddy's group.
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
979 gpointer buddy_getgroup(gpointer rosterdata)
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
980 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
981 roster *roster_usr = rosterdata;
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
982
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
983 if (roster_usr->type & ROSTER_TYPE_GROUP)
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
984 return rosterdata;
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
985
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
986 if (roster_usr->type & ROSTER_TYPE_SPECIAL)
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
987 return NULL;
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
988
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
989 // This is a user
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
990 return (gpointer)((GSList*)roster_usr->list)->data;
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
991 }
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
992
489
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
993 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
994 {
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
995 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
996 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
997 }
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
998
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
999 guint buddy_gettype(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1000 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1001 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1002 return roster_usr->type;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1003 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1004
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1005 guint buddy_getsubscription(gpointer rosterdata)
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1006 {
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1007 roster *roster_usr = rosterdata;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1008 return roster_usr->subscription;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1009 }
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
1010
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1011 enum imstatus buddy_getstatus(gpointer rosterdata, const char *resname)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1012 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1013 roster *roster_usr = rosterdata;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1014 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
1015 if (p_res)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1016 return p_res->status;
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1017 return offline;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1018 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1019
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1020 const char *buddy_getstatusmsg(gpointer rosterdata, const char *resname)
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
1021 {
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
1022 roster *roster_usr = rosterdata;
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1023 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
1024 if (p_res)
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 425
diff changeset
1025 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
1026 return roster_usr->offline_status_message;
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
1027 }
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
1028
625
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1029 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
1030 {
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1031 roster *roster_usr = rosterdata;
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1032 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
1033 if (p_res)
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1034 return p_res->status_timestamp;
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1035 return 0;
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1036 }
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 621
diff changeset
1037
439
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1038 gchar buddy_getresourceprio(gpointer rosterdata, const char *resname)
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1039 {
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1040 roster *roster_usr = rosterdata;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1041 res *p_res = get_resource(roster_usr, resname);
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1042 if (p_res)
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1043 return p_res->prio;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1044 return 0;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1045 }
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1046
572
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1047 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
1048 {
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1049 roster *roster_usr = rosterdata;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1050 res *p_res = get_resource(roster_usr, resname);
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1051 if (p_res)
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1052 return p_res->role;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1053 return role_none;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1054 }
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1055
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1056 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
1057 {
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1058 roster *roster_usr = rosterdata;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1059 res *p_res = get_resource(roster_usr, resname);
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1060 if (p_res)
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1061 return p_res->affil;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1062 return affil_none;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1063 }
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1064
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1065 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
1066 {
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1067 roster *roster_usr = rosterdata;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1068 res *p_res = get_resource(roster_usr, resname);
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1069 if (p_res)
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1070 return p_res->realjid;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1071 return NULL;
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1072 }
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 564
diff changeset
1073
439
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1074 // buddy_getresources(roster_data)
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1075 // Return a singly-linked-list of resource names
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1076 // 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
1077 // 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
1078 GSList *buddy_getresources(gpointer rosterdata)
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1079 {
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1080 roster *roster_usr = rosterdata;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1081 GSList *reslist = NULL, *lp;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1082
501
7c1ca00070e8 Add COMPL_RESOURCE (resource completion category)
Mikael Berthe <mikael@lilotux.net>
parents: 494
diff changeset
1083 if (!roster_usr) {
7c1ca00070e8 Add COMPL_RESOURCE (resource completion category)
Mikael Berthe <mikael@lilotux.net>
parents: 494
diff changeset
1084 if (!current_buddy) return NULL;
7c1ca00070e8 Add COMPL_RESOURCE (resource completion category)
Mikael Berthe <mikael@lilotux.net>
parents: 494
diff changeset
1085 roster_usr = BUDDATA(current_buddy);
7c1ca00070e8 Add COMPL_RESOURCE (resource completion category)
Mikael Berthe <mikael@lilotux.net>
parents: 494
diff changeset
1086 }
439
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1087 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
1088 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
1089
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1090 return reslist;
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1091 }
63562fd409a1 /info can show multiple resources
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1092
792
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1093 // buddy_getresources_locale(roster_data)
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1094 // 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
1095 // 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
1096 GSList *buddy_getresources_locale(gpointer rosterdata)
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1097 {
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1098 GSList *reslist, *lp;
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1099
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1100 reslist = buddy_getresources(rosterdata);
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1101 // Convert each item to UI's locale
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1102 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
1103 gchar *oldname = lp->data;
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1104 lp->data = from_utf8(oldname);
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1105 if (lp->data)
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1106 g_free(oldname);
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1107 else
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1108 lp->data = oldname;
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1109 }
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1110 return reslist;
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1111 }
89ad7b530b3c MUC: Fix completion for UTF-8 nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 783
diff changeset
1112
652
b243d3b3ff1b We do not need buddy_isresource() anymore
Mikael Berthe <mikael@lilotux.net>
parents: 649
diff changeset
1113 /*
539
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1114 // buddy_isresource(roster_data)
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1115 // Return true if there is at least one resource
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1116 // (which means, for a room, that it isn't empty)
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1117 int buddy_isresource(gpointer rosterdata)
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1118 {
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1119 roster *roster_usr = rosterdata;
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1120 if (!roster_usr)
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1121 return FALSE;
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1122 if (roster_usr->resource)
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1123 return TRUE;
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1124 return FALSE;
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1125 }
652
b243d3b3ff1b We do not need buddy_isresource() anymore
Mikael Berthe <mikael@lilotux.net>
parents: 649
diff changeset
1126 */
539
ffdfddd351b8 Fix some memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 532
diff changeset
1127
468
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1128 // buddy_resource_setname(roster_data, oldname, newname)
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1129 // Useful for nickname change in a MUC room
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1130 void buddy_resource_setname(gpointer rosterdata, const char *resname,
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1131 const char *newname)
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1132 {
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1133 roster *roster_usr = rosterdata;
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1134 res *p_res = get_resource(roster_usr, resname);
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1135 if (p_res) {
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1136 if (p_res->name) {
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1137 g_free((gchar*)p_res->name);
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1138 p_res->name = NULL;
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1139 }
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1140 if (newname)
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1141 p_res->name = g_strdup(newname);
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1142 }
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1143 }
644b8bf9ca4d Improve MUC presence messages handling
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
1144
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1145 // buddy_del_all_resources()
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1146 // Remove all resources from the specified buddy
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1147 void buddy_del_all_resources(gpointer rosterdata)
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1148 {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1149 roster *roster_usr = rosterdata;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1150
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1151 while (roster_usr->resource) {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1152 res *r = roster_usr->resource->data;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1153 del_resource(roster_usr, r->name);
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1154 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1155 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1156
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1157 // buddy_setflags()
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1158 // Set one or several flags to value (TRUE/FALSE)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1159 void buddy_setflags(gpointer rosterdata, guint flags, guint value)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1160 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1161 roster *roster_usr = rosterdata;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1162 if (value)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1163 roster_usr->flags |= flags;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1164 else
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1165 roster_usr->flags &= ~flags;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1166 }
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
1167
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1168 guint buddy_getflags(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1169 {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1170 roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
1171 return roster_usr->flags;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1172 }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
1173
480
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1174 // buddy_search_jid(jid)
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1175 // Look for a buddy with specified jid.
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1176 // 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
1177 // return NULL;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1178 GList *buddy_search_jid(char *jid)
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1179 {
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1180 GList *buddy;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1181 roster *roster_usr;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1182
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1183 if (!buddylist) return NULL;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1184
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1185 for (buddy = buddylist; buddy; buddy = g_list_next(buddy)) {
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1186 roster_usr = (roster*)buddy->data;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1187 if (roster_usr->jid && !strcasecmp(roster_usr->jid, jid))
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1188 return buddy;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1189 }
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1190 return NULL;
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1191 }
882e1acae422 Add /say_to command
Mikael Berthe <mikael@lilotux.net>
parents: 469
diff changeset
1192
265
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1193 // buddy_search(string)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1194 // Look for a buddy whose name or jid contains string.
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1195 // 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
1196 // return NULL;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1197 GList *buddy_search(char *string)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1198 {
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1199 GList *buddy = current_buddy;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1200 roster *roster_usr;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1201 if (!buddylist || !current_buddy) return NULL;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1202 for (;;) {
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1203 gchar *jid_locale, *name_locale;
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1204 char *found = NULL;
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1205
265
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1206 buddy = g_list_next(buddy);
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1207 if (!buddy)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1208 buddy = buddylist;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1209
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1210 roster_usr = (roster*)buddy->data;
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1211
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1212 jid_locale = from_utf8(roster_usr->jid);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1213 if (jid_locale) {
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1214 found = strcasestr(jid_locale, string);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1215 g_free(jid_locale);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1216 if (found)
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1217 return buddy;
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1218 }
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1219 name_locale = from_utf8(roster_usr->name);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1220 if (name_locale) {
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1221 found = strcasestr(name_locale, string);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1222 g_free(name_locale);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1223 if (found)
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1224 return buddy;
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1225 }
265
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1226
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1227 if (buddy == current_buddy)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1228 return NULL; // Back to the beginning, and no match found
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1229 }
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1230 }
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
1231
532
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1232 // foreach_buddy(roster_type, pfunction, param)
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1233 // 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
1234 // type matching roster_type.
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1235 void foreach_buddy(guint roster_type,
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1236 void (*pfunc)(gpointer rosterdata, void *param),
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1237 void *param)
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1238 {
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1239 GSList *sl_roster_elt = groups;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1240 roster *roster_elt;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1241 GSList *sl_roster_usrelt;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1242 roster *roster_usrelt;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1243
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1244 while (sl_roster_elt) { // group list loop
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1245 roster_elt = (roster*) sl_roster_elt->data;
848
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
1246 if (roster_elt->type & ROSTER_TYPE_SPECIAL)
a9161d2dc414 Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents: 843
diff changeset
1247 continue; // Skip special items
532
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1248 sl_roster_usrelt = roster_elt->list;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1249 while (sl_roster_usrelt) { // user list loop
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1250 roster_usrelt = (roster*) sl_roster_usrelt->data;
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1251
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1252 if (roster_usrelt->type & roster_type)
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1253 pfunc(roster_usrelt, param);
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1254
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1255 sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1256 }
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1257 sl_roster_elt = g_slist_next(sl_roster_elt);
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1258 }
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1259 }
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 520
diff changeset
1260
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1261 // compl_list(type)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1262 // Returns a list of jid's or groups. (For commands completion)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1263 // type: ROSTER_TYPE_USER (jid's) or ROSTER_TYPE_GROUP (group names)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1264 // The list should be freed by the caller after use.
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1265 GSList *compl_list(guint type)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1266 {
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1267 GSList *list = NULL;
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1268 GList *buddy = buddylist;
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1269
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1270 for ( ; buddy ; buddy = g_list_next(buddy)) {
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1271 guint btype = buddy_gettype(BUDDATA(buddy));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1272
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1273 if (type == ROSTER_TYPE_GROUP) { // (group names)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1274 if (btype == ROSTER_TYPE_GROUP) {
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1275 const char *bname = buddy_getname(BUDDATA(buddy));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1276 if ((bname) && (*bname))
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1277 list = g_slist_append(list, from_utf8(bname));
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1278 }
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 439
diff changeset
1279 } else { // ROSTER_TYPE_USER (jid) (or agent, or chatroom...)
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1280 const char *bjid = buddy_getjid(BUDDATA(buddy));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1281 if (bjid)
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
1282 list = g_slist_append(list, from_utf8(bjid));
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1283 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1284 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1285
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1286 return list;
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1287 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
1288
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1289 // unread_msg(rosterdata)
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1290 // Return the next buddy with an unread message. If the parameter is NULL,
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1291 // return the first buddy with an unread message.
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1292 gpointer unread_msg(gpointer rosterdata)
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1293 {
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1294 GSList *unread, *next_unread;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1295
564
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1296 if (!unread_list)
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1297 return NULL;
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1298
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1299 // First unread message
564
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1300 if (!rosterdata)
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1301 return unread_list->data;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1302
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1303 unread = g_slist_find(unread_list, rosterdata);
564
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1304 if (!unread)
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1305 return unread_list->data;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1306
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1307 next_unread = g_slist_next(unread);
564
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1308 if (next_unread)
95d6297a9654 Cosmetic changes
Mikael Berthe <mikael@lilotux.net>
parents: 563
diff changeset
1309 return next_unread->data;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1310 return unread_list->data;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
1311 }
576
8b3db0b555a1 Add Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 572
diff changeset
1312
662
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1313
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1314 /* ### "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
1315 *
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1316 * 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
1317 * 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
1318 * 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
1319 * 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
1320 * 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
1321 */
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1322
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1323 // 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
1324 // 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
1325 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
1326 {
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1327 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
1328 // 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
1329 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
1330 }
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1331 // 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
1332 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
1333 }
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1334
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1335 // 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
1336 // Return TRUE if jid is found in the table (and remove it), FALSE if not
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1337 int unread_jid_del(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
1338 {
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1339 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
1340 return FALSE;
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1341 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
1342 }
4111ff4cdd15 Do not loose the unread_message flag when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents: 652
diff changeset
1343
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
1344 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */