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