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