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