Mercurial > pidgin
annotate src/blist.c @ 10654:f2e86683cafc
[gaim-migrate @ 12182]
sf patch #1152664, from Richard Laager
This patches does three things:
First, it uses aliases in file transfer messages
whenever possible.
Second, it fixes the case where file transfer
completion messages are not showing for MSN.
Third, it makes the wording more consistent:
Canceled is used to describe cases when the file
transfer was actively canceled by either party.
Failed is used otherwise. Aborted is no longer
used at all. Previously, aborted was used in
some places while failed was used under the
same circumstances in other places. Also,
in the file transfer box, canceled was used in
one place for remotely or locally canceled
files while in another place in the same box
canceled was only used for locally canceled
files (failed was used for remotely canceled
files).
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 06 Mar 2005 00:23:54 +0000 |
parents | 54f7939df8e3 |
children | 54ac161a876e |
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_icon(GaimBuddy *buddy) |
5228 | 805 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
806 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 807 |
808 g_return_if_fail(buddy != NULL); | |
809 | |
810 if (ops && ops->update) | |
811 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
812 } | |
813 | |
814 /* | |
10428 | 815 * TODO: Maybe remove the call to this from server.c and call it |
9285 | 816 * from oscar.c and toc.c instead? |
817 */ | |
818 void gaim_blist_rename_buddy(GaimBuddy *buddy, const char *name) | |
819 { | |
820 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; | |
821 struct _gaim_hbuddy *hb; | |
822 | |
823 g_return_if_fail(buddy != NULL); | |
824 | |
825 hb = g_new(struct _gaim_hbuddy, 1); | |
8675 | 826 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
827 hb->account = buddy->account; | |
828 hb->group = ((GaimBlistNode *)buddy)->parent->parent; | |
829 g_hash_table_remove(gaimbuddylist->buddies, hb); | |
830 | |
831 g_free(hb->name); | |
832 hb->name = g_strdup(gaim_normalize(buddy->account, name)); | |
833 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); | |
834 | |
5634 | 835 g_free(buddy->name); |
5228 | 836 buddy->name = g_strdup(name); |
9285 | 837 |
838 schedule_blist_save(); | |
839 | |
840 if (ops && ops->update) | |
841 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 842 } |
5234 | 843 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
844 void gaim_blist_alias_chat(GaimChat *chat, const char *alias) |
5234 | 845 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
846 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5234 | 847 |
9285 | 848 g_return_if_fail(chat != NULL); |
849 | |
5237 | 850 g_free(chat->alias); |
9285 | 851 if ((alias != NULL) && (*alias != '\0')) |
5237 | 852 chat->alias = g_strdup(alias); |
853 else | |
854 chat->alias = NULL; | |
855 | |
9285 | 856 schedule_blist_save(); |
857 | |
858 if (ops && ops->update) | |
859 ops->update(gaimbuddylist, (GaimBlistNode *)chat); | |
5234 | 860 } |
861 | |
9285 | 862 void gaim_blist_alias_buddy(GaimBuddy *buddy, const char *alias) |
5228 | 863 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
864 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5634
diff
changeset
|
865 GaimConversation *conv; |
5228 | 866 |
9285 | 867 g_return_if_fail(buddy != NULL); |
868 | |
5228 | 869 g_free(buddy->alias); |
9285 | 870 if ((alias != NULL) && (*alias != '\0')) |
5228 | 871 buddy->alias = g_strdup(alias); |
872 else | |
873 buddy->alias = NULL; | |
874 | |
9285 | 875 schedule_blist_save(); |
876 | |
877 if (ops && ops->update) | |
878 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 879 |
10246 | 880 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, buddy->name, |
881 buddy->account); | |
5228 | 882 if (conv) |
883 gaim_conversation_autoset_title(conv); | |
884 } | |
885 | |
9285 | 886 void gaim_blist_server_alias_buddy(GaimBuddy *buddy, const char *alias) |
6058 | 887 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
888 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6058 | 889 GaimConversation *conv; |
890 | |
9285 | 891 g_return_if_fail(buddy != NULL); |
892 | |
6058 | 893 g_free(buddy->server_alias); |
9285 | 894 if ((alias != NULL) && (*alias != '\0') && g_utf8_validate(alias, -1, NULL)) |
6058 | 895 buddy->server_alias = g_strdup(alias); |
896 else | |
897 buddy->server_alias = NULL; | |
898 | |
9285 | 899 schedule_blist_save(); |
900 | |
901 if (ops && ops->update) | |
902 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
6058 | 903 |
10246 | 904 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, buddy->name, |
905 buddy->account); | |
6058 | 906 if (conv) |
907 gaim_conversation_autoset_title(conv); | |
908 } | |
909 | |
9285 | 910 /* |
10428 | 911 * TODO: If merging, prompt the user if they want to merge. |
9285 | 912 */ |
913 void gaim_blist_rename_group(GaimGroup *source, const char *new_name) | |
5228 | 914 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
915 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 916 GaimGroup *dest; |
917 gchar *old_name; | |
918 GList *moved_buddies = NULL; | |
5346 | 919 GSList *accts; |
920 | |
9285 | 921 g_return_if_fail(source != NULL); |
922 g_return_if_fail(new_name != NULL); | |
923 | |
924 if (*new_name == '\0' || !strcmp(new_name, source->name)) | |
5346 | 925 return; |
9285 | 926 |
927 dest = gaim_find_group(new_name); | |
928 if (dest != NULL) { | |
929 /* We're merging two groups */ | |
930 GaimBlistNode *prev, *child, *next; | |
931 | |
932 prev = gaim_blist_get_last_child((GaimBlistNode*)dest); | |
933 child = ((GaimBlistNode*)source)->child; | |
934 | |
935 /* | |
10428 | 936 * TODO: This seems like a dumb way to do this... why not just |
9285 | 937 * append all children from the old group to the end of the new |
938 * one? PRPLs might be expecting to receive an add_buddy() for | |
939 * each moved buddy... | |
940 */ | |
941 while (child) | |
5346 | 942 { |
943 next = child->next; | |
9285 | 944 if (GAIM_BLIST_NODE_IS_CONTACT(child)) { |
6695 | 945 GaimBlistNode *bnode; |
9285 | 946 gaim_blist_add_contact((GaimContact *)child, dest, prev); |
947 for (bnode = child->child; bnode != NULL; bnode = bnode->next) { | |
948 gaim_blist_add_buddy((GaimBuddy *)bnode, (GaimContact *)child, | |
6695 | 949 NULL, bnode->prev); |
9285 | 950 moved_buddies = g_list_append(moved_buddies, bnode); |
951 } | |
5346 | 952 prev = child; |
9285 | 953 } else if (GAIM_BLIST_NODE_IS_CHAT(child)) { |
954 gaim_blist_add_chat((GaimChat *)child, dest, prev); | |
5346 | 955 prev = child; |
956 } else { | |
957 gaim_debug(GAIM_DEBUG_ERROR, "blist", | |
9285 | 958 "Unknown child type in group %s\n", source->name); |
5346 | 959 } |
960 child = next; | |
961 } | |
9285 | 962 |
963 /* Make a copy of the old group name and then delete the old group */ | |
964 old_name = g_strdup(source->name); | |
965 gaim_blist_remove_group(source); | |
5346 | 966 } else { |
9285 | 967 /* A simple rename */ |
968 GaimBlistNode *cnode, *bnode; | |
969 | |
970 /* Build a GList of all buddies in this group */ | |
971 for (cnode = ((GaimBlistNode *)source)->child; cnode != NULL; cnode = cnode->next) { | |
972 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
973 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) | |
974 moved_buddies = g_list_append(moved_buddies, bnode); | |
5346 | 975 } |
9285 | 976 |
977 old_name = source->name; | |
978 source->name = g_strdup(new_name); | |
979 | |
5346 | 980 } |
9285 | 981 |
982 /* Save our changes */ | |
983 schedule_blist_save(); | |
984 | |
985 /* Update the UI */ | |
986 if (ops && ops->update) | |
987 ops->update(gaimbuddylist, (GaimBlistNode*)source); | |
988 | |
989 /* Notify all PRPLs */ | |
990 for (accts = gaim_group_get_accounts(source); accts; accts = g_slist_remove(accts, accts->data)) { | |
991 GaimAccount *account = accts->data; | |
992 serv_rename_group(account->gc, old_name, source, moved_buddies); | |
993 } | |
994 g_list_free(moved_buddies); | |
995 g_free(old_name); | |
5228 | 996 } |
5234 | 997 |
9285 | 998 static void gaim_blist_node_initialize_settings(GaimBlistNode *node); |
7693 | 999 |
7125 | 1000 GaimChat *gaim_chat_new(GaimAccount *account, const char *alias, GHashTable *components) |
5234 | 1001 { |
9285 | 1002 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1003 GaimChat *chat; |
9285 | 1004 |
1005 g_return_val_if_fail(account != NULL, FALSE); | |
1006 g_return_val_if_fail(components != NULL, FALSE); | |
5234 | 1007 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1008 chat = g_new0(GaimChat, 1); |
5234 | 1009 chat->account = account; |
9285 | 1010 if ((alias != NULL) && (*alias != '\0')) |
5237 | 1011 chat->alias = g_strdup(alias); |
5234 | 1012 chat->components = components; |
9285 | 1013 gaim_blist_node_initialize_settings((GaimBlistNode *)chat); |
1014 ((GaimBlistNode *)chat)->type = GAIM_BLIST_CHAT_NODE; | |
5234 | 1015 |
1016 if (ops != NULL && ops->new_node != NULL) | |
1017 ops->new_node((GaimBlistNode *)chat); | |
1018 | |
1019 return chat; | |
1020 } | |
1021 | |
7125 | 1022 char *gaim_chat_get_display_name(GaimChat *chat) |
6034 | 1023 { |
1024 char *name; | |
1025 | |
9285 | 1026 g_return_val_if_fail(chat != NULL, FALSE); |
1027 | |
1028 if (chat->alias != NULL) { | |
6034 | 1029 name = g_strdup(chat->alias); |
9285 | 1030 } else { |
6034 | 1031 GList *parts; |
1032 GaimPlugin *prpl; | |
1033 GaimPluginProtocolInfo *prpl_info; | |
1034 struct proto_chat_entry *pce; | |
1035 | |
7956 | 1036 prpl = gaim_find_prpl(gaim_account_get_protocol_id(chat->account)); |
6034 | 1037 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
1038 | |
1039 parts = prpl_info->chat_info(chat->account->gc); | |
1040 | |
1041 pce = parts->data; | |
1042 name = g_markup_escape_text(g_hash_table_lookup(chat->components, | |
1043 pce->identifier), -1); | |
1044 g_list_free(parts); | |
1045 } | |
1046 | |
1047 return name; | |
1048 } | |
1049 | |
6695 | 1050 GaimBuddy *gaim_buddy_new(GaimAccount *account, const char *screenname, const char *alias) |
5228 | 1051 { |
9285 | 1052 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
1053 GaimBuddy *buddy; | |
1054 | |
1055 g_return_val_if_fail(account != NULL, FALSE); | |
1056 g_return_val_if_fail(screenname != NULL, FALSE); | |
1057 | |
1058 buddy = g_new0(GaimBuddy, 1); | |
9949 | 1059 buddy->account = account; |
1060 buddy->name = g_strdup(screenname); | |
1061 buddy->alias = g_strdup(alias); | |
1062 buddy->presence = gaim_presence_new_for_buddy(buddy); | |
1063 | |
10052 | 1064 gaim_presence_set_status_active(buddy->presence, "offline", TRUE); |
1065 | |
9285 | 1066 gaim_blist_node_initialize_settings((GaimBlistNode *)buddy); |
1067 ((GaimBlistNode *)buddy)->type = GAIM_BLIST_BUDDY_NODE; | |
1068 | |
1069 if (ops && ops->new_node) | |
1070 ops->new_node((GaimBlistNode *)buddy); | |
1071 | |
1072 return buddy; | |
5228 | 1073 } |
5634 | 1074 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1075 void |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1076 gaim_buddy_set_icon(GaimBuddy *buddy, GaimBuddyIcon *icon) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1077 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1078 g_return_if_fail(buddy != NULL); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1079 |
9261
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
1080 if (buddy->icon != icon) |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
1081 { |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
1082 if (buddy->icon != NULL) |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
1083 gaim_buddy_icon_unref(buddy->icon); |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
1084 |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
1085 buddy->icon = (icon == NULL ? NULL : gaim_buddy_icon_ref(icon)); |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
1086 } |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1087 |
9324 | 1088 if (buddy->icon) |
1089 gaim_buddy_icon_cache(icon, buddy); | |
1090 else | |
1091 gaim_blist_node_remove_setting((GaimBlistNode *)buddy, "buddy_icon"); | |
9299 | 1092 |
1093 schedule_blist_save(); | |
9926 | 1094 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1095 gaim_blist_update_buddy_icon(buddy); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1096 } |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1097 |
10037
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1098 GaimAccount * |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1099 gaim_buddy_get_account(const GaimBuddy *buddy) |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1100 { |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1101 g_return_val_if_fail(buddy != NULL, NULL); |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1102 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1103 return buddy->account; |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1104 } |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1105 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1106 const char * |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1107 gaim_buddy_get_name(const GaimBuddy *buddy) |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1108 { |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1109 g_return_val_if_fail(buddy != NULL, NULL); |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1110 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1111 return buddy->name; |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1112 } |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1113 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1114 GaimBuddyIcon * |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1115 gaim_buddy_get_icon(const GaimBuddy *buddy) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1116 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1117 g_return_val_if_fail(buddy != NULL, NULL); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1118 |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1119 return buddy->icon; |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1120 } |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1121 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1122 void gaim_blist_add_chat(GaimChat *chat, GaimGroup *group, GaimBlistNode *node) |
5234 | 1123 { |
9285 | 1124 GaimBlistNode *cnode = (GaimBlistNode*)chat; |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1125 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6774 | 1126 |
1127 g_return_if_fail(chat != NULL); | |
9285 | 1128 g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT((GaimBlistNode *)chat)); |
1129 | |
1130 if (node == NULL) { | |
1131 if (group == NULL) { | |
1132 group = gaim_group_new(_("Chats")); | |
1133 gaim_blist_add_group(group, | |
5634 | 1134 gaim_blist_get_last_sibling(gaimbuddylist->root)); |
5234 | 1135 } |
1136 } else { | |
9285 | 1137 group = (GaimGroup*)node->parent; |
5234 | 1138 } |
1139 | |
1140 /* if we're moving to overtop of ourselves, do nothing */ | |
9285 | 1141 if (cnode == node) |
5234 | 1142 return; |
1143 | |
1144 if (cnode->parent) { | |
1145 /* This chat was already in the list and is | |
1146 * being moved. | |
1147 */ | |
6695 | 1148 ((GaimGroup *)cnode->parent)->totalsize--; |
5855 | 1149 if (gaim_account_is_connected(chat->account)) { |
6695 | 1150 ((GaimGroup *)cnode->parent)->online--; |
1151 ((GaimGroup *)cnode->parent)->currentsize--; | |
5287 | 1152 } |
9285 | 1153 if (cnode->next) |
5234 | 1154 cnode->next->prev = cnode->prev; |
9285 | 1155 if (cnode->prev) |
5234 | 1156 cnode->prev->next = cnode->next; |
9285 | 1157 if (cnode->parent->child == cnode) |
5234 | 1158 cnode->parent->child = cnode->next; |
1159 | |
1160 ops->remove(gaimbuddylist, cnode); | |
1161 | |
9285 | 1162 schedule_blist_save(); |
5234 | 1163 } |
1164 | |
9285 | 1165 if (node != NULL) { |
1166 if (node->next) | |
1167 node->next->prev = cnode; | |
1168 cnode->next = node->next; | |
1169 cnode->prev = node; | |
1170 cnode->parent = node->parent; | |
1171 node->next = cnode; | |
1172 ((GaimGroup *)node->parent)->totalsize++; | |
5855 | 1173 if (gaim_account_is_connected(chat->account)) { |
9285 | 1174 ((GaimGroup *)node->parent)->online++; |
1175 ((GaimGroup *)node->parent)->currentsize++; | |
5287 | 1176 } |
5234 | 1177 } else { |
9285 | 1178 if (((GaimBlistNode *)group)->child) |
1179 ((GaimBlistNode *)group)->child->prev = cnode; | |
1180 cnode->next = ((GaimBlistNode *)group)->child; | |
5634 | 1181 cnode->prev = NULL; |
9285 | 1182 ((GaimBlistNode *)group)->child = cnode; |
1183 cnode->parent = (GaimBlistNode *)group; | |
1184 group->totalsize++; | |
5855 | 1185 if (gaim_account_is_connected(chat->account)) { |
9285 | 1186 group->online++; |
1187 group->currentsize++; | |
5287 | 1188 } |
5234 | 1189 } |
1190 | |
9285 | 1191 schedule_blist_save(); |
1192 | |
1193 if (ops && ops->update) | |
1194 ops->update(gaimbuddylist, (GaimBlistNode *)cnode); | |
5234 | 1195 } |
1196 | |
7879 | 1197 void gaim_blist_add_buddy(GaimBuddy *buddy, GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
5228 | 1198 { |
6695 | 1199 GaimBlistNode *cnode, *bnode; |
1200 GaimGroup *g; | |
1201 GaimContact *c; | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1202 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5247 | 1203 struct _gaim_hbuddy *hb; |
6695 | 1204 |
1205 g_return_if_fail(buddy != NULL); | |
6774 | 1206 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY((GaimBlistNode*)buddy)); |
6695 | 1207 |
1208 bnode = (GaimBlistNode *)buddy; | |
5228 | 1209 |
6695 | 1210 /* if we're moving to overtop of ourselves, do nothing */ |
9285 | 1211 if (bnode == node || (!node && bnode->parent && |
6695 | 1212 contact && bnode->parent == (GaimBlistNode*)contact |
1213 && bnode == bnode->parent->child)) | |
1214 return; | |
1215 | |
9285 | 1216 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
6695 | 1217 c = (GaimContact*)node->parent; |
1218 g = (GaimGroup*)node->parent->parent; | |
9285 | 1219 } else if (contact) { |
6695 | 1220 c = contact; |
9285 | 1221 g = (GaimGroup *)((GaimBlistNode *)c)->parent; |
1222 } else { | |
1223 if (group) { | |
6695 | 1224 g = group; |
1225 } else { | |
5228 | 1226 g = gaim_group_new(_("Buddies")); |
5634 | 1227 gaim_blist_add_group(g, |
1228 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
5228 | 1229 } |
6695 | 1230 c = gaim_contact_new(); |
1231 gaim_blist_add_contact(c, g, | |
1232 gaim_blist_get_last_child((GaimBlistNode*)g)); | |
5228 | 1233 } |
1234 | |
6695 | 1235 cnode = (GaimBlistNode *)c; |
5228 | 1236 |
9285 | 1237 if (bnode->parent) { |
1238 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
6695 | 1239 ((GaimContact*)bnode->parent)->online--; |
9285 | 1240 if (((GaimContact*)bnode->parent)->online == 0) |
6695 | 1241 ((GaimGroup*)bnode->parent->parent)->online--; |
1242 } | |
9285 | 1243 if (gaim_account_is_connected(buddy->account)) { |
6695 | 1244 ((GaimContact*)bnode->parent)->currentsize--; |
9285 | 1245 if (((GaimContact*)bnode->parent)->currentsize == 0) |
6695 | 1246 ((GaimGroup*)bnode->parent->parent)->currentsize--; |
1247 } | |
1248 ((GaimContact*)bnode->parent)->totalsize--; | |
1249 /* the group totalsize will be taken care of by remove_contact below */ | |
1250 | |
9285 | 1251 if (bnode->parent->parent != (GaimBlistNode*)g) |
6695 | 1252 serv_move_buddy(buddy, (GaimGroup *)bnode->parent->parent, g); |
5277 | 1253 |
9285 | 1254 if (bnode->next) |
5228 | 1255 bnode->next->prev = bnode->prev; |
9285 | 1256 if (bnode->prev) |
5228 | 1257 bnode->prev->next = bnode->next; |
9285 | 1258 if (bnode->parent->child == bnode) |
5228 | 1259 bnode->parent->child = bnode->next; |
1260 | |
1261 ops->remove(gaimbuddylist, bnode); | |
1262 | |
9285 | 1263 schedule_blist_save(); |
1264 | |
1265 if (bnode->parent->parent != (GaimBlistNode*)g) { | |
6742 | 1266 hb = g_new(struct _gaim_hbuddy, 1); |
7261 | 1267 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
6742 | 1268 hb->account = buddy->account; |
1269 hb->group = bnode->parent->parent; | |
6775 | 1270 g_hash_table_remove(gaimbuddylist->buddies, hb); |
7162 | 1271 g_free(hb->name); |
6742 | 1272 g_free(hb); |
1273 } | |
6794 | 1274 |
9285 | 1275 if (!bnode->parent->child) { |
6794 | 1276 gaim_blist_remove_contact((GaimContact*)bnode->parent); |
7003 | 1277 } else { |
10378 | 1278 gaim_contact_invalidate_priority_buddy((GaimContact*)bnode->parent); |
7003 | 1279 ops->update(gaimbuddylist, bnode->parent); |
1280 } | |
5228 | 1281 } |
1282 | |
9285 | 1283 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
1284 if (node->next) | |
6695 | 1285 node->next->prev = bnode; |
1286 bnode->next = node->next; | |
1287 bnode->prev = node; | |
1288 bnode->parent = node->parent; | |
1289 node->next = bnode; | |
5228 | 1290 } else { |
9285 | 1291 if (cnode->child) |
6695 | 1292 cnode->child->prev = bnode; |
1293 bnode->prev = NULL; | |
1294 bnode->next = cnode->child; | |
1295 cnode->child = bnode; | |
1296 bnode->parent = cnode; | |
5228 | 1297 } |
1298 | |
9285 | 1299 if (GAIM_BUDDY_IS_ONLINE(buddy)) { |
6695 | 1300 ((GaimContact*)bnode->parent)->online++; |
9285 | 1301 if (((GaimContact*)bnode->parent)->online == 1) |
6695 | 1302 ((GaimGroup*)bnode->parent->parent)->online++; |
1303 } | |
9285 | 1304 if (gaim_account_is_connected(buddy->account)) { |
6695 | 1305 ((GaimContact*)bnode->parent)->currentsize++; |
9285 | 1306 if (((GaimContact*)bnode->parent)->currentsize == 1) |
6695 | 1307 ((GaimGroup*)bnode->parent->parent)->currentsize++; |
1308 } | |
1309 ((GaimContact*)bnode->parent)->totalsize++; | |
1310 | |
6742 | 1311 hb = g_new(struct _gaim_hbuddy, 1); |
7261 | 1312 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
5247 | 1313 hb->account = buddy->account; |
6695 | 1314 hb->group = ((GaimBlistNode*)buddy)->parent->parent; |
5247 | 1315 |
6742 | 1316 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); |
5247 | 1317 |
10378 | 1318 gaim_contact_invalidate_priority_buddy(gaim_buddy_get_contact(buddy)); |
9285 | 1319 |
1320 schedule_blist_save(); | |
1321 | |
1322 if (ops && ops->update) | |
5228 | 1323 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); |
1324 } | |
1325 | |
6695 | 1326 GaimContact *gaim_contact_new() |
5228 | 1327 { |
9285 | 1328 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
1329 | |
1330 GaimContact *contact = g_new0(GaimContact, 1); | |
1331 contact->totalsize = 0; | |
1332 contact->currentsize = 0; | |
1333 contact->online = 0; | |
1334 gaim_blist_node_initialize_settings((GaimBlistNode *)contact); | |
1335 ((GaimBlistNode *)contact)->type = GAIM_BLIST_CONTACT_NODE; | |
1336 | |
1337 if (ops && ops->new_node) | |
1338 ops->new_node((GaimBlistNode *)contact); | |
1339 | |
1340 return contact; | |
6695 | 1341 } |
1342 | |
9285 | 1343 void gaim_contact_set_alias(GaimContact *contact, const char *alias) |
6755 | 1344 { |
7245 | 1345 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
1346 | |
6755 | 1347 g_return_if_fail(contact != NULL); |
1348 | |
9285 | 1349 if (contact->alias != NULL) |
6755 | 1350 g_free(contact->alias); |
1351 | |
9285 | 1352 if ((alias != NULL) && (*alias != '\0')) |
7245 | 1353 contact->alias = g_strdup(alias); |
1354 else | |
1355 contact->alias = NULL; | |
1356 | |
9285 | 1357 schedule_blist_save(); |
1358 | |
1359 if (ops && ops->update) | |
7245 | 1360 ops->update(gaimbuddylist, (GaimBlistNode*)contact); |
6755 | 1361 } |
1362 | |
1363 const char *gaim_contact_get_alias(GaimContact* contact) | |
1364 { | |
9285 | 1365 g_return_val_if_fail(contact != NULL, NULL); |
1366 | |
1367 if (contact->alias) | |
7312 | 1368 return contact->alias; |
1369 | |
10378 | 1370 return gaim_buddy_get_alias(gaim_contact_get_priority_buddy(contact)); |
6755 | 1371 } |
1372 | |
9787 | 1373 gboolean gaim_contact_on_account(GaimContact *c, GaimAccount *account) |
1374 { | |
1375 GaimBlistNode *bnode, *cnode = (GaimBlistNode *) c; | |
1376 | |
1377 g_return_val_if_fail(c != NULL, FALSE); | |
1378 g_return_val_if_fail(account != NULL, FALSE); | |
1379 | |
1380 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
1381 GaimBuddy *buddy; | |
1382 | |
1383 if (! GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
1384 continue; | |
1385 | |
1386 buddy = (GaimBuddy *)bnode; | |
1387 if (buddy->account == account) | |
1388 return TRUE; | |
1389 } | |
1390 return FALSE; | |
1391 } | |
1392 | |
10428 | 1393 void gaim_contact_invalidate_priority_buddy(GaimContact *contact) |
1394 { | |
1395 g_return_if_fail(contact != NULL); | |
1396 | |
1397 contact->priority_valid = FALSE; | |
1398 } | |
1399 | |
6695 | 1400 GaimGroup *gaim_group_new(const char *name) |
1401 { | |
9285 | 1402 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
1403 GaimGroup *group = gaim_find_group(name); | |
1404 | |
1405 if (group != NULL) | |
1406 return group; | |
1407 | |
1408 group = g_new0(GaimGroup, 1); | |
1409 group->name = g_strdup(name); | |
1410 group->totalsize = 0; | |
1411 group->currentsize = 0; | |
1412 group->online = 0; | |
1413 gaim_blist_node_initialize_settings((GaimBlistNode *)group); | |
1414 ((GaimBlistNode *)group)->type = GAIM_BLIST_GROUP_NODE; | |
1415 | |
1416 if (ops && ops->new_node) | |
1417 ops->new_node((GaimBlistNode *)group); | |
1418 | |
1419 return group; | |
5228 | 1420 } |
1421 | |
6695 | 1422 void gaim_blist_add_contact(GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
1423 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1424 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 1425 GaimGroup *g; |
6742 | 1426 GaimBlistNode *gnode, *cnode, *bnode; |
6695 | 1427 |
6774 | 1428 g_return_if_fail(contact != NULL); |
1429 g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT((GaimBlistNode*)contact)); | |
6695 | 1430 |
9285 | 1431 if ((GaimBlistNode*)contact == node) |
6975 | 1432 return; |
1433 | |
9285 | 1434 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
6695 | 1435 GAIM_BLIST_NODE_IS_CHAT(node))) |
1436 g = (GaimGroup*)node->parent; | |
9285 | 1437 else if (group) |
6695 | 1438 g = group; |
1439 else { | |
1440 g = gaim_group_new(_("Buddies")); | |
1441 gaim_blist_add_group(g, | |
1442 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
1443 } | |
1444 | |
1445 gnode = (GaimBlistNode*)g; | |
1446 cnode = (GaimBlistNode*)contact; | |
1447 | |
9285 | 1448 if (cnode->parent) { |
1449 if (cnode->parent->child == cnode) | |
6731 | 1450 cnode->parent->child = cnode->next; |
9285 | 1451 if (cnode->prev) |
6695 | 1452 cnode->prev->next = cnode->next; |
9285 | 1453 if (cnode->next) |
6695 | 1454 cnode->next->prev = cnode->prev; |
1455 | |
9285 | 1456 if (cnode->parent != gnode) { |
9928 | 1457 bnode = cnode->child; |
1458 while (bnode) { | |
1459 GaimBlistNode *next_bnode = bnode->next; | |
6742 | 1460 GaimBuddy *b = (GaimBuddy*)bnode; |
1461 | |
1462 struct _gaim_hbuddy *hb = g_new(struct _gaim_hbuddy, 1); | |
7261 | 1463 hb->name = g_strdup(gaim_normalize(b->account, b->name)); |
6742 | 1464 hb->account = b->account; |
1465 hb->group = cnode->parent; | |
1466 | |
6776 | 1467 g_hash_table_remove(gaimbuddylist->buddies, hb); |
6742 | 1468 |
9285 | 1469 if (!gaim_find_buddy_in_group(b->account, b->name, g)) { |
8328 | 1470 hb->group = gnode; |
1471 g_hash_table_replace(gaimbuddylist->buddies, hb, b); | |
1472 | |
9285 | 1473 if (b->account->gc) |
1474 serv_move_buddy(b, (GaimGroup *)cnode->parent, g); | |
8328 | 1475 } else { |
9928 | 1476 gboolean empty_contact = FALSE; |
1477 | |
8328 | 1478 /* this buddy already exists in the group, so we're |
1479 * gonna delete it instead */ | |
1480 g_free(hb->name); | |
1481 g_free(hb); | |
9285 | 1482 if (b->account->gc) |
1483 serv_remove_buddy(b->account->gc, b, (GaimGroup *)cnode->parent); | |
1484 | |
1485 if (!cnode->child->next) | |
8328 | 1486 empty_contact = TRUE; |
1487 gaim_blist_remove_buddy(b); | |
9928 | 1488 |
1489 /** in gaim_blist_remove_buddy(), if the last buddy in a | |
1490 * contact is removed, the contact is cleaned up and | |
1491 * g_free'd, so we mustn't try to reference bnode->next */ | |
1492 if (empty_contact) | |
1493 return; | |
8328 | 1494 } |
9928 | 1495 bnode = next_bnode; |
6742 | 1496 } |
1497 } | |
9928 | 1498 |
1499 if (contact->online > 0) | |
1500 ((GaimGroup*)cnode->parent)->online--; | |
1501 if (contact->currentsize > 0) | |
1502 ((GaimGroup*)cnode->parent)->currentsize--; | |
1503 ((GaimGroup*)cnode->parent)->totalsize--; | |
1504 | |
1505 ops->remove(gaimbuddylist, cnode); | |
1506 | |
1507 schedule_blist_save(); | |
6695 | 1508 } |
1509 | |
9285 | 1510 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
6695 | 1511 GAIM_BLIST_NODE_IS_CHAT(node))) { |
9285 | 1512 if (node->next) |
6695 | 1513 node->next->prev = cnode; |
1514 cnode->next = node->next; | |
1515 cnode->prev = node; | |
1516 cnode->parent = node->parent; | |
1517 node->next = cnode; | |
1518 } else { | |
9285 | 1519 if (gnode->child) |
6695 | 1520 gnode->child->prev = cnode; |
1521 cnode->prev = NULL; | |
1522 cnode->next = gnode->child; | |
1523 gnode->child = cnode; | |
1524 cnode->parent = gnode; | |
1525 } | |
1526 | |
9285 | 1527 if (contact->online > 0) |
6695 | 1528 g->online++; |
9285 | 1529 if (contact->currentsize > 0) |
6695 | 1530 g->currentsize++; |
1531 g->totalsize++; | |
1532 | |
9285 | 1533 schedule_blist_save(); |
1534 | |
1535 if (ops && cnode->child) | |
6695 | 1536 ops->update(gaimbuddylist, cnode); |
6775 | 1537 |
9285 | 1538 for (bnode = cnode->child; bnode; bnode = bnode->next) |
6775 | 1539 ops->update(gaimbuddylist, bnode); |
6695 | 1540 } |
1541 | |
7246 | 1542 void gaim_blist_merge_contact(GaimContact *source, GaimBlistNode *node) |
6965 | 1543 { |
1544 GaimBlistNode *sourcenode = (GaimBlistNode*)source; | |
7246 | 1545 GaimBlistNode *targetnode; |
1546 GaimBlistNode *prev, *cur, *next; | |
1547 GaimContact *target; | |
1548 | |
9285 | 1549 g_return_if_fail(source != NULL); |
1550 g_return_if_fail(node != NULL); | |
1551 | |
1552 if (GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
1553 target = (GaimContact *)node; | |
7246 | 1554 prev = gaim_blist_get_last_child(node); |
9285 | 1555 } else if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
1556 target = (GaimContact *)node->parent; | |
7246 | 1557 prev = node; |
1558 } else { | |
6965 | 1559 return; |
7246 | 1560 } |
1561 | |
9285 | 1562 if (source == target || !target) |
7246 | 1563 return; |
1564 | |
9285 | 1565 targetnode = (GaimBlistNode *)target; |
7246 | 1566 next = sourcenode->child; |
1567 | |
9285 | 1568 while (next) { |
7246 | 1569 cur = next; |
1570 next = cur->next; | |
9285 | 1571 if (GAIM_BLIST_NODE_IS_BUDDY(cur)) { |
1572 gaim_blist_add_buddy((GaimBuddy *)cur, target, NULL, prev); | |
7246 | 1573 prev = cur; |
1574 } | |
6965 | 1575 } |
1576 } | |
1577 | |
9285 | 1578 void gaim_blist_add_group(GaimGroup *group, GaimBlistNode *node) |
5228 | 1579 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1580 GaimBlistUiOps *ops; |
5228 | 1581 GaimBlistNode *gnode = (GaimBlistNode*)group; |
1582 | |
6774 | 1583 g_return_if_fail(group != NULL); |
9285 | 1584 g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP((GaimBlistNode *)group)); |
1585 | |
5228 | 1586 ops = gaimbuddylist->ui_ops; |
1587 | |
1588 if (!gaimbuddylist->root) { | |
1589 gaimbuddylist->root = gnode; | |
1590 return; | |
1591 } | |
1592 | |
1593 /* if we're moving to overtop of ourselves, do nothing */ | |
9285 | 1594 if (gnode == node) |
5228 | 1595 return; |
1596 | |
1597 if (gaim_find_group(group->name)) { | |
1598 /* This is just being moved */ | |
1599 | |
9285 | 1600 ops->remove(gaimbuddylist, (GaimBlistNode *)group); |
1601 | |
1602 if (gnode == gaimbuddylist->root) | |
5228 | 1603 gaimbuddylist->root = gnode->next; |
9285 | 1604 if (gnode->prev) |
5228 | 1605 gnode->prev->next = gnode->next; |
9285 | 1606 if (gnode->next) |
5228 | 1607 gnode->next->prev = gnode->prev; |
1608 } | |
1609 | |
6695 | 1610 if (node && GAIM_BLIST_NODE_IS_GROUP(node)) { |
5634 | 1611 gnode->next = node->next; |
1612 gnode->prev = node; | |
9285 | 1613 if (node->next) |
5634 | 1614 node->next->prev = gnode; |
1615 node->next = gnode; | |
1616 } else { | |
9285 | 1617 if (gaimbuddylist->root) |
6807 | 1618 gaimbuddylist->root->prev = gnode; |
5634 | 1619 gnode->next = gaimbuddylist->root; |
1620 gnode->prev = NULL; | |
1621 gaimbuddylist->root = gnode; | |
1622 } | |
1623 | |
9285 | 1624 schedule_blist_save(); |
1625 | |
1626 if (ops && ops->update) { | |
5228 | 1627 ops->update(gaimbuddylist, gnode); |
9285 | 1628 for (node = gnode->child; node; node = node->next) |
5228 | 1629 ops->update(gaimbuddylist, node); |
1630 } | |
1631 } | |
1632 | |
9285 | 1633 void gaim_blist_remove_contact(GaimContact *contact) |
5228 | 1634 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1635 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1636 GaimBlistNode *node, *gnode; |
1637 | |
1638 g_return_if_fail(contact != NULL); | |
1639 | |
1640 node = (GaimBlistNode *)contact; | |
1641 gnode = node->parent; | |
1642 | |
1643 if (node->child) { | |
1644 /* | |
1645 * If this contact has children then remove them. When the last | |
10166 | 1646 * buddy is removed from the contact, the contact is automatically |
1647 * deleted. | |
9285 | 1648 */ |
10166 | 1649 while (node->child->next) { |
9285 | 1650 gaim_blist_remove_buddy((GaimBuddy*)node->child); |
6695 | 1651 } |
10166 | 1652 /* |
1653 * Remove the last buddy and trigger the deletion of the contact. | |
1654 * It would probably be cleaner if contact-deletion was done after | |
1655 * a timeout? Or if it had to be done manually, like below? | |
1656 */ | |
1657 gaim_blist_remove_buddy((GaimBuddy*)node->child); | |
6695 | 1658 } else { |
9285 | 1659 /* Remove the node from its parent */ |
1660 if (gnode->child == node) | |
1661 gnode->child = node->next; | |
1662 if (node->prev) | |
1663 node->prev->next = node->next; | |
1664 if (node->next) | |
1665 node->next->prev = node->prev; | |
1666 | |
1667 schedule_blist_save(); | |
1668 | |
1669 /* Update the UI */ | |
1670 if (ops && ops->remove) | |
1671 ops->remove(gaimbuddylist, node); | |
1672 | |
1673 /* Delete the node */ | |
10504 | 1674 g_hash_table_destroy(contact->node.settings); |
6695 | 1675 g_free(contact); |
1676 } | |
1677 } | |
1678 | |
9285 | 1679 void gaim_blist_remove_buddy(GaimBuddy *buddy) |
6695 | 1680 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1681 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1682 GaimBlistNode *node, *cnode, *gnode; |
1683 GaimContact *contact; | |
6695 | 1684 GaimGroup *group; |
6742 | 1685 struct _gaim_hbuddy hb; |
5228 | 1686 |
9285 | 1687 g_return_if_fail(buddy != NULL); |
1688 | |
1689 node = (GaimBlistNode *)buddy; | |
6695 | 1690 cnode = node->parent; |
9285 | 1691 gnode = cnode->parent; |
1692 contact = (GaimContact *)cnode; | |
1693 group = (GaimGroup *)gnode; | |
1694 | |
1695 /* Remove the node from its parent */ | |
5228 | 1696 if (node->prev) |
1697 node->prev->next = node->next; | |
1698 if (node->next) | |
1699 node->next->prev = node->prev; | |
9285 | 1700 if (cnode->child == node) |
6695 | 1701 cnode->child = node->next; |
9285 | 1702 |
1703 /* Adjust size counts */ | |
1704 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
1705 contact->online--; | |
1706 if (contact->online == 0) | |
1707 group->online--; | |
6695 | 1708 } |
9285 | 1709 if (gaim_account_is_connected(buddy->account)) { |
1710 contact->currentsize--; | |
1711 if (contact->currentsize == 0) | |
1712 group->currentsize--; | |
8194 | 1713 } |
9285 | 1714 contact->totalsize--; |
1715 | |
1716 schedule_blist_save(); | |
1717 | |
1718 /* Re-sort the contact */ | |
1719 if (contact->priority == buddy) { | |
10378 | 1720 gaim_contact_invalidate_priority_buddy(contact); |
9285 | 1721 if (ops && ops->update) |
1722 ops->update(gaimbuddylist, cnode); | |
1723 } | |
1724 | |
1725 /* Remove this buddy from the buddies hash table */ | |
7261 | 1726 hb.name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
5247 | 1727 hb.account = buddy->account; |
6695 | 1728 hb.group = ((GaimBlistNode*)buddy)->parent->parent; |
6742 | 1729 g_hash_table_remove(gaimbuddylist->buddies, &hb); |
7162 | 1730 g_free(hb.name); |
5247 | 1731 |
9285 | 1732 /* Update the UI */ |
1733 if (ops && ops->remove) | |
1734 ops->remove(gaimbuddylist, node); | |
1735 | |
1736 /* Delete the node */ | |
1737 if (buddy->timer > 0) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1738 gaim_timeout_remove(buddy->timer); |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1739 if (buddy->icon != NULL) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1740 gaim_buddy_icon_unref(buddy->icon); |
7693 | 1741 g_hash_table_destroy(buddy->node.settings); |
9944 | 1742 gaim_presence_remove_buddy(buddy->presence, buddy); |
1743 gaim_presence_destroy(buddy->presence); | |
5228 | 1744 g_free(buddy->name); |
1745 g_free(buddy->alias); | |
10504 | 1746 g_free(buddy->server_alias); |
5228 | 1747 g_free(buddy); |
6755 | 1748 |
9285 | 1749 /* If the contact is empty then remove it */ |
1750 if (!cnode->child) | |
1751 gaim_blist_remove_contact(contact); | |
5228 | 1752 } |
1753 | |
9285 | 1754 void gaim_blist_remove_chat(GaimChat *chat) |
5234 | 1755 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1756 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1757 GaimBlistNode *node, *gnode; |
6695 | 1758 GaimGroup *group; |
5234 | 1759 |
9285 | 1760 g_return_if_fail(chat != NULL); |
1761 | |
1762 node = (GaimBlistNode *)chat; | |
5234 | 1763 gnode = node->parent; |
6695 | 1764 group = (GaimGroup *)gnode; |
5234 | 1765 |
9285 | 1766 /* Remove the node from its parent */ |
1767 if (gnode->child == node) | |
5234 | 1768 gnode->child = node->next; |
1769 if (node->prev) | |
1770 node->prev->next = node->next; | |
1771 if (node->next) | |
1772 node->next->prev = node->prev; | |
9285 | 1773 |
1774 /* Adjust size counts */ | |
5855 | 1775 if (gaim_account_is_connected(chat->account)) { |
5394 | 1776 group->online--; |
9285 | 1777 group->currentsize--; |
5394 | 1778 } |
9285 | 1779 group->totalsize--; |
1780 | |
1781 schedule_blist_save(); | |
1782 | |
1783 /* Update the UI */ | |
1784 if (ops && ops->remove) | |
1785 ops->remove(gaimbuddylist, node); | |
1786 | |
1787 /* Delete the node */ | |
5234 | 1788 g_hash_table_destroy(chat->components); |
10504 | 1789 g_hash_table_destroy(chat->node.settings); |
5234 | 1790 g_free(chat->alias); |
1791 g_free(chat); | |
1792 } | |
1793 | |
9285 | 1794 void gaim_blist_remove_group(GaimGroup *group) |
5228 | 1795 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1796 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1797 GaimBlistNode *node; |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1798 GList *l; |
5228 | 1799 |
9285 | 1800 g_return_if_fail(group != NULL); |
1801 | |
1802 node = (GaimBlistNode *)group; | |
1803 | |
1804 /* Make sure the group is empty */ | |
1805 if (node->child) { | |
5228 | 1806 char *buf; |
1807 int count = 0; | |
9285 | 1808 GaimBlistNode *child; |
1809 | |
1810 for (child = node->child; child != NULL; child = child->next) | |
5228 | 1811 count++; |
1812 | |
6308 | 1813 buf = g_strdup_printf(ngettext("%d buddy from group %s was not removed " |
1814 "because its account was not logged in." | |
1815 " This buddy and the group were not " | |
1816 "removed.\n", | |
1817 "%d buddies from group %s were not " | |
1818 "removed because their accounts were " | |
6336 | 1819 "not logged in. These buddies and " |
1820 "the group were not removed.\n", count), | |
6308 | 1821 count, group->name); |
5541
aee0ee458974
[gaim-migrate @ 5941]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1822 gaim_notify_error(NULL, NULL, _("Group not removed"), buf); |
5228 | 1823 g_free(buf); |
1824 return; | |
1825 } | |
1826 | |
9285 | 1827 /* Remove the node from its parent */ |
1828 if (gaimbuddylist->root == node) | |
5228 | 1829 gaimbuddylist->root = node->next; |
1830 if (node->prev) | |
1831 node->prev->next = node->next; | |
1832 if (node->next) | |
1833 node->next->prev = node->prev; | |
1834 | |
9285 | 1835 schedule_blist_save(); |
1836 | |
1837 /* Update the UI */ | |
1838 if (ops && ops->remove) | |
1839 ops->remove(gaimbuddylist, node); | |
1840 | |
1841 /* Remove the group from all accounts that are online */ | |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1842 for (l = gaim_connections_get_all(); l != NULL; l = l->next) |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1843 { |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1844 GaimConnection *gc = (GaimConnection *)l->data; |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1845 |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1846 if (gaim_connection_get_state(gc) == GAIM_CONNECTED) |
9285 | 1847 serv_remove_group(gc, group); |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1848 } |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1849 |
9285 | 1850 /* Delete the node */ |
10504 | 1851 g_hash_table_destroy(group->node.settings); |
5228 | 1852 g_free(group->name); |
1853 g_free(group); | |
1854 } | |
1855 | |
9285 | 1856 GaimBuddy *gaim_contact_get_priority_buddy(GaimContact *contact) |
1857 { | |
1858 g_return_val_if_fail(contact != NULL, NULL); | |
1859 | |
10378 | 1860 if (!contact->priority_valid) |
1861 gaim_contact_compute_priority_buddy(contact); | |
1862 | |
6843 | 1863 return contact->priority; |
6695 | 1864 } |
1865 | |
9620 | 1866 const char *gaim_buddy_get_alias_only(GaimBuddy *buddy) |
9285 | 1867 { |
1868 g_return_val_if_fail(buddy != NULL, NULL); | |
1869 | |
1870 if ((buddy->alias != NULL) && (*buddy->alias != '\0')) { | |
1871 return buddy->alias; | |
1872 } else if ((buddy->server_alias != NULL) && | |
10389 | 1873 (*buddy->server_alias != '\0')) { |
9285 | 1874 |
1875 return buddy->server_alias; | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1876 } |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1877 |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1878 return NULL; |
5228 | 1879 } |
1880 | |
9620 | 1881 |
1882 const char *gaim_buddy_get_contact_alias(GaimBuddy *buddy) | |
5228 | 1883 { |
9620 | 1884 GaimContact *c; |
1885 | |
1886 g_return_val_if_fail(buddy != NULL, NULL); | |
1887 | |
1888 /* Search for an alias for the buddy. In order of precedence: */ | |
1889 /* The buddy alias */ | |
1890 if (buddy->alias != NULL) | |
1891 return buddy->alias; | |
1892 | |
1893 /* The contact alias */ | |
1894 c = gaim_buddy_get_contact(buddy); | |
1895 if ((c != NULL) && (c->alias != NULL)) | |
1896 return c->alias; | |
1897 | |
10349 | 1898 /* The server alias */ |
1899 if ((buddy->server_alias) && (*buddy->server_alias)) | |
9620 | 1900 return buddy->server_alias; |
1901 | |
1902 /* The buddy's user name (i.e. no alias) */ | |
1903 return buddy->name; | |
5228 | 1904 } |
1905 | |
9620 | 1906 |
1907 const char *gaim_buddy_get_alias(GaimBuddy *buddy) | |
1908 { | |
1909 g_return_val_if_fail(buddy != NULL, NULL); | |
1910 | |
1911 /* Search for an alias for the buddy. In order of precedence: */ | |
1912 /* The buddy alias */ | |
1913 if (buddy->alias != NULL) | |
1914 return buddy->alias; | |
1915 | |
1916 /* The server alias, if preferences say so */ | |
10389 | 1917 if ((buddy->server_alias) && (*buddy->server_alias)) |
9620 | 1918 return buddy->server_alias; |
1919 | |
1920 /* The buddy's user name (i.e. no alias) */ | |
1921 return buddy->name; | |
1922 } | |
1923 | |
10349 | 1924 const char *gaim_buddy_get_local_alias(GaimBuddy *buddy) |
1925 { | |
1926 GaimContact *c; | |
1927 | |
1928 g_return_val_if_fail(buddy != NULL, NULL); | |
1929 | |
1930 /* Search for an alias for the buddy. In order of precedence: */ | |
1931 /* The buddy alias */ | |
1932 if (buddy->alias != NULL) | |
1933 return buddy->alias; | |
1934 | |
1935 /* The contact alias */ | |
1936 c = gaim_buddy_get_contact(buddy); | |
1937 if ((c != NULL) && (c->alias != NULL)) | |
1938 return c->alias; | |
1939 | |
1940 /* The buddy's user name (i.e. no alias) */ | |
1941 return buddy->name; | |
1942 } | |
9620 | 1943 |
7125 | 1944 const char *gaim_chat_get_name(GaimChat *chat) |
6744 | 1945 { |
9285 | 1946 struct proto_chat_entry *pce; |
1947 GList *parts, *tmp; | |
1948 char *ret; | |
1949 | |
1950 g_return_val_if_fail(chat != NULL, NULL); | |
1951 | |
1952 if ((chat->alias != NULL) && (*chat->alias != '\0')) | |
6744 | 1953 return chat->alias; |
9285 | 1954 |
1955 parts = GAIM_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); | |
1956 pce = parts->data; | |
1957 ret = g_hash_table_lookup(chat->components, pce->identifier); | |
1958 for (tmp = parts; tmp; tmp = tmp->next) | |
1959 g_free(tmp->data); | |
1960 g_list_free(parts); | |
1961 | |
1962 return ret; | |
6744 | 1963 } |
1964 | |
6695 | 1965 GaimBuddy *gaim_find_buddy(GaimAccount *account, const char *name) |
5228 | 1966 { |
6695 | 1967 GaimBuddy *buddy; |
5247 | 1968 struct _gaim_hbuddy hb; |
5758 | 1969 GaimBlistNode *group; |
5228 | 1970 |
9285 | 1971 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
1972 g_return_val_if_fail(account != NULL, NULL); | |
1973 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
5228 | 1974 |
7429 | 1975 hb.account = account; |
7261 | 1976 hb.name = g_strdup(gaim_normalize(account, name)); |
7429 | 1977 |
9285 | 1978 for (group = gaimbuddylist->root; group; group = group->next) { |
5758 | 1979 hb.group = group; |
7162 | 1980 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb))) { |
1981 g_free(hb.name); | |
5758 | 1982 return buddy; |
7162 | 1983 } |
5758 | 1984 } |
7162 | 1985 g_free(hb.name); |
9285 | 1986 |
5758 | 1987 return NULL; |
5228 | 1988 } |
1989 | |
6872 | 1990 GaimBuddy *gaim_find_buddy_in_group(GaimAccount *account, const char *name, |
1991 GaimGroup *group) | |
1992 { | |
1993 struct _gaim_hbuddy hb; | |
7162 | 1994 GaimBuddy *ret; |
6872 | 1995 |
9285 | 1996 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
1997 g_return_val_if_fail(account != NULL, NULL); | |
1998 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6872 | 1999 |
7261 | 2000 hb.name = g_strdup(gaim_normalize(account, name)); |
6872 | 2001 hb.account = account; |
2002 hb.group = (GaimBlistNode*)group; | |
2003 | |
7162 | 2004 ret = g_hash_table_lookup(gaimbuddylist->buddies, &hb); |
2005 g_free(hb.name); | |
9285 | 2006 |
7162 | 2007 return ret; |
6872 | 2008 } |
2009 | |
6245 | 2010 GSList *gaim_find_buddies(GaimAccount *account, const char *name) |
2011 { | |
2012 struct buddy *buddy; | |
2013 struct _gaim_hbuddy hb; | |
9285 | 2014 GaimBlistNode *node; |
6245 | 2015 GSList *ret = NULL; |
2016 | |
9285 | 2017 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2018 g_return_val_if_fail(account != NULL, NULL); | |
2019 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6245 | 2020 |
7261 | 2021 hb.name = g_strdup(gaim_normalize(account, name)); |
6245 | 2022 hb.account = account; |
2023 | |
9285 | 2024 for (node = gaimbuddylist->root; node != NULL; node = node->next) { |
2025 hb.group = node; | |
6245 | 2026 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) != NULL) |
2027 ret = g_slist_append(ret, buddy); | |
2028 } | |
7162 | 2029 g_free(hb.name); |
9285 | 2030 |
6245 | 2031 return ret; |
2032 } | |
2033 | |
6695 | 2034 GaimGroup *gaim_find_group(const char *name) |
5228 | 2035 { |
2036 GaimBlistNode *node; | |
9285 | 2037 |
2038 g_return_val_if_fail(gaimbuddylist != NULL, NULL); | |
2039 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
2040 | |
2041 for (node = gaimbuddylist->root; node != NULL; node = node->next) { | |
6695 | 2042 if (!strcmp(((GaimGroup *)node)->name, name)) |
2043 return (GaimGroup *)node; | |
5228 | 2044 } |
9285 | 2045 |
5228 | 2046 return NULL; |
2047 } | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2048 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2049 GaimChat * |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2050 gaim_blist_find_chat(GaimAccount *account, const char *name) |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2051 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2052 char *chat_name; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2053 GaimChat *chat; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2054 GaimPlugin *prpl; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2055 GaimPluginProtocolInfo *prpl_info = NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2056 struct proto_chat_entry *pce; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2057 GaimBlistNode *node, *group; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2058 GList *parts; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2059 |
9285 | 2060 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2061 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
2062 | |
2063 if (!gaim_account_is_connected(account)) | |
7970 | 2064 return NULL; |
2065 | |
7999 | 2066 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
2067 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
2068 | |
9285 | 2069 if (prpl_info->find_blist_chat != NULL) |
7999 | 2070 return prpl_info->find_blist_chat(account, name); |
2071 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2072 for (group = gaimbuddylist->root; group != NULL; group = group->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2073 for (node = group->child; node != NULL; node = node->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2074 if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2075 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2076 chat = (GaimChat*)node; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2077 |
9285 | 2078 if (account != chat->account) |
7970 | 2079 continue; |
2080 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2081 parts = prpl_info->chat_info( |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2082 gaim_account_get_connection(chat->account)); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2083 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2084 pce = parts->data; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2085 chat_name = g_hash_table_lookup(chat->components, |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2086 pce->identifier); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2087 |
9153 | 2088 if (chat->account == account && chat_name != NULL && |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2089 name != NULL && !strcmp(chat_name, name)) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2090 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2091 return chat; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2092 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2093 } |
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 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2096 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2097 return NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2098 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2099 |
6695 | 2100 GaimGroup * |
7125 | 2101 gaim_chat_get_group(GaimChat *chat) |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2102 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2103 g_return_val_if_fail(chat != NULL, NULL); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2104 |
6695 | 2105 return (GaimGroup *)(((GaimBlistNode *)chat)->parent); |
6456
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 |
9285 | 2108 GaimContact *gaim_buddy_get_contact(GaimBuddy *buddy) |
2109 { | |
2110 g_return_val_if_fail(buddy != NULL, NULL); | |
2111 | |
2112 return (GaimContact*)((GaimBlistNode*)buddy)->parent; | |
2113 } | |
2114 | |
9949 | 2115 GaimPresence *gaim_buddy_get_presence(const GaimBuddy *buddy) |
2116 { | |
2117 g_return_val_if_fail(buddy != NULL, NULL); | |
2118 return buddy->presence; | |
2119 } | |
2120 | |
2121 | |
6695 | 2122 GaimGroup *gaim_find_buddys_group(GaimBuddy *buddy) |
5228 | 2123 { |
9285 | 2124 g_return_val_if_fail(buddy != NULL, NULL); |
6706
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2125 |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2126 if (((GaimBlistNode *)buddy)->parent == NULL) |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2127 return NULL; |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2128 |
6695 | 2129 return (GaimGroup *)(((GaimBlistNode*)buddy)->parent->parent); |
5228 | 2130 } |
2131 | |
9285 | 2132 GSList *gaim_group_get_accounts(GaimGroup *group) |
5228 | 2133 { |
2134 GSList *l = NULL; | |
6695 | 2135 GaimBlistNode *gnode, *cnode, *bnode; |
2136 | |
9285 | 2137 gnode = (GaimBlistNode *)group; |
2138 | |
2139 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
6695 | 2140 if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
9285 | 2141 if (!g_slist_find(l, ((GaimChat *)cnode)->account)) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2142 l = g_slist_append(l, ((GaimChat *)cnode)->account); |
9285 | 2143 } else if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { |
2144 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
2145 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
2146 if (!g_slist_find(l, ((GaimBuddy *)bnode)->account)) | |
6695 | 2147 l = g_slist_append(l, ((GaimBuddy *)bnode)->account); |
2148 } | |
2149 } | |
2150 } | |
5228 | 2151 } |
6695 | 2152 |
5228 | 2153 return l; |
2154 } | |
2155 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2156 void gaim_blist_add_account(GaimAccount *account) |
5234 | 2157 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2158 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 2159 GaimBlistNode *gnode, *cnode, *bnode; |
5234 | 2160 |
9285 | 2161 g_return_if_fail(gaimbuddylist != NULL); |
2162 | |
2163 if (!ops || !ops->update) | |
6695 | 2164 return; |
2165 | |
9285 | 2166 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
2167 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 2168 continue; |
9285 | 2169 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
2170 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6956 | 2171 gboolean recompute = FALSE; |
9285 | 2172 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
2173 if (GAIM_BLIST_NODE_IS_BUDDY(bnode) && | |
6695 | 2174 ((GaimBuddy*)bnode)->account == account) { |
6956 | 2175 recompute = TRUE; |
6695 | 2176 ((GaimContact*)cnode)->currentsize++; |
9285 | 2177 if (((GaimContact*)cnode)->currentsize == 1) |
6695 | 2178 ((GaimGroup*)gnode)->currentsize++; |
2179 ops->update(gaimbuddylist, bnode); | |
2180 } | |
2181 } | |
9285 | 2182 if (recompute || |
8960 | 2183 gaim_blist_node_get_bool(cnode, "show_offline")) { |
10378 | 2184 gaim_contact_invalidate_priority_buddy((GaimContact*)cnode); |
6956 | 2185 ops->update(gaimbuddylist, cnode); |
2186 } | |
9285 | 2187 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode) && |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2188 ((GaimChat*)cnode)->account == account) { |
6901 | 2189 ((GaimGroup *)gnode)->online++; |
2190 ((GaimGroup *)gnode)->currentsize++; | |
2191 ops->update(gaimbuddylist, cnode); | |
5234 | 2192 } |
2193 } | |
6695 | 2194 ops->update(gaimbuddylist, gnode); |
5234 | 2195 } |
2196 } | |
2197 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2198 void gaim_blist_remove_account(GaimAccount *account) |
5228 | 2199 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2200 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 2201 GaimBlistNode *gnode, *cnode, *bnode; |
5234 | 2202 |
9285 | 2203 g_return_if_fail(gaimbuddylist != NULL); |
2204 | |
2205 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
2206 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 2207 continue; |
9285 | 2208 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
2209 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6957 | 2210 gboolean recompute = FALSE; |
9285 | 2211 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
2212 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6695 | 2213 continue; |
9285 | 2214 if (account == ((GaimBuddy *)bnode)->account) { |
10557 | 2215 GaimPresence *presence; |
6957 | 2216 recompute = TRUE; |
9285 | 2217 if (((GaimBuddy*)bnode)->present == GAIM_BUDDY_ONLINE || |
6695 | 2218 ((GaimBuddy*)bnode)->present == GAIM_BUDDY_SIGNING_ON) { |
2219 ((GaimContact*)cnode)->online--; | |
9285 | 2220 if (((GaimContact*)cnode)->online == 0) |
6695 | 2221 ((GaimGroup*)gnode)->online--; |
10475 | 2222 gaim_blist_node_set_int(&((GaimBuddy *)bnode)->node, |
2223 "last_seen", time(NULL)); | |
6695 | 2224 } |
2225 ((GaimContact*)cnode)->currentsize--; | |
9285 | 2226 if (((GaimContact*)cnode)->currentsize == 0) |
6695 | 2227 ((GaimGroup*)gnode)->currentsize--; |
2228 | |
2229 ((GaimBuddy*)bnode)->present = GAIM_BUDDY_OFFLINE; | |
2230 | |
10557 | 2231 presence = gaim_buddy_get_presence((GaimBuddy*)bnode); |
2232 gaim_presence_set_status_active(presence, "offline", TRUE); | |
2233 | |
6803 | 2234 ((GaimBuddy*)bnode)->uc = 0; |
10428 | 2235 /* TODO: ((GaimBuddy*)bnode)->idle = 0; */ |
6945 | 2236 |
9285 | 2237 if (ops && ops->remove) |
6695 | 2238 ops->remove(gaimbuddylist, bnode); |
2239 } | |
5234 | 2240 } |
9285 | 2241 if (recompute) { |
10378 | 2242 gaim_contact_invalidate_priority_buddy((GaimContact*)cnode); |
9285 | 2243 if (ops && ops->update) |
6983 | 2244 ops->update(gaimbuddylist, cnode); |
2245 } | |
9285 | 2246 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode) && |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2247 ((GaimChat*)cnode)->account == account) { |
6695 | 2248 ((GaimGroup*)gnode)->currentsize--; |
2249 ((GaimGroup*)gnode)->online--; | |
9285 | 2250 if (ops && ops->remove) |
6695 | 2251 ops->remove(gaimbuddylist, cnode); |
5228 | 2252 } |
2253 } | |
2254 } | |
2255 } | |
2256 | |
9285 | 2257 gboolean gaim_group_on_account(GaimGroup *g, GaimAccount *account) |
2258 { | |
9787 | 2259 GaimBlistNode *cnode; |
9285 | 2260 for (cnode = ((GaimBlistNode *)g)->child; cnode; cnode = cnode->next) { |
2261 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
9787 | 2262 if(gaim_contact_on_account((GaimContact *) cnode, account)) |
2263 return TRUE; | |
9285 | 2264 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2265 GaimChat *chat = (GaimChat *)cnode; |
9285 | 2266 if ((!account && gaim_account_is_connected(chat->account)) |
6695 | 2267 || chat->account == account) |
2268 return TRUE; | |
2269 } | |
5228 | 2270 } |
2271 return FALSE; | |
2272 } | |
2273 | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2274 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2275 gaim_blist_request_add_buddy(GaimAccount *account, const char *username, |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2276 const char *group, const char *alias) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2277 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2278 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2279 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2280 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2281 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2282 if (ui_ops != NULL && ui_ops->request_add_buddy != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2283 ui_ops->request_add_buddy(account, username, group, alias); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2284 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2285 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2286 void |
9754 | 2287 gaim_blist_request_add_chat(GaimAccount *account, GaimGroup *group, |
2288 const char *alias, const char *name) | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2289 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2290 GaimBlistUiOps *ui_ops; |
7060
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 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2293 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2294 if (ui_ops != NULL && ui_ops->request_add_chat != NULL) |
9754 | 2295 ui_ops->request_add_chat(account, group, alias, name); |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2296 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2297 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2298 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2299 gaim_blist_request_add_group(void) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2300 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2301 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2302 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2303 ui_ops = gaim_blist_get_ui_ops(); |
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 if (ui_ops != NULL && ui_ops->request_add_group != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2306 ui_ops->request_add_group(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2307 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2308 |
10430 | 2309 static void |
2310 gaim_blist_node_setting_free(gpointer data) | |
7693 | 2311 { |
10430 | 2312 GaimValue *value; |
2313 | |
2314 value = (GaimValue *)data; | |
2315 | |
2316 gaim_value_destroy(value); | |
7693 | 2317 } |
2318 | |
9285 | 2319 static void gaim_blist_node_initialize_settings(GaimBlistNode *node) |
7693 | 2320 { |
9285 | 2321 if (node->settings) |
5228 | 2322 return; |
7693 | 2323 |
2324 node->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
2325 (GDestroyNotify)gaim_blist_node_setting_free); | |
2326 } | |
2327 | |
2328 void gaim_blist_node_remove_setting(GaimBlistNode *node, const char *key) | |
2329 { | |
2330 g_return_if_fail(node != NULL); | |
2331 g_return_if_fail(node->settings != NULL); | |
2332 g_return_if_fail(key != NULL); | |
2333 | |
2334 g_hash_table_remove(node->settings, key); | |
9285 | 2335 |
2336 schedule_blist_save(); | |
5228 | 2337 } |
2338 | |
10430 | 2339 void |
10548 | 2340 gaim_blist_node_set_flags(GaimBlistNode *node, GaimBlistNodeFlags flags) |
2341 { | |
2342 g_return_if_fail(node != NULL); | |
2343 | |
2344 node->flags = flags; | |
2345 } | |
2346 | |
2347 GaimBlistNodeFlags | |
2348 gaim_blist_node_get_flags(GaimBlistNode *node) | |
2349 { | |
2350 g_return_val_if_fail(node != NULL, 0); | |
2351 | |
2352 return node->flags; | |
2353 } | |
2354 | |
2355 void | |
10430 | 2356 gaim_blist_node_set_bool(GaimBlistNode* node, const char *key, gboolean data) |
7693 | 2357 { |
10430 | 2358 GaimValue *value; |
7693 | 2359 |
2360 g_return_if_fail(node != NULL); | |
2361 g_return_if_fail(node->settings != NULL); | |
2362 g_return_if_fail(key != NULL); | |
2363 | |
10430 | 2364 value = gaim_value_new(GAIM_TYPE_BOOLEAN); |
2365 gaim_value_set_boolean(value, data); | |
2366 | |
2367 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2368 |
2369 schedule_blist_save(); | |
7693 | 2370 } |
2371 | |
10430 | 2372 gboolean |
2373 gaim_blist_node_get_bool(GaimBlistNode* node, const char *key) | |
7693 | 2374 { |
10430 | 2375 GaimValue *value; |
7693 | 2376 |
2377 g_return_val_if_fail(node != NULL, FALSE); | |
2378 g_return_val_if_fail(node->settings != NULL, FALSE); | |
2379 g_return_val_if_fail(key != NULL, FALSE); | |
2380 | |
10430 | 2381 value = g_hash_table_lookup(node->settings, key); |
2382 | |
2383 if (value == NULL) | |
7849 | 2384 return FALSE; |
2385 | |
10430 | 2386 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_BOOLEAN, FALSE); |
2387 | |
2388 return gaim_value_get_boolean(value); | |
5228 | 2389 } |
2390 | |
10430 | 2391 void |
2392 gaim_blist_node_set_int(GaimBlistNode* node, const char *key, int data) | |
7693 | 2393 { |
10430 | 2394 GaimValue *value; |
7693 | 2395 |
2396 g_return_if_fail(node != NULL); | |
2397 g_return_if_fail(node->settings != NULL); | |
2398 g_return_if_fail(key != NULL); | |
2399 | |
10430 | 2400 value = gaim_value_new(GAIM_TYPE_INT); |
2401 gaim_value_set_int(value, data); | |
2402 | |
2403 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2404 |
2405 schedule_blist_save(); | |
7693 | 2406 } |
2407 | |
10430 | 2408 int |
2409 gaim_blist_node_get_int(GaimBlistNode* node, const char *key) | |
7693 | 2410 { |
10430 | 2411 GaimValue *value; |
7693 | 2412 |
2413 g_return_val_if_fail(node != NULL, 0); | |
2414 g_return_val_if_fail(node->settings != NULL, 0); | |
2415 g_return_val_if_fail(key != NULL, 0); | |
2416 | |
10430 | 2417 value = g_hash_table_lookup(node->settings, key); |
2418 | |
2419 if (value == NULL) | |
7849 | 2420 return 0; |
2421 | |
10430 | 2422 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_INT, 0); |
2423 | |
2424 return gaim_value_get_int(value); | |
7693 | 2425 } |
2426 | |
10430 | 2427 void |
2428 gaim_blist_node_set_string(GaimBlistNode* node, const char *key, const char *data) | |
5906 | 2429 { |
10430 | 2430 GaimValue *value; |
7693 | 2431 |
2432 g_return_if_fail(node != NULL); | |
2433 g_return_if_fail(node->settings != NULL); | |
2434 g_return_if_fail(key != NULL); | |
2435 | |
10430 | 2436 value = gaim_value_new(GAIM_TYPE_STRING); |
2437 gaim_value_set_string(value, data); | |
2438 | |
2439 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2440 |
2441 schedule_blist_save(); | |
7693 | 2442 } |
2443 | |
10430 | 2444 const char * |
2445 gaim_blist_node_get_string(GaimBlistNode* node, const char *key) | |
7693 | 2446 { |
10430 | 2447 GaimValue *value; |
7693 | 2448 |
2449 g_return_val_if_fail(node != NULL, NULL); | |
2450 g_return_val_if_fail(node->settings != NULL, NULL); | |
2451 g_return_val_if_fail(key != NULL, NULL); | |
2452 | |
10430 | 2453 value = g_hash_table_lookup(node->settings, key); |
2454 | |
2455 if (value == NULL) | |
7849 | 2456 return NULL; |
2457 | |
10430 | 2458 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_STRING, NULL); |
2459 | |
2460 return gaim_value_get_string(value); | |
7693 | 2461 } |
2462 | |
9285 | 2463 GList *gaim_blist_node_get_extended_menu(GaimBlistNode *n) |
7693 | 2464 { |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2465 GList *menu = NULL; |
9030 | 2466 |
2467 g_return_val_if_fail(n, NULL); | |
2468 | |
2469 gaim_signal_emit(gaim_blist_get_handle(), | |
2470 "blist-node-extended-menu", | |
2471 n, &menu); | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2472 return menu; |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2473 } |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2474 |
9030 | 2475 GaimBlistNodeAction * |
2476 gaim_blist_node_action_new(char *label, | |
2477 void (*callback)(GaimBlistNode *, gpointer), | |
2478 gpointer data) | |
2479 { | |
2480 GaimBlistNodeAction *act = g_new0(GaimBlistNodeAction, 1); | |
2481 act->label = label; | |
2482 act->callback = callback; | |
2483 act->data = data; | |
2484 return act; | |
8952 | 2485 } |
2486 | |
9285 | 2487 int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) |
2488 { | |
2489 if (!group) | |
5228 | 2490 return 0; |
2491 | |
5277 | 2492 return offline ? group->totalsize : group->currentsize; |
5228 | 2493 } |
2494 | |
9285 | 2495 int gaim_blist_get_group_online_count(GaimGroup *group) |
2496 { | |
2497 if (!group) | |
5228 | 2498 return 0; |
2499 | |
5277 | 2500 return group->online; |
5228 | 2501 } |
2502 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2503 void |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2504 gaim_blist_set_ui_ops(GaimBlistUiOps *ops) |
7035
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 blist_ui_ops = ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2507 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2508 |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2509 GaimBlistUiOps * |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2510 gaim_blist_get_ui_ops(void) |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2511 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2512 return blist_ui_ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2513 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2514 |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2515 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2516 void * |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2517 gaim_blist_get_handle(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2518 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2519 static int handle; |
5228 | 2520 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2521 return &handle; |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2522 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2523 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2524 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2525 gaim_blist_init(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2526 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2527 void *handle = gaim_blist_get_handle(); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2528 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2529 gaim_signal_register(handle, "buddy-away", |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2530 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2531 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2532 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2533 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2534 gaim_signal_register(handle, "buddy-back", |
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)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2538 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2539 gaim_signal_register(handle, "buddy-idle", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2540 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2541 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2542 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2543 gaim_signal_register(handle, "buddy-unidle", |
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)); |
9109
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2547 gaim_signal_register(handle, "buddy-idle-updated", |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2548 gaim_marshal_VOID__POINTER, NULL, 1, |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2549 gaim_value_new(GAIM_TYPE_SUBTYPE, |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2550 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2551 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2552 gaim_signal_register(handle, "buddy-signed-on", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2553 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2554 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2555 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2556 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2557 gaim_signal_register(handle, "buddy-signed-off", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2558 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2559 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2560 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2561 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2562 gaim_signal_register(handle, "update-idle", gaim_marshal_VOID, NULL, 0); |
9030 | 2563 |
2564 gaim_signal_register(handle, "blist-node-extended-menu", | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2565 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2566 gaim_value_new(GAIM_TYPE_SUBTYPE, |
9030 | 2567 GAIM_SUBTYPE_BLIST_NODE), |
8952 | 2568 gaim_value_new(GAIM_TYPE_BOXED, "GList **")); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2569 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2570 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2571 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2572 gaim_blist_uninit(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2573 { |
10428 | 2574 if (save_timer != 0) |
2575 { | |
2576 gaim_timeout_remove(save_timer); | |
2577 save_timer = 0; | |
9285 | 2578 gaim_blist_sync(); |
2579 } | |
2580 | |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2581 gaim_signals_unregister_by_instance(gaim_blist_get_handle()); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2582 } |