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