Mercurial > pidgin.yaz
annotate src/blist.c @ 12233:02833a0ae716
[gaim-migrate @ 14535]
SF Patch #1367116 from Michael Carlson
"In profiling gaim, I noticed that on simply starting
CVS gaim, xmlnode_insert_child is using up by far the
most CPU time. After some testing, I realized the
reason why: xmlnode_insert_child is called some 18,000
times on startup, and it is inserting the child at the
end of the list each time, simply by traversing through
the entire linked list. Sometimes this list can have as
many as 800 elements.
This patch adds a variable to the _xmlnode struct,
lastchild, which simply keeps track of the last node in
the list of children. This is then used by
xmlnode_insert_child to insert at the end of the list,
instead of traversing through the whole list each time.
The two relevant functions in xmlnode.c that need to be
updated to keep track of this function appropriately
have been updated.
Running 3 times with and without the change, the
results from oprofile say it all. Here are the measured
number of clock cycles / % of total clock cycles /
function used to simply start and close gaim before the
change:
204 60.7143 xmlnode_insert_child
210 61.4035 xmlnode_insert_child
230 61.8280 xmlnode_insert_child
And after (note that one time no clock cycles were
caught at all)
3 2.5862 xmlnode_insert_child
3 2.5641 xmlnode_insert_child
This affects other areas of the program than just
starting up, but this seems to be the most noticeable
place."
Speed is good. As I was verifying this patch, I added some g_return_val_if_fail() checks.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Sun, 27 Nov 2005 03:42:39 +0000 |
parents | 875f59f9c0bb |
children | 1504d878be54 |
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" |
11067 | 26 #include "dbus-maybe.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
27 #include "debug.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" |
10431 | 35 #include "value.h" |
7132 | 36 #include "xmlnode.h" |
5228 | 37 |
38 #define PATHSIZE 1024 | |
39 | |
10426 | 40 static GaimBlistUiOps *blist_ui_ops = NULL; |
41 | |
42 static GaimBuddyList *gaimbuddylist = NULL; | |
10428 | 43 static guint save_timer = 0; |
10426 | 44 static gboolean blist_loaded = FALSE; |
7693 | 45 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
46 |
10428 | 47 /********************************************************************* |
48 * Private utility functions * | |
49 *********************************************************************/ | |
50 | |
5228 | 51 static GaimBlistNode *gaim_blist_get_last_sibling(GaimBlistNode *node) |
52 { | |
53 GaimBlistNode *n = node; | |
54 if (!n) | |
55 return NULL; | |
56 while (n->next) | |
57 n = n->next; | |
58 return n; | |
59 } | |
6695 | 60 |
5228 | 61 static GaimBlistNode *gaim_blist_get_last_child(GaimBlistNode *node) |
62 { | |
63 if (!node) | |
64 return NULL; | |
65 return gaim_blist_get_last_sibling(node->child); | |
66 } | |
67 | |
5247 | 68 struct _gaim_hbuddy { |
69 char *name; | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
70 GaimAccount *account; |
5758 | 71 GaimBlistNode *group; |
5247 | 72 }; |
73 | |
9285 | 74 static guint _gaim_blist_hbuddy_hash(struct _gaim_hbuddy *hb) |
5247 | 75 { |
76 return g_str_hash(hb->name); | |
77 } | |
78 | |
9285 | 79 static guint _gaim_blist_hbuddy_equal(struct _gaim_hbuddy *hb1, struct _gaim_hbuddy *hb2) |
5247 | 80 { |
5758 | 81 return ((!strcmp(hb1->name, hb2->name)) && hb1->account == hb2->account && hb1->group == hb2->group); |
5247 | 82 } |
83 | |
6742 | 84 static void _gaim_blist_hbuddy_free_key(struct _gaim_hbuddy *hb) |
85 { | |
86 g_free(hb->name); | |
87 g_free(hb); | |
88 } | |
89 | |
10428 | 90 |
91 /********************************************************************* | |
10429 | 92 * Writing to disk * |
10428 | 93 *********************************************************************/ |
94 | |
95 static void | |
10430 | 96 value_to_xmlnode(gpointer key, gpointer hvalue, gpointer user_data) |
10428 | 97 { |
10429 | 98 const char *name; |
10430 | 99 GaimValue *value; |
10429 | 100 xmlnode *node, *child; |
101 char buf[20]; | |
102 | |
103 name = (const char *)key; | |
10430 | 104 value = (GaimValue *)hvalue; |
10429 | 105 node = (xmlnode *)user_data; |
106 | |
10475 | 107 g_return_if_fail(value != NULL); |
108 | |
10429 | 109 child = xmlnode_new_child(node, "setting"); |
110 xmlnode_set_attrib(child, "name", name); | |
111 | |
10430 | 112 if (gaim_value_get_type(value) == GAIM_TYPE_INT) { |
10429 | 113 xmlnode_set_attrib(child, "type", "int"); |
10430 | 114 snprintf(buf, sizeof(buf), "%d", gaim_value_get_int(value)); |
10429 | 115 xmlnode_insert_data(child, buf, -1); |
10428 | 116 } |
10430 | 117 else if (gaim_value_get_type(value) == GAIM_TYPE_STRING) { |
10429 | 118 xmlnode_set_attrib(child, "type", "string"); |
10430 | 119 xmlnode_insert_data(child, gaim_value_get_string(value), -1); |
10429 | 120 } |
10430 | 121 else if (gaim_value_get_type(value) == GAIM_TYPE_BOOLEAN) { |
10429 | 122 xmlnode_set_attrib(child, "type", "bool"); |
10430 | 123 snprintf(buf, sizeof(buf), "%d", gaim_value_get_boolean(value)); |
10429 | 124 xmlnode_insert_data(child, buf, -1); |
125 } | |
10428 | 126 } |
127 | |
128 static void | |
10429 | 129 chat_component_to_xmlnode(gpointer key, gpointer value, gpointer user_data) |
10428 | 130 { |
10429 | 131 const char *name; |
132 const char *data; | |
133 xmlnode *node, *child; | |
134 | |
135 name = (const char *)key; | |
136 data = (const char *)value; | |
137 node = (xmlnode *)user_data; | |
138 | |
10431 | 139 g_return_if_fail(data != NULL); |
140 | |
10429 | 141 child = xmlnode_new_child(node, "component"); |
142 xmlnode_set_attrib(child, "name", name); | |
143 xmlnode_insert_data(child, data, -1); | |
144 } | |
145 | |
10850 | 146 static xmlnode * |
10429 | 147 buddy_to_xmlnode(GaimBlistNode *bnode) |
148 { | |
149 xmlnode *node, *child; | |
150 GaimBuddy *buddy; | |
151 | |
152 buddy = (GaimBuddy *)bnode; | |
153 | |
154 node = xmlnode_new("buddy"); | |
155 xmlnode_set_attrib(node, "account", gaim_account_get_username(buddy->account)); | |
156 xmlnode_set_attrib(node, "proto", gaim_account_get_protocol_id(buddy->account)); | |
157 | |
158 child = xmlnode_new_child(node, "name"); | |
159 xmlnode_insert_data(child, buddy->name, -1); | |
160 | |
161 if (buddy->alias != NULL) | |
162 { | |
163 child = xmlnode_new_child(node, "alias"); | |
164 xmlnode_insert_data(child, buddy->alias, -1); | |
10428 | 165 } |
166 | |
10429 | 167 /* Write buddy settings */ |
10430 | 168 g_hash_table_foreach(buddy->node.settings, value_to_xmlnode, node); |
10429 | 169 |
170 return node; | |
10428 | 171 } |
172 | |
10850 | 173 static xmlnode * |
10429 | 174 contact_to_xmlnode(GaimBlistNode *cnode) |
10428 | 175 { |
10429 | 176 xmlnode *node, *child; |
177 GaimContact *contact; | |
178 GaimBlistNode *bnode; | |
179 | |
180 contact = (GaimContact *)cnode; | |
181 | |
182 node = xmlnode_new("contact"); | |
183 | |
184 if (contact->alias != NULL) | |
185 { | |
186 xmlnode_set_attrib(node, "alias", contact->alias); | |
10428 | 187 } |
10429 | 188 |
189 /* Write buddies */ | |
190 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) | |
191 { | |
192 if (!GAIM_BLIST_NODE_SHOULD_SAVE(bnode)) | |
193 continue; | |
194 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
195 { | |
196 child = buddy_to_xmlnode(bnode); | |
197 xmlnode_insert_child(node, child); | |
10428 | 198 } |
199 } | |
200 | |
10429 | 201 /* Write contact settings */ |
10430 | 202 g_hash_table_foreach(cnode->settings, value_to_xmlnode, node); |
10429 | 203 |
204 return node; | |
10428 | 205 } |
206 | |
10850 | 207 static xmlnode * |
10429 | 208 chat_to_xmlnode(GaimBlistNode *cnode) |
10428 | 209 { |
10429 | 210 xmlnode *node, *child; |
211 GaimChat *chat; | |
212 | |
213 chat = (GaimChat *)cnode; | |
214 | |
215 node = xmlnode_new("chat"); | |
216 xmlnode_set_attrib(node, "proto", gaim_account_get_protocol_id(chat->account)); | |
217 xmlnode_set_attrib(node, "account", gaim_account_get_username(chat->account)); | |
218 | |
219 if (chat->alias != NULL) | |
220 { | |
221 child = xmlnode_new_child(node, "alias"); | |
222 xmlnode_insert_data(child, chat->alias, -1); | |
10428 | 223 } |
224 | |
10429 | 225 /* Write chat components */ |
226 g_hash_table_foreach(chat->components, chat_component_to_xmlnode, node); | |
227 | |
228 /* Write chat settings */ | |
10430 | 229 g_hash_table_foreach(chat->node.settings, value_to_xmlnode, node); |
10429 | 230 |
231 return node; | |
10428 | 232 } |
233 | |
10850 | 234 static xmlnode * |
10429 | 235 group_to_xmlnode(GaimBlistNode *gnode) |
10428 | 236 { |
10429 | 237 xmlnode *node, *child; |
238 GaimGroup *group; | |
239 GaimBlistNode *cnode; | |
240 | |
241 group = (GaimGroup *)gnode; | |
242 | |
243 node = xmlnode_new("group"); | |
244 xmlnode_set_attrib(node, "name", group->name); | |
245 | |
246 /* Write settings */ | |
10430 | 247 g_hash_table_foreach(group->node.settings, value_to_xmlnode, node); |
10429 | 248 |
249 /* Write contacts and chats */ | |
250 for (cnode = gnode->child; cnode != NULL; cnode = cnode->next) | |
251 { | |
252 if (!GAIM_BLIST_NODE_SHOULD_SAVE(cnode)) | |
253 continue; | |
254 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
255 { | |
256 child = contact_to_xmlnode(cnode); | |
257 xmlnode_insert_child(node, child); | |
258 } | |
259 else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) | |
260 { | |
261 child = chat_to_xmlnode(cnode); | |
262 xmlnode_insert_child(node, child); | |
10428 | 263 } |
264 } | |
265 | |
10429 | 266 return node; |
10428 | 267 } |
268 | |
10850 | 269 static xmlnode * |
10429 | 270 accountprivacy_to_xmlnode(GaimAccount *account) |
10428 | 271 { |
10429 | 272 xmlnode *node, *child; |
273 GSList *cur; | |
274 char buf[10]; | |
275 | |
276 node = xmlnode_new("account"); | |
277 xmlnode_set_attrib(node, "proto", gaim_account_get_protocol_id(account)); | |
278 xmlnode_set_attrib(node, "name", gaim_account_get_username(account)); | |
279 snprintf(buf, sizeof(buf), "%d", account->perm_deny); | |
280 xmlnode_set_attrib(node, "mode", buf); | |
281 | |
282 for (cur = account->permit; cur; cur = cur->next) | |
283 { | |
284 child = xmlnode_new_child(node, "permit"); | |
285 xmlnode_insert_data(child, cur->data, -1); | |
10428 | 286 } |
287 | |
10429 | 288 for (cur = account->deny; cur; cur = cur->next) |
289 { | |
290 child = xmlnode_new_child(node, "block"); | |
291 xmlnode_insert_data(child, cur->data, -1); | |
10428 | 292 } |
293 | |
10429 | 294 return node; |
10428 | 295 } |
296 | |
10850 | 297 static xmlnode * |
10429 | 298 blist_to_xmlnode() |
10428 | 299 { |
10429 | 300 xmlnode *node, *child, *grandchild; |
10428 | 301 GaimBlistNode *gnode; |
10429 | 302 GList *cur; |
303 | |
304 node = xmlnode_new("gaim"); | |
305 xmlnode_set_attrib(node, "version", "1.0"); | |
306 | |
307 /* Write groups */ | |
308 child = xmlnode_new_child(node, "blist"); | |
309 for (gnode = gaimbuddylist->root; gnode != NULL; gnode = gnode->next) | |
310 { | |
311 if (!GAIM_BLIST_NODE_SHOULD_SAVE(gnode)) | |
312 continue; | |
10428 | 313 if (GAIM_BLIST_NODE_IS_GROUP(gnode)) |
10429 | 314 { |
315 grandchild = group_to_xmlnode(gnode); | |
316 xmlnode_insert_child(child, grandchild); | |
317 } | |
10428 | 318 } |
319 | |
10429 | 320 /* Write privacy settings */ |
321 child = xmlnode_new_child(node, "privacy"); | |
322 for (cur = gaim_accounts_get_all(); cur != NULL; cur = cur->next) | |
323 { | |
324 grandchild = accountprivacy_to_xmlnode(cur->data); | |
325 xmlnode_insert_child(child, grandchild); | |
10428 | 326 } |
327 | |
10429 | 328 return node; |
10428 | 329 } |
330 | |
331 void | |
332 gaim_blist_sync() | |
10378 | 333 { |
10429 | 334 xmlnode *node; |
335 char *data; | |
336 | |
337 if (!blist_loaded) | |
338 { | |
339 gaim_debug_error("blist", "Attempted to save buddy list before it " | |
340 "was read!\n"); | |
10428 | 341 return; |
342 } | |
343 | |
10429 | 344 node = blist_to_xmlnode(); |
345 data = xmlnode_to_formatted_str(node, NULL); | |
346 gaim_util_write_data_to_file("blist.xml", data, -1); | |
347 g_free(data); | |
348 xmlnode_free(node); | |
10428 | 349 } |
350 | |
351 static gboolean | |
352 save_cb(gpointer data) | |
353 { | |
354 gaim_blist_sync(); | |
355 save_timer = 0; | |
356 return FALSE; | |
357 } | |
358 | |
10704 | 359 void |
360 gaim_blist_schedule_save() | |
10428 | 361 { |
362 if (save_timer == 0) | |
363 save_timer = gaim_timeout_add(5000, save_cb, NULL); | |
364 } | |
365 | |
366 | |
367 /********************************************************************* | |
368 * Reading from disk * | |
369 *********************************************************************/ | |
370 | |
371 static void | |
372 parse_setting(GaimBlistNode *node, xmlnode *setting) | |
373 { | |
374 const char *name = xmlnode_get_attrib(setting, "name"); | |
375 const char *type = xmlnode_get_attrib(setting, "type"); | |
376 char *value = xmlnode_get_data(setting); | |
377 | |
378 if (!value) | |
379 return; | |
380 | |
381 if (!type || !strcmp(type, "string")) | |
382 gaim_blist_node_set_string(node, name, value); | |
383 else if (!strcmp(type, "bool")) | |
384 gaim_blist_node_set_bool(node, name, atoi(value)); | |
385 else if (!strcmp(type, "int")) | |
386 gaim_blist_node_set_int(node, name, atoi(value)); | |
387 | |
388 g_free(value); | |
389 } | |
390 | |
391 static void | |
392 parse_buddy(GaimGroup *group, GaimContact *contact, xmlnode *bnode) | |
393 { | |
394 GaimAccount *account; | |
395 GaimBuddy *buddy; | |
396 char *name = NULL, *alias = NULL; | |
397 const char *acct_name, *proto, *protocol; | |
398 xmlnode *x; | |
399 | |
400 acct_name = xmlnode_get_attrib(bnode, "account"); | |
401 protocol = xmlnode_get_attrib(bnode, "protocol"); | |
402 proto = xmlnode_get_attrib(bnode, "proto"); | |
403 | |
404 if (!acct_name || (!proto && !protocol)) | |
405 return; | |
406 | |
407 account = gaim_accounts_find(acct_name, proto ? proto : protocol); | |
408 | |
409 if (!account) | |
410 return; | |
411 | |
412 if ((x = xmlnode_get_child(bnode, "name"))) | |
413 name = xmlnode_get_data(x); | |
414 | |
415 if (!name) | |
416 return; | |
417 | |
418 if ((x = xmlnode_get_child(bnode, "alias"))) | |
419 alias = xmlnode_get_data(x); | |
420 | |
421 buddy = gaim_buddy_new(account, name, alias); | |
422 gaim_blist_add_buddy(buddy, contact, group, | |
423 gaim_blist_get_last_child((GaimBlistNode*)contact)); | |
424 | |
425 for (x = xmlnode_get_child(bnode, "setting"); x; x = xmlnode_get_next_twin(x)) { | |
426 parse_setting((GaimBlistNode*)buddy, x); | |
427 } | |
428 | |
429 g_free(name); | |
430 if (alias) | |
431 g_free(alias); | |
10378 | 432 } |
433 | |
10428 | 434 static void |
435 parse_contact(GaimGroup *group, xmlnode *cnode) | |
436 { | |
437 GaimContact *contact = gaim_contact_new(); | |
438 xmlnode *x; | |
439 const char *alias; | |
440 | |
441 gaim_blist_add_contact(contact, group, | |
442 gaim_blist_get_last_child((GaimBlistNode*)group)); | |
443 | |
444 if ((alias = xmlnode_get_attrib(cnode, "alias"))) { | |
445 gaim_contact_set_alias(contact, alias); | |
446 } | |
447 | |
448 for (x = cnode->child; x; x = x->next) { | |
449 if (x->type != XMLNODE_TYPE_TAG) | |
450 continue; | |
451 if (!strcmp(x->name, "buddy")) | |
452 parse_buddy(group, contact, x); | |
453 else if (!strcmp(x->name, "setting")) | |
454 parse_setting((GaimBlistNode*)contact, x); | |
455 } | |
456 | |
457 /* if the contact is empty, don't keep it around. it causes problems */ | |
458 if (!((GaimBlistNode*)contact)->child) | |
459 gaim_blist_remove_contact(contact); | |
460 } | |
461 | |
462 static void | |
463 parse_chat(GaimGroup *group, xmlnode *cnode) | |
464 { | |
465 GaimChat *chat; | |
466 GaimAccount *account; | |
467 const char *acct_name, *proto, *protocol; | |
468 xmlnode *x; | |
469 char *alias = NULL; | |
470 GHashTable *components; | |
471 | |
472 acct_name = xmlnode_get_attrib(cnode, "account"); | |
473 protocol = xmlnode_get_attrib(cnode, "protocol"); | |
474 proto = xmlnode_get_attrib(cnode, "proto"); | |
475 | |
476 if (!acct_name || (!proto && !protocol)) | |
477 return; | |
478 | |
479 account = gaim_accounts_find(acct_name, proto ? proto : protocol); | |
480 | |
481 if (!account) | |
482 return; | |
483 | |
484 if ((x = xmlnode_get_child(cnode, "alias"))) | |
485 alias = xmlnode_get_data(x); | |
486 | |
487 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
488 | |
489 for (x = xmlnode_get_child(cnode, "component"); x; x = xmlnode_get_next_twin(x)) { | |
490 const char *name; | |
491 char *value; | |
492 | |
493 name = xmlnode_get_attrib(x, "name"); | |
494 value = xmlnode_get_data(x); | |
495 g_hash_table_replace(components, g_strdup(name), value); | |
496 } | |
497 | |
498 chat = gaim_chat_new(account, alias, components); | |
499 gaim_blist_add_chat(chat, group, | |
500 gaim_blist_get_last_child((GaimBlistNode*)group)); | |
501 | |
502 for (x = xmlnode_get_child(cnode, "setting"); x; x = xmlnode_get_next_twin(x)) { | |
503 parse_setting((GaimBlistNode*)chat, x); | |
504 } | |
505 | |
506 if (alias) | |
507 g_free(alias); | |
508 } | |
509 | |
510 static void | |
511 parse_group(xmlnode *groupnode) | |
512 { | |
513 const char *name = xmlnode_get_attrib(groupnode, "name"); | |
514 GaimGroup *group; | |
515 xmlnode *cnode; | |
516 | |
517 if (!name) | |
518 name = _("Buddies"); | |
519 | |
520 group = gaim_group_new(name); | |
521 gaim_blist_add_group(group, | |
522 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
523 | |
524 for (cnode = groupnode->child; cnode; cnode = cnode->next) { | |
525 if (cnode->type != XMLNODE_TYPE_TAG) | |
526 continue; | |
527 if (!strcmp(cnode->name, "setting")) | |
528 parse_setting((GaimBlistNode*)group, cnode); | |
529 else if (!strcmp(cnode->name, "contact") || | |
530 !strcmp(cnode->name, "person")) | |
531 parse_contact(group, cnode); | |
532 else if (!strcmp(cnode->name, "chat")) | |
533 parse_chat(group, cnode); | |
534 } | |
535 } | |
536 | |
537 /* TODO: Make static and rename to load_blist */ | |
538 void | |
539 gaim_blist_load() | |
540 { | |
541 xmlnode *gaim, *blist, *privacy; | |
542 | |
543 blist_loaded = TRUE; | |
544 | |
545 gaim = gaim_util_read_xml_from_file("blist.xml", _("buddy list")); | |
546 | |
547 if (gaim == NULL) | |
548 return; | |
549 | |
550 blist = xmlnode_get_child(gaim, "blist"); | |
551 if (blist) { | |
552 xmlnode *groupnode; | |
553 for (groupnode = xmlnode_get_child(blist, "group"); groupnode != NULL; | |
554 groupnode = xmlnode_get_next_twin(groupnode)) { | |
555 parse_group(groupnode); | |
556 } | |
557 } | |
558 | |
559 privacy = xmlnode_get_child(gaim, "privacy"); | |
560 if (privacy) { | |
561 xmlnode *anode; | |
562 for (anode = privacy->child; anode; anode = anode->next) { | |
563 xmlnode *x; | |
564 GaimAccount *account; | |
10944 | 565 int imode; |
10428 | 566 const char *acct_name, *proto, *mode, *protocol; |
567 | |
568 acct_name = xmlnode_get_attrib(anode, "name"); | |
569 protocol = xmlnode_get_attrib(anode, "protocol"); | |
570 proto = xmlnode_get_attrib(anode, "proto"); | |
571 mode = xmlnode_get_attrib(anode, "mode"); | |
572 | |
573 if (!acct_name || (!proto && !protocol) || !mode) | |
574 continue; | |
575 | |
576 account = gaim_accounts_find(acct_name, proto ? proto : protocol); | |
577 | |
578 if (!account) | |
579 continue; | |
580 | |
10944 | 581 imode = atoi(mode); |
10945 | 582 account->perm_deny = (imode != 0 ? imode : GAIM_PRIVACY_ALLOW_ALL); |
10428 | 583 |
584 for (x = anode->child; x; x = x->next) { | |
585 char *name; | |
586 if (x->type != XMLNODE_TYPE_TAG) | |
587 continue; | |
588 | |
589 if (!strcmp(x->name, "permit")) { | |
590 name = xmlnode_get_data(x); | |
591 gaim_privacy_permit_add(account, name, TRUE); | |
592 g_free(name); | |
593 } else if (!strcmp(x->name, "block")) { | |
594 name = xmlnode_get_data(x); | |
595 gaim_privacy_deny_add(account, name, TRUE); | |
596 g_free(name); | |
597 } | |
598 } | |
599 } | |
600 } | |
601 | |
602 xmlnode_free(gaim); | |
603 } | |
604 | |
605 | |
606 /********************************************************************* | |
607 * Stuff * | |
608 *********************************************************************/ | |
609 | |
610 static void | |
611 gaim_contact_compute_priority_buddy(GaimContact *contact) | |
6843 | 612 { |
613 GaimBlistNode *bnode; | |
9949 | 614 GaimBuddy *new_priority = NULL; |
9285 | 615 |
616 g_return_if_fail(contact != NULL); | |
617 | |
6870 | 618 contact->priority = NULL; |
9949 | 619 for (bnode = ((GaimBlistNode*)contact)->child; |
620 bnode != NULL; | |
621 bnode = bnode->next) | |
622 { | |
6843 | 623 GaimBuddy *buddy; |
7420 | 624 |
9285 | 625 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) |
6843 | 626 continue; |
9949 | 627 |
6843 | 628 buddy = (GaimBuddy*)bnode; |
9949 | 629 |
9285 | 630 if (!gaim_account_is_connected(buddy->account)) |
6843 | 631 continue; |
9949 | 632 if (new_priority == NULL) |
633 new_priority = buddy; | |
634 else | |
635 { | |
636 int cmp; | |
10427 | 637 |
10368 | 638 cmp = gaim_presence_compare(gaim_buddy_get_presence(new_priority), |
639 gaim_buddy_get_presence(buddy)); | |
9949 | 640 |
641 if (cmp > 0 || (cmp == 0 && | |
10368 | 642 gaim_prefs_get_bool("/core/contact/last_match"))) |
9949 | 643 { |
644 new_priority = buddy; | |
645 } | |
646 } | |
6843 | 647 } |
9949 | 648 |
649 contact->priority = new_priority; | |
10378 | 650 contact->priority_valid = TRUE; |
6843 | 651 } |
652 | |
653 | |
5228 | 654 /***************************************************************************** |
655 * Public API functions * | |
656 *****************************************************************************/ | |
657 | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
658 GaimBuddyList *gaim_blist_new() |
5228 | 659 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
660 GaimBuddyList *gbl = g_new0(GaimBuddyList, 1); |
11146 | 661 GAIM_DBUS_REGISTER_POINTER(gbl, GaimBuddyList); |
5228 | 662 |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
663 gbl->ui_ops = gaim_blist_get_ui_ops(); |
5228 | 664 |
6742 | 665 gbl->buddies = g_hash_table_new_full((GHashFunc)_gaim_blist_hbuddy_hash, |
666 (GEqualFunc)_gaim_blist_hbuddy_equal, | |
667 (GDestroyNotify)_gaim_blist_hbuddy_free_key, NULL); | |
5247 | 668 |
5228 | 669 if (gbl->ui_ops != NULL && gbl->ui_ops->new_list != NULL) |
670 gbl->ui_ops->new_list(gbl); | |
671 | |
672 return gbl; | |
673 } | |
674 | |
675 void | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
676 gaim_set_blist(GaimBuddyList *list) |
5228 | 677 { |
678 gaimbuddylist = list; | |
679 } | |
680 | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
681 GaimBuddyList * |
9285 | 682 gaim_get_blist() |
5228 | 683 { |
684 return gaimbuddylist; | |
685 } | |
686 | |
9285 | 687 void gaim_blist_show() |
5228 | 688 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
689 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 690 |
691 if (ops && ops->show) | |
5228 | 692 ops->show(gaimbuddylist); |
693 } | |
694 | |
695 void gaim_blist_destroy() | |
696 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
697 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 698 |
8259
4f9f68ab8770
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8200
diff
changeset
|
699 gaim_debug(GAIM_DEBUG_INFO, "blist", "Destroying\n"); |
9285 | 700 |
701 if (ops && ops->destroy) | |
5228 | 702 ops->destroy(gaimbuddylist); |
703 } | |
704 | |
9285 | 705 void gaim_blist_set_visible(gboolean show) |
5228 | 706 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
707 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 708 |
709 if (ops && ops->set_visible) | |
5228 | 710 ops->set_visible(gaimbuddylist, show); |
711 } | |
712 | |
12112 | 713 static GaimBlistNode *get_next_node(GaimBlistNode *node, gboolean godeep) |
714 { | |
715 if (node == NULL) | |
716 return NULL; | |
717 | |
718 if (godeep && node->child) | |
719 return node->child; | |
720 | |
721 if (node->next) | |
722 return node->next; | |
723 | |
724 return get_next_node(node->parent, FALSE); | |
725 } | |
726 | |
727 GaimBlistNode *gaim_blist_node_next(GaimBlistNode *node, gboolean offline) | |
728 { | |
729 GaimBlistNode *ret = node; | |
730 | |
731 do | |
732 { | |
733 ret = get_next_node(ret, TRUE); | |
734 } while (ret && !offline && GAIM_BLIST_NODE_IS_BUDDY(ret) && | |
735 !gaim_account_is_connected(gaim_buddy_get_account((GaimBuddy *)ret))); | |
736 | |
737 return ret; | |
738 } | |
739 | |
10052 | 740 void |
741 gaim_blist_update_buddy_status(GaimBuddy *buddy, GaimStatus *old_status) | |
9285 | 742 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
743 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
10052 | 744 GaimPresence *presence; |
745 GaimStatus *status; | |
11494 | 746 GaimConversation *conv; |
9285 | 747 |
748 g_return_if_fail(buddy != NULL); | |
5228 | 749 |
10052 | 750 presence = gaim_buddy_get_presence(buddy); |
751 status = gaim_presence_get_active_status(presence); | |
752 | |
10847 | 753 gaim_debug_info("blist", "Updating buddy status for %s (%s)\n", |
754 buddy->name, gaim_account_get_protocol_name(buddy->account)); | |
10052 | 755 |
756 if (gaim_status_is_online(status) && | |
757 !gaim_status_is_online(old_status)) { | |
11910 | 758 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
759 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-on", buddy); |
11910 | 760 |
761 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online++; | |
762 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 1) | |
763 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online++; | |
10052 | 764 } else if (!gaim_status_is_online(status) && |
765 gaim_status_is_online(old_status)) { | |
10475 | 766 gaim_blist_node_set_int(&buddy->node, "last_seen", time(NULL)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
767 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-off", buddy); |
11910 | 768 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online--; |
769 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 0) | |
770 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online--; | |
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
771 } else { |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
772 gaim_signal_emit(gaim_blist_get_handle(), |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
773 "buddy-status-changed", buddy, old_status, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
774 status); |
5228 | 775 } |
776 | |
10205 | 777 /* |
778 * This function used to only call the following two functions if one of | |
779 * the above signals had been triggered, but that's not good, because | |
780 * if someone's away message changes and they don't go from away to back | |
781 * to away then no signal is triggered. | |
782 * | |
783 * It's a safe assumption that SOMETHING called this function. PROBABLY | |
784 * because something, somewhere changed. Calling the stuff below | |
785 * certainly won't hurt anything. Unless you're on a K6-2 300. | |
786 */ | |
10378 | 787 gaim_contact_invalidate_priority_buddy(gaim_buddy_get_contact(buddy)); |
10205 | 788 if (ops && ops->update) |
789 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
11494 | 790 |
11497 | 791 if ((conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, buddy->name, buddy->account))) |
11494 | 792 gaim_conversation_update(conv, GAIM_CONV_UPDATE_AWAY); |
5228 | 793 } |
794 | |
9285 | 795 void gaim_blist_update_buddy_icon(GaimBuddy *buddy) |
5228 | 796 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
797 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 798 |
799 g_return_if_fail(buddy != NULL); | |
800 | |
801 if (ops && ops->update) | |
802 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
803 } | |
804 | |
805 /* | |
10428 | 806 * TODO: Maybe remove the call to this from server.c and call it |
9285 | 807 * from oscar.c and toc.c instead? |
808 */ | |
809 void gaim_blist_rename_buddy(GaimBuddy *buddy, const char *name) | |
810 { | |
811 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; | |
812 struct _gaim_hbuddy *hb; | |
813 | |
814 g_return_if_fail(buddy != NULL); | |
815 | |
816 hb = g_new(struct _gaim_hbuddy, 1); | |
8675 | 817 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
818 hb->account = buddy->account; | |
819 hb->group = ((GaimBlistNode *)buddy)->parent->parent; | |
820 g_hash_table_remove(gaimbuddylist->buddies, hb); | |
821 | |
822 g_free(hb->name); | |
823 hb->name = g_strdup(gaim_normalize(buddy->account, name)); | |
824 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); | |
825 | |
5634 | 826 g_free(buddy->name); |
5228 | 827 buddy->name = g_strdup(name); |
9285 | 828 |
10704 | 829 gaim_blist_schedule_save(); |
9285 | 830 |
831 if (ops && ops->update) | |
832 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 833 } |
5234 | 834 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
835 void gaim_blist_alias_chat(GaimChat *chat, const char *alias) |
5234 | 836 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
837 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
838 char *old_alias = chat->alias; |
5234 | 839 |
9285 | 840 g_return_if_fail(chat != NULL); |
841 | |
842 if ((alias != NULL) && (*alias != '\0')) | |
5237 | 843 chat->alias = g_strdup(alias); |
844 else | |
845 chat->alias = NULL; | |
846 | |
10704 | 847 gaim_blist_schedule_save(); |
9285 | 848 |
849 if (ops && ops->update) | |
850 ops->update(gaimbuddylist, (GaimBlistNode *)chat); | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
851 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
852 gaim_signal_emit(gaim_blist_get_handle(), "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
853 chat, old_alias); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
854 g_free(old_alias); |
5234 | 855 } |
856 | |
9285 | 857 void gaim_blist_alias_buddy(GaimBuddy *buddy, const char *alias) |
5228 | 858 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
859 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5634
diff
changeset
|
860 GaimConversation *conv; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
861 char *old_alias = buddy->alias; |
5228 | 862 |
9285 | 863 g_return_if_fail(buddy != NULL); |
864 | |
865 if ((alias != NULL) && (*alias != '\0')) | |
5228 | 866 buddy->alias = g_strdup(alias); |
867 else | |
868 buddy->alias = NULL; | |
869 | |
10704 | 870 gaim_blist_schedule_save(); |
9285 | 871 |
872 if (ops && ops->update) | |
873 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 874 |
11338 | 875 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, buddy->name, |
10246 | 876 buddy->account); |
5228 | 877 if (conv) |
878 gaim_conversation_autoset_title(conv); | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
879 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
880 gaim_signal_emit(gaim_blist_get_handle(), "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
881 buddy, old_alias); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
882 g_free(old_alias); |
5228 | 883 } |
884 | |
9285 | 885 void gaim_blist_server_alias_buddy(GaimBuddy *buddy, const char *alias) |
6058 | 886 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
887 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6058 | 888 GaimConversation *conv; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
889 char *old_alias = buddy->server_alias; |
6058 | 890 |
9285 | 891 g_return_if_fail(buddy != NULL); |
892 | |
893 if ((alias != NULL) && (*alias != '\0') && g_utf8_validate(alias, -1, NULL)) | |
6058 | 894 buddy->server_alias = g_strdup(alias); |
895 else | |
896 buddy->server_alias = NULL; | |
897 | |
10704 | 898 gaim_blist_schedule_save(); |
9285 | 899 |
900 if (ops && ops->update) | |
901 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
6058 | 902 |
11338 | 903 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, buddy->name, |
10246 | 904 buddy->account); |
6058 | 905 if (conv) |
906 gaim_conversation_autoset_title(conv); | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
907 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
908 gaim_signal_emit(gaim_blist_get_handle(), "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
909 buddy, old_alias); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
910 g_free(old_alias); |
6058 | 911 } |
912 | |
9285 | 913 /* |
10428 | 914 * TODO: If merging, prompt the user if they want to merge. |
9285 | 915 */ |
916 void gaim_blist_rename_group(GaimGroup *source, const char *new_name) | |
5228 | 917 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
918 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 919 GaimGroup *dest; |
920 gchar *old_name; | |
921 GList *moved_buddies = NULL; | |
5346 | 922 GSList *accts; |
923 | |
9285 | 924 g_return_if_fail(source != NULL); |
925 g_return_if_fail(new_name != NULL); | |
926 | |
927 if (*new_name == '\0' || !strcmp(new_name, source->name)) | |
5346 | 928 return; |
9285 | 929 |
930 dest = gaim_find_group(new_name); | |
931 if (dest != NULL) { | |
932 /* We're merging two groups */ | |
933 GaimBlistNode *prev, *child, *next; | |
934 | |
935 prev = gaim_blist_get_last_child((GaimBlistNode*)dest); | |
936 child = ((GaimBlistNode*)source)->child; | |
937 | |
938 /* | |
10428 | 939 * TODO: This seems like a dumb way to do this... why not just |
9285 | 940 * append all children from the old group to the end of the new |
941 * one? PRPLs might be expecting to receive an add_buddy() for | |
942 * each moved buddy... | |
943 */ | |
944 while (child) | |
5346 | 945 { |
946 next = child->next; | |
9285 | 947 if (GAIM_BLIST_NODE_IS_CONTACT(child)) { |
6695 | 948 GaimBlistNode *bnode; |
9285 | 949 gaim_blist_add_contact((GaimContact *)child, dest, prev); |
950 for (bnode = child->child; bnode != NULL; bnode = bnode->next) { | |
951 gaim_blist_add_buddy((GaimBuddy *)bnode, (GaimContact *)child, | |
6695 | 952 NULL, bnode->prev); |
9285 | 953 moved_buddies = g_list_append(moved_buddies, bnode); |
954 } | |
5346 | 955 prev = child; |
9285 | 956 } else if (GAIM_BLIST_NODE_IS_CHAT(child)) { |
957 gaim_blist_add_chat((GaimChat *)child, dest, prev); | |
5346 | 958 prev = child; |
959 } else { | |
960 gaim_debug(GAIM_DEBUG_ERROR, "blist", | |
9285 | 961 "Unknown child type in group %s\n", source->name); |
5346 | 962 } |
963 child = next; | |
964 } | |
9285 | 965 |
966 /* Make a copy of the old group name and then delete the old group */ | |
967 old_name = g_strdup(source->name); | |
968 gaim_blist_remove_group(source); | |
5346 | 969 } else { |
9285 | 970 /* A simple rename */ |
971 GaimBlistNode *cnode, *bnode; | |
972 | |
973 /* Build a GList of all buddies in this group */ | |
974 for (cnode = ((GaimBlistNode *)source)->child; cnode != NULL; cnode = cnode->next) { | |
975 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
976 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) | |
977 moved_buddies = g_list_append(moved_buddies, bnode); | |
5346 | 978 } |
9285 | 979 |
980 old_name = source->name; | |
981 source->name = g_strdup(new_name); | |
982 | |
5346 | 983 } |
9285 | 984 |
985 /* Save our changes */ | |
10704 | 986 gaim_blist_schedule_save(); |
9285 | 987 |
988 /* Update the UI */ | |
989 if (ops && ops->update) | |
990 ops->update(gaimbuddylist, (GaimBlistNode*)source); | |
991 | |
992 /* Notify all PRPLs */ | |
10853
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
993 if(old_name && source && strcmp(source->name, old_name)) { |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
994 for (accts = gaim_group_get_accounts(source); accts; accts = g_slist_remove(accts, accts->data)) { |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
995 GaimAccount *account = accts->data; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
996 GaimPluginProtocolInfo *prpl_info = NULL; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
997 GList *l = NULL, *buddies = NULL; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
998 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
999 if(account->gc && account->gc->prpl) |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1000 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl); |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1001 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1002 if(!prpl_info) |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1003 continue; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1004 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1005 for(l = moved_buddies; l; l = l->next) { |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1006 GaimBuddy *buddy = (GaimBuddy *)l->data; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1007 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1008 if(buddy && buddy->account == account) |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1009 buddies = g_list_append(buddies, (GaimBlistNode *)buddy); |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1010 } |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1011 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1012 if(prpl_info->rename_group) { |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1013 prpl_info->rename_group(account->gc, old_name, source, buddies); |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1014 } else { |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1015 GList *cur, *groups = NULL; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1016 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1017 /* Make a list of what the groups each buddy is in */ |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1018 for(cur = buddies; cur; cur = cur->next) { |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1019 GaimBlistNode *node = (GaimBlistNode *)cur->data; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1020 groups = g_list_append(groups, node->parent->parent); |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1021 } |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1022 |
11643 | 1023 gaim_account_remove_buddies(account, buddies, groups); |
10853
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1024 g_list_free(groups); |
11643 | 1025 gaim_account_add_buddies(account, buddies); |
10853
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1026 } |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1027 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1028 g_list_free(buddies); |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1029 } |
9285 | 1030 } |
1031 g_list_free(moved_buddies); | |
1032 g_free(old_name); | |
5228 | 1033 } |
5234 | 1034 |
9285 | 1035 static void gaim_blist_node_initialize_settings(GaimBlistNode *node); |
7693 | 1036 |
7125 | 1037 GaimChat *gaim_chat_new(GaimAccount *account, const char *alias, GHashTable *components) |
5234 | 1038 { |
9285 | 1039 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1040 GaimChat *chat; |
9285 | 1041 |
1042 g_return_val_if_fail(account != NULL, FALSE); | |
1043 g_return_val_if_fail(components != NULL, FALSE); | |
5234 | 1044 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1045 chat = g_new0(GaimChat, 1); |
5234 | 1046 chat->account = account; |
9285 | 1047 if ((alias != NULL) && (*alias != '\0')) |
5237 | 1048 chat->alias = g_strdup(alias); |
5234 | 1049 chat->components = components; |
9285 | 1050 gaim_blist_node_initialize_settings((GaimBlistNode *)chat); |
1051 ((GaimBlistNode *)chat)->type = GAIM_BLIST_CHAT_NODE; | |
5234 | 1052 |
1053 if (ops != NULL && ops->new_node != NULL) | |
1054 ops->new_node((GaimBlistNode *)chat); | |
1055 | |
11146 | 1056 GAIM_DBUS_REGISTER_POINTER(chat, GaimChat); |
5234 | 1057 return chat; |
1058 } | |
1059 | |
6695 | 1060 GaimBuddy *gaim_buddy_new(GaimAccount *account, const char *screenname, const char *alias) |
5228 | 1061 { |
9285 | 1062 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
1063 GaimBuddy *buddy; | |
1064 | |
1065 g_return_val_if_fail(account != NULL, FALSE); | |
1066 g_return_val_if_fail(screenname != NULL, FALSE); | |
1067 | |
1068 buddy = g_new0(GaimBuddy, 1); | |
9949 | 1069 buddy->account = account; |
1070 buddy->name = g_strdup(screenname); | |
1071 buddy->alias = g_strdup(alias); | |
1072 buddy->presence = gaim_presence_new_for_buddy(buddy); | |
11624 | 1073 ((GaimBlistNode *)buddy)->type = GAIM_BLIST_BUDDY_NODE; |
9949 | 1074 |
10052 | 1075 gaim_presence_set_status_active(buddy->presence, "offline", TRUE); |
1076 | |
9285 | 1077 gaim_blist_node_initialize_settings((GaimBlistNode *)buddy); |
1078 | |
1079 if (ops && ops->new_node) | |
1080 ops->new_node((GaimBlistNode *)buddy); | |
1081 | |
11146 | 1082 GAIM_DBUS_REGISTER_POINTER(buddy, GaimBuddy); |
9285 | 1083 return buddy; |
5228 | 1084 } |
5634 | 1085 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1086 void |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1087 gaim_buddy_set_icon(GaimBuddy *buddy, GaimBuddyIcon *icon) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1088 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1089 g_return_if_fail(buddy != NULL); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1090 |
12097 | 1091 if (buddy->icon == icon) |
1092 /* Don't need to do anything */ | |
1093 return; | |
1094 | |
1095 if (buddy->icon != NULL) | |
1096 gaim_buddy_icon_unref(buddy->icon); | |
1097 | |
1098 buddy->icon = (icon != NULL ? gaim_buddy_icon_ref(icon) : NULL); | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1099 |
9324 | 1100 if (buddy->icon) |
1101 gaim_buddy_icon_cache(icon, buddy); | |
1102 else | |
11040
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
1103 gaim_buddy_icon_uncache(buddy); |
9299 | 1104 |
10704 | 1105 gaim_blist_schedule_save(); |
9926 | 1106 |
12097 | 1107 gaim_signal_emit(gaim_blist_get_handle(), "buddy-icon-changed", buddy); |
1108 | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1109 gaim_blist_update_buddy_icon(buddy); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1110 } |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1111 |
10037
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1112 GaimAccount * |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1113 gaim_buddy_get_account(const GaimBuddy *buddy) |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1114 { |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1115 g_return_val_if_fail(buddy != NULL, NULL); |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1116 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1117 return buddy->account; |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1118 } |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1119 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1120 const char * |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1121 gaim_buddy_get_name(const GaimBuddy *buddy) |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1122 { |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1123 g_return_val_if_fail(buddy != NULL, NULL); |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1124 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1125 return buddy->name; |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1126 } |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1127 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1128 GaimBuddyIcon * |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1129 gaim_buddy_get_icon(const GaimBuddy *buddy) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1130 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1131 g_return_val_if_fail(buddy != NULL, NULL); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1132 |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1133 return buddy->icon; |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1134 } |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1135 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1136 void gaim_blist_add_chat(GaimChat *chat, GaimGroup *group, GaimBlistNode *node) |
5234 | 1137 { |
9285 | 1138 GaimBlistNode *cnode = (GaimBlistNode*)chat; |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1139 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6774 | 1140 |
1141 g_return_if_fail(chat != NULL); | |
9285 | 1142 g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT((GaimBlistNode *)chat)); |
1143 | |
1144 if (node == NULL) { | |
1145 if (group == NULL) { | |
1146 group = gaim_group_new(_("Chats")); | |
1147 gaim_blist_add_group(group, | |
5634 | 1148 gaim_blist_get_last_sibling(gaimbuddylist->root)); |
5234 | 1149 } |
1150 } else { | |
9285 | 1151 group = (GaimGroup*)node->parent; |
5234 | 1152 } |
1153 | |
1154 /* if we're moving to overtop of ourselves, do nothing */ | |
9285 | 1155 if (cnode == node) |
5234 | 1156 return; |
1157 | |
1158 if (cnode->parent) { | |
1159 /* This chat was already in the list and is | |
1160 * being moved. | |
1161 */ | |
6695 | 1162 ((GaimGroup *)cnode->parent)->totalsize--; |
5855 | 1163 if (gaim_account_is_connected(chat->account)) { |
6695 | 1164 ((GaimGroup *)cnode->parent)->online--; |
1165 ((GaimGroup *)cnode->parent)->currentsize--; | |
5287 | 1166 } |
9285 | 1167 if (cnode->next) |
5234 | 1168 cnode->next->prev = cnode->prev; |
9285 | 1169 if (cnode->prev) |
5234 | 1170 cnode->prev->next = cnode->next; |
9285 | 1171 if (cnode->parent->child == cnode) |
5234 | 1172 cnode->parent->child = cnode->next; |
1173 | |
1174 ops->remove(gaimbuddylist, cnode); | |
11101
8b346ce5cdb8
[gaim-migrate @ 13140]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11067
diff
changeset
|
1175 /* ops->remove() cleaned up the cnode's ui_data, so we need to |
8b346ce5cdb8
[gaim-migrate @ 13140]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11067
diff
changeset
|
1176 * reinitialize it */ |
8b346ce5cdb8
[gaim-migrate @ 13140]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11067
diff
changeset
|
1177 ops->new_node(cnode); |
5234 | 1178 |
10704 | 1179 gaim_blist_schedule_save(); |
5234 | 1180 } |
1181 | |
9285 | 1182 if (node != NULL) { |
1183 if (node->next) | |
1184 node->next->prev = cnode; | |
1185 cnode->next = node->next; | |
1186 cnode->prev = node; | |
1187 cnode->parent = node->parent; | |
1188 node->next = cnode; | |
1189 ((GaimGroup *)node->parent)->totalsize++; | |
5855 | 1190 if (gaim_account_is_connected(chat->account)) { |
9285 | 1191 ((GaimGroup *)node->parent)->online++; |
1192 ((GaimGroup *)node->parent)->currentsize++; | |
5287 | 1193 } |
5234 | 1194 } else { |
9285 | 1195 if (((GaimBlistNode *)group)->child) |
1196 ((GaimBlistNode *)group)->child->prev = cnode; | |
1197 cnode->next = ((GaimBlistNode *)group)->child; | |
5634 | 1198 cnode->prev = NULL; |
9285 | 1199 ((GaimBlistNode *)group)->child = cnode; |
1200 cnode->parent = (GaimBlistNode *)group; | |
1201 group->totalsize++; | |
5855 | 1202 if (gaim_account_is_connected(chat->account)) { |
9285 | 1203 group->online++; |
1204 group->currentsize++; | |
5287 | 1205 } |
5234 | 1206 } |
1207 | |
10704 | 1208 gaim_blist_schedule_save(); |
9285 | 1209 |
1210 if (ops && ops->update) | |
1211 ops->update(gaimbuddylist, (GaimBlistNode *)cnode); | |
5234 | 1212 } |
1213 | |
7879 | 1214 void gaim_blist_add_buddy(GaimBuddy *buddy, GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
5228 | 1215 { |
6695 | 1216 GaimBlistNode *cnode, *bnode; |
1217 GaimGroup *g; | |
1218 GaimContact *c; | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1219 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5247 | 1220 struct _gaim_hbuddy *hb; |
6695 | 1221 |
1222 g_return_if_fail(buddy != NULL); | |
6774 | 1223 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY((GaimBlistNode*)buddy)); |
6695 | 1224 |
1225 bnode = (GaimBlistNode *)buddy; | |
5228 | 1226 |
6695 | 1227 /* if we're moving to overtop of ourselves, do nothing */ |
9285 | 1228 if (bnode == node || (!node && bnode->parent && |
6695 | 1229 contact && bnode->parent == (GaimBlistNode*)contact |
1230 && bnode == bnode->parent->child)) | |
1231 return; | |
1232 | |
9285 | 1233 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
6695 | 1234 c = (GaimContact*)node->parent; |
1235 g = (GaimGroup*)node->parent->parent; | |
9285 | 1236 } else if (contact) { |
6695 | 1237 c = contact; |
9285 | 1238 g = (GaimGroup *)((GaimBlistNode *)c)->parent; |
1239 } else { | |
1240 if (group) { | |
6695 | 1241 g = group; |
1242 } else { | |
5228 | 1243 g = gaim_group_new(_("Buddies")); |
5634 | 1244 gaim_blist_add_group(g, |
1245 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
5228 | 1246 } |
6695 | 1247 c = gaim_contact_new(); |
1248 gaim_blist_add_contact(c, g, | |
1249 gaim_blist_get_last_child((GaimBlistNode*)g)); | |
5228 | 1250 } |
1251 | |
6695 | 1252 cnode = (GaimBlistNode *)c; |
5228 | 1253 |
9285 | 1254 if (bnode->parent) { |
1255 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
6695 | 1256 ((GaimContact*)bnode->parent)->online--; |
9285 | 1257 if (((GaimContact*)bnode->parent)->online == 0) |
6695 | 1258 ((GaimGroup*)bnode->parent->parent)->online--; |
1259 } | |
9285 | 1260 if (gaim_account_is_connected(buddy->account)) { |
6695 | 1261 ((GaimContact*)bnode->parent)->currentsize--; |
9285 | 1262 if (((GaimContact*)bnode->parent)->currentsize == 0) |
6695 | 1263 ((GaimGroup*)bnode->parent->parent)->currentsize--; |
1264 } | |
1265 ((GaimContact*)bnode->parent)->totalsize--; | |
1266 /* the group totalsize will be taken care of by remove_contact below */ | |
1267 | |
9285 | 1268 if (bnode->parent->parent != (GaimBlistNode*)g) |
6695 | 1269 serv_move_buddy(buddy, (GaimGroup *)bnode->parent->parent, g); |
5277 | 1270 |
9285 | 1271 if (bnode->next) |
5228 | 1272 bnode->next->prev = bnode->prev; |
9285 | 1273 if (bnode->prev) |
5228 | 1274 bnode->prev->next = bnode->next; |
9285 | 1275 if (bnode->parent->child == bnode) |
5228 | 1276 bnode->parent->child = bnode->next; |
1277 | |
1278 ops->remove(gaimbuddylist, bnode); | |
1279 | |
10704 | 1280 gaim_blist_schedule_save(); |
9285 | 1281 |
1282 if (bnode->parent->parent != (GaimBlistNode*)g) { | |
6742 | 1283 hb = g_new(struct _gaim_hbuddy, 1); |
7261 | 1284 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
6742 | 1285 hb->account = buddy->account; |
1286 hb->group = bnode->parent->parent; | |
6775 | 1287 g_hash_table_remove(gaimbuddylist->buddies, hb); |
7162 | 1288 g_free(hb->name); |
6742 | 1289 g_free(hb); |
1290 } | |
6794 | 1291 |
9285 | 1292 if (!bnode->parent->child) { |
6794 | 1293 gaim_blist_remove_contact((GaimContact*)bnode->parent); |
7003 | 1294 } else { |
10378 | 1295 gaim_contact_invalidate_priority_buddy((GaimContact*)bnode->parent); |
7003 | 1296 ops->update(gaimbuddylist, bnode->parent); |
1297 } | |
5228 | 1298 } |
1299 | |
9285 | 1300 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
1301 if (node->next) | |
6695 | 1302 node->next->prev = bnode; |
1303 bnode->next = node->next; | |
1304 bnode->prev = node; | |
1305 bnode->parent = node->parent; | |
1306 node->next = bnode; | |
5228 | 1307 } else { |
9285 | 1308 if (cnode->child) |
6695 | 1309 cnode->child->prev = bnode; |
1310 bnode->prev = NULL; | |
1311 bnode->next = cnode->child; | |
1312 cnode->child = bnode; | |
1313 bnode->parent = cnode; | |
5228 | 1314 } |
1315 | |
9285 | 1316 if (GAIM_BUDDY_IS_ONLINE(buddy)) { |
6695 | 1317 ((GaimContact*)bnode->parent)->online++; |
9285 | 1318 if (((GaimContact*)bnode->parent)->online == 1) |
6695 | 1319 ((GaimGroup*)bnode->parent->parent)->online++; |
1320 } | |
9285 | 1321 if (gaim_account_is_connected(buddy->account)) { |
6695 | 1322 ((GaimContact*)bnode->parent)->currentsize++; |
9285 | 1323 if (((GaimContact*)bnode->parent)->currentsize == 1) |
6695 | 1324 ((GaimGroup*)bnode->parent->parent)->currentsize++; |
1325 } | |
1326 ((GaimContact*)bnode->parent)->totalsize++; | |
1327 | |
6742 | 1328 hb = g_new(struct _gaim_hbuddy, 1); |
7261 | 1329 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
5247 | 1330 hb->account = buddy->account; |
6695 | 1331 hb->group = ((GaimBlistNode*)buddy)->parent->parent; |
5247 | 1332 |
6742 | 1333 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); |
5247 | 1334 |
10378 | 1335 gaim_contact_invalidate_priority_buddy(gaim_buddy_get_contact(buddy)); |
9285 | 1336 |
10704 | 1337 gaim_blist_schedule_save(); |
9285 | 1338 |
1339 if (ops && ops->update) | |
5228 | 1340 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1341 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1342 /* Signal that the buddy has been added */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1343 gaim_signal_emit(gaim_blist_get_handle(), "buddy-added", buddy); |
5228 | 1344 } |
1345 | |
6695 | 1346 GaimContact *gaim_contact_new() |
5228 | 1347 { |
9285 | 1348 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
1349 | |
1350 GaimContact *contact = g_new0(GaimContact, 1); | |
1351 contact->totalsize = 0; | |
1352 contact->currentsize = 0; | |
1353 contact->online = 0; | |
1354 gaim_blist_node_initialize_settings((GaimBlistNode *)contact); | |
1355 ((GaimBlistNode *)contact)->type = GAIM_BLIST_CONTACT_NODE; | |
1356 | |
1357 if (ops && ops->new_node) | |
1358 ops->new_node((GaimBlistNode *)contact); | |
1359 | |
11146 | 1360 GAIM_DBUS_REGISTER_POINTER(contact, GaimContact); |
9285 | 1361 return contact; |
6695 | 1362 } |
1363 | |
9285 | 1364 void gaim_contact_set_alias(GaimContact *contact, const char *alias) |
6755 | 1365 { |
7245 | 1366 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1367 char *old_alias = contact->alias; |
7245 | 1368 |
6755 | 1369 g_return_if_fail(contact != NULL); |
1370 | |
9285 | 1371 if ((alias != NULL) && (*alias != '\0')) |
7245 | 1372 contact->alias = g_strdup(alias); |
1373 else | |
1374 contact->alias = NULL; | |
1375 | |
10704 | 1376 gaim_blist_schedule_save(); |
9285 | 1377 |
1378 if (ops && ops->update) | |
7245 | 1379 ops->update(gaimbuddylist, (GaimBlistNode*)contact); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1380 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1381 gaim_signal_emit(gaim_blist_get_handle(), "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1382 contact, old_alias); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1383 g_free(old_alias); |
6755 | 1384 } |
1385 | |
1386 const char *gaim_contact_get_alias(GaimContact* contact) | |
1387 { | |
9285 | 1388 g_return_val_if_fail(contact != NULL, NULL); |
1389 | |
1390 if (contact->alias) | |
7312 | 1391 return contact->alias; |
1392 | |
10378 | 1393 return gaim_buddy_get_alias(gaim_contact_get_priority_buddy(contact)); |
6755 | 1394 } |
1395 | |
9787 | 1396 gboolean gaim_contact_on_account(GaimContact *c, GaimAccount *account) |
1397 { | |
1398 GaimBlistNode *bnode, *cnode = (GaimBlistNode *) c; | |
1399 | |
1400 g_return_val_if_fail(c != NULL, FALSE); | |
1401 g_return_val_if_fail(account != NULL, FALSE); | |
1402 | |
1403 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
1404 GaimBuddy *buddy; | |
1405 | |
1406 if (! GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
1407 continue; | |
1408 | |
1409 buddy = (GaimBuddy *)bnode; | |
1410 if (buddy->account == account) | |
1411 return TRUE; | |
1412 } | |
1413 return FALSE; | |
1414 } | |
1415 | |
10428 | 1416 void gaim_contact_invalidate_priority_buddy(GaimContact *contact) |
1417 { | |
1418 g_return_if_fail(contact != NULL); | |
1419 | |
1420 contact->priority_valid = FALSE; | |
1421 } | |
1422 | |
6695 | 1423 GaimGroup *gaim_group_new(const char *name) |
1424 { | |
9285 | 1425 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
1426 GaimGroup *group = gaim_find_group(name); | |
1427 | |
1428 if (group != NULL) | |
1429 return group; | |
1430 | |
1431 group = g_new0(GaimGroup, 1); | |
1432 group->name = g_strdup(name); | |
1433 group->totalsize = 0; | |
1434 group->currentsize = 0; | |
1435 group->online = 0; | |
1436 gaim_blist_node_initialize_settings((GaimBlistNode *)group); | |
1437 ((GaimBlistNode *)group)->type = GAIM_BLIST_GROUP_NODE; | |
1438 | |
1439 if (ops && ops->new_node) | |
1440 ops->new_node((GaimBlistNode *)group); | |
1441 | |
11146 | 1442 GAIM_DBUS_REGISTER_POINTER(group, GaimGroup); |
9285 | 1443 return group; |
5228 | 1444 } |
1445 | |
6695 | 1446 void gaim_blist_add_contact(GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
1447 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1448 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 1449 GaimGroup *g; |
6742 | 1450 GaimBlistNode *gnode, *cnode, *bnode; |
6695 | 1451 |
6774 | 1452 g_return_if_fail(contact != NULL); |
1453 g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT((GaimBlistNode*)contact)); | |
6695 | 1454 |
9285 | 1455 if ((GaimBlistNode*)contact == node) |
6975 | 1456 return; |
1457 | |
9285 | 1458 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
6695 | 1459 GAIM_BLIST_NODE_IS_CHAT(node))) |
1460 g = (GaimGroup*)node->parent; | |
9285 | 1461 else if (group) |
6695 | 1462 g = group; |
1463 else { | |
1464 g = gaim_group_new(_("Buddies")); | |
1465 gaim_blist_add_group(g, | |
1466 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
1467 } | |
1468 | |
1469 gnode = (GaimBlistNode*)g; | |
1470 cnode = (GaimBlistNode*)contact; | |
1471 | |
9285 | 1472 if (cnode->parent) { |
1473 if (cnode->parent->child == cnode) | |
6731 | 1474 cnode->parent->child = cnode->next; |
9285 | 1475 if (cnode->prev) |
6695 | 1476 cnode->prev->next = cnode->next; |
9285 | 1477 if (cnode->next) |
6695 | 1478 cnode->next->prev = cnode->prev; |
1479 | |
9285 | 1480 if (cnode->parent != gnode) { |
9928 | 1481 bnode = cnode->child; |
1482 while (bnode) { | |
1483 GaimBlistNode *next_bnode = bnode->next; | |
6742 | 1484 GaimBuddy *b = (GaimBuddy*)bnode; |
1485 | |
1486 struct _gaim_hbuddy *hb = g_new(struct _gaim_hbuddy, 1); | |
7261 | 1487 hb->name = g_strdup(gaim_normalize(b->account, b->name)); |
6742 | 1488 hb->account = b->account; |
1489 hb->group = cnode->parent; | |
1490 | |
6776 | 1491 g_hash_table_remove(gaimbuddylist->buddies, hb); |
6742 | 1492 |
9285 | 1493 if (!gaim_find_buddy_in_group(b->account, b->name, g)) { |
8328 | 1494 hb->group = gnode; |
1495 g_hash_table_replace(gaimbuddylist->buddies, hb, b); | |
1496 | |
9285 | 1497 if (b->account->gc) |
1498 serv_move_buddy(b, (GaimGroup *)cnode->parent, g); | |
8328 | 1499 } else { |
9928 | 1500 gboolean empty_contact = FALSE; |
1501 | |
8328 | 1502 /* this buddy already exists in the group, so we're |
1503 * gonna delete it instead */ | |
1504 g_free(hb->name); | |
1505 g_free(hb); | |
9285 | 1506 if (b->account->gc) |
11643 | 1507 gaim_account_remove_buddy(b->account, b, (GaimGroup *)cnode->parent); |
9285 | 1508 |
1509 if (!cnode->child->next) | |
8328 | 1510 empty_contact = TRUE; |
1511 gaim_blist_remove_buddy(b); | |
9928 | 1512 |
1513 /** in gaim_blist_remove_buddy(), if the last buddy in a | |
1514 * contact is removed, the contact is cleaned up and | |
1515 * g_free'd, so we mustn't try to reference bnode->next */ | |
1516 if (empty_contact) | |
1517 return; | |
8328 | 1518 } |
9928 | 1519 bnode = next_bnode; |
6742 | 1520 } |
1521 } | |
9928 | 1522 |
1523 if (contact->online > 0) | |
1524 ((GaimGroup*)cnode->parent)->online--; | |
1525 if (contact->currentsize > 0) | |
1526 ((GaimGroup*)cnode->parent)->currentsize--; | |
1527 ((GaimGroup*)cnode->parent)->totalsize--; | |
1528 | |
1529 ops->remove(gaimbuddylist, cnode); | |
1530 | |
10704 | 1531 gaim_blist_schedule_save(); |
6695 | 1532 } |
1533 | |
9285 | 1534 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
6695 | 1535 GAIM_BLIST_NODE_IS_CHAT(node))) { |
9285 | 1536 if (node->next) |
6695 | 1537 node->next->prev = cnode; |
1538 cnode->next = node->next; | |
1539 cnode->prev = node; | |
1540 cnode->parent = node->parent; | |
1541 node->next = cnode; | |
1542 } else { | |
9285 | 1543 if (gnode->child) |
6695 | 1544 gnode->child->prev = cnode; |
1545 cnode->prev = NULL; | |
1546 cnode->next = gnode->child; | |
1547 gnode->child = cnode; | |
1548 cnode->parent = gnode; | |
1549 } | |
1550 | |
9285 | 1551 if (contact->online > 0) |
6695 | 1552 g->online++; |
9285 | 1553 if (contact->currentsize > 0) |
6695 | 1554 g->currentsize++; |
1555 g->totalsize++; | |
1556 | |
10704 | 1557 gaim_blist_schedule_save(); |
9285 | 1558 |
1559 if (ops && cnode->child) | |
6695 | 1560 ops->update(gaimbuddylist, cnode); |
6775 | 1561 |
9285 | 1562 for (bnode = cnode->child; bnode; bnode = bnode->next) |
6775 | 1563 ops->update(gaimbuddylist, bnode); |
6695 | 1564 } |
1565 | |
7246 | 1566 void gaim_blist_merge_contact(GaimContact *source, GaimBlistNode *node) |
6965 | 1567 { |
1568 GaimBlistNode *sourcenode = (GaimBlistNode*)source; | |
7246 | 1569 GaimBlistNode *targetnode; |
1570 GaimBlistNode *prev, *cur, *next; | |
1571 GaimContact *target; | |
1572 | |
9285 | 1573 g_return_if_fail(source != NULL); |
1574 g_return_if_fail(node != NULL); | |
1575 | |
1576 if (GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
1577 target = (GaimContact *)node; | |
7246 | 1578 prev = gaim_blist_get_last_child(node); |
9285 | 1579 } else if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
1580 target = (GaimContact *)node->parent; | |
7246 | 1581 prev = node; |
1582 } else { | |
6965 | 1583 return; |
7246 | 1584 } |
1585 | |
9285 | 1586 if (source == target || !target) |
7246 | 1587 return; |
1588 | |
9285 | 1589 targetnode = (GaimBlistNode *)target; |
7246 | 1590 next = sourcenode->child; |
1591 | |
9285 | 1592 while (next) { |
7246 | 1593 cur = next; |
1594 next = cur->next; | |
9285 | 1595 if (GAIM_BLIST_NODE_IS_BUDDY(cur)) { |
1596 gaim_blist_add_buddy((GaimBuddy *)cur, target, NULL, prev); | |
7246 | 1597 prev = cur; |
1598 } | |
6965 | 1599 } |
1600 } | |
1601 | |
9285 | 1602 void gaim_blist_add_group(GaimGroup *group, GaimBlistNode *node) |
5228 | 1603 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1604 GaimBlistUiOps *ops; |
5228 | 1605 GaimBlistNode *gnode = (GaimBlistNode*)group; |
1606 | |
6774 | 1607 g_return_if_fail(group != NULL); |
9285 | 1608 g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP((GaimBlistNode *)group)); |
1609 | |
5228 | 1610 ops = gaimbuddylist->ui_ops; |
1611 | |
1612 if (!gaimbuddylist->root) { | |
1613 gaimbuddylist->root = gnode; | |
1614 return; | |
1615 } | |
1616 | |
1617 /* if we're moving to overtop of ourselves, do nothing */ | |
9285 | 1618 if (gnode == node) |
5228 | 1619 return; |
1620 | |
1621 if (gaim_find_group(group->name)) { | |
1622 /* This is just being moved */ | |
1623 | |
9285 | 1624 ops->remove(gaimbuddylist, (GaimBlistNode *)group); |
1625 | |
1626 if (gnode == gaimbuddylist->root) | |
5228 | 1627 gaimbuddylist->root = gnode->next; |
9285 | 1628 if (gnode->prev) |
5228 | 1629 gnode->prev->next = gnode->next; |
9285 | 1630 if (gnode->next) |
5228 | 1631 gnode->next->prev = gnode->prev; |
1632 } | |
1633 | |
6695 | 1634 if (node && GAIM_BLIST_NODE_IS_GROUP(node)) { |
5634 | 1635 gnode->next = node->next; |
1636 gnode->prev = node; | |
9285 | 1637 if (node->next) |
5634 | 1638 node->next->prev = gnode; |
1639 node->next = gnode; | |
1640 } else { | |
9285 | 1641 if (gaimbuddylist->root) |
6807 | 1642 gaimbuddylist->root->prev = gnode; |
5634 | 1643 gnode->next = gaimbuddylist->root; |
1644 gnode->prev = NULL; | |
1645 gaimbuddylist->root = gnode; | |
1646 } | |
1647 | |
10704 | 1648 gaim_blist_schedule_save(); |
9285 | 1649 |
1650 if (ops && ops->update) { | |
5228 | 1651 ops->update(gaimbuddylist, gnode); |
9285 | 1652 for (node = gnode->child; node; node = node->next) |
5228 | 1653 ops->update(gaimbuddylist, node); |
1654 } | |
1655 } | |
1656 | |
9285 | 1657 void gaim_blist_remove_contact(GaimContact *contact) |
5228 | 1658 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1659 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1660 GaimBlistNode *node, *gnode; |
1661 | |
1662 g_return_if_fail(contact != NULL); | |
1663 | |
1664 node = (GaimBlistNode *)contact; | |
1665 gnode = node->parent; | |
1666 | |
1667 if (node->child) { | |
1668 /* | |
1669 * If this contact has children then remove them. When the last | |
10166 | 1670 * buddy is removed from the contact, the contact is automatically |
1671 * deleted. | |
9285 | 1672 */ |
10166 | 1673 while (node->child->next) { |
9285 | 1674 gaim_blist_remove_buddy((GaimBuddy*)node->child); |
6695 | 1675 } |
10166 | 1676 /* |
1677 * Remove the last buddy and trigger the deletion of the contact. | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1678 * It would probably be cleaner if contact-deletion was done after |
10166 | 1679 * a timeout? Or if it had to be done manually, like below? |
1680 */ | |
1681 gaim_blist_remove_buddy((GaimBuddy*)node->child); | |
6695 | 1682 } else { |
9285 | 1683 /* Remove the node from its parent */ |
1684 if (gnode->child == node) | |
1685 gnode->child = node->next; | |
1686 if (node->prev) | |
1687 node->prev->next = node->next; | |
1688 if (node->next) | |
1689 node->next->prev = node->prev; | |
1690 | |
10704 | 1691 gaim_blist_schedule_save(); |
9285 | 1692 |
1693 /* Update the UI */ | |
1694 if (ops && ops->remove) | |
1695 ops->remove(gaimbuddylist, node); | |
1696 | |
1697 /* Delete the node */ | |
10504 | 1698 g_hash_table_destroy(contact->node.settings); |
11067 | 1699 GAIM_DBUS_UNREGISTER_POINTER(contact); |
6695 | 1700 g_free(contact); |
1701 } | |
1702 } | |
1703 | |
9285 | 1704 void gaim_blist_remove_buddy(GaimBuddy *buddy) |
6695 | 1705 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1706 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1707 GaimBlistNode *node, *cnode, *gnode; |
1708 GaimContact *contact; | |
6695 | 1709 GaimGroup *group; |
6742 | 1710 struct _gaim_hbuddy hb; |
5228 | 1711 |
9285 | 1712 g_return_if_fail(buddy != NULL); |
1713 | |
1714 node = (GaimBlistNode *)buddy; | |
6695 | 1715 cnode = node->parent; |
9285 | 1716 gnode = cnode->parent; |
1717 contact = (GaimContact *)cnode; | |
1718 group = (GaimGroup *)gnode; | |
1719 | |
11302
fc17554c32c5
[gaim-migrate @ 13502]
Richard Laager <rlaager@wiktel.com>
parents:
11268
diff
changeset
|
1720 /* Delete any buddy icon. */ |
11860 | 1721 gaim_buddy_icon_uncache(buddy); |
11302
fc17554c32c5
[gaim-migrate @ 13502]
Richard Laager <rlaager@wiktel.com>
parents:
11268
diff
changeset
|
1722 |
9285 | 1723 /* Remove the node from its parent */ |
5228 | 1724 if (node->prev) |
1725 node->prev->next = node->next; | |
1726 if (node->next) | |
1727 node->next->prev = node->prev; | |
9285 | 1728 if (cnode->child == node) |
6695 | 1729 cnode->child = node->next; |
9285 | 1730 |
1731 /* Adjust size counts */ | |
1732 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
1733 contact->online--; | |
1734 if (contact->online == 0) | |
1735 group->online--; | |
6695 | 1736 } |
9285 | 1737 if (gaim_account_is_connected(buddy->account)) { |
1738 contact->currentsize--; | |
1739 if (contact->currentsize == 0) | |
1740 group->currentsize--; | |
8194 | 1741 } |
9285 | 1742 contact->totalsize--; |
1743 | |
10704 | 1744 gaim_blist_schedule_save(); |
9285 | 1745 |
1746 /* Re-sort the contact */ | |
1747 if (contact->priority == buddy) { | |
10378 | 1748 gaim_contact_invalidate_priority_buddy(contact); |
9285 | 1749 if (ops && ops->update) |
1750 ops->update(gaimbuddylist, cnode); | |
1751 } | |
1752 | |
1753 /* Remove this buddy from the buddies hash table */ | |
7261 | 1754 hb.name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
5247 | 1755 hb.account = buddy->account; |
6695 | 1756 hb.group = ((GaimBlistNode*)buddy)->parent->parent; |
6742 | 1757 g_hash_table_remove(gaimbuddylist->buddies, &hb); |
7162 | 1758 g_free(hb.name); |
5247 | 1759 |
9285 | 1760 /* Update the UI */ |
1761 if (ops && ops->remove) | |
1762 ops->remove(gaimbuddylist, node); | |
1763 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1764 /* Signal that the buddy has been removed before freeing the memory for it */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1765 gaim_signal_emit(gaim_blist_get_handle(), "buddy-removed", buddy); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1766 |
9285 | 1767 /* Delete the node */ |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1768 if (buddy->icon != NULL) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1769 gaim_buddy_icon_unref(buddy->icon); |
7693 | 1770 g_hash_table_destroy(buddy->node.settings); |
9944 | 1771 gaim_presence_remove_buddy(buddy->presence, buddy); |
1772 gaim_presence_destroy(buddy->presence); | |
5228 | 1773 g_free(buddy->name); |
1774 g_free(buddy->alias); | |
10504 | 1775 g_free(buddy->server_alias); |
11067 | 1776 |
1777 GAIM_DBUS_UNREGISTER_POINTER(buddy); | |
5228 | 1778 g_free(buddy); |
6755 | 1779 |
9285 | 1780 /* If the contact is empty then remove it */ |
1781 if (!cnode->child) | |
1782 gaim_blist_remove_contact(contact); | |
5228 | 1783 } |
1784 | |
9285 | 1785 void gaim_blist_remove_chat(GaimChat *chat) |
5234 | 1786 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1787 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1788 GaimBlistNode *node, *gnode; |
6695 | 1789 GaimGroup *group; |
5234 | 1790 |
9285 | 1791 g_return_if_fail(chat != NULL); |
1792 | |
1793 node = (GaimBlistNode *)chat; | |
5234 | 1794 gnode = node->parent; |
6695 | 1795 group = (GaimGroup *)gnode; |
5234 | 1796 |
9285 | 1797 /* Remove the node from its parent */ |
1798 if (gnode->child == node) | |
5234 | 1799 gnode->child = node->next; |
1800 if (node->prev) | |
1801 node->prev->next = node->next; | |
1802 if (node->next) | |
1803 node->next->prev = node->prev; | |
9285 | 1804 |
1805 /* Adjust size counts */ | |
5855 | 1806 if (gaim_account_is_connected(chat->account)) { |
5394 | 1807 group->online--; |
9285 | 1808 group->currentsize--; |
5394 | 1809 } |
9285 | 1810 group->totalsize--; |
1811 | |
10704 | 1812 gaim_blist_schedule_save(); |
9285 | 1813 |
1814 /* Update the UI */ | |
1815 if (ops && ops->remove) | |
1816 ops->remove(gaimbuddylist, node); | |
1817 | |
1818 /* Delete the node */ | |
5234 | 1819 g_hash_table_destroy(chat->components); |
10504 | 1820 g_hash_table_destroy(chat->node.settings); |
5234 | 1821 g_free(chat->alias); |
11067 | 1822 GAIM_DBUS_UNREGISTER_POINTER(chat); |
5234 | 1823 g_free(chat); |
1824 } | |
1825 | |
9285 | 1826 void gaim_blist_remove_group(GaimGroup *group) |
5228 | 1827 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1828 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1829 GaimBlistNode *node; |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1830 GList *l; |
5228 | 1831 |
9285 | 1832 g_return_if_fail(group != NULL); |
1833 | |
1834 node = (GaimBlistNode *)group; | |
1835 | |
1836 /* Make sure the group is empty */ | |
1837 if (node->child) { | |
5228 | 1838 char *buf; |
1839 int count = 0; | |
9285 | 1840 GaimBlistNode *child; |
1841 | |
1842 for (child = node->child; child != NULL; child = child->next) | |
5228 | 1843 count++; |
1844 | |
6308 | 1845 buf = g_strdup_printf(ngettext("%d buddy from group %s was not removed " |
1846 "because its account was not logged in." | |
1847 " This buddy and the group were not " | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1848 "removed.\n", |
6308 | 1849 "%d buddies from group %s were not " |
1850 "removed because their accounts were " | |
6336 | 1851 "not logged in. These buddies and " |
1852 "the group were not removed.\n", count), | |
6308 | 1853 count, group->name); |
5541
aee0ee458974
[gaim-migrate @ 5941]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1854 gaim_notify_error(NULL, NULL, _("Group not removed"), buf); |
5228 | 1855 g_free(buf); |
1856 return; | |
1857 } | |
1858 | |
9285 | 1859 /* Remove the node from its parent */ |
1860 if (gaimbuddylist->root == node) | |
5228 | 1861 gaimbuddylist->root = node->next; |
1862 if (node->prev) | |
1863 node->prev->next = node->next; | |
1864 if (node->next) | |
1865 node->next->prev = node->prev; | |
1866 | |
10704 | 1867 gaim_blist_schedule_save(); |
9285 | 1868 |
1869 /* Update the UI */ | |
1870 if (ops && ops->remove) | |
1871 ops->remove(gaimbuddylist, node); | |
1872 | |
1873 /* Remove the group from all accounts that are online */ | |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1874 for (l = gaim_connections_get_all(); l != NULL; l = l->next) |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1875 { |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1876 GaimConnection *gc = (GaimConnection *)l->data; |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1877 |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1878 if (gaim_connection_get_state(gc) == GAIM_CONNECTED) |
11643 | 1879 gaim_account_remove_group(gaim_connection_get_account(gc), group); |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1880 } |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1881 |
9285 | 1882 /* Delete the node */ |
10504 | 1883 g_hash_table_destroy(group->node.settings); |
5228 | 1884 g_free(group->name); |
11067 | 1885 GAIM_DBUS_UNREGISTER_POINTER(group); |
5228 | 1886 g_free(group); |
1887 } | |
1888 | |
9285 | 1889 GaimBuddy *gaim_contact_get_priority_buddy(GaimContact *contact) |
1890 { | |
1891 g_return_val_if_fail(contact != NULL, NULL); | |
1892 | |
10378 | 1893 if (!contact->priority_valid) |
1894 gaim_contact_compute_priority_buddy(contact); | |
1895 | |
6843 | 1896 return contact->priority; |
6695 | 1897 } |
1898 | |
9620 | 1899 const char *gaim_buddy_get_alias_only(GaimBuddy *buddy) |
9285 | 1900 { |
1901 g_return_val_if_fail(buddy != NULL, NULL); | |
1902 | |
1903 if ((buddy->alias != NULL) && (*buddy->alias != '\0')) { | |
1904 return buddy->alias; | |
1905 } else if ((buddy->server_alias != NULL) && | |
10389 | 1906 (*buddy->server_alias != '\0')) { |
9285 | 1907 |
1908 return buddy->server_alias; | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1909 } |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1910 |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1911 return NULL; |
5228 | 1912 } |
1913 | |
9620 | 1914 |
1915 const char *gaim_buddy_get_contact_alias(GaimBuddy *buddy) | |
5228 | 1916 { |
9620 | 1917 GaimContact *c; |
1918 | |
1919 g_return_val_if_fail(buddy != NULL, NULL); | |
1920 | |
1921 /* Search for an alias for the buddy. In order of precedence: */ | |
1922 /* The buddy alias */ | |
1923 if (buddy->alias != NULL) | |
1924 return buddy->alias; | |
1925 | |
1926 /* The contact alias */ | |
1927 c = gaim_buddy_get_contact(buddy); | |
1928 if ((c != NULL) && (c->alias != NULL)) | |
1929 return c->alias; | |
1930 | |
10349 | 1931 /* The server alias */ |
1932 if ((buddy->server_alias) && (*buddy->server_alias)) | |
9620 | 1933 return buddy->server_alias; |
1934 | |
1935 /* The buddy's user name (i.e. no alias) */ | |
1936 return buddy->name; | |
5228 | 1937 } |
1938 | |
9620 | 1939 |
1940 const char *gaim_buddy_get_alias(GaimBuddy *buddy) | |
1941 { | |
1942 g_return_val_if_fail(buddy != NULL, NULL); | |
1943 | |
1944 /* Search for an alias for the buddy. In order of precedence: */ | |
1945 /* The buddy alias */ | |
1946 if (buddy->alias != NULL) | |
1947 return buddy->alias; | |
1948 | |
11266 | 1949 /* The server alias */ |
10389 | 1950 if ((buddy->server_alias) && (*buddy->server_alias)) |
9620 | 1951 return buddy->server_alias; |
1952 | |
1953 /* The buddy's user name (i.e. no alias) */ | |
1954 return buddy->name; | |
1955 } | |
1956 | |
10349 | 1957 const char *gaim_buddy_get_local_alias(GaimBuddy *buddy) |
1958 { | |
1959 GaimContact *c; | |
1960 | |
1961 g_return_val_if_fail(buddy != NULL, NULL); | |
1962 | |
1963 /* Search for an alias for the buddy. In order of precedence: */ | |
1964 /* The buddy alias */ | |
1965 if (buddy->alias != NULL) | |
1966 return buddy->alias; | |
1967 | |
1968 /* The contact alias */ | |
1969 c = gaim_buddy_get_contact(buddy); | |
1970 if ((c != NULL) && (c->alias != NULL)) | |
1971 return c->alias; | |
1972 | |
1973 /* The buddy's user name (i.e. no alias) */ | |
1974 return buddy->name; | |
1975 } | |
9620 | 1976 |
7125 | 1977 const char *gaim_chat_get_name(GaimChat *chat) |
6744 | 1978 { |
9285 | 1979 struct proto_chat_entry *pce; |
1980 GList *parts, *tmp; | |
1981 char *ret; | |
1982 | |
1983 g_return_val_if_fail(chat != NULL, NULL); | |
1984 | |
1985 if ((chat->alias != NULL) && (*chat->alias != '\0')) | |
6744 | 1986 return chat->alias; |
9285 | 1987 |
1988 parts = GAIM_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); | |
1989 pce = parts->data; | |
1990 ret = g_hash_table_lookup(chat->components, pce->identifier); | |
1991 for (tmp = parts; tmp; tmp = tmp->next) | |
1992 g_free(tmp->data); | |
1993 g_list_free(parts); | |
1994 | |
1995 return ret; | |
6744 | 1996 } |
1997 | |
6695 | 1998 GaimBuddy *gaim_find_buddy(GaimAccount *account, const char *name) |
5228 | 1999 { |
6695 | 2000 GaimBuddy *buddy; |
5247 | 2001 struct _gaim_hbuddy hb; |
5758 | 2002 GaimBlistNode *group; |
5228 | 2003 |
9285 | 2004 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2005 g_return_val_if_fail(account != NULL, NULL); | |
2006 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
5228 | 2007 |
7429 | 2008 hb.account = account; |
7261 | 2009 hb.name = g_strdup(gaim_normalize(account, name)); |
7429 | 2010 |
9285 | 2011 for (group = gaimbuddylist->root; group; group = group->next) { |
5758 | 2012 hb.group = group; |
7162 | 2013 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb))) { |
2014 g_free(hb.name); | |
5758 | 2015 return buddy; |
7162 | 2016 } |
5758 | 2017 } |
7162 | 2018 g_free(hb.name); |
9285 | 2019 |
5758 | 2020 return NULL; |
5228 | 2021 } |
2022 | |
6872 | 2023 GaimBuddy *gaim_find_buddy_in_group(GaimAccount *account, const char *name, |
2024 GaimGroup *group) | |
2025 { | |
2026 struct _gaim_hbuddy hb; | |
7162 | 2027 GaimBuddy *ret; |
6872 | 2028 |
9285 | 2029 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2030 g_return_val_if_fail(account != NULL, NULL); | |
2031 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6872 | 2032 |
7261 | 2033 hb.name = g_strdup(gaim_normalize(account, name)); |
6872 | 2034 hb.account = account; |
2035 hb.group = (GaimBlistNode*)group; | |
2036 | |
7162 | 2037 ret = g_hash_table_lookup(gaimbuddylist->buddies, &hb); |
2038 g_free(hb.name); | |
9285 | 2039 |
7162 | 2040 return ret; |
6872 | 2041 } |
2042 | |
6245 | 2043 GSList *gaim_find_buddies(GaimAccount *account, const char *name) |
2044 { | |
2045 struct buddy *buddy; | |
2046 struct _gaim_hbuddy hb; | |
9285 | 2047 GaimBlistNode *node; |
6245 | 2048 GSList *ret = NULL; |
2049 | |
9285 | 2050 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2051 g_return_val_if_fail(account != NULL, NULL); | |
2052 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6245 | 2053 |
7261 | 2054 hb.name = g_strdup(gaim_normalize(account, name)); |
6245 | 2055 hb.account = account; |
2056 | |
9285 | 2057 for (node = gaimbuddylist->root; node != NULL; node = node->next) { |
2058 hb.group = node; | |
6245 | 2059 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) != NULL) |
2060 ret = g_slist_append(ret, buddy); | |
2061 } | |
7162 | 2062 g_free(hb.name); |
9285 | 2063 |
6245 | 2064 return ret; |
2065 } | |
2066 | |
6695 | 2067 GaimGroup *gaim_find_group(const char *name) |
5228 | 2068 { |
2069 GaimBlistNode *node; | |
9285 | 2070 |
2071 g_return_val_if_fail(gaimbuddylist != NULL, NULL); | |
2072 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
2073 | |
2074 for (node = gaimbuddylist->root; node != NULL; node = node->next) { | |
6695 | 2075 if (!strcmp(((GaimGroup *)node)->name, name)) |
2076 return (GaimGroup *)node; | |
5228 | 2077 } |
9285 | 2078 |
5228 | 2079 return NULL; |
2080 } | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2081 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2082 GaimChat * |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2083 gaim_blist_find_chat(GaimAccount *account, const char *name) |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2084 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2085 char *chat_name; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2086 GaimChat *chat; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2087 GaimPlugin *prpl; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2088 GaimPluginProtocolInfo *prpl_info = NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2089 struct proto_chat_entry *pce; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2090 GaimBlistNode *node, *group; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2091 GList *parts; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2092 |
9285 | 2093 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2094 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
2095 | |
2096 if (!gaim_account_is_connected(account)) | |
7970 | 2097 return NULL; |
2098 | |
7999 | 2099 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
2100 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
2101 | |
9285 | 2102 if (prpl_info->find_blist_chat != NULL) |
7999 | 2103 return prpl_info->find_blist_chat(account, name); |
2104 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2105 for (group = gaimbuddylist->root; group != NULL; group = group->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2106 for (node = group->child; node != NULL; node = node->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2107 if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2108 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2109 chat = (GaimChat*)node; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2110 |
9285 | 2111 if (account != chat->account) |
7970 | 2112 continue; |
2113 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2114 parts = prpl_info->chat_info( |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2115 gaim_account_get_connection(chat->account)); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2116 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2117 pce = parts->data; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2118 chat_name = g_hash_table_lookup(chat->components, |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2119 pce->identifier); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2120 |
9153 | 2121 if (chat->account == account && chat_name != NULL && |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2122 name != NULL && !strcmp(chat_name, name)) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2123 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2124 return chat; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2125 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2126 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2127 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2128 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2129 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2130 return NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2131 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2132 |
6695 | 2133 GaimGroup * |
7125 | 2134 gaim_chat_get_group(GaimChat *chat) |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2135 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2136 g_return_val_if_fail(chat != NULL, NULL); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2137 |
6695 | 2138 return (GaimGroup *)(((GaimBlistNode *)chat)->parent); |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2139 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2140 |
9285 | 2141 GaimContact *gaim_buddy_get_contact(GaimBuddy *buddy) |
2142 { | |
2143 g_return_val_if_fail(buddy != NULL, NULL); | |
2144 | |
2145 return (GaimContact*)((GaimBlistNode*)buddy)->parent; | |
2146 } | |
2147 | |
9949 | 2148 GaimPresence *gaim_buddy_get_presence(const GaimBuddy *buddy) |
2149 { | |
2150 g_return_val_if_fail(buddy != NULL, NULL); | |
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2151 return buddy->presence; |
9949 | 2152 } |
2153 | |
12088 | 2154 GaimGroup *gaim_buddy_get_group(GaimBuddy *buddy) |
5228 | 2155 { |
9285 | 2156 g_return_val_if_fail(buddy != NULL, NULL); |
6706
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2157 |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2158 if (((GaimBlistNode *)buddy)->parent == NULL) |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2159 return NULL; |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2160 |
6695 | 2161 return (GaimGroup *)(((GaimBlistNode*)buddy)->parent->parent); |
5228 | 2162 } |
2163 | |
9285 | 2164 GSList *gaim_group_get_accounts(GaimGroup *group) |
5228 | 2165 { |
2166 GSList *l = NULL; | |
6695 | 2167 GaimBlistNode *gnode, *cnode, *bnode; |
2168 | |
9285 | 2169 gnode = (GaimBlistNode *)group; |
2170 | |
2171 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
6695 | 2172 if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
9285 | 2173 if (!g_slist_find(l, ((GaimChat *)cnode)->account)) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2174 l = g_slist_append(l, ((GaimChat *)cnode)->account); |
9285 | 2175 } else if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { |
2176 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
2177 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
2178 if (!g_slist_find(l, ((GaimBuddy *)bnode)->account)) | |
6695 | 2179 l = g_slist_append(l, ((GaimBuddy *)bnode)->account); |
2180 } | |
2181 } | |
2182 } | |
5228 | 2183 } |
6695 | 2184 |
5228 | 2185 return l; |
2186 } | |
2187 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2188 void gaim_blist_add_account(GaimAccount *account) |
5234 | 2189 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2190 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 2191 GaimBlistNode *gnode, *cnode, *bnode; |
5234 | 2192 |
9285 | 2193 g_return_if_fail(gaimbuddylist != NULL); |
2194 | |
2195 if (!ops || !ops->update) | |
6695 | 2196 return; |
2197 | |
9285 | 2198 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
2199 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 2200 continue; |
9285 | 2201 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
2202 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6956 | 2203 gboolean recompute = FALSE; |
9285 | 2204 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
2205 if (GAIM_BLIST_NODE_IS_BUDDY(bnode) && | |
6695 | 2206 ((GaimBuddy*)bnode)->account == account) { |
6956 | 2207 recompute = TRUE; |
6695 | 2208 ((GaimContact*)cnode)->currentsize++; |
9285 | 2209 if (((GaimContact*)cnode)->currentsize == 1) |
6695 | 2210 ((GaimGroup*)gnode)->currentsize++; |
2211 ops->update(gaimbuddylist, bnode); | |
2212 } | |
2213 } | |
9285 | 2214 if (recompute || |
8960 | 2215 gaim_blist_node_get_bool(cnode, "show_offline")) { |
10378 | 2216 gaim_contact_invalidate_priority_buddy((GaimContact*)cnode); |
6956 | 2217 ops->update(gaimbuddylist, cnode); |
2218 } | |
9285 | 2219 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode) && |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2220 ((GaimChat*)cnode)->account == account) { |
6901 | 2221 ((GaimGroup *)gnode)->online++; |
2222 ((GaimGroup *)gnode)->currentsize++; | |
2223 ops->update(gaimbuddylist, cnode); | |
5234 | 2224 } |
2225 } | |
6695 | 2226 ops->update(gaimbuddylist, gnode); |
5234 | 2227 } |
2228 } | |
2229 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2230 void gaim_blist_remove_account(GaimAccount *account) |
5228 | 2231 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2232 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 2233 GaimBlistNode *gnode, *cnode, *bnode; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2234 GaimBuddy *buddy; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2235 GaimChat *chat; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2236 GaimContact *contact; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2237 GaimGroup *group; |
5234 | 2238 |
9285 | 2239 g_return_if_fail(gaimbuddylist != NULL); |
2240 | |
2241 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
2242 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 2243 continue; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2244 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2245 group = (GaimGroup *)gnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2246 |
9285 | 2247 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
2248 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
10727 | 2249 gboolean recompute = FALSE; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2250 contact = (GaimContact *)cnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2251 |
9285 | 2252 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
2253 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6695 | 2254 continue; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2255 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2256 buddy = (GaimBuddy *)bnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2257 if (account == buddy->account) { |
10557 | 2258 GaimPresence *presence; |
6957 | 2259 recompute = TRUE; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2260 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2261 presence = gaim_buddy_get_presence(buddy); |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2262 |
10728 | 2263 if(gaim_presence_is_online(presence)) { |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2264 contact->online--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2265 if (contact->online == 0) |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2266 group->online--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2267 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2268 gaim_blist_node_set_int(&buddy->node, |
10475 | 2269 "last_seen", time(NULL)); |
6695 | 2270 } |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2271 |
10728 | 2272 contact->currentsize--; |
2273 if (contact->currentsize == 0) | |
2274 group->currentsize--; | |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2275 |
10557 | 2276 gaim_presence_set_status_active(presence, "offline", TRUE); |
2277 | |
9285 | 2278 if (ops && ops->remove) |
6695 | 2279 ops->remove(gaimbuddylist, bnode); |
2280 } | |
5234 | 2281 } |
9285 | 2282 if (recompute) { |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2283 gaim_contact_invalidate_priority_buddy(contact); |
9285 | 2284 if (ops && ops->update) |
6983 | 2285 ops->update(gaimbuddylist, cnode); |
2286 } | |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2287 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2288 chat = (GaimChat *)cnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2289 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2290 if(chat->account == account) { |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2291 group->currentsize--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2292 group->online--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2293 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2294 if (ops && ops->remove) |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2295 ops->remove(gaimbuddylist, cnode); |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2296 } |
5228 | 2297 } |
2298 } | |
2299 } | |
2300 } | |
2301 | |
9285 | 2302 gboolean gaim_group_on_account(GaimGroup *g, GaimAccount *account) |
2303 { | |
9787 | 2304 GaimBlistNode *cnode; |
9285 | 2305 for (cnode = ((GaimBlistNode *)g)->child; cnode; cnode = cnode->next) { |
2306 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
9787 | 2307 if(gaim_contact_on_account((GaimContact *) cnode, account)) |
2308 return TRUE; | |
9285 | 2309 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2310 GaimChat *chat = (GaimChat *)cnode; |
9285 | 2311 if ((!account && gaim_account_is_connected(chat->account)) |
6695 | 2312 || chat->account == account) |
2313 return TRUE; | |
2314 } | |
5228 | 2315 } |
2316 return FALSE; | |
2317 } | |
2318 | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2319 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2320 gaim_blist_request_add_buddy(GaimAccount *account, const char *username, |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2321 const char *group, const char *alias) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2322 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2323 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2324 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2325 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2326 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2327 if (ui_ops != NULL && ui_ops->request_add_buddy != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2328 ui_ops->request_add_buddy(account, username, group, alias); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2329 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2330 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2331 void |
9754 | 2332 gaim_blist_request_add_chat(GaimAccount *account, GaimGroup *group, |
2333 const char *alias, const char *name) | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2334 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2335 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2336 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2337 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2338 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2339 if (ui_ops != NULL && ui_ops->request_add_chat != NULL) |
9754 | 2340 ui_ops->request_add_chat(account, group, alias, name); |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2341 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2342 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2343 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2344 gaim_blist_request_add_group(void) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2345 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2346 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2347 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2348 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2349 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2350 if (ui_ops != NULL && ui_ops->request_add_group != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2351 ui_ops->request_add_group(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2352 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2353 |
10430 | 2354 static void |
2355 gaim_blist_node_setting_free(gpointer data) | |
7693 | 2356 { |
10430 | 2357 GaimValue *value; |
2358 | |
2359 value = (GaimValue *)data; | |
2360 | |
2361 gaim_value_destroy(value); | |
7693 | 2362 } |
2363 | |
9285 | 2364 static void gaim_blist_node_initialize_settings(GaimBlistNode *node) |
7693 | 2365 { |
9285 | 2366 if (node->settings) |
5228 | 2367 return; |
7693 | 2368 |
2369 node->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
2370 (GDestroyNotify)gaim_blist_node_setting_free); | |
2371 } | |
2372 | |
2373 void gaim_blist_node_remove_setting(GaimBlistNode *node, const char *key) | |
2374 { | |
2375 g_return_if_fail(node != NULL); | |
2376 g_return_if_fail(node->settings != NULL); | |
2377 g_return_if_fail(key != NULL); | |
2378 | |
2379 g_hash_table_remove(node->settings, key); | |
9285 | 2380 |
10704 | 2381 gaim_blist_schedule_save(); |
5228 | 2382 } |
2383 | |
10430 | 2384 void |
10548 | 2385 gaim_blist_node_set_flags(GaimBlistNode *node, GaimBlistNodeFlags flags) |
2386 { | |
2387 g_return_if_fail(node != NULL); | |
2388 | |
2389 node->flags = flags; | |
2390 } | |
2391 | |
2392 GaimBlistNodeFlags | |
2393 gaim_blist_node_get_flags(GaimBlistNode *node) | |
2394 { | |
2395 g_return_val_if_fail(node != NULL, 0); | |
2396 | |
2397 return node->flags; | |
2398 } | |
2399 | |
2400 void | |
10430 | 2401 gaim_blist_node_set_bool(GaimBlistNode* node, const char *key, gboolean data) |
7693 | 2402 { |
10430 | 2403 GaimValue *value; |
7693 | 2404 |
2405 g_return_if_fail(node != NULL); | |
2406 g_return_if_fail(node->settings != NULL); | |
2407 g_return_if_fail(key != NULL); | |
2408 | |
10430 | 2409 value = gaim_value_new(GAIM_TYPE_BOOLEAN); |
2410 gaim_value_set_boolean(value, data); | |
2411 | |
2412 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2413 |
10704 | 2414 gaim_blist_schedule_save(); |
7693 | 2415 } |
2416 | |
10430 | 2417 gboolean |
2418 gaim_blist_node_get_bool(GaimBlistNode* node, const char *key) | |
7693 | 2419 { |
10430 | 2420 GaimValue *value; |
7693 | 2421 |
2422 g_return_val_if_fail(node != NULL, FALSE); | |
2423 g_return_val_if_fail(node->settings != NULL, FALSE); | |
2424 g_return_val_if_fail(key != NULL, FALSE); | |
2425 | |
10430 | 2426 value = g_hash_table_lookup(node->settings, key); |
2427 | |
2428 if (value == NULL) | |
7849 | 2429 return FALSE; |
2430 | |
10430 | 2431 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_BOOLEAN, FALSE); |
2432 | |
2433 return gaim_value_get_boolean(value); | |
5228 | 2434 } |
2435 | |
10430 | 2436 void |
2437 gaim_blist_node_set_int(GaimBlistNode* node, const char *key, int data) | |
7693 | 2438 { |
10430 | 2439 GaimValue *value; |
7693 | 2440 |
2441 g_return_if_fail(node != NULL); | |
2442 g_return_if_fail(node->settings != NULL); | |
2443 g_return_if_fail(key != NULL); | |
2444 | |
10430 | 2445 value = gaim_value_new(GAIM_TYPE_INT); |
2446 gaim_value_set_int(value, data); | |
2447 | |
2448 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2449 |
10704 | 2450 gaim_blist_schedule_save(); |
7693 | 2451 } |
2452 | |
10430 | 2453 int |
2454 gaim_blist_node_get_int(GaimBlistNode* node, const char *key) | |
7693 | 2455 { |
10430 | 2456 GaimValue *value; |
7693 | 2457 |
2458 g_return_val_if_fail(node != NULL, 0); | |
2459 g_return_val_if_fail(node->settings != NULL, 0); | |
2460 g_return_val_if_fail(key != NULL, 0); | |
2461 | |
10430 | 2462 value = g_hash_table_lookup(node->settings, key); |
2463 | |
2464 if (value == NULL) | |
7849 | 2465 return 0; |
2466 | |
10430 | 2467 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_INT, 0); |
2468 | |
2469 return gaim_value_get_int(value); | |
7693 | 2470 } |
2471 | |
10430 | 2472 void |
2473 gaim_blist_node_set_string(GaimBlistNode* node, const char *key, const char *data) | |
5906 | 2474 { |
10430 | 2475 GaimValue *value; |
7693 | 2476 |
2477 g_return_if_fail(node != NULL); | |
2478 g_return_if_fail(node->settings != NULL); | |
2479 g_return_if_fail(key != NULL); | |
2480 | |
10430 | 2481 value = gaim_value_new(GAIM_TYPE_STRING); |
2482 gaim_value_set_string(value, data); | |
2483 | |
2484 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2485 |
10704 | 2486 gaim_blist_schedule_save(); |
7693 | 2487 } |
2488 | |
10430 | 2489 const char * |
2490 gaim_blist_node_get_string(GaimBlistNode* node, const char *key) | |
7693 | 2491 { |
10430 | 2492 GaimValue *value; |
7693 | 2493 |
2494 g_return_val_if_fail(node != NULL, NULL); | |
2495 g_return_val_if_fail(node->settings != NULL, NULL); | |
2496 g_return_val_if_fail(key != NULL, NULL); | |
2497 | |
10430 | 2498 value = g_hash_table_lookup(node->settings, key); |
2499 | |
2500 if (value == NULL) | |
7849 | 2501 return NULL; |
2502 | |
10430 | 2503 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_STRING, NULL); |
2504 | |
2505 return gaim_value_get_string(value); | |
7693 | 2506 } |
2507 | |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2508 GList * |
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2509 gaim_blist_node_get_extended_menu(GaimBlistNode *n) |
7693 | 2510 { |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2511 GList *menu = NULL; |
9030 | 2512 |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2513 g_return_val_if_fail(n != NULL, NULL); |
9030 | 2514 |
2515 gaim_signal_emit(gaim_blist_get_handle(), | |
2516 "blist-node-extended-menu", | |
2517 n, &menu); | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2518 return menu; |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2519 } |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2520 |
9030 | 2521 GaimBlistNodeAction * |
2522 gaim_blist_node_action_new(char *label, | |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2523 void (*callback)(GaimBlistNode *, gpointer), |
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2524 gpointer data, GList *children) |
9030 | 2525 { |
2526 GaimBlistNodeAction *act = g_new0(GaimBlistNodeAction, 1); | |
2527 act->label = label; | |
2528 act->callback = callback; | |
2529 act->data = data; | |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2530 act->children = children; |
9030 | 2531 return act; |
8952 | 2532 } |
2533 | |
9285 | 2534 int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) |
2535 { | |
2536 if (!group) | |
5228 | 2537 return 0; |
2538 | |
5277 | 2539 return offline ? group->totalsize : group->currentsize; |
5228 | 2540 } |
2541 | |
9285 | 2542 int gaim_blist_get_group_online_count(GaimGroup *group) |
2543 { | |
2544 if (!group) | |
5228 | 2545 return 0; |
2546 | |
5277 | 2547 return group->online; |
5228 | 2548 } |
2549 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2550 void |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2551 gaim_blist_set_ui_ops(GaimBlistUiOps *ops) |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2552 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2553 blist_ui_ops = ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2554 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2555 |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2556 GaimBlistUiOps * |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2557 gaim_blist_get_ui_ops(void) |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2558 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2559 return blist_ui_ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2560 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2561 |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2562 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2563 void * |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2564 gaim_blist_get_handle(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2565 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2566 static int handle; |
5228 | 2567 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2568 return &handle; |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2569 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2570 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2571 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2572 gaim_blist_init(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2573 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2574 void *handle = gaim_blist_get_handle(); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2575 |
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2576 gaim_signal_register(handle, "buddy-status-changed", |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2577 gaim_marshal_VOID__POINTER_POINTER_POINTER, NULL, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2578 3, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2579 gaim_value_new(GAIM_TYPE_SUBTYPE, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2580 GAIM_SUBTYPE_BLIST_BUDDY), |
11979
717cbb3115bc
[gaim-migrate @ 14272]
Gary Kramlich <grim@reaperworld.com>
parents:
11935
diff
changeset
|
2581 gaim_value_new(GAIM_TYPE_SUBTYPE, |
12097 | 2582 GAIM_SUBTYPE_STATUS), |
11979
717cbb3115bc
[gaim-migrate @ 14272]
Gary Kramlich <grim@reaperworld.com>
parents:
11935
diff
changeset
|
2583 gaim_value_new(GAIM_TYPE_SUBTYPE, |
12097 | 2584 GAIM_SUBTYPE_STATUS)); |
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2585 |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2586 gaim_signal_register(handle, "buddy-idle-changed", |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2587 gaim_marshal_VOID__POINTER_INT_INT, NULL, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2588 3, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2589 gaim_value_new(GAIM_TYPE_SUBTYPE, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2590 GAIM_SUBTYPE_BLIST_BUDDY), |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2591 gaim_value_new(GAIM_TYPE_INT), |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2592 gaim_value_new(GAIM_TYPE_INT)); |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2593 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2594 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2595 gaim_signal_register(handle, "buddy-signed-on", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2596 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2597 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2598 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2599 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2600 gaim_signal_register(handle, "buddy-signed-off", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2601 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2602 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2603 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2604 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2605 gaim_signal_register(handle, "buddy-added", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2606 gaim_marshal_VOID__POINTER, NULL, 1, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2607 gaim_value_new(GAIM_TYPE_SUBTYPE, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2608 GAIM_SUBTYPE_BLIST_BUDDY)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2609 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2610 gaim_signal_register(handle, "buddy-removed", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2611 gaim_marshal_VOID__POINTER, NULL, 1, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2612 gaim_value_new(GAIM_TYPE_SUBTYPE, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2613 GAIM_SUBTYPE_BLIST_BUDDY)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2614 |
12097 | 2615 gaim_signal_register(handle, "buddy-icon-changed", |
2616 gaim_marshal_VOID__POINTER, NULL, 1, | |
2617 gaim_value_new(GAIM_TYPE_SUBTYPE, | |
2618 GAIM_SUBTYPE_BLIST_BUDDY)); | |
2619 | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2620 gaim_signal_register(handle, "update-idle", gaim_marshal_VOID, NULL, 0); |
9030 | 2621 |
2622 gaim_signal_register(handle, "blist-node-extended-menu", | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2623 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2624 gaim_value_new(GAIM_TYPE_SUBTYPE, |
9030 | 2625 GAIM_SUBTYPE_BLIST_NODE), |
8952 | 2626 gaim_value_new(GAIM_TYPE_BOXED, "GList **")); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2627 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2628 gaim_signal_register(handle, "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2629 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2630 gaim_value_new(GAIM_TYPE_SUBTYPE, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2631 GAIM_SUBTYPE_BLIST_NODE), |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2632 gaim_value_new(GAIM_TYPE_STRING)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2633 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2634 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2635 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2636 gaim_blist_uninit(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2637 { |
10428 | 2638 if (save_timer != 0) |
2639 { | |
2640 gaim_timeout_remove(save_timer); | |
2641 save_timer = 0; | |
9285 | 2642 gaim_blist_sync(); |
2643 } | |
2644 | |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2645 gaim_signals_unregister_by_instance(gaim_blist_get_handle()); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2646 } |