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