Mercurial > pidgin
annotate src/blist.c @ 9460:eae7e049d639
[gaim-migrate @ 10285]
" This patch completely eliminates the use of the old
numeric prpl identifiers.
I've noticed that some plugins (both in gaim's cvs and
external) continue to use the constants even though
they are essentially no longer valid - code that relies
on them being unique will fail - the new built-in prpls
(SILC and novell) ,and any recent external prpls don't
have numeric values.
The once side effect that the removal causes is that
the code for importing of the old .gaimrc and *.blist
files is a little more kludgy (using magic numbers
instead of the old constants). IMHO this isn't a big
deal as the code will go away eventually anyway.
**This patch also fixes the raw plugin so that i
compiles once again.
**Someone should make sure that the gaim-remote and raw
plugins still work. (If the raw doesn't work, it may be
unrelated as it hasn't been updated since the latest
significant MSN changes - i just made a minor change to
make it compile)" --Daniel Atallah
(13:44:44) Me: what think you of getting rid of prpl numbers?
(13:45:05) Sean: what do you mean?
(13:45:27) Me: right now they are listed as deprecated, but still used in a
few of our own plugins as well as in some 3rd party stuff
(13:45:32) Me: and the enum still exists in the core
(13:45:44) Me: and the newwer prpls such as novell don't use them
(13:45:59) Me: datallah has submitted a patch to get rid of them entirely
(13:46:31) Me: the only thing it would break would be the old blist import,
which he hacked into working with magic numbers, but which i tend to think
we could remove entirely anyway
(13:50:03) Sean: Let's get rid of them, then.
(13:50:10) Sean: and take out old .blist code too
(13:50:14) Me: cool
(13:52:37) Sean: we should get rid of .gaimrc code too, sometime.
(13:53:02) Sean: If anyone's seriously just now upgrading from 0.59.x, or
whatever, they deserve to lose their preferences.
(12:27:56) LSchiere: Paco-Paco: what do you think of getting rid of the
deprecated prpl numbers?
(12:28:14) Paco-Paco: LSchiere: I think it shouldh ave happened long ago
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Tue, 06 Jul 2004 18:06:43 +0000 |
parents | af707cc1e229 |
children | 9e647eaaa349 |
rev | line source |
---|---|
5228 | 1 /* |
2 * gaim | |
3 * | |
8046 | 4 * Gaim is the legal property of its developers, whose names are too numerous |
5 * to list here. Please refer to the COPYRIGHT file distributed with this | |
6 * source distribution. | |
5228 | 7 * |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 * | |
22 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
23 #include "internal.h" |
5228 | 24 #include "blist.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
25 #include "conversation.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
26 #include "debug.h" |
6034 | 27 #include "multi.h" |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
28 #include "notify.h" |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
29 #include "prefs.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
30 #include "privacy.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
31 #include "prpl.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
32 #include "server.h" |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
33 #include "signals.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
34 #include "util.h" |
7132 | 35 #include "xmlnode.h" |
5228 | 36 |
37 #define PATHSIZE 1024 | |
38 | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
39 GaimBuddyList *gaimbuddylist = NULL; |
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
40 static GaimBlistUiOps *blist_ui_ops = NULL; |
9285 | 41 static guint blist_save_timer = 0; |
5228 | 42 |
7693 | 43 struct gaim_blist_node_setting { |
44 enum { | |
45 GAIM_BLIST_NODE_SETTING_BOOL, | |
46 GAIM_BLIST_NODE_SETTING_INT, | |
47 GAIM_BLIST_NODE_SETTING_STRING | |
48 } type; | |
49 union { | |
50 gboolean boolean; | |
51 int integer; | |
52 char *string; | |
53 } value; | |
54 }; | |
55 | |
56 | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
57 |
5228 | 58 /***************************************************************************** |
59 * Private Utility functions * | |
60 *****************************************************************************/ | |
61 static GaimBlistNode *gaim_blist_get_last_sibling(GaimBlistNode *node) | |
62 { | |
63 GaimBlistNode *n = node; | |
64 if (!n) | |
65 return NULL; | |
66 while (n->next) | |
67 n = n->next; | |
68 return n; | |
69 } | |
6695 | 70 |
5228 | 71 static GaimBlistNode *gaim_blist_get_last_child(GaimBlistNode *node) |
72 { | |
73 if (!node) | |
74 return NULL; | |
75 return gaim_blist_get_last_sibling(node->child); | |
76 } | |
77 | |
5247 | 78 struct _gaim_hbuddy { |
79 char *name; | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
80 GaimAccount *account; |
5758 | 81 GaimBlistNode *group; |
5247 | 82 }; |
83 | |
9285 | 84 static guint _gaim_blist_hbuddy_hash(struct _gaim_hbuddy *hb) |
5247 | 85 { |
86 return g_str_hash(hb->name); | |
87 } | |
88 | |
9285 | 89 static guint _gaim_blist_hbuddy_equal(struct _gaim_hbuddy *hb1, struct _gaim_hbuddy *hb2) |
5247 | 90 { |
5758 | 91 return ((!strcmp(hb1->name, hb2->name)) && hb1->account == hb2->account && hb1->group == hb2->group); |
5247 | 92 } |
93 | |
6742 | 94 static void _gaim_blist_hbuddy_free_key(struct _gaim_hbuddy *hb) |
95 { | |
96 g_free(hb->name); | |
97 g_free(hb); | |
98 } | |
99 | |
9285 | 100 static void blist_pref_cb(const char *name, GaimPrefType type, gpointer value, gpointer data) |
6006 | 101 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
102 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 103 GaimBlistNode *gnode, *cnode, *bnode; |
6012 | 104 |
9285 | 105 if (!ops || !ops->update) |
6012 | 106 return; |
107 | |
9285 | 108 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
109 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
6012 | 110 continue; |
9285 | 111 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
112 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
113 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
114 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6695 | 115 continue; |
116 ops->update(gaimbuddylist, bnode); | |
117 } | |
9285 | 118 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
6695 | 119 ops->update(gaimbuddylist, cnode); |
120 } | |
6012 | 121 } |
122 } | |
6006 | 123 } |
124 | |
9285 | 125 static void gaim_contact_compute_priority_buddy(GaimContact *contact) |
6843 | 126 { |
127 GaimBlistNode *bnode; | |
7826 | 128 int contact_score = INT_MAX; |
9285 | 129 |
130 g_return_if_fail(contact != NULL); | |
131 | |
6870 | 132 contact->priority = NULL; |
9285 | 133 for (bnode = ((GaimBlistNode*)contact)->child; bnode; bnode = bnode->next) { |
6843 | 134 GaimBuddy *buddy; |
7420 | 135 int score = 0; |
136 | |
9285 | 137 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) |
6843 | 138 continue; |
139 buddy = (GaimBuddy*)bnode; | |
9285 | 140 if (!gaim_account_is_connected(buddy->account)) |
6843 | 141 continue; |
142 | |
7420 | 143 if (!GAIM_BUDDY_IS_ONLINE(buddy)) |
144 score += gaim_prefs_get_int("/core/contact/offline_score"); | |
145 if (buddy->uc & UC_UNAVAILABLE) | |
146 score += gaim_prefs_get_int("/core/contact/away_score"); | |
147 if (buddy->idle) | |
148 score += gaim_prefs_get_int("/core/contact/idle_score"); | |
149 | |
150 score += gaim_account_get_int(buddy->account, "score", 0); | |
151 | |
7826 | 152 if (score < contact_score) { |
6843 | 153 contact->priority = buddy; |
7826 | 154 contact_score = score; |
7420 | 155 } |
156 if (gaim_prefs_get_bool("/core/contact/last_match")) | |
7826 | 157 if (score == contact_score) |
6843 | 158 contact->priority = buddy; |
159 } | |
160 } | |
161 | |
9285 | 162 static gboolean blist_save_callback(gpointer data) |
163 { | |
164 gaim_blist_sync(); | |
165 blist_save_timer = 0; | |
166 return FALSE; | |
167 } | |
168 | |
169 static void schedule_blist_save() | |
170 { | |
171 if (blist_save_timer != 0) | |
172 gaim_timeout_remove(blist_save_timer); | |
173 blist_save_timer = gaim_timeout_add(1000, blist_save_callback, NULL); | |
174 } | |
175 | |
6843 | 176 |
5228 | 177 /***************************************************************************** |
178 * Public API functions * | |
179 *****************************************************************************/ | |
180 | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
181 GaimBuddyList *gaim_blist_new() |
5228 | 182 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
183 GaimBuddyList *gbl = g_new0(GaimBuddyList, 1); |
5228 | 184 |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
185 gbl->ui_ops = gaim_blist_get_ui_ops(); |
5228 | 186 |
6742 | 187 gbl->buddies = g_hash_table_new_full((GHashFunc)_gaim_blist_hbuddy_hash, |
188 (GEqualFunc)_gaim_blist_hbuddy_equal, | |
189 (GDestroyNotify)_gaim_blist_hbuddy_free_key, NULL); | |
5247 | 190 |
5228 | 191 if (gbl->ui_ops != NULL && gbl->ui_ops->new_list != NULL) |
192 gbl->ui_ops->new_list(gbl); | |
193 | |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
194 gaim_prefs_connect_callback("/core/buddies/use_server_alias", |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
195 blist_pref_cb, NULL); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
196 |
5228 | 197 return gbl; |
198 } | |
199 | |
200 void | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
201 gaim_set_blist(GaimBuddyList *list) |
5228 | 202 { |
203 gaimbuddylist = list; | |
204 } | |
205 | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
206 GaimBuddyList * |
9285 | 207 gaim_get_blist() |
5228 | 208 { |
209 return gaimbuddylist; | |
210 } | |
211 | |
9285 | 212 void gaim_blist_show() |
5228 | 213 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
214 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 215 |
216 if (ops && ops->show) | |
5228 | 217 ops->show(gaimbuddylist); |
218 } | |
219 | |
220 void gaim_blist_destroy() | |
221 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
222 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 223 |
8259
4f9f68ab8770
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8200
diff
changeset
|
224 gaim_debug(GAIM_DEBUG_INFO, "blist", "Destroying\n"); |
9285 | 225 |
226 if (ops && ops->destroy) | |
5228 | 227 ops->destroy(gaimbuddylist); |
228 } | |
229 | |
9285 | 230 void gaim_blist_set_visible(gboolean show) |
5228 | 231 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
232 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 233 |
234 if (ops && ops->set_visible) | |
5228 | 235 ops->set_visible(gaimbuddylist, show); |
236 } | |
237 | |
9285 | 238 void gaim_blist_update_buddy_status(GaimBuddy *buddy, int status) |
5228 | 239 { |
9285 | 240 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
241 int old_status; | |
242 | |
243 g_return_if_fail(buddy != NULL); | |
244 | |
245 old_status = buddy->uc; | |
8129
52cdf2740654
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
246 if (old_status != status) { |
52cdf2740654
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
247 buddy->uc = status; |
52cdf2740654
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
248 gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); |
52cdf2740654
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
249 |
52cdf2740654
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
250 if ((status & UC_UNAVAILABLE) != (old_status & UC_UNAVAILABLE)) { |
7549 | 251 if (status & UC_UNAVAILABLE) |
252 gaim_signal_emit(gaim_blist_get_handle(), "buddy-away", buddy); | |
253 else | |
254 gaim_signal_emit(gaim_blist_get_handle(), "buddy-back", buddy); | |
255 } | |
5305 | 256 } |
8129
52cdf2740654
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
257 |
9285 | 258 if (ops && ops->update) |
5228 | 259 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); |
260 } | |
261 | |
9285 | 262 static gboolean presence_update_timeout_cb(GaimBuddy *buddy) |
263 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
264 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
265 GaimConversation *conv; |
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
266 |
9285 | 267 g_return_val_if_fail(buddy != NULL, FALSE); |
268 | |
269 if (buddy->present == GAIM_BUDDY_SIGNING_ON) { | |
5228 | 270 buddy->present = GAIM_BUDDY_ONLINE; |
9285 | 271 } else if (buddy->present == GAIM_BUDDY_SIGNING_OFF) { |
5228 | 272 buddy->present = GAIM_BUDDY_OFFLINE; |
6860 | 273 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online--; |
9285 | 274 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 0) |
6860 | 275 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online--; |
5228 | 276 } |
277 | |
278 buddy->timer = 0; | |
279 | |
9285 | 280 if (ops && ops->update) |
5228 | 281 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); |
282 | |
9285 | 283 conv = gaim_find_conversation_with_account(buddy->name, buddy->account); |
6392
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
284 if (conv) { |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
285 if (buddy->present == GAIM_BUDDY_ONLINE) |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
286 gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_ONLINE); |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
287 else if (buddy->present == GAIM_BUDDY_OFFLINE) |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
288 gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_OFFLINE); |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
289 } |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
290 |
5228 | 291 return FALSE; |
292 } | |
293 | |
9285 | 294 void gaim_blist_update_buddy_presence(GaimBuddy *buddy, int presence) |
295 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
296 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 297 gboolean did_something = FALSE; |
298 | |
299 g_return_if_fail(buddy != NULL); | |
5228 | 300 |
301 if (!GAIM_BUDDY_IS_ONLINE(buddy) && presence) { | |
6901 | 302 int old_present = buddy->present; |
5228 | 303 buddy->present = GAIM_BUDDY_SIGNING_ON; |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
304 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-on", buddy); |
9285 | 305 did_something = TRUE; |
306 | |
307 if (old_present != GAIM_BUDDY_SIGNING_OFF) { | |
6901 | 308 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online++; |
9285 | 309 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 1) |
6901 | 310 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online++; |
311 } | |
9285 | 312 } else if (GAIM_BUDDY_IS_ONLINE(buddy) && !presence) { |
5228 | 313 buddy->present = GAIM_BUDDY_SIGNING_OFF; |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
314 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-off", buddy); |
9285 | 315 did_something = TRUE; |
5228 | 316 } |
317 | |
9285 | 318 if (did_something) { |
319 if (buddy->timer > 0) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
320 gaim_timeout_remove(buddy->timer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8259
diff
changeset
|
321 buddy->timer = gaim_timeout_add(10000, (GSourceFunc)presence_update_timeout_cb, buddy); |
6961 | 322 |
323 gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); | |
9285 | 324 if (ops && ops->update) |
325 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 326 } |
327 } | |
328 | |
9285 | 329 void gaim_blist_update_buddy_signon(GaimBuddy *buddy, time_t signon) |
7950 | 330 { |
331 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; | |
9285 | 332 |
333 g_return_if_fail(buddy != NULL); | |
334 | |
335 if (buddy->signon == signon) | |
7950 | 336 return; |
337 | |
338 buddy->signon = signon; | |
9285 | 339 |
340 if (ops && ops->update) | |
341 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
7950 | 342 } |
5228 | 343 |
9285 | 344 void gaim_blist_update_buddy_idle(GaimBuddy *buddy, int idle) |
5228 | 345 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
346 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 347 |
348 g_return_if_fail(buddy != NULL); | |
349 | |
350 if (buddy->idle == idle) | |
6961 | 351 return; |
352 | |
5228 | 353 buddy->idle = idle; |
6843 | 354 gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); |
9285 | 355 |
356 if (ops && ops->update) | |
357 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 358 } |
6695 | 359 |
9285 | 360 void gaim_blist_update_buddy_evil(GaimBuddy *buddy, int warning) |
5228 | 361 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
362 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 363 |
364 g_return_if_fail(buddy != NULL); | |
365 | |
366 if (buddy->evil == warning) | |
6961 | 367 return; |
368 | |
5228 | 369 buddy->evil = warning; |
9285 | 370 |
371 if (ops && ops->update) | |
372 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 373 } |
6695 | 374 |
9285 | 375 void gaim_blist_update_buddy_icon(GaimBuddy *buddy) |
5228 | 376 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
377 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 378 |
379 g_return_if_fail(buddy != NULL); | |
380 | |
381 if (ops && ops->update) | |
382 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
383 } | |
384 | |
385 /* | |
386 * XXX - Maybe remove the call to this from server.c and call it | |
387 * from oscar.c and toc.c instead? | |
388 */ | |
389 void gaim_blist_rename_buddy(GaimBuddy *buddy, const char *name) | |
390 { | |
391 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; | |
392 struct _gaim_hbuddy *hb; | |
393 | |
394 g_return_if_fail(buddy != NULL); | |
395 | |
396 hb = g_new(struct _gaim_hbuddy, 1); | |
8675 | 397 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
398 hb->account = buddy->account; | |
399 hb->group = ((GaimBlistNode *)buddy)->parent->parent; | |
400 g_hash_table_remove(gaimbuddylist->buddies, hb); | |
401 | |
402 g_free(hb->name); | |
403 hb->name = g_strdup(gaim_normalize(buddy->account, name)); | |
404 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); | |
405 | |
5634 | 406 g_free(buddy->name); |
5228 | 407 buddy->name = g_strdup(name); |
9285 | 408 |
409 schedule_blist_save(); | |
410 | |
411 if (ops && ops->update) | |
412 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 413 } |
5234 | 414 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
415 void gaim_blist_alias_chat(GaimChat *chat, const char *alias) |
5234 | 416 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
417 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5234 | 418 |
9285 | 419 g_return_if_fail(chat != NULL); |
420 | |
5237 | 421 g_free(chat->alias); |
9285 | 422 if ((alias != NULL) && (*alias != '\0')) |
5237 | 423 chat->alias = g_strdup(alias); |
424 else | |
425 chat->alias = NULL; | |
426 | |
9285 | 427 schedule_blist_save(); |
428 | |
429 if (ops && ops->update) | |
430 ops->update(gaimbuddylist, (GaimBlistNode *)chat); | |
5234 | 431 } |
432 | |
9285 | 433 void gaim_blist_alias_buddy(GaimBuddy *buddy, const char *alias) |
5228 | 434 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
435 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5634
diff
changeset
|
436 GaimConversation *conv; |
5228 | 437 |
9285 | 438 g_return_if_fail(buddy != NULL); |
439 | |
5228 | 440 g_free(buddy->alias); |
9285 | 441 if ((alias != NULL) && (*alias != '\0')) |
5228 | 442 buddy->alias = g_strdup(alias); |
443 else | |
444 buddy->alias = NULL; | |
445 | |
9285 | 446 schedule_blist_save(); |
447 | |
448 if (ops && ops->update) | |
449 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 450 |
451 conv = gaim_find_conversation_with_account(buddy->name, buddy->account); | |
452 if (conv) | |
453 gaim_conversation_autoset_title(conv); | |
454 } | |
455 | |
9285 | 456 void gaim_blist_server_alias_buddy(GaimBuddy *buddy, const char *alias) |
6058 | 457 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
458 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6058 | 459 GaimConversation *conv; |
460 | |
9285 | 461 g_return_if_fail(buddy != NULL); |
462 | |
6058 | 463 g_free(buddy->server_alias); |
9285 | 464 if ((alias != NULL) && (*alias != '\0') && g_utf8_validate(alias, -1, NULL)) |
6058 | 465 buddy->server_alias = g_strdup(alias); |
466 else | |
467 buddy->server_alias = NULL; | |
468 | |
9285 | 469 schedule_blist_save(); |
470 | |
471 if (ops && ops->update) | |
472 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
6058 | 473 |
474 conv = gaim_find_conversation_with_account(buddy->name, buddy->account); | |
475 if (conv) | |
476 gaim_conversation_autoset_title(conv); | |
477 } | |
478 | |
9285 | 479 /* |
480 * XXX - If merging, prompt the user if they want to merge. | |
481 */ | |
482 void gaim_blist_rename_group(GaimGroup *source, const char *new_name) | |
5228 | 483 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
484 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 485 GaimGroup *dest; |
486 gchar *old_name; | |
487 GList *moved_buddies = NULL; | |
5346 | 488 GSList *accts; |
489 | |
9285 | 490 g_return_if_fail(source != NULL); |
491 g_return_if_fail(new_name != NULL); | |
492 | |
493 if (*new_name == '\0' || !strcmp(new_name, source->name)) | |
5346 | 494 return; |
9285 | 495 |
496 dest = gaim_find_group(new_name); | |
497 if (dest != NULL) { | |
498 /* We're merging two groups */ | |
499 GaimBlistNode *prev, *child, *next; | |
500 | |
501 prev = gaim_blist_get_last_child((GaimBlistNode*)dest); | |
502 child = ((GaimBlistNode*)source)->child; | |
503 | |
504 /* | |
505 * XXX - This seems like a dumb way to do this... why not just | |
506 * append all children from the old group to the end of the new | |
507 * one? PRPLs might be expecting to receive an add_buddy() for | |
508 * each moved buddy... | |
509 */ | |
510 while (child) | |
5346 | 511 { |
512 next = child->next; | |
9285 | 513 if (GAIM_BLIST_NODE_IS_CONTACT(child)) { |
6695 | 514 GaimBlistNode *bnode; |
9285 | 515 gaim_blist_add_contact((GaimContact *)child, dest, prev); |
516 for (bnode = child->child; bnode != NULL; bnode = bnode->next) { | |
517 gaim_blist_add_buddy((GaimBuddy *)bnode, (GaimContact *)child, | |
6695 | 518 NULL, bnode->prev); |
9285 | 519 moved_buddies = g_list_append(moved_buddies, bnode); |
520 } | |
5346 | 521 prev = child; |
9285 | 522 } else if (GAIM_BLIST_NODE_IS_CHAT(child)) { |
523 gaim_blist_add_chat((GaimChat *)child, dest, prev); | |
5346 | 524 prev = child; |
525 } else { | |
526 gaim_debug(GAIM_DEBUG_ERROR, "blist", | |
9285 | 527 "Unknown child type in group %s\n", source->name); |
5346 | 528 } |
529 child = next; | |
530 } | |
9285 | 531 |
532 /* Make a copy of the old group name and then delete the old group */ | |
533 old_name = g_strdup(source->name); | |
534 gaim_blist_remove_group(source); | |
5346 | 535 } else { |
9285 | 536 /* A simple rename */ |
537 GaimBlistNode *cnode, *bnode; | |
538 | |
539 /* Build a GList of all buddies in this group */ | |
540 for (cnode = ((GaimBlistNode *)source)->child; cnode != NULL; cnode = cnode->next) { | |
541 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
542 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) | |
543 moved_buddies = g_list_append(moved_buddies, bnode); | |
5346 | 544 } |
9285 | 545 |
546 old_name = source->name; | |
547 source->name = g_strdup(new_name); | |
548 | |
5346 | 549 } |
9285 | 550 |
551 /* Save our changes */ | |
552 schedule_blist_save(); | |
553 | |
554 /* Update the UI */ | |
555 if (ops && ops->update) | |
556 ops->update(gaimbuddylist, (GaimBlistNode*)source); | |
557 | |
558 /* Notify all PRPLs */ | |
559 for (accts = gaim_group_get_accounts(source); accts; accts = g_slist_remove(accts, accts->data)) { | |
560 GaimAccount *account = accts->data; | |
561 serv_rename_group(account->gc, old_name, source, moved_buddies); | |
562 } | |
563 g_list_free(moved_buddies); | |
564 g_free(old_name); | |
5228 | 565 } |
5234 | 566 |
9285 | 567 static void gaim_blist_node_initialize_settings(GaimBlistNode *node); |
7693 | 568 |
7125 | 569 GaimChat *gaim_chat_new(GaimAccount *account, const char *alias, GHashTable *components) |
5234 | 570 { |
9285 | 571 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
572 GaimChat *chat; |
9285 | 573 |
574 g_return_val_if_fail(account != NULL, FALSE); | |
575 g_return_val_if_fail(components != NULL, FALSE); | |
5234 | 576 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
577 chat = g_new0(GaimChat, 1); |
5234 | 578 chat->account = account; |
9285 | 579 if ((alias != NULL) && (*alias != '\0')) |
5237 | 580 chat->alias = g_strdup(alias); |
5234 | 581 chat->components = components; |
9285 | 582 gaim_blist_node_initialize_settings((GaimBlistNode *)chat); |
583 ((GaimBlistNode *)chat)->type = GAIM_BLIST_CHAT_NODE; | |
5234 | 584 |
585 if (ops != NULL && ops->new_node != NULL) | |
586 ops->new_node((GaimBlistNode *)chat); | |
587 | |
588 return chat; | |
589 } | |
590 | |
7125 | 591 char *gaim_chat_get_display_name(GaimChat *chat) |
6034 | 592 { |
593 char *name; | |
594 | |
9285 | 595 g_return_val_if_fail(chat != NULL, FALSE); |
596 | |
597 if (chat->alias != NULL) { | |
6034 | 598 name = g_strdup(chat->alias); |
9285 | 599 } else { |
6034 | 600 GList *parts; |
601 GaimPlugin *prpl; | |
602 GaimPluginProtocolInfo *prpl_info; | |
603 struct proto_chat_entry *pce; | |
604 | |
7956 | 605 prpl = gaim_find_prpl(gaim_account_get_protocol_id(chat->account)); |
6034 | 606 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
607 | |
608 parts = prpl_info->chat_info(chat->account->gc); | |
609 | |
610 pce = parts->data; | |
611 name = g_markup_escape_text(g_hash_table_lookup(chat->components, | |
612 pce->identifier), -1); | |
613 g_list_free(parts); | |
614 } | |
615 | |
616 return name; | |
617 } | |
618 | |
6695 | 619 GaimBuddy *gaim_buddy_new(GaimAccount *account, const char *screenname, const char *alias) |
5228 | 620 { |
9285 | 621 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
622 GaimBuddy *buddy; | |
623 | |
624 g_return_val_if_fail(account != NULL, FALSE); | |
625 g_return_val_if_fail(screenname != NULL, FALSE); | |
626 | |
627 buddy = g_new0(GaimBuddy, 1); | |
628 buddy->account = account; | |
629 buddy->name = g_strdup(screenname); | |
630 buddy->alias = g_strdup(alias); | |
631 gaim_blist_node_initialize_settings((GaimBlistNode *)buddy); | |
632 ((GaimBlistNode *)buddy)->type = GAIM_BLIST_BUDDY_NODE; | |
633 | |
634 if (ops && ops->new_node) | |
635 ops->new_node((GaimBlistNode *)buddy); | |
636 | |
637 return buddy; | |
5228 | 638 } |
5634 | 639 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
640 void |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
641 gaim_buddy_set_icon(GaimBuddy *buddy, GaimBuddyIcon *icon) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
642 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
643 g_return_if_fail(buddy != NULL); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
644 |
9261
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
645 if (buddy->icon != icon) |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
646 { |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
647 if (buddy->icon != NULL) |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
648 gaim_buddy_icon_unref(buddy->icon); |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
649 |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
650 buddy->icon = (icon == NULL ? NULL : gaim_buddy_icon_ref(icon)); |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
651 } |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
652 |
9324 | 653 if (buddy->icon) |
654 gaim_buddy_icon_cache(icon, buddy); | |
655 else | |
656 gaim_blist_node_remove_setting((GaimBlistNode *)buddy, "buddy_icon"); | |
9299 | 657 |
658 schedule_blist_save(); | |
659 | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
660 gaim_blist_update_buddy_icon(buddy); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
661 } |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
662 |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
663 GaimBuddyIcon * |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
664 gaim_buddy_get_icon(const GaimBuddy *buddy) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
665 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
666 g_return_val_if_fail(buddy != NULL, NULL); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
667 |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
668 return buddy->icon; |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
669 } |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
670 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
671 void gaim_blist_add_chat(GaimChat *chat, GaimGroup *group, GaimBlistNode *node) |
5234 | 672 { |
9285 | 673 GaimBlistNode *cnode = (GaimBlistNode*)chat; |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
674 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6774 | 675 |
676 g_return_if_fail(chat != NULL); | |
9285 | 677 g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT((GaimBlistNode *)chat)); |
678 | |
679 if (node == NULL) { | |
680 if (group == NULL) { | |
681 group = gaim_group_new(_("Chats")); | |
682 gaim_blist_add_group(group, | |
5634 | 683 gaim_blist_get_last_sibling(gaimbuddylist->root)); |
5234 | 684 } |
685 } else { | |
9285 | 686 group = (GaimGroup*)node->parent; |
5234 | 687 } |
688 | |
689 /* if we're moving to overtop of ourselves, do nothing */ | |
9285 | 690 if (cnode == node) |
5234 | 691 return; |
692 | |
693 if (cnode->parent) { | |
694 /* This chat was already in the list and is | |
695 * being moved. | |
696 */ | |
6695 | 697 ((GaimGroup *)cnode->parent)->totalsize--; |
5855 | 698 if (gaim_account_is_connected(chat->account)) { |
6695 | 699 ((GaimGroup *)cnode->parent)->online--; |
700 ((GaimGroup *)cnode->parent)->currentsize--; | |
5287 | 701 } |
9285 | 702 if (cnode->next) |
5234 | 703 cnode->next->prev = cnode->prev; |
9285 | 704 if (cnode->prev) |
5234 | 705 cnode->prev->next = cnode->next; |
9285 | 706 if (cnode->parent->child == cnode) |
5234 | 707 cnode->parent->child = cnode->next; |
708 | |
709 ops->remove(gaimbuddylist, cnode); | |
710 | |
9285 | 711 schedule_blist_save(); |
5234 | 712 } |
713 | |
9285 | 714 if (node != NULL) { |
715 if (node->next) | |
716 node->next->prev = cnode; | |
717 cnode->next = node->next; | |
718 cnode->prev = node; | |
719 cnode->parent = node->parent; | |
720 node->next = cnode; | |
721 ((GaimGroup *)node->parent)->totalsize++; | |
5855 | 722 if (gaim_account_is_connected(chat->account)) { |
9285 | 723 ((GaimGroup *)node->parent)->online++; |
724 ((GaimGroup *)node->parent)->currentsize++; | |
5287 | 725 } |
5234 | 726 } else { |
9285 | 727 if (((GaimBlistNode *)group)->child) |
728 ((GaimBlistNode *)group)->child->prev = cnode; | |
729 cnode->next = ((GaimBlistNode *)group)->child; | |
5634 | 730 cnode->prev = NULL; |
9285 | 731 ((GaimBlistNode *)group)->child = cnode; |
732 cnode->parent = (GaimBlistNode *)group; | |
733 group->totalsize++; | |
5855 | 734 if (gaim_account_is_connected(chat->account)) { |
9285 | 735 group->online++; |
736 group->currentsize++; | |
5287 | 737 } |
5234 | 738 } |
739 | |
9285 | 740 schedule_blist_save(); |
741 | |
742 if (ops && ops->update) | |
743 ops->update(gaimbuddylist, (GaimBlistNode *)cnode); | |
5234 | 744 } |
745 | |
7879 | 746 void gaim_blist_add_buddy(GaimBuddy *buddy, GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
5228 | 747 { |
6695 | 748 GaimBlistNode *cnode, *bnode; |
749 GaimGroup *g; | |
750 GaimContact *c; | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
751 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5247 | 752 struct _gaim_hbuddy *hb; |
6695 | 753 |
754 g_return_if_fail(buddy != NULL); | |
6774 | 755 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY((GaimBlistNode*)buddy)); |
6695 | 756 |
757 bnode = (GaimBlistNode *)buddy; | |
5228 | 758 |
6695 | 759 /* if we're moving to overtop of ourselves, do nothing */ |
9285 | 760 if (bnode == node || (!node && bnode->parent && |
6695 | 761 contact && bnode->parent == (GaimBlistNode*)contact |
762 && bnode == bnode->parent->child)) | |
763 return; | |
764 | |
9285 | 765 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
6695 | 766 c = (GaimContact*)node->parent; |
767 g = (GaimGroup*)node->parent->parent; | |
9285 | 768 } else if (contact) { |
6695 | 769 c = contact; |
9285 | 770 g = (GaimGroup *)((GaimBlistNode *)c)->parent; |
771 } else { | |
772 if (group) { | |
6695 | 773 g = group; |
774 } else { | |
5228 | 775 g = gaim_group_new(_("Buddies")); |
5634 | 776 gaim_blist_add_group(g, |
777 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
5228 | 778 } |
6695 | 779 c = gaim_contact_new(); |
780 gaim_blist_add_contact(c, g, | |
781 gaim_blist_get_last_child((GaimBlistNode*)g)); | |
5228 | 782 } |
783 | |
6695 | 784 cnode = (GaimBlistNode *)c; |
5228 | 785 |
9285 | 786 if (bnode->parent) { |
787 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
6695 | 788 ((GaimContact*)bnode->parent)->online--; |
9285 | 789 if (((GaimContact*)bnode->parent)->online == 0) |
6695 | 790 ((GaimGroup*)bnode->parent->parent)->online--; |
791 } | |
9285 | 792 if (gaim_account_is_connected(buddy->account)) { |
6695 | 793 ((GaimContact*)bnode->parent)->currentsize--; |
9285 | 794 if (((GaimContact*)bnode->parent)->currentsize == 0) |
6695 | 795 ((GaimGroup*)bnode->parent->parent)->currentsize--; |
796 } | |
797 ((GaimContact*)bnode->parent)->totalsize--; | |
798 /* the group totalsize will be taken care of by remove_contact below */ | |
799 | |
9285 | 800 if (bnode->parent->parent != (GaimBlistNode*)g) |
6695 | 801 serv_move_buddy(buddy, (GaimGroup *)bnode->parent->parent, g); |
5277 | 802 |
9285 | 803 if (bnode->next) |
5228 | 804 bnode->next->prev = bnode->prev; |
9285 | 805 if (bnode->prev) |
5228 | 806 bnode->prev->next = bnode->next; |
9285 | 807 if (bnode->parent->child == bnode) |
5228 | 808 bnode->parent->child = bnode->next; |
809 | |
810 ops->remove(gaimbuddylist, bnode); | |
811 | |
9285 | 812 schedule_blist_save(); |
813 | |
814 if (bnode->parent->parent != (GaimBlistNode*)g) { | |
6742 | 815 hb = g_new(struct _gaim_hbuddy, 1); |
7261 | 816 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
6742 | 817 hb->account = buddy->account; |
818 hb->group = bnode->parent->parent; | |
6775 | 819 g_hash_table_remove(gaimbuddylist->buddies, hb); |
7162 | 820 g_free(hb->name); |
6742 | 821 g_free(hb); |
822 } | |
6794 | 823 |
9285 | 824 if (!bnode->parent->child) { |
6794 | 825 gaim_blist_remove_contact((GaimContact*)bnode->parent); |
7003 | 826 } else { |
827 gaim_contact_compute_priority_buddy((GaimContact*)bnode->parent); | |
828 ops->update(gaimbuddylist, bnode->parent); | |
829 } | |
5228 | 830 } |
831 | |
9285 | 832 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
833 if (node->next) | |
6695 | 834 node->next->prev = bnode; |
835 bnode->next = node->next; | |
836 bnode->prev = node; | |
837 bnode->parent = node->parent; | |
838 node->next = bnode; | |
5228 | 839 } else { |
9285 | 840 if (cnode->child) |
6695 | 841 cnode->child->prev = bnode; |
842 bnode->prev = NULL; | |
843 bnode->next = cnode->child; | |
844 cnode->child = bnode; | |
845 bnode->parent = cnode; | |
5228 | 846 } |
847 | |
9285 | 848 if (GAIM_BUDDY_IS_ONLINE(buddy)) { |
6695 | 849 ((GaimContact*)bnode->parent)->online++; |
9285 | 850 if (((GaimContact*)bnode->parent)->online == 1) |
6695 | 851 ((GaimGroup*)bnode->parent->parent)->online++; |
852 } | |
9285 | 853 if (gaim_account_is_connected(buddy->account)) { |
6695 | 854 ((GaimContact*)bnode->parent)->currentsize++; |
9285 | 855 if (((GaimContact*)bnode->parent)->currentsize == 1) |
6695 | 856 ((GaimGroup*)bnode->parent->parent)->currentsize++; |
857 } | |
858 ((GaimContact*)bnode->parent)->totalsize++; | |
859 | |
6742 | 860 hb = g_new(struct _gaim_hbuddy, 1); |
7261 | 861 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
5247 | 862 hb->account = buddy->account; |
6695 | 863 hb->group = ((GaimBlistNode*)buddy)->parent->parent; |
5247 | 864 |
6742 | 865 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); |
5247 | 866 |
6843 | 867 gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); |
9285 | 868 |
869 schedule_blist_save(); | |
870 | |
871 if (ops && ops->update) | |
5228 | 872 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); |
873 } | |
874 | |
6695 | 875 GaimContact *gaim_contact_new() |
5228 | 876 { |
9285 | 877 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
878 | |
879 GaimContact *contact = g_new0(GaimContact, 1); | |
880 contact->totalsize = 0; | |
881 contact->currentsize = 0; | |
882 contact->online = 0; | |
883 gaim_blist_node_initialize_settings((GaimBlistNode *)contact); | |
884 ((GaimBlistNode *)contact)->type = GAIM_BLIST_CONTACT_NODE; | |
885 | |
886 if (ops && ops->new_node) | |
887 ops->new_node((GaimBlistNode *)contact); | |
888 | |
889 return contact; | |
6695 | 890 } |
891 | |
9285 | 892 void gaim_contact_set_alias(GaimContact *contact, const char *alias) |
6755 | 893 { |
7245 | 894 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
895 | |
6755 | 896 g_return_if_fail(contact != NULL); |
897 | |
9285 | 898 if (contact->alias != NULL) |
6755 | 899 g_free(contact->alias); |
900 | |
9285 | 901 if ((alias != NULL) && (*alias != '\0')) |
7245 | 902 contact->alias = g_strdup(alias); |
903 else | |
904 contact->alias = NULL; | |
905 | |
9285 | 906 schedule_blist_save(); |
907 | |
908 if (ops && ops->update) | |
7245 | 909 ops->update(gaimbuddylist, (GaimBlistNode*)contact); |
6755 | 910 } |
911 | |
912 const char *gaim_contact_get_alias(GaimContact* contact) | |
913 { | |
9285 | 914 g_return_val_if_fail(contact != NULL, NULL); |
915 | |
916 if (contact->alias) | |
7312 | 917 return contact->alias; |
918 | |
919 return gaim_get_buddy_alias(contact->priority); | |
6755 | 920 } |
921 | |
6695 | 922 GaimGroup *gaim_group_new(const char *name) |
923 { | |
9285 | 924 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
925 GaimGroup *group = gaim_find_group(name); | |
926 | |
927 if (group != NULL) | |
928 return group; | |
929 | |
930 group = g_new0(GaimGroup, 1); | |
931 group->name = g_strdup(name); | |
932 group->totalsize = 0; | |
933 group->currentsize = 0; | |
934 group->online = 0; | |
935 gaim_blist_node_initialize_settings((GaimBlistNode *)group); | |
936 ((GaimBlistNode *)group)->type = GAIM_BLIST_GROUP_NODE; | |
937 | |
938 if (ops && ops->new_node) | |
939 ops->new_node((GaimBlistNode *)group); | |
940 | |
941 return group; | |
5228 | 942 } |
943 | |
6695 | 944 void gaim_blist_add_contact(GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
945 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
946 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 947 GaimGroup *g; |
6742 | 948 GaimBlistNode *gnode, *cnode, *bnode; |
9285 | 949 gboolean empty_contact = FALSE; |
6695 | 950 |
6774 | 951 g_return_if_fail(contact != NULL); |
952 g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT((GaimBlistNode*)contact)); | |
6695 | 953 |
9285 | 954 if ((GaimBlistNode*)contact == node) |
6975 | 955 return; |
956 | |
9285 | 957 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
6695 | 958 GAIM_BLIST_NODE_IS_CHAT(node))) |
959 g = (GaimGroup*)node->parent; | |
9285 | 960 else if (group) |
6695 | 961 g = group; |
962 else { | |
963 g = gaim_group_new(_("Buddies")); | |
964 gaim_blist_add_group(g, | |
965 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
966 } | |
967 | |
968 gnode = (GaimBlistNode*)g; | |
969 cnode = (GaimBlistNode*)contact; | |
970 | |
9285 | 971 if (cnode->parent) { |
972 if (cnode->parent->child == cnode) | |
6731 | 973 cnode->parent->child = cnode->next; |
9285 | 974 if (cnode->prev) |
6695 | 975 cnode->prev->next = cnode->next; |
9285 | 976 if (cnode->next) |
6695 | 977 cnode->next->prev = cnode->prev; |
978 | |
979 | |
9285 | 980 if (contact->online > 0) |
6695 | 981 ((GaimGroup*)cnode->parent)->online--; |
9285 | 982 if (contact->currentsize > 0) |
6695 | 983 ((GaimGroup*)cnode->parent)->currentsize--; |
984 ((GaimGroup*)cnode->parent)->totalsize--; | |
985 | |
6731 | 986 ops->remove(gaimbuddylist, cnode); |
987 | |
9285 | 988 schedule_blist_save(); |
989 | |
990 if (cnode->parent != gnode) { | |
991 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
6742 | 992 GaimBuddy *b = (GaimBuddy*)bnode; |
993 | |
994 struct _gaim_hbuddy *hb = g_new(struct _gaim_hbuddy, 1); | |
7261 | 995 hb->name = g_strdup(gaim_normalize(b->account, b->name)); |
6742 | 996 hb->account = b->account; |
997 hb->group = cnode->parent; | |
998 | |
6776 | 999 g_hash_table_remove(gaimbuddylist->buddies, hb); |
6742 | 1000 |
9285 | 1001 if (!gaim_find_buddy_in_group(b->account, b->name, g)) { |
8328 | 1002 hb->group = gnode; |
1003 g_hash_table_replace(gaimbuddylist->buddies, hb, b); | |
1004 | |
9285 | 1005 if (b->account->gc) |
1006 serv_move_buddy(b, (GaimGroup *)cnode->parent, g); | |
8328 | 1007 } else { |
1008 /* this buddy already exists in the group, so we're | |
1009 * gonna delete it instead */ | |
1010 g_free(hb->name); | |
1011 g_free(hb); | |
9285 | 1012 if (b->account->gc) |
1013 serv_remove_buddy(b->account->gc, b, (GaimGroup *)cnode->parent); | |
1014 | |
1015 if (!cnode->child->next) | |
8328 | 1016 empty_contact = TRUE; |
1017 gaim_blist_remove_buddy(b); | |
1018 } | |
6742 | 1019 } |
1020 } | |
6695 | 1021 } |
1022 | |
9285 | 1023 if (empty_contact) |
8328 | 1024 return; |
1025 | |
6775 | 1026 |
9285 | 1027 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
6695 | 1028 GAIM_BLIST_NODE_IS_CHAT(node))) { |
9285 | 1029 if (node->next) |
6695 | 1030 node->next->prev = cnode; |
1031 cnode->next = node->next; | |
1032 cnode->prev = node; | |
1033 cnode->parent = node->parent; | |
1034 node->next = cnode; | |
1035 } else { | |
9285 | 1036 if (gnode->child) |
6695 | 1037 gnode->child->prev = cnode; |
1038 cnode->prev = NULL; | |
1039 cnode->next = gnode->child; | |
1040 gnode->child = cnode; | |
1041 cnode->parent = gnode; | |
1042 } | |
1043 | |
9285 | 1044 if (contact->online > 0) |
6695 | 1045 g->online++; |
9285 | 1046 if (contact->currentsize > 0) |
6695 | 1047 g->currentsize++; |
1048 g->totalsize++; | |
1049 | |
9285 | 1050 schedule_blist_save(); |
1051 | |
1052 if (ops && cnode->child) | |
6695 | 1053 ops->update(gaimbuddylist, cnode); |
6775 | 1054 |
9285 | 1055 for (bnode = cnode->child; bnode; bnode = bnode->next) |
6775 | 1056 ops->update(gaimbuddylist, bnode); |
6695 | 1057 } |
1058 | |
7246 | 1059 void gaim_blist_merge_contact(GaimContact *source, GaimBlistNode *node) |
6965 | 1060 { |
1061 GaimBlistNode *sourcenode = (GaimBlistNode*)source; | |
7246 | 1062 GaimBlistNode *targetnode; |
1063 GaimBlistNode *prev, *cur, *next; | |
1064 GaimContact *target; | |
1065 | |
9285 | 1066 g_return_if_fail(source != NULL); |
1067 g_return_if_fail(node != NULL); | |
1068 | |
1069 if (GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
1070 target = (GaimContact *)node; | |
7246 | 1071 prev = gaim_blist_get_last_child(node); |
9285 | 1072 } else if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
1073 target = (GaimContact *)node->parent; | |
7246 | 1074 prev = node; |
1075 } else { | |
6965 | 1076 return; |
7246 | 1077 } |
1078 | |
9285 | 1079 if (source == target || !target) |
7246 | 1080 return; |
1081 | |
9285 | 1082 targetnode = (GaimBlistNode *)target; |
7246 | 1083 next = sourcenode->child; |
1084 | |
9285 | 1085 while (next) { |
7246 | 1086 cur = next; |
1087 next = cur->next; | |
9285 | 1088 if (GAIM_BLIST_NODE_IS_BUDDY(cur)) { |
1089 gaim_blist_add_buddy((GaimBuddy *)cur, target, NULL, prev); | |
7246 | 1090 prev = cur; |
1091 } | |
6965 | 1092 } |
1093 } | |
1094 | |
9285 | 1095 void gaim_blist_add_group(GaimGroup *group, GaimBlistNode *node) |
5228 | 1096 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1097 GaimBlistUiOps *ops; |
5228 | 1098 GaimBlistNode *gnode = (GaimBlistNode*)group; |
1099 | |
6774 | 1100 g_return_if_fail(group != NULL); |
9285 | 1101 g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP((GaimBlistNode *)group)); |
1102 | |
1103 /* XXX - Wha? Why does this exist here? */ | |
1104 //if (!gaimbuddylist) | |
1105 //gaimbuddylist = gaim_blist_new(); | |
5228 | 1106 ops = gaimbuddylist->ui_ops; |
1107 | |
1108 if (!gaimbuddylist->root) { | |
1109 gaimbuddylist->root = gnode; | |
1110 return; | |
1111 } | |
1112 | |
1113 /* if we're moving to overtop of ourselves, do nothing */ | |
9285 | 1114 if (gnode == node) |
5228 | 1115 return; |
1116 | |
1117 if (gaim_find_group(group->name)) { | |
1118 /* This is just being moved */ | |
1119 | |
9285 | 1120 ops->remove(gaimbuddylist, (GaimBlistNode *)group); |
1121 | |
1122 if (gnode == gaimbuddylist->root) | |
5228 | 1123 gaimbuddylist->root = gnode->next; |
9285 | 1124 if (gnode->prev) |
5228 | 1125 gnode->prev->next = gnode->next; |
9285 | 1126 if (gnode->next) |
5228 | 1127 gnode->next->prev = gnode->prev; |
1128 } | |
1129 | |
6695 | 1130 if (node && GAIM_BLIST_NODE_IS_GROUP(node)) { |
5634 | 1131 gnode->next = node->next; |
1132 gnode->prev = node; | |
9285 | 1133 if (node->next) |
5634 | 1134 node->next->prev = gnode; |
1135 node->next = gnode; | |
1136 } else { | |
9285 | 1137 if (gaimbuddylist->root) |
6807 | 1138 gaimbuddylist->root->prev = gnode; |
5634 | 1139 gnode->next = gaimbuddylist->root; |
1140 gnode->prev = NULL; | |
1141 gaimbuddylist->root = gnode; | |
1142 } | |
1143 | |
9285 | 1144 schedule_blist_save(); |
1145 | |
1146 if (ops && ops->update) { | |
5228 | 1147 ops->update(gaimbuddylist, gnode); |
9285 | 1148 for (node = gnode->child; node; node = node->next) |
5228 | 1149 ops->update(gaimbuddylist, node); |
1150 } | |
1151 } | |
1152 | |
9285 | 1153 void gaim_blist_remove_contact(GaimContact *contact) |
5228 | 1154 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1155 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1156 GaimBlistNode *node, *gnode; |
1157 | |
1158 g_return_if_fail(contact != NULL); | |
1159 | |
1160 node = (GaimBlistNode *)contact; | |
1161 gnode = node->parent; | |
1162 | |
1163 if (node->child) { | |
1164 /* | |
1165 * If this contact has children then remove them. When the last | |
1166 * buddy is removed from the contact, the contact is deleted. | |
1167 */ | |
1168 while (node->child) { | |
1169 gaim_blist_remove_buddy((GaimBuddy*)node->child); | |
6695 | 1170 } |
1171 } else { | |
9285 | 1172 /* Remove the node from its parent */ |
1173 if (gnode->child == node) | |
1174 gnode->child = node->next; | |
1175 if (node->prev) | |
1176 node->prev->next = node->next; | |
1177 if (node->next) | |
1178 node->next->prev = node->prev; | |
1179 | |
1180 schedule_blist_save(); | |
1181 | |
1182 /* Update the UI */ | |
1183 if (ops && ops->remove) | |
1184 ops->remove(gaimbuddylist, node); | |
1185 | |
1186 /* Delete the node */ | |
6695 | 1187 g_free(contact); |
1188 } | |
1189 } | |
1190 | |
9285 | 1191 void gaim_blist_remove_buddy(GaimBuddy *buddy) |
6695 | 1192 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1193 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1194 GaimBlistNode *node, *cnode, *gnode; |
1195 GaimContact *contact; | |
6695 | 1196 GaimGroup *group; |
6742 | 1197 struct _gaim_hbuddy hb; |
5228 | 1198 |
9285 | 1199 g_return_if_fail(buddy != NULL); |
1200 | |
1201 node = (GaimBlistNode *)buddy; | |
6695 | 1202 cnode = node->parent; |
9285 | 1203 gnode = cnode->parent; |
1204 contact = (GaimContact *)cnode; | |
1205 group = (GaimGroup *)gnode; | |
1206 | |
1207 /* Remove the node from its parent */ | |
5228 | 1208 if (node->prev) |
1209 node->prev->next = node->next; | |
1210 if (node->next) | |
1211 node->next->prev = node->prev; | |
9285 | 1212 if (cnode->child == node) |
6695 | 1213 cnode->child = node->next; |
9285 | 1214 |
1215 /* Adjust size counts */ | |
1216 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
1217 contact->online--; | |
1218 if (contact->online == 0) | |
1219 group->online--; | |
6695 | 1220 } |
9285 | 1221 if (gaim_account_is_connected(buddy->account)) { |
1222 contact->currentsize--; | |
1223 if (contact->currentsize == 0) | |
1224 group->currentsize--; | |
8194 | 1225 } |
9285 | 1226 contact->totalsize--; |
1227 | |
1228 schedule_blist_save(); | |
1229 | |
1230 /* Re-sort the contact */ | |
1231 if (contact->priority == buddy) { | |
1232 gaim_contact_compute_priority_buddy(contact); | |
1233 if (ops && ops->update) | |
1234 ops->update(gaimbuddylist, cnode); | |
1235 } | |
1236 | |
1237 /* Remove this buddy from the buddies hash table */ | |
7261 | 1238 hb.name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
5247 | 1239 hb.account = buddy->account; |
6695 | 1240 hb.group = ((GaimBlistNode*)buddy)->parent->parent; |
6742 | 1241 g_hash_table_remove(gaimbuddylist->buddies, &hb); |
7162 | 1242 g_free(hb.name); |
5247 | 1243 |
9285 | 1244 /* Update the UI */ |
1245 if (ops && ops->remove) | |
1246 ops->remove(gaimbuddylist, node); | |
1247 | |
1248 /* Delete the node */ | |
1249 if (buddy->timer > 0) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1250 gaim_timeout_remove(buddy->timer); |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1251 if (buddy->icon != NULL) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1252 gaim_buddy_icon_unref(buddy->icon); |
7693 | 1253 g_hash_table_destroy(buddy->node.settings); |
5228 | 1254 g_free(buddy->name); |
1255 g_free(buddy->alias); | |
1256 g_free(buddy); | |
6755 | 1257 |
9285 | 1258 /* If the contact is empty then remove it */ |
1259 if (!cnode->child) | |
1260 gaim_blist_remove_contact(contact); | |
5228 | 1261 } |
1262 | |
9285 | 1263 void gaim_blist_remove_chat(GaimChat *chat) |
5234 | 1264 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1265 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1266 GaimBlistNode *node, *gnode; |
6695 | 1267 GaimGroup *group; |
5234 | 1268 |
9285 | 1269 g_return_if_fail(chat != NULL); |
1270 | |
1271 node = (GaimBlistNode *)chat; | |
5234 | 1272 gnode = node->parent; |
6695 | 1273 group = (GaimGroup *)gnode; |
5234 | 1274 |
9285 | 1275 /* Remove the node from its parent */ |
1276 if (gnode->child == node) | |
5234 | 1277 gnode->child = node->next; |
1278 if (node->prev) | |
1279 node->prev->next = node->next; | |
1280 if (node->next) | |
1281 node->next->prev = node->prev; | |
9285 | 1282 |
1283 /* Adjust size counts */ | |
5855 | 1284 if (gaim_account_is_connected(chat->account)) { |
5394 | 1285 group->online--; |
9285 | 1286 group->currentsize--; |
5394 | 1287 } |
9285 | 1288 group->totalsize--; |
1289 | |
1290 schedule_blist_save(); | |
1291 | |
1292 /* Update the UI */ | |
1293 if (ops && ops->remove) | |
1294 ops->remove(gaimbuddylist, node); | |
1295 | |
1296 /* Delete the node */ | |
5234 | 1297 g_hash_table_destroy(chat->components); |
1298 g_free(chat->alias); | |
1299 g_free(chat); | |
1300 } | |
1301 | |
9285 | 1302 void gaim_blist_remove_group(GaimGroup *group) |
5228 | 1303 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1304 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1305 GaimBlistNode *node; |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1306 GList *l; |
5228 | 1307 |
9285 | 1308 g_return_if_fail(group != NULL); |
1309 | |
1310 node = (GaimBlistNode *)group; | |
1311 | |
1312 /* Make sure the group is empty */ | |
1313 if (node->child) { | |
5228 | 1314 char *buf; |
1315 int count = 0; | |
9285 | 1316 GaimBlistNode *child; |
1317 | |
1318 for (child = node->child; child != NULL; child = child->next) | |
5228 | 1319 count++; |
1320 | |
6308 | 1321 buf = g_strdup_printf(ngettext("%d buddy from group %s was not removed " |
1322 "because its account was not logged in." | |
1323 " This buddy and the group were not " | |
1324 "removed.\n", | |
1325 "%d buddies from group %s were not " | |
1326 "removed because their accounts were " | |
6336 | 1327 "not logged in. These buddies and " |
1328 "the group were not removed.\n", count), | |
6308 | 1329 count, group->name); |
5541
aee0ee458974
[gaim-migrate @ 5941]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1330 gaim_notify_error(NULL, NULL, _("Group not removed"), buf); |
5228 | 1331 g_free(buf); |
1332 return; | |
1333 } | |
1334 | |
9285 | 1335 /* Remove the node from its parent */ |
1336 if (gaimbuddylist->root == node) | |
5228 | 1337 gaimbuddylist->root = node->next; |
1338 if (node->prev) | |
1339 node->prev->next = node->next; | |
1340 if (node->next) | |
1341 node->next->prev = node->prev; | |
1342 | |
9285 | 1343 schedule_blist_save(); |
1344 | |
1345 /* Update the UI */ | |
1346 if (ops && ops->remove) | |
1347 ops->remove(gaimbuddylist, node); | |
1348 | |
1349 /* Remove the group from all accounts that are online */ | |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1350 for (l = gaim_connections_get_all(); l != NULL; l = l->next) |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1351 { |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1352 GaimConnection *gc = (GaimConnection *)l->data; |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1353 |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1354 if (gaim_connection_get_state(gc) == GAIM_CONNECTED) |
9285 | 1355 serv_remove_group(gc, group); |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1356 } |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1357 |
9285 | 1358 /* Delete the node */ |
5228 | 1359 g_free(group->name); |
1360 g_free(group); | |
1361 } | |
1362 | |
9285 | 1363 GaimBuddy *gaim_contact_get_priority_buddy(GaimContact *contact) |
1364 { | |
1365 g_return_val_if_fail(contact != NULL, NULL); | |
1366 | |
6843 | 1367 return contact->priority; |
6695 | 1368 } |
1369 | |
9285 | 1370 const char *gaim_get_buddy_alias_only(GaimBuddy *buddy) |
1371 { | |
1372 g_return_val_if_fail(buddy != NULL, NULL); | |
1373 | |
1374 if ((buddy->alias != NULL) && (*buddy->alias != '\0')) { | |
1375 return buddy->alias; | |
1376 } else if ((buddy->server_alias != NULL) && | |
1377 (*buddy->server_alias != '\0') && | |
1378 (gaim_prefs_get_bool("/core/buddies/use_server_alias"))) { | |
1379 | |
1380 return buddy->server_alias; | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1381 } |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1382 |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1383 return NULL; |
5228 | 1384 } |
1385 | |
9285 | 1386 const char *gaim_get_buddy_alias(GaimBuddy *buddy) |
5228 | 1387 { |
6755 | 1388 const char *ret; |
1389 | |
9285 | 1390 /* Are there ever times when we WANT to return "Unknown"? */ |
1391 /* g_return_val_if_fail(buddy != NULL, NULL); */ | |
1392 if (!buddy) | |
6755 | 1393 return _("Unknown"); |
5228 | 1394 |
9285 | 1395 ret = gaim_get_buddy_alias_only(buddy); |
6755 | 1396 |
1397 return ret ? ret : buddy->name; | |
5228 | 1398 } |
1399 | |
7125 | 1400 const char *gaim_chat_get_name(GaimChat *chat) |
6744 | 1401 { |
9285 | 1402 struct proto_chat_entry *pce; |
1403 GList *parts, *tmp; | |
1404 char *ret; | |
1405 | |
1406 g_return_val_if_fail(chat != NULL, NULL); | |
1407 | |
1408 if ((chat->alias != NULL) && (*chat->alias != '\0')) | |
6744 | 1409 return chat->alias; |
9285 | 1410 |
1411 parts = GAIM_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); | |
1412 pce = parts->data; | |
1413 ret = g_hash_table_lookup(chat->components, pce->identifier); | |
1414 for (tmp = parts; tmp; tmp = tmp->next) | |
1415 g_free(tmp->data); | |
1416 g_list_free(parts); | |
1417 | |
1418 return ret; | |
6744 | 1419 } |
1420 | |
6695 | 1421 GaimBuddy *gaim_find_buddy(GaimAccount *account, const char *name) |
5228 | 1422 { |
6695 | 1423 GaimBuddy *buddy; |
5247 | 1424 struct _gaim_hbuddy hb; |
5758 | 1425 GaimBlistNode *group; |
5228 | 1426 |
9285 | 1427 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
1428 g_return_val_if_fail(account != NULL, NULL); | |
1429 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
5228 | 1430 |
7429 | 1431 hb.account = account; |
7261 | 1432 hb.name = g_strdup(gaim_normalize(account, name)); |
7429 | 1433 |
9285 | 1434 for (group = gaimbuddylist->root; group; group = group->next) { |
5758 | 1435 hb.group = group; |
7162 | 1436 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb))) { |
1437 g_free(hb.name); | |
5758 | 1438 return buddy; |
7162 | 1439 } |
5758 | 1440 } |
7162 | 1441 g_free(hb.name); |
9285 | 1442 |
5758 | 1443 return NULL; |
5228 | 1444 } |
1445 | |
6872 | 1446 GaimBuddy *gaim_find_buddy_in_group(GaimAccount *account, const char *name, |
1447 GaimGroup *group) | |
1448 { | |
1449 struct _gaim_hbuddy hb; | |
7162 | 1450 GaimBuddy *ret; |
6872 | 1451 |
9285 | 1452 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
1453 g_return_val_if_fail(account != NULL, NULL); | |
1454 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6872 | 1455 |
7261 | 1456 hb.name = g_strdup(gaim_normalize(account, name)); |
6872 | 1457 hb.account = account; |
1458 hb.group = (GaimBlistNode*)group; | |
1459 | |
7162 | 1460 ret = g_hash_table_lookup(gaimbuddylist->buddies, &hb); |
1461 g_free(hb.name); | |
9285 | 1462 |
7162 | 1463 return ret; |
6872 | 1464 } |
1465 | |
6245 | 1466 GSList *gaim_find_buddies(GaimAccount *account, const char *name) |
1467 { | |
1468 struct buddy *buddy; | |
1469 struct _gaim_hbuddy hb; | |
9285 | 1470 GaimBlistNode *node; |
6245 | 1471 GSList *ret = NULL; |
1472 | |
9285 | 1473 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
1474 g_return_val_if_fail(account != NULL, NULL); | |
1475 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6245 | 1476 |
7261 | 1477 hb.name = g_strdup(gaim_normalize(account, name)); |
6245 | 1478 hb.account = account; |
1479 | |
9285 | 1480 for (node = gaimbuddylist->root; node != NULL; node = node->next) { |
1481 hb.group = node; | |
6245 | 1482 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) != NULL) |
1483 ret = g_slist_append(ret, buddy); | |
1484 } | |
7162 | 1485 g_free(hb.name); |
9285 | 1486 |
6245 | 1487 return ret; |
1488 } | |
1489 | |
6695 | 1490 GaimGroup *gaim_find_group(const char *name) |
5228 | 1491 { |
1492 GaimBlistNode *node; | |
9285 | 1493 |
1494 g_return_val_if_fail(gaimbuddylist != NULL, NULL); | |
1495 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
1496 | |
1497 for (node = gaimbuddylist->root; node != NULL; node = node->next) { | |
6695 | 1498 if (!strcmp(((GaimGroup *)node)->name, name)) |
1499 return (GaimGroup *)node; | |
5228 | 1500 } |
9285 | 1501 |
5228 | 1502 return NULL; |
1503 } | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1504 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1505 GaimChat * |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1506 gaim_blist_find_chat(GaimAccount *account, const char *name) |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1507 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1508 char *chat_name; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1509 GaimChat *chat; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1510 GaimPlugin *prpl; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1511 GaimPluginProtocolInfo *prpl_info = NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1512 struct proto_chat_entry *pce; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1513 GaimBlistNode *node, *group; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1514 GList *parts; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1515 |
9285 | 1516 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
1517 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
1518 | |
1519 if (!gaim_account_is_connected(account)) | |
7970 | 1520 return NULL; |
1521 | |
7999 | 1522 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
1523 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
1524 | |
9285 | 1525 if (prpl_info->find_blist_chat != NULL) |
7999 | 1526 return prpl_info->find_blist_chat(account, name); |
1527 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1528 for (group = gaimbuddylist->root; group != NULL; group = group->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1529 for (node = group->child; node != NULL; node = node->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1530 if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1531 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1532 chat = (GaimChat*)node; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1533 |
9285 | 1534 if (account != chat->account) |
7970 | 1535 continue; |
1536 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1537 parts = prpl_info->chat_info( |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1538 gaim_account_get_connection(chat->account)); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1539 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1540 pce = parts->data; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1541 chat_name = g_hash_table_lookup(chat->components, |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1542 pce->identifier); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1543 |
9153 | 1544 if (chat->account == account && chat_name != NULL && |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1545 name != NULL && !strcmp(chat_name, name)) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1546 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1547 return chat; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1548 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1549 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1550 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1551 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1552 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1553 return NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1554 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1555 |
6695 | 1556 GaimGroup * |
7125 | 1557 gaim_chat_get_group(GaimChat *chat) |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1558 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1559 g_return_val_if_fail(chat != NULL, NULL); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1560 |
6695 | 1561 return (GaimGroup *)(((GaimBlistNode *)chat)->parent); |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1562 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1563 |
9285 | 1564 GaimContact *gaim_buddy_get_contact(GaimBuddy *buddy) |
1565 { | |
1566 g_return_val_if_fail(buddy != NULL, NULL); | |
1567 | |
1568 return (GaimContact*)((GaimBlistNode*)buddy)->parent; | |
1569 } | |
1570 | |
6695 | 1571 GaimGroup *gaim_find_buddys_group(GaimBuddy *buddy) |
5228 | 1572 { |
9285 | 1573 g_return_val_if_fail(buddy != NULL, NULL); |
6706
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1574 |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1575 if (((GaimBlistNode *)buddy)->parent == NULL) |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1576 return NULL; |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1577 |
6695 | 1578 return (GaimGroup *)(((GaimBlistNode*)buddy)->parent->parent); |
5228 | 1579 } |
1580 | |
9285 | 1581 GSList *gaim_group_get_accounts(GaimGroup *group) |
5228 | 1582 { |
1583 GSList *l = NULL; | |
6695 | 1584 GaimBlistNode *gnode, *cnode, *bnode; |
1585 | |
9285 | 1586 gnode = (GaimBlistNode *)group; |
1587 | |
1588 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
6695 | 1589 if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
9285 | 1590 if (!g_slist_find(l, ((GaimChat *)cnode)->account)) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1591 l = g_slist_append(l, ((GaimChat *)cnode)->account); |
9285 | 1592 } else if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { |
1593 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
1594 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
1595 if (!g_slist_find(l, ((GaimBuddy *)bnode)->account)) | |
6695 | 1596 l = g_slist_append(l, ((GaimBuddy *)bnode)->account); |
1597 } | |
1598 } | |
1599 } | |
5228 | 1600 } |
6695 | 1601 |
5228 | 1602 return l; |
1603 } | |
1604 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1605 void gaim_blist_add_account(GaimAccount *account) |
5234 | 1606 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1607 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 1608 GaimBlistNode *gnode, *cnode, *bnode; |
5234 | 1609 |
9285 | 1610 g_return_if_fail(gaimbuddylist != NULL); |
1611 | |
1612 if (!ops || !ops->update) | |
6695 | 1613 return; |
1614 | |
9285 | 1615 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
1616 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 1617 continue; |
9285 | 1618 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
1619 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6956 | 1620 gboolean recompute = FALSE; |
9285 | 1621 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
1622 if (GAIM_BLIST_NODE_IS_BUDDY(bnode) && | |
6695 | 1623 ((GaimBuddy*)bnode)->account == account) { |
6956 | 1624 recompute = TRUE; |
6695 | 1625 ((GaimContact*)cnode)->currentsize++; |
9285 | 1626 if (((GaimContact*)cnode)->currentsize == 1) |
6695 | 1627 ((GaimGroup*)gnode)->currentsize++; |
1628 ops->update(gaimbuddylist, bnode); | |
1629 } | |
1630 } | |
9285 | 1631 if (recompute || |
8960 | 1632 gaim_blist_node_get_bool(cnode, "show_offline")) { |
6956 | 1633 gaim_contact_compute_priority_buddy((GaimContact*)cnode); |
1634 ops->update(gaimbuddylist, cnode); | |
1635 } | |
9285 | 1636 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode) && |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1637 ((GaimChat*)cnode)->account == account) { |
6901 | 1638 ((GaimGroup *)gnode)->online++; |
1639 ((GaimGroup *)gnode)->currentsize++; | |
1640 ops->update(gaimbuddylist, cnode); | |
5234 | 1641 } |
1642 } | |
6695 | 1643 ops->update(gaimbuddylist, gnode); |
5234 | 1644 } |
1645 } | |
1646 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1647 void gaim_blist_remove_account(GaimAccount *account) |
5228 | 1648 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1649 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 1650 GaimBlistNode *gnode, *cnode, *bnode; |
5234 | 1651 |
9285 | 1652 g_return_if_fail(gaimbuddylist != NULL); |
1653 | |
1654 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
1655 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 1656 continue; |
9285 | 1657 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
1658 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6957 | 1659 gboolean recompute = FALSE; |
9285 | 1660 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
1661 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6695 | 1662 continue; |
9285 | 1663 if (account == ((GaimBuddy *)bnode)->account) { |
6957 | 1664 recompute = TRUE; |
9285 | 1665 if (((GaimBuddy*)bnode)->present == GAIM_BUDDY_ONLINE || |
6695 | 1666 ((GaimBuddy*)bnode)->present == GAIM_BUDDY_SIGNING_ON) { |
1667 ((GaimContact*)cnode)->online--; | |
9285 | 1668 if (((GaimContact*)cnode)->online == 0) |
6695 | 1669 ((GaimGroup*)gnode)->online--; |
1670 } | |
1671 ((GaimContact*)cnode)->currentsize--; | |
9285 | 1672 if (((GaimContact*)cnode)->currentsize == 0) |
6695 | 1673 ((GaimGroup*)gnode)->currentsize--; |
1674 | |
1675 ((GaimBuddy*)bnode)->present = GAIM_BUDDY_OFFLINE; | |
1676 | |
6803 | 1677 ((GaimBuddy*)bnode)->uc = 0; |
1678 ((GaimBuddy*)bnode)->idle = 0; | |
1679 ((GaimBuddy*)bnode)->evil = 0; | |
1680 | |
6945 | 1681 |
9285 | 1682 if (ops && ops->remove) |
6695 | 1683 ops->remove(gaimbuddylist, bnode); |
1684 } | |
5234 | 1685 } |
9285 | 1686 if (recompute) { |
6959 | 1687 gaim_contact_compute_priority_buddy((GaimContact*)cnode); |
9285 | 1688 if (ops && ops->update) |
6983 | 1689 ops->update(gaimbuddylist, cnode); |
1690 } | |
9285 | 1691 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode) && |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1692 ((GaimChat*)cnode)->account == account) { |
6695 | 1693 ((GaimGroup*)gnode)->currentsize--; |
1694 ((GaimGroup*)gnode)->online--; | |
9285 | 1695 if (ops && ops->remove) |
6695 | 1696 ops->remove(gaimbuddylist, cnode); |
5228 | 1697 } |
1698 } | |
1699 } | |
1700 } | |
1701 | |
7117
943085b0ff8b
[gaim-migrate @ 7684]
Christian Hammond <chipx86@chipx86.com>
parents:
7115
diff
changeset
|
1702 void gaim_blist_parse_toc_buddy_list(GaimAccount *account, char *config) |
5228 | 1703 { |
1704 char *c; | |
1705 char current[256]; | |
9285 | 1706 GList *buddies = NULL; |
5228 | 1707 |
1708 if (config != NULL) { | |
1709 | |
1710 /* skip "CONFIG:" (if it exists) */ | |
1711 c = strncmp(config + 6 /* sizeof(struct sflap_hdr) */ , "CONFIG:", strlen("CONFIG:")) ? | |
1712 strtok(config, "\n") : | |
1713 strtok(config + 6 /* sizeof(struct sflap_hdr) */ + strlen("CONFIG:"), "\n"); | |
1714 do { | |
1715 if (c == NULL) | |
1716 break; | |
1717 if (*c == 'g') { | |
1718 char *utf8 = NULL; | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1719 utf8 = gaim_utf8_try_convert(c + 2); |
5228 | 1720 if (utf8 == NULL) { |
1721 g_strlcpy(current, _("Invalid Groupname"), sizeof(current)); | |
1722 } else { | |
1723 g_strlcpy(current, utf8, sizeof(current)); | |
1724 g_free(utf8); | |
1725 } | |
1726 if (!gaim_find_group(current)) { | |
6695 | 1727 GaimGroup *g = gaim_group_new(current); |
5634 | 1728 gaim_blist_add_group(g, |
1729 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
5228 | 1730 } |
1731 } else if (*c == 'b') { /*&& !gaim_find_buddy(user, c + 2)) {*/ | |
1732 char nm[80], sw[388], *a, *utf8 = NULL; | |
1733 | |
1734 if ((a = strchr(c + 2, ':')) != NULL) { | |
1735 *a++ = '\0'; /* nul the : */ | |
1736 } | |
1737 | |
1738 g_strlcpy(nm, c + 2, sizeof(nm)); | |
1739 if (a) { | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1740 utf8 = gaim_utf8_try_convert(a); |
5228 | 1741 if (utf8 == NULL) { |
1742 gaim_debug(GAIM_DEBUG_ERROR, "toc blist", | |
1743 "Failed to convert alias for " | |
1744 "'%s' to UTF-8\n", nm); | |
1745 } | |
1746 } | |
1747 if (utf8 == NULL) { | |
1748 sw[0] = '\0'; | |
1749 } else { | |
1750 /* This can leave a partial sequence at the end, | |
1751 * but who cares? */ | |
1752 g_strlcpy(sw, utf8, sizeof(sw)); | |
1753 g_free(utf8); | |
1754 } | |
1755 | |
1756 if (!gaim_find_buddy(account, nm)) { | |
6695 | 1757 GaimBuddy *b = gaim_buddy_new(account, nm, sw); |
1758 GaimGroup *g = gaim_find_group(current); | |
1759 gaim_blist_add_buddy(b, NULL, g, | |
5634 | 1760 gaim_blist_get_last_child((GaimBlistNode*)g)); |
9285 | 1761 buddies = g_list_append(buddies, b); |
5228 | 1762 } |
1763 } else if (*c == 'p') { | |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
1764 gaim_privacy_permit_add(account, c + 2, TRUE); |
5228 | 1765 } else if (*c == 'd') { |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
1766 gaim_privacy_deny_add(account, c + 2, TRUE); |
5228 | 1767 } else if (!strncmp("toc", c, 3)) { |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1768 sscanf(c + strlen(c) - 1, "%d", &account->perm_deny); |
5228 | 1769 gaim_debug(GAIM_DEBUG_MISC, "toc blist", |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1770 "permdeny: %d\n", account->perm_deny); |
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1771 if (account->perm_deny == 0) |
8175 | 1772 account->perm_deny = GAIM_PRIVACY_ALLOW_ALL; |
5228 | 1773 } else if (*c == 'm') { |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1774 sscanf(c + 2, "%d", &account->perm_deny); |
5228 | 1775 gaim_debug(GAIM_DEBUG_MISC, "toc blist", |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1776 "permdeny: %d\n", account->perm_deny); |
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1777 if (account->perm_deny == 0) |
8175 | 1778 account->perm_deny = GAIM_PRIVACY_ALLOW_ALL; |
5228 | 1779 } |
1780 } while ((c = strtok(NULL, "\n"))); | |
1781 | |
9285 | 1782 if (account->gc) { |
1783 if (buddies != NULL) { | |
1784 serv_add_buddies(account->gc, buddies); | |
1785 g_list_free(buddies); | |
5228 | 1786 } |
1787 serv_set_permit_deny(account->gc); | |
1788 } | |
9285 | 1789 g_list_free(buddies); |
5228 | 1790 } |
1791 } | |
1792 | |
1793 static gchar *get_screenname_filename(const char *name) | |
1794 { | |
1795 gchar **split; | |
1796 gchar *good; | |
1797 gchar *ret; | |
1798 | |
1799 split = g_strsplit(name, G_DIR_SEPARATOR_S, -1); | |
1800 good = g_strjoinv(NULL, split); | |
1801 g_strfreev(split); | |
1802 | |
1803 ret = g_utf8_strup(good, -1); | |
1804 | |
1805 g_free(good); | |
1806 | |
1807 return ret; | |
1808 } | |
1809 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1810 static void do_import(GaimAccount *account, const char *filename) |
5228 | 1811 { |
1812 GString *buf = NULL; | |
1813 char first[64]; | |
1814 char path[PATHSIZE]; | |
1815 int len; | |
1816 FILE *f; | |
1817 struct stat st; | |
1818 | |
1819 if (filename) { | |
1820 g_snprintf(path, sizeof(path), "%s", filename); | |
1821 } else { | |
1822 char *g_screenname = get_screenname_filename(account->username); | |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1823 const char *username; |
5228 | 1824 char *file = gaim_user_dir(); |
9460 | 1825 const char *prpl_id; |
1826 int protocol = -1; | |
1827 | |
1828 prpl_id = gaim_account_get_protocol_id(account); | |
1829 | |
1830 /* XXX - Somehow move this checking into the PRPLs | |
1831 * Load old GaimProtocol numbers that have been eliminated */ | |
1832 if (strcmp(prpl_id, "prpl-toc") == 0) { | |
1833 protocol = 0; | |
1834 } else if (strcmp(prpl_id, "prpl-oscar") == 0) { | |
1835 protocol = 1; | |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1836 if ((username = gaim_account_get_username(account)) != NULL) { |
9460 | 1837 /* |
1838 * Old values from when Protocols had to have an assigned ID: | |
1839 * | |
1840 * GAIM_PROTO_TOC = 0 | |
1841 * GAIM_PROTO_ICQ = 3 | |
1842 */ | |
1843 protocol = (isalpha(*username) ? 0 : 3); | |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1844 } |
9460 | 1845 } else if (strcmp(prpl_id, "prpl-yahoo") == 0) { |
1846 protocol = 2; | |
1847 } else if (strcmp(prpl_id, "prpl-icq") == 0) { | |
1848 protocol = 3; | |
1849 } else if (strcmp(prpl_id, "prpl-msn") == 0) { | |
1850 protocol = 4; | |
1851 } else if (strcmp(prpl_id, "prpl-irc") == 0) { | |
1852 protocol = 5; | |
1853 } else if (strcmp(prpl_id, "prpl-jabber") == 0) { | |
1854 protocol = 8; | |
1855 } else if (strcmp(prpl_id, "prpl-napster") == 0) { | |
1856 protocol = 9; | |
1857 } else if (strcmp(prpl_id, "prpl-zephyr") == 0) { | |
1858 protocol = 10; | |
1859 } else if (strcmp(prpl_id, "prpl-gg") == 0) { | |
1860 protocol = 11; | |
1861 } else if (strcmp(prpl_id, "prpl-moo") == 0) { | |
1862 protocol = 16; | |
1863 } else if (strcmp(prpl_id, "prpl-trepia") == 0) { | |
1864 protocol = 18; | |
1865 } else if (strcmp(prpl_id, "prpl-blogger") == 0) { | |
1866 protocol = 21; | |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1867 } |
5228 | 1868 |
1869 if (file != (char *)NULL) { | |
5435 | 1870 snprintf(path, PATHSIZE, "%s" G_DIR_SEPARATOR_S "%s.%d.blist", file, g_screenname, protocol); |
5228 | 1871 g_free(g_screenname); |
1872 } else { | |
1873 g_free(g_screenname); | |
1874 return; | |
1875 } | |
1876 } | |
1877 | |
1878 if (stat(path, &st)) { | |
1879 gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Unable to stat %s.\n", | |
1880 path); | |
1881 return; | |
1882 } | |
1883 | |
1884 if (!(f = fopen(path, "r"))) { | |
1885 gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Unable to open %s.\n", | |
1886 path); | |
1887 return; | |
1888 } | |
1889 | |
1890 fgets(first, 64, f); | |
1891 | |
1892 if ((first[0] == '\n') || (first[0] == '\r' && first[1] == '\n')) | |
1893 fgets(first, 64, f); | |
1894 | |
9285 | 1895 /* We're going to parse an old-style Gaim buddy list */ |
1896 if (first[0] == 'm') { | |
1897 char buf2[BUF_LONG * 2]; | |
1898 buf = g_string_new(""); | |
5228 | 1899 rewind(f); |
9285 | 1900 while (1) { |
1901 len = fread(buf2, 1, BUF_LONG * 2 - 1, f); | |
1902 if (len <= 0) | |
5228 | 1903 break; |
9285 | 1904 buf2[len] = '\0'; |
1905 buf = g_string_append(buf, buf2); | |
1906 if (len != BUF_LONG * 2 - 1) | |
1907 break; | |
5228 | 1908 } |
9285 | 1909 } |
1910 | |
5228 | 1911 fclose(f); |
1912 | |
1913 if (buf) { | |
1914 buf = g_string_prepend(buf, "toc_set_config {"); | |
1915 buf = g_string_append(buf, "}\n"); | |
7117
943085b0ff8b
[gaim-migrate @ 7684]
Christian Hammond <chipx86@chipx86.com>
parents:
7115
diff
changeset
|
1916 gaim_blist_parse_toc_buddy_list(account, buf->str); |
5228 | 1917 g_string_free(buf, TRUE); |
1918 } | |
1919 } | |
1920 | |
9285 | 1921 gboolean gaim_group_on_account(GaimGroup *g, GaimAccount *account) |
1922 { | |
6695 | 1923 GaimBlistNode *cnode, *bnode; |
9285 | 1924 for (cnode = ((GaimBlistNode *)g)->child; cnode; cnode = cnode->next) { |
1925 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
1926 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
1927 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
6695 | 1928 GaimBuddy *buddy = (GaimBuddy *)bnode; |
9285 | 1929 if ((!account && gaim_account_is_connected(buddy->account)) |
6695 | 1930 || buddy->account == account) |
1931 return TRUE; | |
1932 } | |
1933 } | |
9285 | 1934 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1935 GaimChat *chat = (GaimChat *)cnode; |
9285 | 1936 if ((!account && gaim_account_is_connected(chat->account)) |
6695 | 1937 || chat->account == account) |
1938 return TRUE; | |
1939 } | |
5228 | 1940 } |
1941 return FALSE; | |
1942 } | |
1943 | |
1944 static gboolean blist_safe_to_write = FALSE; | |
1945 | |
7132 | 1946 static void parse_setting(GaimBlistNode *node, xmlnode *setting) |
1947 { | |
1948 const char *name = xmlnode_get_attrib(setting, "name"); | |
7693 | 1949 const char *type = xmlnode_get_attrib(setting, "type"); |
7132 | 1950 char *value = xmlnode_get_data(setting); |
1951 | |
9285 | 1952 if (!value) |
7693 | 1953 return; |
1954 | |
9285 | 1955 if (!type || !strcmp(type, "string")) |
7693 | 1956 gaim_blist_node_set_string(node, name, value); |
9285 | 1957 else if (!strcmp(type, "bool")) |
7693 | 1958 gaim_blist_node_set_bool(node, name, atoi(value)); |
9285 | 1959 else if (!strcmp(type, "int")) |
7693 | 1960 gaim_blist_node_set_int(node, name, atoi(value)); |
7132 | 1961 |
1962 g_free(value); | |
1963 } | |
1964 | |
1965 static void parse_buddy(GaimGroup *group, GaimContact *contact, xmlnode *bnode) | |
1966 { | |
1967 GaimAccount *account; | |
1968 GaimBuddy *buddy; | |
7727 | 1969 char *name = NULL, *alias = NULL; |
7153 | 1970 const char *acct_name, *proto, *protocol; |
7132 | 1971 xmlnode *x; |
1972 | |
1973 acct_name = xmlnode_get_attrib(bnode, "account"); | |
7153 | 1974 protocol = xmlnode_get_attrib(bnode, "protocol"); |
1975 proto = xmlnode_get_attrib(bnode, "proto"); | |
1976 | |
9285 | 1977 if (!acct_name || (!proto && !protocol)) |
7132 | 1978 return; |
1979 | |
7153 | 1980 account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
7132 | 1981 |
9285 | 1982 if (!account) |
7132 | 1983 return; |
1984 | |
9285 | 1985 if ((x = xmlnode_get_child(bnode, "name"))) |
7132 | 1986 name = xmlnode_get_data(x); |
1987 | |
9285 | 1988 if (!name) |
7132 | 1989 return; |
1990 | |
9285 | 1991 if ((x = xmlnode_get_child(bnode, "alias"))) |
7132 | 1992 alias = xmlnode_get_data(x); |
1993 | |
1994 buddy = gaim_buddy_new(account, name, alias); | |
1995 gaim_blist_add_buddy(buddy, contact, group, | |
1996 gaim_blist_get_last_child((GaimBlistNode*)contact)); | |
1997 | |
9285 | 1998 for (x = xmlnode_get_child(bnode, "setting"); x; x = xmlnode_get_next_twin(x)) { |
7132 | 1999 parse_setting((GaimBlistNode*)buddy, x); |
2000 } | |
2001 | |
2002 g_free(name); | |
9285 | 2003 if (alias) |
7132 | 2004 g_free(alias); |
2005 } | |
2006 | |
2007 static void parse_contact(GaimGroup *group, xmlnode *cnode) | |
2008 { | |
2009 GaimContact *contact = gaim_contact_new(); | |
2010 xmlnode *x; | |
7245 | 2011 const char *alias; |
7132 | 2012 |
2013 gaim_blist_add_contact(contact, group, | |
2014 gaim_blist_get_last_child((GaimBlistNode*)group)); | |
2015 | |
9285 | 2016 if ((alias = xmlnode_get_attrib(cnode, "alias"))) { |
7132 | 2017 gaim_contact_set_alias(contact, alias); |
2018 } | |
2019 | |
9285 | 2020 for (x = cnode->child; x; x = x->next) { |
2021 if (x->type != XMLNODE_TYPE_TAG) | |
7132 | 2022 continue; |
9285 | 2023 if (!strcmp(x->name, "buddy")) |
7132 | 2024 parse_buddy(group, contact, x); |
9285 | 2025 else if (!strcmp(x->name, "setting")) |
7132 | 2026 parse_setting((GaimBlistNode*)contact, x); |
5228 | 2027 } |
7825 | 2028 |
2029 /* if the contact is empty, don't keep it around. it causes problems */ | |
9285 | 2030 if (!((GaimBlistNode*)contact)->child) |
7825 | 2031 gaim_blist_remove_contact(contact); |
5228 | 2032 } |
2033 | |
7132 | 2034 static void parse_chat(GaimGroup *group, xmlnode *cnode) |
2035 { | |
2036 GaimChat *chat; | |
2037 GaimAccount *account; | |
7153 | 2038 const char *acct_name, *proto, *protocol; |
7132 | 2039 xmlnode *x; |
2040 char *alias = NULL; | |
2041 GHashTable *components; | |
2042 | |
2043 acct_name = xmlnode_get_attrib(cnode, "account"); | |
7153 | 2044 protocol = xmlnode_get_attrib(cnode, "protocol"); |
2045 proto = xmlnode_get_attrib(cnode, "proto"); | |
2046 | |
9285 | 2047 if (!acct_name || (!proto && !protocol)) |
7132 | 2048 return; |
2049 | |
7153 | 2050 account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
7132 | 2051 |
9285 | 2052 if (!account) |
7132 | 2053 return; |
2054 | |
9285 | 2055 if ((x = xmlnode_get_child(cnode, "alias"))) |
7132 | 2056 alias = xmlnode_get_data(x); |
2057 | |
2058 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
2059 | |
9285 | 2060 for (x = xmlnode_get_child(cnode, "component"); x; x = xmlnode_get_next_twin(x)) { |
7132 | 2061 const char *name; |
2062 char *value; | |
2063 | |
2064 name = xmlnode_get_attrib(x, "name"); | |
2065 value = xmlnode_get_data(x); | |
2066 g_hash_table_replace(components, g_strdup(name), value); | |
2067 } | |
2068 | |
2069 chat = gaim_chat_new(account, alias, components); | |
7151 | 2070 gaim_blist_add_chat(chat, group, |
2071 gaim_blist_get_last_child((GaimBlistNode*)group)); | |
7132 | 2072 |
9285 | 2073 for (x = xmlnode_get_child(cnode, "setting"); x; x = xmlnode_get_next_twin(x)) { |
7132 | 2074 parse_setting((GaimBlistNode*)chat, x); |
2075 } | |
2076 | |
9285 | 2077 if (alias) |
7132 | 2078 g_free(alias); |
2079 } | |
2080 | |
2081 | |
2082 static void parse_group(xmlnode *groupnode) | |
2083 { | |
2084 const char *name = xmlnode_get_attrib(groupnode, "name"); | |
2085 GaimGroup *group; | |
2086 xmlnode *cnode; | |
2087 | |
9285 | 2088 if (!name) |
7132 | 2089 name = _("Buddies"); |
2090 | |
2091 group = gaim_group_new(name); | |
2092 gaim_blist_add_group(group, | |
2093 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
2094 | |
9285 | 2095 for (cnode = groupnode->child; cnode; cnode = cnode->next) { |
2096 if (cnode->type != XMLNODE_TYPE_TAG) | |
7132 | 2097 continue; |
9285 | 2098 if (!strcmp(cnode->name, "setting")) |
7132 | 2099 parse_setting((GaimBlistNode*)group, cnode); |
9285 | 2100 else if (!strcmp(cnode->name, "contact") || |
7132 | 2101 !strcmp(cnode->name, "person")) |
2102 parse_contact(group, cnode); | |
9285 | 2103 else if (!strcmp(cnode->name, "chat")) |
7132 | 2104 parse_chat(group, cnode); |
5228 | 2105 } |
2106 } | |
2107 | |
9285 | 2108 static gboolean gaim_blist_read(const char *filename) |
2109 { | |
7132 | 2110 GError *error; |
5228 | 2111 gchar *contents = NULL; |
2112 gsize length; | |
7132 | 2113 xmlnode *gaim, *blist, *privacy; |
5228 | 2114 |
2115 gaim_debug(GAIM_DEBUG_INFO, "blist import", | |
2116 "Reading %s\n", filename); | |
9285 | 2117 if (!g_file_get_contents(filename, &contents, &length, &error)) { |
5228 | 2118 gaim_debug(GAIM_DEBUG_ERROR, "blist import", |
2119 "Error reading blist: %s\n", error->message); | |
2120 g_error_free(error); | |
2121 return FALSE; | |
2122 } | |
2123 | |
7132 | 2124 gaim = xmlnode_from_str(contents, length); |
8826 | 2125 |
9285 | 2126 if (!gaim) { |
8826 | 2127 FILE *backup; |
2128 char *name; | |
7132 | 2129 gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Error parsing %s\n", |
2130 filename); | |
8826 | 2131 name = g_build_filename(gaim_user_dir(), "blist.xml~", NULL); |
2132 | |
9285 | 2133 if ((backup = fopen(name, "w"))) { |
8826 | 2134 fwrite(contents, length, 1, backup); |
2135 fclose(backup); | |
2136 chmod(name, S_IRUSR | S_IWUSR); | |
2137 } else { | |
2138 gaim_debug(GAIM_DEBUG_ERROR, "blist load", "Unable to write backup %s\n", | |
2139 name); | |
2140 } | |
2141 g_free(name); | |
2142 g_free(contents); | |
5228 | 2143 return FALSE; |
2144 } | |
8826 | 2145 |
2146 g_free(contents); | |
2147 | |
7132 | 2148 blist = xmlnode_get_child(gaim, "blist"); |
9285 | 2149 if (blist) { |
7132 | 2150 xmlnode *groupnode; |
9285 | 2151 for (groupnode = xmlnode_get_child(blist, "group"); groupnode; |
8135 | 2152 groupnode = xmlnode_get_next_twin(groupnode)) { |
7132 | 2153 parse_group(groupnode); |
2154 } | |
5228 | 2155 } |
2156 | |
7132 | 2157 privacy = xmlnode_get_child(gaim, "privacy"); |
9285 | 2158 if (privacy) { |
7132 | 2159 xmlnode *anode; |
9285 | 2160 for (anode = privacy->child; anode; anode = anode->next) { |
7132 | 2161 xmlnode *x; |
2162 GaimAccount *account; | |
7153 | 2163 const char *acct_name, *proto, *mode, *protocol; |
7132 | 2164 |
2165 acct_name = xmlnode_get_attrib(anode, "name"); | |
7153 | 2166 protocol = xmlnode_get_attrib(anode, "protocol"); |
2167 proto = xmlnode_get_attrib(anode, "proto"); | |
7132 | 2168 mode = xmlnode_get_attrib(anode, "mode"); |
2169 | |
9285 | 2170 if (!acct_name || (!proto && !protocol) || !mode) |
7132 | 2171 continue; |
2172 | |
7153 | 2173 account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
7132 | 2174 |
9285 | 2175 if (!account) |
7132 | 2176 continue; |
2177 | |
2178 account->perm_deny = atoi(mode); | |
2179 | |
9285 | 2180 for (x = anode->child; x; x = x->next) { |
7132 | 2181 char *name; |
9285 | 2182 if (x->type != XMLNODE_TYPE_TAG) |
7132 | 2183 continue; |
2184 | |
9285 | 2185 if (!strcmp(x->name, "permit")) { |
7132 | 2186 name = xmlnode_get_data(x); |
2187 gaim_privacy_permit_add(account, name, TRUE); | |
2188 g_free(name); | |
9285 | 2189 } else if (!strcmp(x->name, "block")) { |
7132 | 2190 name = xmlnode_get_data(x); |
2191 gaim_privacy_deny_add(account, name, TRUE); | |
2192 g_free(name); | |
2193 } | |
2194 } | |
2195 } | |
2196 } | |
5228 | 2197 |
2198 gaim_debug(GAIM_DEBUG_INFO, "blist import", "Finished reading %s\n", | |
2199 filename); | |
2200 | |
8200 | 2201 xmlnode_free(gaim); |
5228 | 2202 return TRUE; |
2203 } | |
2204 | |
9285 | 2205 void gaim_blist_load() |
2206 { | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2207 GList *accts; |
5228 | 2208 char *user_dir = gaim_user_dir(); |
2209 char *filename; | |
2210 char *msg; | |
2211 | |
2212 blist_safe_to_write = TRUE; | |
2213 | |
9285 | 2214 if (!user_dir) |
5228 | 2215 return; |
2216 | |
2217 filename = g_build_filename(user_dir, "blist.xml", NULL); | |
2218 | |
9285 | 2219 if (g_file_test(filename, G_FILE_TEST_EXISTS)) { |
2220 if (!gaim_blist_read(filename)) { | |
5228 | 2221 msg = g_strdup_printf(_("An error was encountered parsing your " |
8826 | 2222 "buddy list. It has not been loaded, " |
2223 "and the old file has moved to blist.xml~.")); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2224 gaim_notify_error(NULL, NULL, _("Buddy List Error"), msg); |
5228 | 2225 g_free(msg); |
2226 } | |
9285 | 2227 } else if (g_list_length(gaim_accounts_get_all())) { |
5228 | 2228 /* read in the old lists, then save to the new format */ |
9285 | 2229 for (accts = gaim_accounts_get_all(); accts; accts = accts->next) { |
5228 | 2230 do_import(accts->data, NULL); |
2231 } | |
9285 | 2232 schedule_blist_save(); |
5228 | 2233 } |
2234 | |
2235 g_free(filename); | |
2236 } | |
2237 | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2238 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2239 gaim_blist_request_add_buddy(GaimAccount *account, const char *username, |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2240 const char *group, const char *alias) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2241 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2242 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2243 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2244 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2245 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2246 if (ui_ops != NULL && ui_ops->request_add_buddy != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2247 ui_ops->request_add_buddy(account, username, group, alias); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2248 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2249 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2250 void |
7859 | 2251 gaim_blist_request_add_chat(GaimAccount *account, GaimGroup *group, const char *alias) |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2252 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2253 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2254 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2255 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2256 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2257 if (ui_ops != NULL && ui_ops->request_add_chat != NULL) |
7859 | 2258 ui_ops->request_add_chat(account, group, alias); |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2259 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2260 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2261 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2262 gaim_blist_request_add_group(void) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2263 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2264 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2265 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2266 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2267 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2268 if (ui_ops != NULL && ui_ops->request_add_group != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2269 ui_ops->request_add_group(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2270 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2271 |
7693 | 2272 static void blist_print_setting(const char *key, |
2273 struct gaim_blist_node_setting *setting, FILE *file, int indent) | |
2274 { | |
2275 char *key_val, *data_val = NULL; | |
2276 const char *type = NULL; | |
2277 int i; | |
2278 | |
9285 | 2279 if (!key) |
7693 | 2280 return; |
2281 | |
2282 switch(setting->type) { | |
2283 case GAIM_BLIST_NODE_SETTING_BOOL: | |
2284 type = "bool"; | |
2285 data_val = g_strdup_printf("%d", setting->value.boolean); | |
2286 break; | |
2287 case GAIM_BLIST_NODE_SETTING_INT: | |
2288 type = "int"; | |
2289 data_val = g_strdup_printf("%d", setting->value.integer); | |
2290 break; | |
2291 case GAIM_BLIST_NODE_SETTING_STRING: | |
9285 | 2292 if (!setting->value.string) |
7693 | 2293 return; |
2294 | |
2295 type = "string"; | |
2296 data_val = g_markup_escape_text(setting->value.string, -1); | |
2297 break; | |
2298 } | |
2299 | |
2300 /* this can't happen */ | |
9285 | 2301 if (!type || !data_val) |
7693 | 2302 return; |
2303 | |
9285 | 2304 for (i=0; i<indent; i++) fprintf(file, "\t"); |
7693 | 2305 |
2306 key_val = g_markup_escape_text(key, -1); | |
2307 fprintf(file, "<setting name=\"%s\" type=\"%s\">%s</setting>\n", key_val, type, | |
2308 data_val); | |
2309 | |
2310 g_free(key_val); | |
2311 g_free(data_val); | |
2312 } | |
2313 | |
5228 | 2314 static void blist_print_group_settings(gpointer key, gpointer data, |
9285 | 2315 gpointer user_data) |
2316 { | |
7693 | 2317 blist_print_setting(key, data, user_data, 3); |
5228 | 2318 } |
2319 | |
2320 static void blist_print_buddy_settings(gpointer key, gpointer data, | |
9285 | 2321 gpointer user_data) |
2322 { | |
7693 | 2323 blist_print_setting(key, data, user_data, 5); |
5228 | 2324 } |
2325 | |
6695 | 2326 static void blist_print_cnode_settings(gpointer key, gpointer data, |
9285 | 2327 gpointer user_data) |
2328 { | |
7693 | 2329 blist_print_setting(key, data, user_data, 4); |
6695 | 2330 } |
2331 | |
5234 | 2332 static void blist_print_chat_components(gpointer key, gpointer data, |
2333 gpointer user_data) { | |
2334 char *key_val; | |
2335 char *data_val; | |
2336 FILE *file = user_data; | |
2337 | |
9285 | 2338 if (!key || !data) |
5234 | 2339 return; |
2340 | |
2341 key_val = g_markup_escape_text(key, -1); | |
2342 data_val = g_markup_escape_text(data, -1); | |
2343 | |
2344 fprintf(file, "\t\t\t\t<component name=\"%s\">%s</component>\n", key_val, | |
2345 data_val); | |
2346 g_free(key_val); | |
2347 g_free(data_val); | |
2348 } | |
2349 | |
9285 | 2350 static void print_buddy(FILE *file, GaimBuddy *buddy) |
2351 { | |
6695 | 2352 char *bud_name = g_markup_escape_text(buddy->name, -1); |
2353 char *bud_alias = NULL; | |
2354 char *acct_name = g_markup_escape_text(buddy->account->username, -1); | |
9285 | 2355 if (buddy->alias) |
6695 | 2356 bud_alias= g_markup_escape_text(buddy->alias, -1); |
9460 | 2357 fprintf(file, "\t\t\t\t<buddy account=\"%s\" proto=\"%s\">\n", acct_name, |
7153 | 2358 gaim_account_get_protocol_id(buddy->account)); |
2359 | |
6695 | 2360 fprintf(file, "\t\t\t\t\t<name>%s</name>\n", bud_name); |
9285 | 2361 if (bud_alias) { |
6695 | 2362 fprintf(file, "\t\t\t\t\t<alias>%s</alias>\n", bud_alias); |
2363 } | |
7726 | 2364 g_hash_table_foreach(buddy->node.settings, blist_print_buddy_settings, file); |
6695 | 2365 fprintf(file, "\t\t\t\t</buddy>\n"); |
2366 g_free(bud_name); | |
2367 g_free(bud_alias); | |
2368 g_free(acct_name); | |
2369 } | |
2370 | |
9285 | 2371 static void gaim_blist_write(FILE *file, GaimAccount *exp_acct) |
2372 { | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2373 GList *accounts; |
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2374 GSList *buds; |
6695 | 2375 GaimBlistNode *gnode, *cnode, *bnode; |
5228 | 2376 fprintf(file, "<?xml version='1.0' encoding='UTF-8' ?>\n"); |
2377 fprintf(file, "<gaim version=\"1\">\n"); | |
2378 fprintf(file, "\t<blist>\n"); | |
2379 | |
9285 | 2380 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
6695 | 2381 GaimGroup *group; |
2382 | |
9285 | 2383 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
5228 | 2384 continue; |
6695 | 2385 |
2386 group = (GaimGroup *)gnode; | |
9285 | 2387 if (!exp_acct || gaim_group_on_account(group, exp_acct)) { |
5228 | 2388 char *group_name = g_markup_escape_text(group->name, -1); |
2389 fprintf(file, "\t\t<group name=\"%s\">\n", group_name); | |
7693 | 2390 g_hash_table_foreach(group->node.settings, |
2391 blist_print_group_settings, file); | |
9285 | 2392 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
2393 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6755 | 2394 GaimContact *contact = (GaimContact*)cnode; |
2395 fprintf(file, "\t\t\t<contact"); | |
9285 | 2396 if (contact->alias) { |
6755 | 2397 char *alias = g_markup_escape_text(contact->alias, -1); |
2398 fprintf(file, " alias=\"%s\"", alias); | |
2399 g_free(alias); | |
2400 } | |
2401 fprintf(file, ">\n"); | |
6695 | 2402 |
9285 | 2403 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
2404 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
6695 | 2405 GaimBuddy *buddy = (GaimBuddy *)bnode; |
9285 | 2406 if (!exp_acct || buddy->account == exp_acct) { |
6695 | 2407 print_buddy(file, buddy); |
2408 } | |
5234 | 2409 } |
5228 | 2410 } |
6695 | 2411 |
8960 | 2412 g_hash_table_foreach(cnode->settings, |
2413 blist_print_cnode_settings, file); | |
2414 | |
6695 | 2415 fprintf(file, "\t\t\t</contact>\n"); |
9285 | 2416 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2417 GaimChat *chat = (GaimChat *)cnode; |
9285 | 2418 if (!exp_acct || chat->account == exp_acct) { |
5234 | 2419 char *acct_name = g_markup_escape_text(chat->account->username, -1); |
9460 | 2420 fprintf(file, "\t\t\t<chat proto=\"%s\" account=\"%s\">\n", |
7133 | 2421 gaim_account_get_protocol_id(chat->account), |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2422 acct_name); |
7153 | 2423 |
9285 | 2424 if (chat->alias) { |
5237 | 2425 char *chat_alias = g_markup_escape_text(chat->alias, -1); |
2426 fprintf(file, "\t\t\t\t<alias>%s</alias>\n", chat_alias); | |
2427 g_free(chat_alias); | |
2428 } | |
5234 | 2429 g_hash_table_foreach(chat->components, |
2430 blist_print_chat_components, file); | |
7693 | 2431 g_hash_table_foreach(chat->node.settings, |
6695 | 2432 blist_print_cnode_settings, file); |
5234 | 2433 fprintf(file, "\t\t\t</chat>\n"); |
5237 | 2434 g_free(acct_name); |
5234 | 2435 } |
5228 | 2436 } |
2437 } | |
2438 fprintf(file, "\t\t</group>\n"); | |
2439 g_free(group_name); | |
2440 } | |
2441 } | |
2442 | |
2443 fprintf(file, "\t</blist>\n"); | |
2444 fprintf(file, "\t<privacy>\n"); | |
2445 | |
9285 | 2446 for (accounts = gaim_accounts_get_all(); |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2447 accounts != NULL; |
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2448 accounts = accounts->next) { |
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2449 |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2450 GaimAccount *account = accounts->data; |
5228 | 2451 char *acct_name = g_markup_escape_text(account->username, -1); |
9285 | 2452 if (!exp_acct || account == exp_acct) { |
7153 | 2453 fprintf(file, "\t\t<account proto=\"%s\" name=\"%s\" " |
9460 | 2454 "mode=\"%d\">\n", gaim_account_get_protocol_id(account), |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2455 acct_name, account->perm_deny); |
7153 | 2456 |
9285 | 2457 for (buds = account->permit; buds; buds = buds->next) { |
5228 | 2458 char *bud_name = g_markup_escape_text(buds->data, -1); |
2459 fprintf(file, "\t\t\t<permit>%s</permit>\n", bud_name); | |
2460 g_free(bud_name); | |
2461 } | |
9285 | 2462 for (buds = account->deny; buds; buds = buds->next) { |
5228 | 2463 char *bud_name = g_markup_escape_text(buds->data, -1); |
2464 fprintf(file, "\t\t\t<block>%s</block>\n", bud_name); | |
2465 g_free(bud_name); | |
2466 } | |
2467 fprintf(file, "\t\t</account>\n"); | |
2468 } | |
2469 g_free(acct_name); | |
2470 } | |
2471 | |
2472 fprintf(file, "\t</privacy>\n"); | |
2473 fprintf(file, "</gaim>\n"); | |
2474 } | |
2475 | |
9285 | 2476 void gaim_blist_sync() |
2477 { | |
5228 | 2478 FILE *file; |
2479 char *user_dir = gaim_user_dir(); | |
2480 char *filename; | |
2481 char *filename_real; | |
2482 | |
9285 | 2483 if (!user_dir) |
5228 | 2484 return; |
9285 | 2485 |
2486 if (!blist_safe_to_write) { | |
5228 | 2487 gaim_debug(GAIM_DEBUG_WARNING, "blist save", |
2488 "AHH!! Tried to write the blist before we read it!\n"); | |
2489 return; | |
2490 } | |
2491 | |
2492 file = fopen(user_dir, "r"); | |
9285 | 2493 if (!file) |
5228 | 2494 mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); |
2495 else | |
2496 fclose(file); | |
2497 | |
2498 filename = g_build_filename(user_dir, "blist.xml.save", NULL); | |
2499 | |
9285 | 2500 if ((file = fopen(filename, "w"))) { |
5228 | 2501 gaim_blist_write(file, NULL); |
2502 fclose(file); | |
2503 chmod(filename, S_IRUSR | S_IWUSR); | |
2504 } else { | |
2505 gaim_debug(GAIM_DEBUG_ERROR, "blist save", "Unable to write %s\n", | |
2506 filename); | |
8549 | 2507 g_free(filename); |
2508 return; | |
5228 | 2509 } |
2510 | |
2511 filename_real = g_build_filename(user_dir, "blist.xml", NULL); | |
2512 | |
9285 | 2513 if (rename(filename, filename_real) < 0) |
5228 | 2514 gaim_debug(GAIM_DEBUG_ERROR, "blist save", |
2515 "Error renaming %s to %s\n", filename, filename_real); | |
2516 | |
2517 | |
2518 g_free(filename); | |
2519 g_free(filename_real); | |
2520 } | |
2521 | |
7693 | 2522 |
2523 static void gaim_blist_node_setting_free(struct gaim_blist_node_setting *setting) | |
2524 { | |
2525 switch(setting->type) { | |
2526 case GAIM_BLIST_NODE_SETTING_BOOL: | |
2527 case GAIM_BLIST_NODE_SETTING_INT: | |
2528 break; | |
2529 case GAIM_BLIST_NODE_SETTING_STRING: | |
2530 g_free(setting->value.string); | |
2531 break; | |
2532 } | |
8020 | 2533 g_free(setting); |
7693 | 2534 } |
2535 | |
9285 | 2536 static void gaim_blist_node_initialize_settings(GaimBlistNode *node) |
7693 | 2537 { |
9285 | 2538 if (node->settings) |
5228 | 2539 return; |
7693 | 2540 |
2541 node->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
2542 (GDestroyNotify)gaim_blist_node_setting_free); | |
2543 } | |
2544 | |
2545 void gaim_blist_node_remove_setting(GaimBlistNode *node, const char *key) | |
2546 { | |
2547 g_return_if_fail(node != NULL); | |
2548 g_return_if_fail(node->settings != NULL); | |
2549 g_return_if_fail(key != NULL); | |
2550 | |
2551 g_hash_table_remove(node->settings, key); | |
9285 | 2552 |
2553 schedule_blist_save(); | |
5228 | 2554 } |
2555 | |
7693 | 2556 |
2557 void gaim_blist_node_set_bool(GaimBlistNode* node, const char *key, gboolean value) | |
2558 { | |
2559 struct gaim_blist_node_setting *setting; | |
2560 | |
2561 g_return_if_fail(node != NULL); | |
2562 g_return_if_fail(node->settings != NULL); | |
2563 g_return_if_fail(key != NULL); | |
2564 | |
2565 setting = g_new0(struct gaim_blist_node_setting, 1); | |
2566 setting->type = GAIM_BLIST_NODE_SETTING_BOOL; | |
2567 setting->value.boolean = value; | |
2568 | |
2569 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
9285 | 2570 |
2571 schedule_blist_save(); | |
7693 | 2572 } |
2573 | |
2574 gboolean gaim_blist_node_get_bool(GaimBlistNode* node, const char *key) | |
2575 { | |
2576 struct gaim_blist_node_setting *setting; | |
2577 | |
2578 g_return_val_if_fail(node != NULL, FALSE); | |
2579 g_return_val_if_fail(node->settings != NULL, FALSE); | |
2580 g_return_val_if_fail(key != NULL, FALSE); | |
2581 | |
2582 setting = g_hash_table_lookup(node->settings, key); | |
2583 | |
9285 | 2584 if (!setting) |
7849 | 2585 return FALSE; |
2586 | |
7848 | 2587 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_BOOL, FALSE); |
2588 | |
2589 return setting->value.boolean; | |
5228 | 2590 } |
2591 | |
7693 | 2592 void gaim_blist_node_set_int(GaimBlistNode* node, const char *key, int value) |
2593 { | |
2594 struct gaim_blist_node_setting *setting; | |
2595 | |
2596 g_return_if_fail(node != NULL); | |
2597 g_return_if_fail(node->settings != NULL); | |
2598 g_return_if_fail(key != NULL); | |
2599 | |
2600 setting = g_new0(struct gaim_blist_node_setting, 1); | |
8071 | 2601 setting->type = GAIM_BLIST_NODE_SETTING_INT; |
7693 | 2602 setting->value.integer = value; |
2603 | |
2604 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
9285 | 2605 |
2606 schedule_blist_save(); | |
7693 | 2607 } |
2608 | |
2609 int gaim_blist_node_get_int(GaimBlistNode* node, const char *key) | |
2610 { | |
2611 struct gaim_blist_node_setting *setting; | |
2612 | |
2613 g_return_val_if_fail(node != NULL, 0); | |
2614 g_return_val_if_fail(node->settings != NULL, 0); | |
2615 g_return_val_if_fail(key != NULL, 0); | |
2616 | |
2617 setting = g_hash_table_lookup(node->settings, key); | |
2618 | |
9285 | 2619 if (!setting) |
7849 | 2620 return 0; |
2621 | |
7848 | 2622 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_INT, 0); |
2623 | |
2624 return setting->value.integer; | |
7693 | 2625 } |
2626 | |
2627 void gaim_blist_node_set_string(GaimBlistNode* node, const char *key, | |
5906 | 2628 const char *value) |
2629 { | |
7693 | 2630 struct gaim_blist_node_setting *setting; |
2631 | |
2632 g_return_if_fail(node != NULL); | |
2633 g_return_if_fail(node->settings != NULL); | |
2634 g_return_if_fail(key != NULL); | |
2635 | |
2636 setting = g_new0(struct gaim_blist_node_setting, 1); | |
2637 setting->type = GAIM_BLIST_NODE_SETTING_STRING; | |
2638 setting->value.string = g_strdup(value); | |
2639 | |
2640 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
9285 | 2641 |
2642 schedule_blist_save(); | |
7693 | 2643 } |
2644 | |
2645 const char *gaim_blist_node_get_string(GaimBlistNode* node, const char *key) | |
2646 { | |
2647 struct gaim_blist_node_setting *setting; | |
2648 | |
2649 g_return_val_if_fail(node != NULL, NULL); | |
2650 g_return_val_if_fail(node->settings != NULL, NULL); | |
2651 g_return_val_if_fail(key != NULL, NULL); | |
2652 | |
2653 setting = g_hash_table_lookup(node->settings, key); | |
2654 | |
9285 | 2655 if (!setting) |
7849 | 2656 return NULL; |
2657 | |
7848 | 2658 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_STRING, NULL); |
2659 | |
2660 return setting->value.string; | |
7693 | 2661 } |
2662 | |
9285 | 2663 GList *gaim_blist_node_get_extended_menu(GaimBlistNode *n) |
7693 | 2664 { |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2665 GList *menu = NULL; |
9030 | 2666 |
2667 g_return_val_if_fail(n, NULL); | |
2668 | |
2669 gaim_signal_emit(gaim_blist_get_handle(), | |
2670 "blist-node-extended-menu", | |
2671 n, &menu); | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2672 return menu; |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2673 } |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2674 |
9030 | 2675 |
2676 GaimBlistNodeAction * | |
2677 gaim_blist_node_action_new(char *label, | |
2678 void (*callback)(GaimBlistNode *, gpointer), | |
2679 gpointer data) | |
2680 { | |
2681 GaimBlistNodeAction *act = g_new0(GaimBlistNodeAction, 1); | |
2682 act->label = label; | |
2683 act->callback = callback; | |
2684 act->data = data; | |
2685 return act; | |
8952 | 2686 } |
2687 | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2688 |
9285 | 2689 int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) |
2690 { | |
2691 if (!group) | |
5228 | 2692 return 0; |
2693 | |
5277 | 2694 return offline ? group->totalsize : group->currentsize; |
5228 | 2695 } |
2696 | |
9285 | 2697 int gaim_blist_get_group_online_count(GaimGroup *group) |
2698 { | |
2699 if (!group) | |
5228 | 2700 return 0; |
2701 | |
5277 | 2702 return group->online; |
5228 | 2703 } |
2704 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2705 void |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2706 gaim_blist_set_ui_ops(GaimBlistUiOps *ops) |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2707 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2708 blist_ui_ops = ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2709 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2710 |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2711 GaimBlistUiOps * |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2712 gaim_blist_get_ui_ops(void) |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2713 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2714 return blist_ui_ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2715 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2716 |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2717 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2718 void * |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2719 gaim_blist_get_handle(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2720 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2721 static int handle; |
5228 | 2722 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2723 return &handle; |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2724 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2725 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2726 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2727 gaim_blist_init(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2728 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2729 void *handle = gaim_blist_get_handle(); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2730 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2731 gaim_signal_register(handle, "buddy-away", |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2732 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2733 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2734 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2735 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2736 gaim_signal_register(handle, "buddy-back", |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2737 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2738 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2739 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2740 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2741 gaim_signal_register(handle, "buddy-idle", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2742 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2743 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2744 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2745 gaim_signal_register(handle, "buddy-unidle", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2746 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2747 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2748 GAIM_SUBTYPE_BLIST_BUDDY)); |
9109
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2749 gaim_signal_register(handle, "buddy-idle-updated", |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2750 gaim_marshal_VOID__POINTER, NULL, 1, |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2751 gaim_value_new(GAIM_TYPE_SUBTYPE, |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2752 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2753 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2754 gaim_signal_register(handle, "buddy-signed-on", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2755 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2756 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2757 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2758 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2759 gaim_signal_register(handle, "buddy-signed-off", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2760 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2761 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2762 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2763 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2764 gaim_signal_register(handle, "update-idle", gaim_marshal_VOID, NULL, 0); |
9030 | 2765 |
2766 gaim_signal_register(handle, "blist-node-extended-menu", | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2767 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2768 gaim_value_new(GAIM_TYPE_SUBTYPE, |
9030 | 2769 GAIM_SUBTYPE_BLIST_NODE), |
8952 | 2770 gaim_value_new(GAIM_TYPE_BOXED, "GList **")); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2771 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2772 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2773 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2774 gaim_blist_uninit(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2775 { |
9285 | 2776 if (blist_save_timer != 0) { |
2777 gaim_timeout_remove(blist_save_timer); | |
2778 blist_save_timer = 0; | |
2779 gaim_blist_sync(); | |
2780 } | |
2781 | |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2782 gaim_signals_unregister_by_instance(gaim_blist_get_handle()); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2783 } |