Mercurial > pidgin
annotate src/blist.c @ 13131:47ecef83e2e1
[gaim-migrate @ 15493]
A lot of our conversation code assumes that conv->account != NULL.
This is a completely invalid assumption. If you have a conversation
open on an account, and you delete the account, Gaim should leave the
conversation window open and set the account to NULL and handle
everything appropriately. Currently it does not, and that makes me
a little unhappy.
To reproduce this:
1. Open a conversation with someone
2. Delete the account that you're sending messages from
3. Watch the assertion failures scroll by in the debug window
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 06 Feb 2006 05:43:09 +0000 |
parents | fa99be331f2f |
children | c242836ff793 |
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 | |
12398
bd42f4d5854c
[gaim-migrate @ 14705]
Richard Laager <rlaager@wiktel.com>
parents:
12319
diff
changeset
|
331 static void |
10428 | 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); | |
12687 | 430 g_free(alias); |
10378 | 431 } |
432 | |
10428 | 433 static void |
434 parse_contact(GaimGroup *group, xmlnode *cnode) | |
435 { | |
436 GaimContact *contact = gaim_contact_new(); | |
437 xmlnode *x; | |
438 const char *alias; | |
439 | |
440 gaim_blist_add_contact(contact, group, | |
441 gaim_blist_get_last_child((GaimBlistNode*)group)); | |
442 | |
443 if ((alias = xmlnode_get_attrib(cnode, "alias"))) { | |
444 gaim_contact_set_alias(contact, alias); | |
445 } | |
446 | |
447 for (x = cnode->child; x; x = x->next) { | |
448 if (x->type != XMLNODE_TYPE_TAG) | |
449 continue; | |
450 if (!strcmp(x->name, "buddy")) | |
451 parse_buddy(group, contact, x); | |
452 else if (!strcmp(x->name, "setting")) | |
453 parse_setting((GaimBlistNode*)contact, x); | |
454 } | |
455 | |
456 /* if the contact is empty, don't keep it around. it causes problems */ | |
457 if (!((GaimBlistNode*)contact)->child) | |
458 gaim_blist_remove_contact(contact); | |
459 } | |
460 | |
461 static void | |
462 parse_chat(GaimGroup *group, xmlnode *cnode) | |
463 { | |
464 GaimChat *chat; | |
465 GaimAccount *account; | |
466 const char *acct_name, *proto, *protocol; | |
467 xmlnode *x; | |
468 char *alias = NULL; | |
469 GHashTable *components; | |
470 | |
471 acct_name = xmlnode_get_attrib(cnode, "account"); | |
472 protocol = xmlnode_get_attrib(cnode, "protocol"); | |
473 proto = xmlnode_get_attrib(cnode, "proto"); | |
474 | |
475 if (!acct_name || (!proto && !protocol)) | |
476 return; | |
477 | |
478 account = gaim_accounts_find(acct_name, proto ? proto : protocol); | |
479 | |
480 if (!account) | |
481 return; | |
482 | |
483 if ((x = xmlnode_get_child(cnode, "alias"))) | |
484 alias = xmlnode_get_data(x); | |
485 | |
486 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
487 | |
488 for (x = xmlnode_get_child(cnode, "component"); x; x = xmlnode_get_next_twin(x)) { | |
489 const char *name; | |
490 char *value; | |
491 | |
492 name = xmlnode_get_attrib(x, "name"); | |
493 value = xmlnode_get_data(x); | |
494 g_hash_table_replace(components, g_strdup(name), value); | |
495 } | |
496 | |
497 chat = gaim_chat_new(account, alias, components); | |
498 gaim_blist_add_chat(chat, group, | |
499 gaim_blist_get_last_child((GaimBlistNode*)group)); | |
500 | |
501 for (x = xmlnode_get_child(cnode, "setting"); x; x = xmlnode_get_next_twin(x)) { | |
502 parse_setting((GaimBlistNode*)chat, x); | |
503 } | |
504 | |
12687 | 505 g_free(alias); |
10428 | 506 } |
507 | |
508 static void | |
509 parse_group(xmlnode *groupnode) | |
510 { | |
511 const char *name = xmlnode_get_attrib(groupnode, "name"); | |
512 GaimGroup *group; | |
513 xmlnode *cnode; | |
514 | |
515 if (!name) | |
516 name = _("Buddies"); | |
517 | |
518 group = gaim_group_new(name); | |
519 gaim_blist_add_group(group, | |
520 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
521 | |
522 for (cnode = groupnode->child; cnode; cnode = cnode->next) { | |
523 if (cnode->type != XMLNODE_TYPE_TAG) | |
524 continue; | |
525 if (!strcmp(cnode->name, "setting")) | |
526 parse_setting((GaimBlistNode*)group, cnode); | |
527 else if (!strcmp(cnode->name, "contact") || | |
528 !strcmp(cnode->name, "person")) | |
529 parse_contact(group, cnode); | |
530 else if (!strcmp(cnode->name, "chat")) | |
531 parse_chat(group, cnode); | |
532 } | |
533 } | |
534 | |
535 /* TODO: Make static and rename to load_blist */ | |
536 void | |
537 gaim_blist_load() | |
538 { | |
539 xmlnode *gaim, *blist, *privacy; | |
540 | |
541 blist_loaded = TRUE; | |
542 | |
543 gaim = gaim_util_read_xml_from_file("blist.xml", _("buddy list")); | |
544 | |
545 if (gaim == NULL) | |
546 return; | |
547 | |
548 blist = xmlnode_get_child(gaim, "blist"); | |
549 if (blist) { | |
550 xmlnode *groupnode; | |
551 for (groupnode = xmlnode_get_child(blist, "group"); groupnode != NULL; | |
552 groupnode = xmlnode_get_next_twin(groupnode)) { | |
553 parse_group(groupnode); | |
554 } | |
555 } | |
556 | |
557 privacy = xmlnode_get_child(gaim, "privacy"); | |
558 if (privacy) { | |
559 xmlnode *anode; | |
560 for (anode = privacy->child; anode; anode = anode->next) { | |
561 xmlnode *x; | |
562 GaimAccount *account; | |
10944 | 563 int imode; |
10428 | 564 const char *acct_name, *proto, *mode, *protocol; |
565 | |
566 acct_name = xmlnode_get_attrib(anode, "name"); | |
567 protocol = xmlnode_get_attrib(anode, "protocol"); | |
568 proto = xmlnode_get_attrib(anode, "proto"); | |
569 mode = xmlnode_get_attrib(anode, "mode"); | |
570 | |
571 if (!acct_name || (!proto && !protocol) || !mode) | |
572 continue; | |
573 | |
574 account = gaim_accounts_find(acct_name, proto ? proto : protocol); | |
575 | |
576 if (!account) | |
577 continue; | |
578 | |
10944 | 579 imode = atoi(mode); |
10945 | 580 account->perm_deny = (imode != 0 ? imode : GAIM_PRIVACY_ALLOW_ALL); |
10428 | 581 |
582 for (x = anode->child; x; x = x->next) { | |
583 char *name; | |
584 if (x->type != XMLNODE_TYPE_TAG) | |
585 continue; | |
586 | |
587 if (!strcmp(x->name, "permit")) { | |
588 name = xmlnode_get_data(x); | |
589 gaim_privacy_permit_add(account, name, TRUE); | |
590 g_free(name); | |
591 } else if (!strcmp(x->name, "block")) { | |
592 name = xmlnode_get_data(x); | |
593 gaim_privacy_deny_add(account, name, TRUE); | |
594 g_free(name); | |
595 } | |
596 } | |
597 } | |
598 } | |
599 | |
600 xmlnode_free(gaim); | |
601 } | |
602 | |
603 | |
604 /********************************************************************* | |
605 * Stuff * | |
606 *********************************************************************/ | |
607 | |
608 static void | |
609 gaim_contact_compute_priority_buddy(GaimContact *contact) | |
6843 | 610 { |
611 GaimBlistNode *bnode; | |
9949 | 612 GaimBuddy *new_priority = NULL; |
9285 | 613 |
614 g_return_if_fail(contact != NULL); | |
615 | |
6870 | 616 contact->priority = NULL; |
9949 | 617 for (bnode = ((GaimBlistNode*)contact)->child; |
618 bnode != NULL; | |
619 bnode = bnode->next) | |
620 { | |
6843 | 621 GaimBuddy *buddy; |
7420 | 622 |
9285 | 623 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) |
6843 | 624 continue; |
9949 | 625 |
6843 | 626 buddy = (GaimBuddy*)bnode; |
9949 | 627 |
9285 | 628 if (!gaim_account_is_connected(buddy->account)) |
6843 | 629 continue; |
9949 | 630 if (new_priority == NULL) |
631 new_priority = buddy; | |
632 else | |
633 { | |
634 int cmp; | |
10427 | 635 |
10368 | 636 cmp = gaim_presence_compare(gaim_buddy_get_presence(new_priority), |
637 gaim_buddy_get_presence(buddy)); | |
9949 | 638 |
639 if (cmp > 0 || (cmp == 0 && | |
10368 | 640 gaim_prefs_get_bool("/core/contact/last_match"))) |
9949 | 641 { |
642 new_priority = buddy; | |
643 } | |
644 } | |
6843 | 645 } |
9949 | 646 |
647 contact->priority = new_priority; | |
10378 | 648 contact->priority_valid = TRUE; |
6843 | 649 } |
650 | |
651 | |
5228 | 652 /***************************************************************************** |
653 * Public API functions * | |
654 *****************************************************************************/ | |
655 | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
656 GaimBuddyList *gaim_blist_new() |
5228 | 657 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
658 GaimBuddyList *gbl = g_new0(GaimBuddyList, 1); |
11146 | 659 GAIM_DBUS_REGISTER_POINTER(gbl, GaimBuddyList); |
5228 | 660 |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
661 gbl->ui_ops = gaim_blist_get_ui_ops(); |
5228 | 662 |
6742 | 663 gbl->buddies = g_hash_table_new_full((GHashFunc)_gaim_blist_hbuddy_hash, |
664 (GEqualFunc)_gaim_blist_hbuddy_equal, | |
665 (GDestroyNotify)_gaim_blist_hbuddy_free_key, NULL); | |
5247 | 666 |
5228 | 667 if (gbl->ui_ops != NULL && gbl->ui_ops->new_list != NULL) |
668 gbl->ui_ops->new_list(gbl); | |
669 | |
670 return gbl; | |
671 } | |
672 | |
673 void | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
674 gaim_set_blist(GaimBuddyList *list) |
5228 | 675 { |
676 gaimbuddylist = list; | |
677 } | |
678 | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
679 GaimBuddyList * |
9285 | 680 gaim_get_blist() |
5228 | 681 { |
682 return gaimbuddylist; | |
683 } | |
684 | |
9285 | 685 void gaim_blist_show() |
5228 | 686 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
687 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 688 |
689 if (ops && ops->show) | |
5228 | 690 ops->show(gaimbuddylist); |
691 } | |
692 | |
693 void gaim_blist_destroy() | |
694 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
695 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 696 |
8259
4f9f68ab8770
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8200
diff
changeset
|
697 gaim_debug(GAIM_DEBUG_INFO, "blist", "Destroying\n"); |
9285 | 698 |
699 if (ops && ops->destroy) | |
5228 | 700 ops->destroy(gaimbuddylist); |
701 } | |
702 | |
9285 | 703 void gaim_blist_set_visible(gboolean show) |
5228 | 704 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
705 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 706 |
707 if (ops && ops->set_visible) | |
5228 | 708 ops->set_visible(gaimbuddylist, show); |
709 } | |
710 | |
12112 | 711 static GaimBlistNode *get_next_node(GaimBlistNode *node, gboolean godeep) |
712 { | |
713 if (node == NULL) | |
714 return NULL; | |
715 | |
716 if (godeep && node->child) | |
717 return node->child; | |
718 | |
719 if (node->next) | |
720 return node->next; | |
721 | |
722 return get_next_node(node->parent, FALSE); | |
723 } | |
724 | |
725 GaimBlistNode *gaim_blist_node_next(GaimBlistNode *node, gboolean offline) | |
726 { | |
727 GaimBlistNode *ret = node; | |
728 | |
729 do | |
730 { | |
731 ret = get_next_node(ret, TRUE); | |
732 } while (ret && !offline && GAIM_BLIST_NODE_IS_BUDDY(ret) && | |
733 !gaim_account_is_connected(gaim_buddy_get_account((GaimBuddy *)ret))); | |
734 | |
735 return ret; | |
736 } | |
737 | |
10052 | 738 void |
739 gaim_blist_update_buddy_status(GaimBuddy *buddy, GaimStatus *old_status) | |
9285 | 740 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
741 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
10052 | 742 GaimPresence *presence; |
743 GaimStatus *status; | |
9285 | 744 |
745 g_return_if_fail(buddy != NULL); | |
5228 | 746 |
10052 | 747 presence = gaim_buddy_get_presence(buddy); |
748 status = gaim_presence_get_active_status(presence); | |
749 | |
10847 | 750 gaim_debug_info("blist", "Updating buddy status for %s (%s)\n", |
751 buddy->name, gaim_account_get_protocol_name(buddy->account)); | |
10052 | 752 |
753 if (gaim_status_is_online(status) && | |
754 !gaim_status_is_online(old_status)) { | |
11910 | 755 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
756 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-on", buddy); |
11910 | 757 |
758 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online++; | |
759 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 1) | |
760 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online++; | |
10052 | 761 } else if (!gaim_status_is_online(status) && |
762 gaim_status_is_online(old_status)) { | |
10475 | 763 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
|
764 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-off", buddy); |
11910 | 765 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online--; |
766 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 0) | |
767 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online--; | |
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
768 } else { |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
769 gaim_signal_emit(gaim_blist_get_handle(), |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
770 "buddy-status-changed", buddy, old_status, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
771 status); |
5228 | 772 } |
773 | |
10205 | 774 /* |
775 * This function used to only call the following two functions if one of | |
776 * the above signals had been triggered, but that's not good, because | |
777 * if someone's away message changes and they don't go from away to back | |
778 * to away then no signal is triggered. | |
779 * | |
780 * It's a safe assumption that SOMETHING called this function. PROBABLY | |
781 * because something, somewhere changed. Calling the stuff below | |
782 * certainly won't hurt anything. Unless you're on a K6-2 300. | |
783 */ | |
10378 | 784 gaim_contact_invalidate_priority_buddy(gaim_buddy_get_contact(buddy)); |
10205 | 785 if (ops && ops->update) |
786 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 787 } |
788 | |
9285 | 789 void gaim_blist_update_buddy_icon(GaimBuddy *buddy) |
5228 | 790 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
791 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 792 |
793 g_return_if_fail(buddy != NULL); | |
794 | |
795 if (ops && ops->update) | |
796 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
797 } | |
798 | |
799 /* | |
10428 | 800 * TODO: Maybe remove the call to this from server.c and call it |
9285 | 801 * from oscar.c and toc.c instead? |
802 */ | |
803 void gaim_blist_rename_buddy(GaimBuddy *buddy, const char *name) | |
804 { | |
805 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; | |
806 struct _gaim_hbuddy *hb; | |
807 | |
808 g_return_if_fail(buddy != NULL); | |
809 | |
810 hb = g_new(struct _gaim_hbuddy, 1); | |
8675 | 811 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
812 hb->account = buddy->account; | |
813 hb->group = ((GaimBlistNode *)buddy)->parent->parent; | |
814 g_hash_table_remove(gaimbuddylist->buddies, hb); | |
815 | |
816 g_free(hb->name); | |
817 hb->name = g_strdup(gaim_normalize(buddy->account, name)); | |
818 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); | |
819 | |
5634 | 820 g_free(buddy->name); |
5228 | 821 buddy->name = g_strdup(name); |
9285 | 822 |
10704 | 823 gaim_blist_schedule_save(); |
9285 | 824 |
825 if (ops && ops->update) | |
826 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 827 } |
5234 | 828 |
12319
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
829 void gaim_blist_alias_contact(GaimContact *contact, const char *alias) |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
830 { |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
831 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
832 GaimConversation *conv; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
833 char *old_alias = contact->alias; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
834 GaimBlistNode *bnode; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
835 |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
836 g_return_if_fail(contact != NULL); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
837 |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
838 if ((alias != NULL) && (*alias != '\0')) |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
839 contact->alias = g_strdup(alias); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
840 else |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
841 contact->alias = NULL; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
842 |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
843 gaim_blist_schedule_save(); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
844 |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
845 if (ops && ops->update) |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
846 ops->update(gaimbuddylist, (GaimBlistNode *)contact); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
847 |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
848 for(bnode = ((GaimBlistNode *)contact)->child; bnode != NULL; bnode = bnode->next) |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
849 { |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
850 GaimBuddy *buddy = (GaimBuddy *)bnode; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
851 |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
852 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, buddy->name, |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
853 buddy->account); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
854 if (conv) |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
855 gaim_conversation_autoset_title(conv); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
856 } |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
857 |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
858 gaim_signal_emit(gaim_blist_get_handle(), "blist-node-aliased", |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
859 contact, old_alias); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
860 g_free(old_alias); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
861 } |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12305
diff
changeset
|
862 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
863 void gaim_blist_alias_chat(GaimChat *chat, const char *alias) |
5234 | 864 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
865 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
866 char *old_alias = chat->alias; |
5234 | 867 |
9285 | 868 g_return_if_fail(chat != NULL); |
869 | |
870 if ((alias != NULL) && (*alias != '\0')) | |
5237 | 871 chat->alias = g_strdup(alias); |
872 else | |
873 chat->alias = NULL; | |
874 | |
10704 | 875 gaim_blist_schedule_save(); |
9285 | 876 |
877 if (ops && ops->update) | |
878 ops->update(gaimbuddylist, (GaimBlistNode *)chat); | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
879 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
880 gaim_signal_emit(gaim_blist_get_handle(), "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
881 chat, old_alias); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
882 g_free(old_alias); |
5234 | 883 } |
884 | |
9285 | 885 void gaim_blist_alias_buddy(GaimBuddy *buddy, const char *alias) |
5228 | 886 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
887 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5634
diff
changeset
|
888 GaimConversation *conv; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
889 char *old_alias = buddy->alias; |
5228 | 890 |
9285 | 891 g_return_if_fail(buddy != NULL); |
892 | |
893 if ((alias != NULL) && (*alias != '\0')) | |
5228 | 894 buddy->alias = g_strdup(alias); |
895 else | |
896 buddy->alias = NULL; | |
897 | |
10704 | 898 gaim_blist_schedule_save(); |
9285 | 899 |
900 if (ops && ops->update) | |
901 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 902 |
11338 | 903 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, buddy->name, |
10246 | 904 buddy->account); |
5228 | 905 if (conv) |
906 gaim_conversation_autoset_title(conv); | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
907 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
908 gaim_signal_emit(gaim_blist_get_handle(), "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
909 buddy, old_alias); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
910 g_free(old_alias); |
5228 | 911 } |
912 | |
9285 | 913 void gaim_blist_server_alias_buddy(GaimBuddy *buddy, const char *alias) |
6058 | 914 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
915 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6058 | 916 GaimConversation *conv; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
917 char *old_alias = buddy->server_alias; |
6058 | 918 |
9285 | 919 g_return_if_fail(buddy != NULL); |
920 | |
921 if ((alias != NULL) && (*alias != '\0') && g_utf8_validate(alias, -1, NULL)) | |
6058 | 922 buddy->server_alias = g_strdup(alias); |
923 else | |
924 buddy->server_alias = NULL; | |
925 | |
10704 | 926 gaim_blist_schedule_save(); |
9285 | 927 |
928 if (ops && ops->update) | |
929 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
6058 | 930 |
11338 | 931 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, buddy->name, |
10246 | 932 buddy->account); |
6058 | 933 if (conv) |
934 gaim_conversation_autoset_title(conv); | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
935 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
936 gaim_signal_emit(gaim_blist_get_handle(), "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
937 buddy, old_alias); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
938 g_free(old_alias); |
6058 | 939 } |
940 | |
9285 | 941 /* |
10428 | 942 * TODO: If merging, prompt the user if they want to merge. |
9285 | 943 */ |
944 void gaim_blist_rename_group(GaimGroup *source, const char *new_name) | |
5228 | 945 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
946 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 947 GaimGroup *dest; |
948 gchar *old_name; | |
949 GList *moved_buddies = NULL; | |
5346 | 950 GSList *accts; |
951 | |
9285 | 952 g_return_if_fail(source != NULL); |
953 g_return_if_fail(new_name != NULL); | |
954 | |
955 if (*new_name == '\0' || !strcmp(new_name, source->name)) | |
5346 | 956 return; |
9285 | 957 |
958 dest = gaim_find_group(new_name); | |
959 if (dest != NULL) { | |
960 /* We're merging two groups */ | |
961 GaimBlistNode *prev, *child, *next; | |
962 | |
963 prev = gaim_blist_get_last_child((GaimBlistNode*)dest); | |
964 child = ((GaimBlistNode*)source)->child; | |
965 | |
966 /* | |
10428 | 967 * TODO: This seems like a dumb way to do this... why not just |
9285 | 968 * append all children from the old group to the end of the new |
969 * one? PRPLs might be expecting to receive an add_buddy() for | |
970 * each moved buddy... | |
971 */ | |
972 while (child) | |
5346 | 973 { |
974 next = child->next; | |
9285 | 975 if (GAIM_BLIST_NODE_IS_CONTACT(child)) { |
6695 | 976 GaimBlistNode *bnode; |
9285 | 977 gaim_blist_add_contact((GaimContact *)child, dest, prev); |
978 for (bnode = child->child; bnode != NULL; bnode = bnode->next) { | |
979 gaim_blist_add_buddy((GaimBuddy *)bnode, (GaimContact *)child, | |
6695 | 980 NULL, bnode->prev); |
9285 | 981 moved_buddies = g_list_append(moved_buddies, bnode); |
982 } | |
5346 | 983 prev = child; |
9285 | 984 } else if (GAIM_BLIST_NODE_IS_CHAT(child)) { |
985 gaim_blist_add_chat((GaimChat *)child, dest, prev); | |
5346 | 986 prev = child; |
987 } else { | |
988 gaim_debug(GAIM_DEBUG_ERROR, "blist", | |
9285 | 989 "Unknown child type in group %s\n", source->name); |
5346 | 990 } |
991 child = next; | |
992 } | |
9285 | 993 |
994 /* Make a copy of the old group name and then delete the old group */ | |
995 old_name = g_strdup(source->name); | |
996 gaim_blist_remove_group(source); | |
5346 | 997 } else { |
9285 | 998 /* A simple rename */ |
999 GaimBlistNode *cnode, *bnode; | |
1000 | |
1001 /* Build a GList of all buddies in this group */ | |
1002 for (cnode = ((GaimBlistNode *)source)->child; cnode != NULL; cnode = cnode->next) { | |
1003 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
1004 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) | |
1005 moved_buddies = g_list_append(moved_buddies, bnode); | |
5346 | 1006 } |
9285 | 1007 |
1008 old_name = source->name; | |
1009 source->name = g_strdup(new_name); | |
1010 | |
5346 | 1011 } |
9285 | 1012 |
1013 /* Save our changes */ | |
10704 | 1014 gaim_blist_schedule_save(); |
9285 | 1015 |
1016 /* Update the UI */ | |
1017 if (ops && ops->update) | |
1018 ops->update(gaimbuddylist, (GaimBlistNode*)source); | |
1019 | |
1020 /* Notify all PRPLs */ | |
10853
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1021 if(old_name && source && strcmp(source->name, old_name)) { |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1022 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
|
1023 GaimAccount *account = accts->data; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1024 GaimPluginProtocolInfo *prpl_info = NULL; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1025 GList *l = NULL, *buddies = NULL; |
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(account->gc && account->gc->prpl) |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1028 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl); |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1029 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1030 if(!prpl_info) |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1031 continue; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1032 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1033 for(l = moved_buddies; l; l = l->next) { |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1034 GaimBuddy *buddy = (GaimBuddy *)l->data; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1035 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1036 if(buddy && buddy->account == account) |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1037 buddies = g_list_append(buddies, (GaimBlistNode *)buddy); |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1038 } |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1039 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1040 if(prpl_info->rename_group) { |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1041 prpl_info->rename_group(account->gc, old_name, source, buddies); |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1042 } else { |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1043 GList *cur, *groups = NULL; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1044 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1045 /* Make a list of what the groups each buddy is in */ |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1046 for(cur = buddies; cur; cur = cur->next) { |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1047 GaimBlistNode *node = (GaimBlistNode *)cur->data; |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1048 groups = g_list_append(groups, node->parent->parent); |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1049 } |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1050 |
11643 | 1051 gaim_account_remove_buddies(account, buddies, groups); |
10853
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1052 g_list_free(groups); |
11643 | 1053 gaim_account_add_buddies(account, buddies); |
10853
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1054 } |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1055 |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1056 g_list_free(buddies); |
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1057 } |
9285 | 1058 } |
1059 g_list_free(moved_buddies); | |
1060 g_free(old_name); | |
5228 | 1061 } |
5234 | 1062 |
9285 | 1063 static void gaim_blist_node_initialize_settings(GaimBlistNode *node); |
7693 | 1064 |
7125 | 1065 GaimChat *gaim_chat_new(GaimAccount *account, const char *alias, GHashTable *components) |
5234 | 1066 { |
9285 | 1067 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1068 GaimChat *chat; |
9285 | 1069 |
1070 g_return_val_if_fail(account != NULL, FALSE); | |
1071 g_return_val_if_fail(components != NULL, FALSE); | |
5234 | 1072 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1073 chat = g_new0(GaimChat, 1); |
5234 | 1074 chat->account = account; |
9285 | 1075 if ((alias != NULL) && (*alias != '\0')) |
5237 | 1076 chat->alias = g_strdup(alias); |
5234 | 1077 chat->components = components; |
9285 | 1078 gaim_blist_node_initialize_settings((GaimBlistNode *)chat); |
1079 ((GaimBlistNode *)chat)->type = GAIM_BLIST_CHAT_NODE; | |
5234 | 1080 |
1081 if (ops != NULL && ops->new_node != NULL) | |
1082 ops->new_node((GaimBlistNode *)chat); | |
1083 | |
11146 | 1084 GAIM_DBUS_REGISTER_POINTER(chat, GaimChat); |
5234 | 1085 return chat; |
1086 } | |
1087 | |
6695 | 1088 GaimBuddy *gaim_buddy_new(GaimAccount *account, const char *screenname, const char *alias) |
5228 | 1089 { |
9285 | 1090 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
1091 GaimBuddy *buddy; | |
1092 | |
1093 g_return_val_if_fail(account != NULL, FALSE); | |
1094 g_return_val_if_fail(screenname != NULL, FALSE); | |
1095 | |
1096 buddy = g_new0(GaimBuddy, 1); | |
9949 | 1097 buddy->account = account; |
1098 buddy->name = g_strdup(screenname); | |
1099 buddy->alias = g_strdup(alias); | |
1100 buddy->presence = gaim_presence_new_for_buddy(buddy); | |
11624 | 1101 ((GaimBlistNode *)buddy)->type = GAIM_BLIST_BUDDY_NODE; |
9949 | 1102 |
10052 | 1103 gaim_presence_set_status_active(buddy->presence, "offline", TRUE); |
1104 | |
9285 | 1105 gaim_blist_node_initialize_settings((GaimBlistNode *)buddy); |
1106 | |
1107 if (ops && ops->new_node) | |
1108 ops->new_node((GaimBlistNode *)buddy); | |
1109 | |
11146 | 1110 GAIM_DBUS_REGISTER_POINTER(buddy, GaimBuddy); |
9285 | 1111 return buddy; |
5228 | 1112 } |
5634 | 1113 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1114 void |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1115 gaim_buddy_set_icon(GaimBuddy *buddy, GaimBuddyIcon *icon) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1116 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1117 g_return_if_fail(buddy != NULL); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1118 |
12476
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1119 if (buddy->icon != icon) { |
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1120 if (buddy->icon != NULL) |
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1121 gaim_buddy_icon_unref(buddy->icon); |
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1122 |
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1123 buddy->icon = (icon != NULL ? gaim_buddy_icon_ref(icon) : NULL); |
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1124 } |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1125 |
9324 | 1126 if (buddy->icon) |
1127 gaim_buddy_icon_cache(icon, buddy); | |
1128 else | |
11040
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
1129 gaim_buddy_icon_uncache(buddy); |
9299 | 1130 |
10704 | 1131 gaim_blist_schedule_save(); |
9926 | 1132 |
12097 | 1133 gaim_signal_emit(gaim_blist_get_handle(), "buddy-icon-changed", buddy); |
1134 | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1135 gaim_blist_update_buddy_icon(buddy); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1136 } |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1137 |
10037
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1138 GaimAccount * |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1139 gaim_buddy_get_account(const GaimBuddy *buddy) |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1140 { |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1141 g_return_val_if_fail(buddy != NULL, NULL); |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1142 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1143 return buddy->account; |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1144 } |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1145 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1146 const char * |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1147 gaim_buddy_get_name(const GaimBuddy *buddy) |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1148 { |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1149 g_return_val_if_fail(buddy != NULL, NULL); |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1150 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1151 return buddy->name; |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1152 } |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1153 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1154 GaimBuddyIcon * |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1155 gaim_buddy_get_icon(const GaimBuddy *buddy) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1156 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1157 g_return_val_if_fail(buddy != NULL, NULL); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1158 |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1159 return buddy->icon; |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1160 } |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1161 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1162 void gaim_blist_add_chat(GaimChat *chat, GaimGroup *group, GaimBlistNode *node) |
5234 | 1163 { |
9285 | 1164 GaimBlistNode *cnode = (GaimBlistNode*)chat; |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1165 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6774 | 1166 |
1167 g_return_if_fail(chat != NULL); | |
9285 | 1168 g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT((GaimBlistNode *)chat)); |
1169 | |
1170 if (node == NULL) { | |
1171 if (group == NULL) { | |
1172 group = gaim_group_new(_("Chats")); | |
1173 gaim_blist_add_group(group, | |
5634 | 1174 gaim_blist_get_last_sibling(gaimbuddylist->root)); |
5234 | 1175 } |
1176 } else { | |
9285 | 1177 group = (GaimGroup*)node->parent; |
5234 | 1178 } |
1179 | |
1180 /* if we're moving to overtop of ourselves, do nothing */ | |
9285 | 1181 if (cnode == node) |
5234 | 1182 return; |
1183 | |
1184 if (cnode->parent) { | |
1185 /* This chat was already in the list and is | |
1186 * being moved. | |
1187 */ | |
6695 | 1188 ((GaimGroup *)cnode->parent)->totalsize--; |
5855 | 1189 if (gaim_account_is_connected(chat->account)) { |
6695 | 1190 ((GaimGroup *)cnode->parent)->online--; |
1191 ((GaimGroup *)cnode->parent)->currentsize--; | |
5287 | 1192 } |
9285 | 1193 if (cnode->next) |
5234 | 1194 cnode->next->prev = cnode->prev; |
9285 | 1195 if (cnode->prev) |
5234 | 1196 cnode->prev->next = cnode->next; |
9285 | 1197 if (cnode->parent->child == cnode) |
5234 | 1198 cnode->parent->child = cnode->next; |
1199 | |
1200 ops->remove(gaimbuddylist, cnode); | |
11101
8b346ce5cdb8
[gaim-migrate @ 13140]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11067
diff
changeset
|
1201 /* 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
|
1202 * reinitialize it */ |
8b346ce5cdb8
[gaim-migrate @ 13140]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11067
diff
changeset
|
1203 ops->new_node(cnode); |
5234 | 1204 |
10704 | 1205 gaim_blist_schedule_save(); |
5234 | 1206 } |
1207 | |
9285 | 1208 if (node != NULL) { |
1209 if (node->next) | |
1210 node->next->prev = cnode; | |
1211 cnode->next = node->next; | |
1212 cnode->prev = node; | |
1213 cnode->parent = node->parent; | |
1214 node->next = cnode; | |
1215 ((GaimGroup *)node->parent)->totalsize++; | |
5855 | 1216 if (gaim_account_is_connected(chat->account)) { |
9285 | 1217 ((GaimGroup *)node->parent)->online++; |
1218 ((GaimGroup *)node->parent)->currentsize++; | |
5287 | 1219 } |
5234 | 1220 } else { |
9285 | 1221 if (((GaimBlistNode *)group)->child) |
1222 ((GaimBlistNode *)group)->child->prev = cnode; | |
1223 cnode->next = ((GaimBlistNode *)group)->child; | |
5634 | 1224 cnode->prev = NULL; |
9285 | 1225 ((GaimBlistNode *)group)->child = cnode; |
1226 cnode->parent = (GaimBlistNode *)group; | |
1227 group->totalsize++; | |
5855 | 1228 if (gaim_account_is_connected(chat->account)) { |
9285 | 1229 group->online++; |
1230 group->currentsize++; | |
5287 | 1231 } |
5234 | 1232 } |
1233 | |
10704 | 1234 gaim_blist_schedule_save(); |
9285 | 1235 |
1236 if (ops && ops->update) | |
1237 ops->update(gaimbuddylist, (GaimBlistNode *)cnode); | |
5234 | 1238 } |
1239 | |
7879 | 1240 void gaim_blist_add_buddy(GaimBuddy *buddy, GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
5228 | 1241 { |
6695 | 1242 GaimBlistNode *cnode, *bnode; |
1243 GaimGroup *g; | |
1244 GaimContact *c; | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1245 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5247 | 1246 struct _gaim_hbuddy *hb; |
6695 | 1247 |
1248 g_return_if_fail(buddy != NULL); | |
6774 | 1249 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY((GaimBlistNode*)buddy)); |
6695 | 1250 |
1251 bnode = (GaimBlistNode *)buddy; | |
5228 | 1252 |
6695 | 1253 /* if we're moving to overtop of ourselves, do nothing */ |
9285 | 1254 if (bnode == node || (!node && bnode->parent && |
6695 | 1255 contact && bnode->parent == (GaimBlistNode*)contact |
1256 && bnode == bnode->parent->child)) | |
1257 return; | |
1258 | |
9285 | 1259 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
6695 | 1260 c = (GaimContact*)node->parent; |
1261 g = (GaimGroup*)node->parent->parent; | |
9285 | 1262 } else if (contact) { |
6695 | 1263 c = contact; |
9285 | 1264 g = (GaimGroup *)((GaimBlistNode *)c)->parent; |
1265 } else { | |
1266 if (group) { | |
6695 | 1267 g = group; |
1268 } else { | |
5228 | 1269 g = gaim_group_new(_("Buddies")); |
5634 | 1270 gaim_blist_add_group(g, |
1271 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
5228 | 1272 } |
6695 | 1273 c = gaim_contact_new(); |
1274 gaim_blist_add_contact(c, g, | |
1275 gaim_blist_get_last_child((GaimBlistNode*)g)); | |
5228 | 1276 } |
1277 | |
6695 | 1278 cnode = (GaimBlistNode *)c; |
5228 | 1279 |
9285 | 1280 if (bnode->parent) { |
1281 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
6695 | 1282 ((GaimContact*)bnode->parent)->online--; |
9285 | 1283 if (((GaimContact*)bnode->parent)->online == 0) |
6695 | 1284 ((GaimGroup*)bnode->parent->parent)->online--; |
1285 } | |
9285 | 1286 if (gaim_account_is_connected(buddy->account)) { |
6695 | 1287 ((GaimContact*)bnode->parent)->currentsize--; |
9285 | 1288 if (((GaimContact*)bnode->parent)->currentsize == 0) |
6695 | 1289 ((GaimGroup*)bnode->parent->parent)->currentsize--; |
1290 } | |
1291 ((GaimContact*)bnode->parent)->totalsize--; | |
1292 /* the group totalsize will be taken care of by remove_contact below */ | |
1293 | |
9285 | 1294 if (bnode->parent->parent != (GaimBlistNode*)g) |
6695 | 1295 serv_move_buddy(buddy, (GaimGroup *)bnode->parent->parent, g); |
5277 | 1296 |
9285 | 1297 if (bnode->next) |
5228 | 1298 bnode->next->prev = bnode->prev; |
9285 | 1299 if (bnode->prev) |
5228 | 1300 bnode->prev->next = bnode->next; |
9285 | 1301 if (bnode->parent->child == bnode) |
5228 | 1302 bnode->parent->child = bnode->next; |
1303 | |
1304 ops->remove(gaimbuddylist, bnode); | |
1305 | |
10704 | 1306 gaim_blist_schedule_save(); |
9285 | 1307 |
1308 if (bnode->parent->parent != (GaimBlistNode*)g) { | |
6742 | 1309 hb = g_new(struct _gaim_hbuddy, 1); |
7261 | 1310 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
6742 | 1311 hb->account = buddy->account; |
1312 hb->group = bnode->parent->parent; | |
6775 | 1313 g_hash_table_remove(gaimbuddylist->buddies, hb); |
7162 | 1314 g_free(hb->name); |
6742 | 1315 g_free(hb); |
1316 } | |
6794 | 1317 |
9285 | 1318 if (!bnode->parent->child) { |
6794 | 1319 gaim_blist_remove_contact((GaimContact*)bnode->parent); |
7003 | 1320 } else { |
10378 | 1321 gaim_contact_invalidate_priority_buddy((GaimContact*)bnode->parent); |
7003 | 1322 ops->update(gaimbuddylist, bnode->parent); |
1323 } | |
5228 | 1324 } |
1325 | |
9285 | 1326 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
1327 if (node->next) | |
6695 | 1328 node->next->prev = bnode; |
1329 bnode->next = node->next; | |
1330 bnode->prev = node; | |
1331 bnode->parent = node->parent; | |
1332 node->next = bnode; | |
5228 | 1333 } else { |
9285 | 1334 if (cnode->child) |
6695 | 1335 cnode->child->prev = bnode; |
1336 bnode->prev = NULL; | |
1337 bnode->next = cnode->child; | |
1338 cnode->child = bnode; | |
1339 bnode->parent = cnode; | |
5228 | 1340 } |
1341 | |
9285 | 1342 if (GAIM_BUDDY_IS_ONLINE(buddy)) { |
6695 | 1343 ((GaimContact*)bnode->parent)->online++; |
9285 | 1344 if (((GaimContact*)bnode->parent)->online == 1) |
6695 | 1345 ((GaimGroup*)bnode->parent->parent)->online++; |
1346 } | |
9285 | 1347 if (gaim_account_is_connected(buddy->account)) { |
6695 | 1348 ((GaimContact*)bnode->parent)->currentsize++; |
9285 | 1349 if (((GaimContact*)bnode->parent)->currentsize == 1) |
6695 | 1350 ((GaimGroup*)bnode->parent->parent)->currentsize++; |
1351 } | |
1352 ((GaimContact*)bnode->parent)->totalsize++; | |
1353 | |
6742 | 1354 hb = g_new(struct _gaim_hbuddy, 1); |
7261 | 1355 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
5247 | 1356 hb->account = buddy->account; |
6695 | 1357 hb->group = ((GaimBlistNode*)buddy)->parent->parent; |
5247 | 1358 |
6742 | 1359 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); |
5247 | 1360 |
10378 | 1361 gaim_contact_invalidate_priority_buddy(gaim_buddy_get_contact(buddy)); |
9285 | 1362 |
10704 | 1363 gaim_blist_schedule_save(); |
9285 | 1364 |
1365 if (ops && ops->update) | |
5228 | 1366 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1367 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1368 /* Signal that the buddy has been added */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1369 gaim_signal_emit(gaim_blist_get_handle(), "buddy-added", buddy); |
5228 | 1370 } |
1371 | |
6695 | 1372 GaimContact *gaim_contact_new() |
5228 | 1373 { |
9285 | 1374 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
1375 | |
1376 GaimContact *contact = g_new0(GaimContact, 1); | |
1377 contact->totalsize = 0; | |
1378 contact->currentsize = 0; | |
1379 contact->online = 0; | |
1380 gaim_blist_node_initialize_settings((GaimBlistNode *)contact); | |
1381 ((GaimBlistNode *)contact)->type = GAIM_BLIST_CONTACT_NODE; | |
1382 | |
1383 if (ops && ops->new_node) | |
1384 ops->new_node((GaimBlistNode *)contact); | |
1385 | |
11146 | 1386 GAIM_DBUS_REGISTER_POINTER(contact, GaimContact); |
9285 | 1387 return contact; |
6695 | 1388 } |
1389 | |
9285 | 1390 void gaim_contact_set_alias(GaimContact *contact, const char *alias) |
6755 | 1391 { |
7245 | 1392 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1393 char *old_alias = contact->alias; |
7245 | 1394 |
6755 | 1395 g_return_if_fail(contact != NULL); |
1396 | |
9285 | 1397 if ((alias != NULL) && (*alias != '\0')) |
7245 | 1398 contact->alias = g_strdup(alias); |
1399 else | |
1400 contact->alias = NULL; | |
1401 | |
10704 | 1402 gaim_blist_schedule_save(); |
9285 | 1403 |
1404 if (ops && ops->update) | |
7245 | 1405 ops->update(gaimbuddylist, (GaimBlistNode*)contact); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1406 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1407 gaim_signal_emit(gaim_blist_get_handle(), "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1408 contact, old_alias); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1409 g_free(old_alias); |
6755 | 1410 } |
1411 | |
1412 const char *gaim_contact_get_alias(GaimContact* contact) | |
1413 { | |
9285 | 1414 g_return_val_if_fail(contact != NULL, NULL); |
1415 | |
1416 if (contact->alias) | |
7312 | 1417 return contact->alias; |
1418 | |
10378 | 1419 return gaim_buddy_get_alias(gaim_contact_get_priority_buddy(contact)); |
6755 | 1420 } |
1421 | |
9787 | 1422 gboolean gaim_contact_on_account(GaimContact *c, GaimAccount *account) |
1423 { | |
1424 GaimBlistNode *bnode, *cnode = (GaimBlistNode *) c; | |
1425 | |
1426 g_return_val_if_fail(c != NULL, FALSE); | |
1427 g_return_val_if_fail(account != NULL, FALSE); | |
1428 | |
1429 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
1430 GaimBuddy *buddy; | |
1431 | |
1432 if (! GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
1433 continue; | |
1434 | |
1435 buddy = (GaimBuddy *)bnode; | |
1436 if (buddy->account == account) | |
1437 return TRUE; | |
1438 } | |
1439 return FALSE; | |
1440 } | |
1441 | |
10428 | 1442 void gaim_contact_invalidate_priority_buddy(GaimContact *contact) |
1443 { | |
1444 g_return_if_fail(contact != NULL); | |
1445 | |
1446 contact->priority_valid = FALSE; | |
1447 } | |
1448 | |
6695 | 1449 GaimGroup *gaim_group_new(const char *name) |
1450 { | |
9285 | 1451 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
12458 | 1452 GaimGroup *group; |
1453 | |
1454 g_return_val_if_fail(name != NULL, NULL); | |
1455 g_return_val_if_fail(*name != '\0', NULL); | |
1456 | |
1457 group = gaim_find_group(name); | |
9285 | 1458 if (group != NULL) |
1459 return group; | |
1460 | |
1461 group = g_new0(GaimGroup, 1); | |
1462 group->name = g_strdup(name); | |
1463 group->totalsize = 0; | |
1464 group->currentsize = 0; | |
1465 group->online = 0; | |
1466 gaim_blist_node_initialize_settings((GaimBlistNode *)group); | |
1467 ((GaimBlistNode *)group)->type = GAIM_BLIST_GROUP_NODE; | |
1468 | |
1469 if (ops && ops->new_node) | |
1470 ops->new_node((GaimBlistNode *)group); | |
1471 | |
11146 | 1472 GAIM_DBUS_REGISTER_POINTER(group, GaimGroup); |
9285 | 1473 return group; |
5228 | 1474 } |
1475 | |
6695 | 1476 void gaim_blist_add_contact(GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
1477 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1478 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 1479 GaimGroup *g; |
6742 | 1480 GaimBlistNode *gnode, *cnode, *bnode; |
6695 | 1481 |
6774 | 1482 g_return_if_fail(contact != NULL); |
1483 g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT((GaimBlistNode*)contact)); | |
6695 | 1484 |
9285 | 1485 if ((GaimBlistNode*)contact == node) |
6975 | 1486 return; |
1487 | |
9285 | 1488 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
6695 | 1489 GAIM_BLIST_NODE_IS_CHAT(node))) |
1490 g = (GaimGroup*)node->parent; | |
9285 | 1491 else if (group) |
6695 | 1492 g = group; |
1493 else { | |
1494 g = gaim_group_new(_("Buddies")); | |
1495 gaim_blist_add_group(g, | |
1496 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
1497 } | |
1498 | |
1499 gnode = (GaimBlistNode*)g; | |
1500 cnode = (GaimBlistNode*)contact; | |
1501 | |
9285 | 1502 if (cnode->parent) { |
1503 if (cnode->parent->child == cnode) | |
6731 | 1504 cnode->parent->child = cnode->next; |
9285 | 1505 if (cnode->prev) |
6695 | 1506 cnode->prev->next = cnode->next; |
9285 | 1507 if (cnode->next) |
6695 | 1508 cnode->next->prev = cnode->prev; |
1509 | |
9285 | 1510 if (cnode->parent != gnode) { |
9928 | 1511 bnode = cnode->child; |
1512 while (bnode) { | |
1513 GaimBlistNode *next_bnode = bnode->next; | |
6742 | 1514 GaimBuddy *b = (GaimBuddy*)bnode; |
1515 | |
1516 struct _gaim_hbuddy *hb = g_new(struct _gaim_hbuddy, 1); | |
7261 | 1517 hb->name = g_strdup(gaim_normalize(b->account, b->name)); |
6742 | 1518 hb->account = b->account; |
1519 hb->group = cnode->parent; | |
1520 | |
6776 | 1521 g_hash_table_remove(gaimbuddylist->buddies, hb); |
6742 | 1522 |
9285 | 1523 if (!gaim_find_buddy_in_group(b->account, b->name, g)) { |
8328 | 1524 hb->group = gnode; |
1525 g_hash_table_replace(gaimbuddylist->buddies, hb, b); | |
1526 | |
9285 | 1527 if (b->account->gc) |
1528 serv_move_buddy(b, (GaimGroup *)cnode->parent, g); | |
8328 | 1529 } else { |
9928 | 1530 gboolean empty_contact = FALSE; |
1531 | |
8328 | 1532 /* this buddy already exists in the group, so we're |
1533 * gonna delete it instead */ | |
1534 g_free(hb->name); | |
1535 g_free(hb); | |
9285 | 1536 if (b->account->gc) |
11643 | 1537 gaim_account_remove_buddy(b->account, b, (GaimGroup *)cnode->parent); |
9285 | 1538 |
1539 if (!cnode->child->next) | |
8328 | 1540 empty_contact = TRUE; |
1541 gaim_blist_remove_buddy(b); | |
9928 | 1542 |
1543 /** in gaim_blist_remove_buddy(), if the last buddy in a | |
1544 * contact is removed, the contact is cleaned up and | |
1545 * g_free'd, so we mustn't try to reference bnode->next */ | |
1546 if (empty_contact) | |
1547 return; | |
8328 | 1548 } |
9928 | 1549 bnode = next_bnode; |
6742 | 1550 } |
1551 } | |
9928 | 1552 |
1553 if (contact->online > 0) | |
1554 ((GaimGroup*)cnode->parent)->online--; | |
1555 if (contact->currentsize > 0) | |
1556 ((GaimGroup*)cnode->parent)->currentsize--; | |
1557 ((GaimGroup*)cnode->parent)->totalsize--; | |
1558 | |
1559 ops->remove(gaimbuddylist, cnode); | |
1560 | |
10704 | 1561 gaim_blist_schedule_save(); |
6695 | 1562 } |
1563 | |
9285 | 1564 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
6695 | 1565 GAIM_BLIST_NODE_IS_CHAT(node))) { |
9285 | 1566 if (node->next) |
6695 | 1567 node->next->prev = cnode; |
1568 cnode->next = node->next; | |
1569 cnode->prev = node; | |
1570 cnode->parent = node->parent; | |
1571 node->next = cnode; | |
1572 } else { | |
9285 | 1573 if (gnode->child) |
6695 | 1574 gnode->child->prev = cnode; |
1575 cnode->prev = NULL; | |
1576 cnode->next = gnode->child; | |
1577 gnode->child = cnode; | |
1578 cnode->parent = gnode; | |
1579 } | |
1580 | |
9285 | 1581 if (contact->online > 0) |
6695 | 1582 g->online++; |
9285 | 1583 if (contact->currentsize > 0) |
6695 | 1584 g->currentsize++; |
1585 g->totalsize++; | |
1586 | |
10704 | 1587 gaim_blist_schedule_save(); |
9285 | 1588 |
1589 if (ops && cnode->child) | |
6695 | 1590 ops->update(gaimbuddylist, cnode); |
6775 | 1591 |
9285 | 1592 for (bnode = cnode->child; bnode; bnode = bnode->next) |
6775 | 1593 ops->update(gaimbuddylist, bnode); |
6695 | 1594 } |
1595 | |
7246 | 1596 void gaim_blist_merge_contact(GaimContact *source, GaimBlistNode *node) |
6965 | 1597 { |
1598 GaimBlistNode *sourcenode = (GaimBlistNode*)source; | |
7246 | 1599 GaimBlistNode *targetnode; |
1600 GaimBlistNode *prev, *cur, *next; | |
1601 GaimContact *target; | |
1602 | |
9285 | 1603 g_return_if_fail(source != NULL); |
1604 g_return_if_fail(node != NULL); | |
1605 | |
1606 if (GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
1607 target = (GaimContact *)node; | |
7246 | 1608 prev = gaim_blist_get_last_child(node); |
9285 | 1609 } else if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
1610 target = (GaimContact *)node->parent; | |
7246 | 1611 prev = node; |
1612 } else { | |
6965 | 1613 return; |
7246 | 1614 } |
1615 | |
9285 | 1616 if (source == target || !target) |
7246 | 1617 return; |
1618 | |
9285 | 1619 targetnode = (GaimBlistNode *)target; |
7246 | 1620 next = sourcenode->child; |
1621 | |
9285 | 1622 while (next) { |
7246 | 1623 cur = next; |
1624 next = cur->next; | |
9285 | 1625 if (GAIM_BLIST_NODE_IS_BUDDY(cur)) { |
1626 gaim_blist_add_buddy((GaimBuddy *)cur, target, NULL, prev); | |
7246 | 1627 prev = cur; |
1628 } | |
6965 | 1629 } |
1630 } | |
1631 | |
9285 | 1632 void gaim_blist_add_group(GaimGroup *group, GaimBlistNode *node) |
5228 | 1633 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1634 GaimBlistUiOps *ops; |
5228 | 1635 GaimBlistNode *gnode = (GaimBlistNode*)group; |
1636 | |
6774 | 1637 g_return_if_fail(group != NULL); |
9285 | 1638 g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP((GaimBlistNode *)group)); |
1639 | |
5228 | 1640 ops = gaimbuddylist->ui_ops; |
1641 | |
1642 if (!gaimbuddylist->root) { | |
1643 gaimbuddylist->root = gnode; | |
1644 return; | |
1645 } | |
1646 | |
1647 /* if we're moving to overtop of ourselves, do nothing */ | |
9285 | 1648 if (gnode == node) |
5228 | 1649 return; |
1650 | |
1651 if (gaim_find_group(group->name)) { | |
1652 /* This is just being moved */ | |
1653 | |
9285 | 1654 ops->remove(gaimbuddylist, (GaimBlistNode *)group); |
1655 | |
1656 if (gnode == gaimbuddylist->root) | |
5228 | 1657 gaimbuddylist->root = gnode->next; |
9285 | 1658 if (gnode->prev) |
5228 | 1659 gnode->prev->next = gnode->next; |
9285 | 1660 if (gnode->next) |
5228 | 1661 gnode->next->prev = gnode->prev; |
1662 } | |
1663 | |
6695 | 1664 if (node && GAIM_BLIST_NODE_IS_GROUP(node)) { |
5634 | 1665 gnode->next = node->next; |
1666 gnode->prev = node; | |
9285 | 1667 if (node->next) |
5634 | 1668 node->next->prev = gnode; |
1669 node->next = gnode; | |
1670 } else { | |
9285 | 1671 if (gaimbuddylist->root) |
6807 | 1672 gaimbuddylist->root->prev = gnode; |
5634 | 1673 gnode->next = gaimbuddylist->root; |
1674 gnode->prev = NULL; | |
1675 gaimbuddylist->root = gnode; | |
1676 } | |
1677 | |
10704 | 1678 gaim_blist_schedule_save(); |
9285 | 1679 |
1680 if (ops && ops->update) { | |
5228 | 1681 ops->update(gaimbuddylist, gnode); |
9285 | 1682 for (node = gnode->child; node; node = node->next) |
5228 | 1683 ops->update(gaimbuddylist, node); |
1684 } | |
1685 } | |
1686 | |
9285 | 1687 void gaim_blist_remove_contact(GaimContact *contact) |
5228 | 1688 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1689 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1690 GaimBlistNode *node, *gnode; |
1691 | |
1692 g_return_if_fail(contact != NULL); | |
1693 | |
1694 node = (GaimBlistNode *)contact; | |
1695 gnode = node->parent; | |
1696 | |
1697 if (node->child) { | |
1698 /* | |
1699 * If this contact has children then remove them. When the last | |
10166 | 1700 * buddy is removed from the contact, the contact is automatically |
1701 * deleted. | |
9285 | 1702 */ |
10166 | 1703 while (node->child->next) { |
9285 | 1704 gaim_blist_remove_buddy((GaimBuddy*)node->child); |
6695 | 1705 } |
10166 | 1706 /* |
1707 * 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
|
1708 * It would probably be cleaner if contact-deletion was done after |
10166 | 1709 * a timeout? Or if it had to be done manually, like below? |
1710 */ | |
1711 gaim_blist_remove_buddy((GaimBuddy*)node->child); | |
6695 | 1712 } else { |
9285 | 1713 /* Remove the node from its parent */ |
1714 if (gnode->child == node) | |
1715 gnode->child = node->next; | |
1716 if (node->prev) | |
1717 node->prev->next = node->next; | |
1718 if (node->next) | |
1719 node->next->prev = node->prev; | |
1720 | |
10704 | 1721 gaim_blist_schedule_save(); |
9285 | 1722 |
1723 /* Update the UI */ | |
1724 if (ops && ops->remove) | |
1725 ops->remove(gaimbuddylist, node); | |
1726 | |
1727 /* Delete the node */ | |
10504 | 1728 g_hash_table_destroy(contact->node.settings); |
11067 | 1729 GAIM_DBUS_UNREGISTER_POINTER(contact); |
6695 | 1730 g_free(contact); |
1731 } | |
1732 } | |
1733 | |
9285 | 1734 void gaim_blist_remove_buddy(GaimBuddy *buddy) |
6695 | 1735 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1736 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1737 GaimBlistNode *node, *cnode, *gnode; |
1738 GaimContact *contact; | |
6695 | 1739 GaimGroup *group; |
6742 | 1740 struct _gaim_hbuddy hb; |
5228 | 1741 |
9285 | 1742 g_return_if_fail(buddy != NULL); |
1743 | |
1744 node = (GaimBlistNode *)buddy; | |
6695 | 1745 cnode = node->parent; |
9285 | 1746 gnode = cnode->parent; |
1747 contact = (GaimContact *)cnode; | |
1748 group = (GaimGroup *)gnode; | |
1749 | |
11302
fc17554c32c5
[gaim-migrate @ 13502]
Richard Laager <rlaager@wiktel.com>
parents:
11268
diff
changeset
|
1750 /* Delete any buddy icon. */ |
11860 | 1751 gaim_buddy_icon_uncache(buddy); |
11302
fc17554c32c5
[gaim-migrate @ 13502]
Richard Laager <rlaager@wiktel.com>
parents:
11268
diff
changeset
|
1752 |
9285 | 1753 /* Remove the node from its parent */ |
5228 | 1754 if (node->prev) |
1755 node->prev->next = node->next; | |
1756 if (node->next) | |
1757 node->next->prev = node->prev; | |
9285 | 1758 if (cnode->child == node) |
6695 | 1759 cnode->child = node->next; |
9285 | 1760 |
1761 /* Adjust size counts */ | |
1762 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
1763 contact->online--; | |
1764 if (contact->online == 0) | |
1765 group->online--; | |
6695 | 1766 } |
9285 | 1767 if (gaim_account_is_connected(buddy->account)) { |
1768 contact->currentsize--; | |
1769 if (contact->currentsize == 0) | |
1770 group->currentsize--; | |
8194 | 1771 } |
9285 | 1772 contact->totalsize--; |
1773 | |
10704 | 1774 gaim_blist_schedule_save(); |
9285 | 1775 |
1776 /* Re-sort the contact */ | |
1777 if (contact->priority == buddy) { | |
10378 | 1778 gaim_contact_invalidate_priority_buddy(contact); |
9285 | 1779 if (ops && ops->update) |
1780 ops->update(gaimbuddylist, cnode); | |
1781 } | |
1782 | |
1783 /* Remove this buddy from the buddies hash table */ | |
7261 | 1784 hb.name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
5247 | 1785 hb.account = buddy->account; |
6695 | 1786 hb.group = ((GaimBlistNode*)buddy)->parent->parent; |
6742 | 1787 g_hash_table_remove(gaimbuddylist->buddies, &hb); |
7162 | 1788 g_free(hb.name); |
5247 | 1789 |
9285 | 1790 /* Update the UI */ |
1791 if (ops && ops->remove) | |
1792 ops->remove(gaimbuddylist, node); | |
1793 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1794 /* 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
|
1795 gaim_signal_emit(gaim_blist_get_handle(), "buddy-removed", buddy); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1796 |
9285 | 1797 /* Delete the node */ |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1798 if (buddy->icon != NULL) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1799 gaim_buddy_icon_unref(buddy->icon); |
7693 | 1800 g_hash_table_destroy(buddy->node.settings); |
9944 | 1801 gaim_presence_remove_buddy(buddy->presence, buddy); |
1802 gaim_presence_destroy(buddy->presence); | |
5228 | 1803 g_free(buddy->name); |
1804 g_free(buddy->alias); | |
10504 | 1805 g_free(buddy->server_alias); |
11067 | 1806 |
1807 GAIM_DBUS_UNREGISTER_POINTER(buddy); | |
5228 | 1808 g_free(buddy); |
6755 | 1809 |
12862
b503265495f7
[gaim-migrate @ 15213]
Richard Laager <rlaager@wiktel.com>
parents:
12860
diff
changeset
|
1810 /* FIXME: Once GaimBuddy is a GObject, timeout callbacks can |
b503265495f7
[gaim-migrate @ 15213]
Richard Laager <rlaager@wiktel.com>
parents:
12860
diff
changeset
|
1811 * g_object_ref() it when connecting the callback and |
b503265495f7
[gaim-migrate @ 15213]
Richard Laager <rlaager@wiktel.com>
parents:
12860
diff
changeset
|
1812 * g_object_unref() it in the handler. That way, it won't |
b503265495f7
[gaim-migrate @ 15213]
Richard Laager <rlaager@wiktel.com>
parents:
12860
diff
changeset
|
1813 * get freed while the timeout is pending and this line can |
b503265495f7
[gaim-migrate @ 15213]
Richard Laager <rlaager@wiktel.com>
parents:
12860
diff
changeset
|
1814 * be removed. */ |
12860
a35edda11737
[gaim-migrate @ 15211]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
1815 while (g_source_remove_by_user_data((gpointer *)buddy)); |
a35edda11737
[gaim-migrate @ 15211]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
1816 |
9285 | 1817 /* If the contact is empty then remove it */ |
1818 if (!cnode->child) | |
1819 gaim_blist_remove_contact(contact); | |
5228 | 1820 } |
1821 | |
9285 | 1822 void gaim_blist_remove_chat(GaimChat *chat) |
5234 | 1823 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1824 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1825 GaimBlistNode *node, *gnode; |
6695 | 1826 GaimGroup *group; |
5234 | 1827 |
9285 | 1828 g_return_if_fail(chat != NULL); |
1829 | |
1830 node = (GaimBlistNode *)chat; | |
5234 | 1831 gnode = node->parent; |
6695 | 1832 group = (GaimGroup *)gnode; |
5234 | 1833 |
12577
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1834 if (gnode != NULL) |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1835 { |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1836 /* Remove the node from its parent */ |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1837 if (gnode->child == node) |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1838 gnode->child = node->next; |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1839 if (node->prev) |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1840 node->prev->next = node->next; |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1841 if (node->next) |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1842 node->next->prev = node->prev; |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1843 |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1844 /* Adjust size counts */ |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1845 if (gaim_account_is_connected(chat->account)) { |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1846 group->online--; |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1847 group->currentsize--; |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1848 } |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1849 group->totalsize--; |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1850 |
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1851 gaim_blist_schedule_save(); |
5394 | 1852 } |
9285 | 1853 |
1854 /* Update the UI */ | |
1855 if (ops && ops->remove) | |
1856 ops->remove(gaimbuddylist, node); | |
1857 | |
1858 /* Delete the node */ | |
5234 | 1859 g_hash_table_destroy(chat->components); |
10504 | 1860 g_hash_table_destroy(chat->node.settings); |
5234 | 1861 g_free(chat->alias); |
11067 | 1862 GAIM_DBUS_UNREGISTER_POINTER(chat); |
5234 | 1863 g_free(chat); |
1864 } | |
1865 | |
9285 | 1866 void gaim_blist_remove_group(GaimGroup *group) |
5228 | 1867 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1868 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1869 GaimBlistNode *node; |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1870 GList *l; |
5228 | 1871 |
9285 | 1872 g_return_if_fail(group != NULL); |
1873 | |
1874 node = (GaimBlistNode *)group; | |
1875 | |
1876 /* Make sure the group is empty */ | |
1877 if (node->child) { | |
5228 | 1878 char *buf; |
1879 int count = 0; | |
9285 | 1880 GaimBlistNode *child; |
1881 | |
1882 for (child = node->child; child != NULL; child = child->next) | |
5228 | 1883 count++; |
1884 | |
6308 | 1885 buf = g_strdup_printf(ngettext("%d buddy from group %s was not removed " |
13043
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1886 "because it belongs to an account which is " |
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1887 "disabled or offline. This buddy and the " |
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1888 "group were not removed.\n", |
6308 | 1889 "%d buddies from group %s were not " |
13043
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1890 "removed because they belong to accounts " |
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1891 "which are currently disabled or offline. " |
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1892 "These buddies and the group were not " |
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1893 "removed.\n", count), |
6308 | 1894 count, group->name); |
5541
aee0ee458974
[gaim-migrate @ 5941]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1895 gaim_notify_error(NULL, NULL, _("Group not removed"), buf); |
5228 | 1896 g_free(buf); |
1897 return; | |
1898 } | |
1899 | |
9285 | 1900 /* Remove the node from its parent */ |
1901 if (gaimbuddylist->root == node) | |
5228 | 1902 gaimbuddylist->root = node->next; |
1903 if (node->prev) | |
1904 node->prev->next = node->next; | |
1905 if (node->next) | |
1906 node->next->prev = node->prev; | |
1907 | |
10704 | 1908 gaim_blist_schedule_save(); |
9285 | 1909 |
1910 /* Update the UI */ | |
1911 if (ops && ops->remove) | |
1912 ops->remove(gaimbuddylist, node); | |
1913 | |
1914 /* Remove the group from all accounts that are online */ | |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1915 for (l = gaim_connections_get_all(); l != NULL; l = l->next) |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1916 { |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1917 GaimConnection *gc = (GaimConnection *)l->data; |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1918 |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1919 if (gaim_connection_get_state(gc) == GAIM_CONNECTED) |
11643 | 1920 gaim_account_remove_group(gaim_connection_get_account(gc), group); |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1921 } |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1922 |
9285 | 1923 /* Delete the node */ |
10504 | 1924 g_hash_table_destroy(group->node.settings); |
5228 | 1925 g_free(group->name); |
11067 | 1926 GAIM_DBUS_UNREGISTER_POINTER(group); |
5228 | 1927 g_free(group); |
1928 } | |
1929 | |
9285 | 1930 GaimBuddy *gaim_contact_get_priority_buddy(GaimContact *contact) |
1931 { | |
1932 g_return_val_if_fail(contact != NULL, NULL); | |
1933 | |
10378 | 1934 if (!contact->priority_valid) |
1935 gaim_contact_compute_priority_buddy(contact); | |
1936 | |
6843 | 1937 return contact->priority; |
6695 | 1938 } |
1939 | |
9620 | 1940 const char *gaim_buddy_get_alias_only(GaimBuddy *buddy) |
9285 | 1941 { |
1942 g_return_val_if_fail(buddy != NULL, NULL); | |
1943 | |
1944 if ((buddy->alias != NULL) && (*buddy->alias != '\0')) { | |
1945 return buddy->alias; | |
1946 } else if ((buddy->server_alias != NULL) && | |
10389 | 1947 (*buddy->server_alias != '\0')) { |
9285 | 1948 |
1949 return buddy->server_alias; | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1950 } |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1951 |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1952 return NULL; |
5228 | 1953 } |
1954 | |
9620 | 1955 |
1956 const char *gaim_buddy_get_contact_alias(GaimBuddy *buddy) | |
5228 | 1957 { |
9620 | 1958 GaimContact *c; |
1959 | |
1960 g_return_val_if_fail(buddy != NULL, NULL); | |
1961 | |
1962 /* Search for an alias for the buddy. In order of precedence: */ | |
1963 /* The buddy alias */ | |
1964 if (buddy->alias != NULL) | |
1965 return buddy->alias; | |
1966 | |
1967 /* The contact alias */ | |
1968 c = gaim_buddy_get_contact(buddy); | |
1969 if ((c != NULL) && (c->alias != NULL)) | |
1970 return c->alias; | |
1971 | |
10349 | 1972 /* The server alias */ |
1973 if ((buddy->server_alias) && (*buddy->server_alias)) | |
9620 | 1974 return buddy->server_alias; |
1975 | |
1976 /* The buddy's user name (i.e. no alias) */ | |
1977 return buddy->name; | |
5228 | 1978 } |
1979 | |
9620 | 1980 |
1981 const char *gaim_buddy_get_alias(GaimBuddy *buddy) | |
1982 { | |
1983 g_return_val_if_fail(buddy != NULL, NULL); | |
1984 | |
1985 /* Search for an alias for the buddy. In order of precedence: */ | |
1986 /* The buddy alias */ | |
1987 if (buddy->alias != NULL) | |
1988 return buddy->alias; | |
1989 | |
11266 | 1990 /* The server alias */ |
10389 | 1991 if ((buddy->server_alias) && (*buddy->server_alias)) |
9620 | 1992 return buddy->server_alias; |
1993 | |
1994 /* The buddy's user name (i.e. no alias) */ | |
1995 return buddy->name; | |
1996 } | |
1997 | |
10349 | 1998 const char *gaim_buddy_get_local_alias(GaimBuddy *buddy) |
1999 { | |
2000 GaimContact *c; | |
2001 | |
2002 g_return_val_if_fail(buddy != NULL, NULL); | |
2003 | |
2004 /* Search for an alias for the buddy. In order of precedence: */ | |
2005 /* The buddy alias */ | |
2006 if (buddy->alias != NULL) | |
2007 return buddy->alias; | |
2008 | |
2009 /* The contact alias */ | |
2010 c = gaim_buddy_get_contact(buddy); | |
2011 if ((c != NULL) && (c->alias != NULL)) | |
2012 return c->alias; | |
2013 | |
2014 /* The buddy's user name (i.e. no alias) */ | |
2015 return buddy->name; | |
2016 } | |
9620 | 2017 |
7125 | 2018 const char *gaim_chat_get_name(GaimChat *chat) |
6744 | 2019 { |
9285 | 2020 struct proto_chat_entry *pce; |
2021 GList *parts, *tmp; | |
2022 char *ret; | |
2023 | |
2024 g_return_val_if_fail(chat != NULL, NULL); | |
2025 | |
2026 if ((chat->alias != NULL) && (*chat->alias != '\0')) | |
6744 | 2027 return chat->alias; |
9285 | 2028 |
2029 parts = GAIM_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); | |
2030 pce = parts->data; | |
2031 ret = g_hash_table_lookup(chat->components, pce->identifier); | |
2032 for (tmp = parts; tmp; tmp = tmp->next) | |
2033 g_free(tmp->data); | |
2034 g_list_free(parts); | |
2035 | |
2036 return ret; | |
6744 | 2037 } |
2038 | |
6695 | 2039 GaimBuddy *gaim_find_buddy(GaimAccount *account, const char *name) |
5228 | 2040 { |
6695 | 2041 GaimBuddy *buddy; |
5247 | 2042 struct _gaim_hbuddy hb; |
5758 | 2043 GaimBlistNode *group; |
5228 | 2044 |
9285 | 2045 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2046 g_return_val_if_fail(account != NULL, NULL); | |
2047 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
5228 | 2048 |
7429 | 2049 hb.account = account; |
7261 | 2050 hb.name = g_strdup(gaim_normalize(account, name)); |
7429 | 2051 |
9285 | 2052 for (group = gaimbuddylist->root; group; group = group->next) { |
5758 | 2053 hb.group = group; |
7162 | 2054 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb))) { |
2055 g_free(hb.name); | |
5758 | 2056 return buddy; |
7162 | 2057 } |
5758 | 2058 } |
7162 | 2059 g_free(hb.name); |
9285 | 2060 |
5758 | 2061 return NULL; |
5228 | 2062 } |
2063 | |
6872 | 2064 GaimBuddy *gaim_find_buddy_in_group(GaimAccount *account, const char *name, |
2065 GaimGroup *group) | |
2066 { | |
2067 struct _gaim_hbuddy hb; | |
7162 | 2068 GaimBuddy *ret; |
6872 | 2069 |
9285 | 2070 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2071 g_return_val_if_fail(account != NULL, NULL); | |
2072 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6872 | 2073 |
7261 | 2074 hb.name = g_strdup(gaim_normalize(account, name)); |
6872 | 2075 hb.account = account; |
2076 hb.group = (GaimBlistNode*)group; | |
2077 | |
7162 | 2078 ret = g_hash_table_lookup(gaimbuddylist->buddies, &hb); |
2079 g_free(hb.name); | |
9285 | 2080 |
7162 | 2081 return ret; |
6872 | 2082 } |
2083 | |
6245 | 2084 GSList *gaim_find_buddies(GaimAccount *account, const char *name) |
2085 { | |
2086 struct buddy *buddy; | |
2087 struct _gaim_hbuddy hb; | |
9285 | 2088 GaimBlistNode *node; |
6245 | 2089 GSList *ret = NULL; |
2090 | |
9285 | 2091 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2092 g_return_val_if_fail(account != NULL, NULL); | |
2093 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6245 | 2094 |
7261 | 2095 hb.name = g_strdup(gaim_normalize(account, name)); |
6245 | 2096 hb.account = account; |
2097 | |
9285 | 2098 for (node = gaimbuddylist->root; node != NULL; node = node->next) { |
2099 hb.group = node; | |
6245 | 2100 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) != NULL) |
2101 ret = g_slist_append(ret, buddy); | |
2102 } | |
7162 | 2103 g_free(hb.name); |
9285 | 2104 |
6245 | 2105 return ret; |
2106 } | |
2107 | |
6695 | 2108 GaimGroup *gaim_find_group(const char *name) |
5228 | 2109 { |
2110 GaimBlistNode *node; | |
9285 | 2111 |
2112 g_return_val_if_fail(gaimbuddylist != NULL, NULL); | |
2113 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
2114 | |
2115 for (node = gaimbuddylist->root; node != NULL; node = node->next) { | |
6695 | 2116 if (!strcmp(((GaimGroup *)node)->name, name)) |
2117 return (GaimGroup *)node; | |
5228 | 2118 } |
9285 | 2119 |
5228 | 2120 return NULL; |
2121 } | |
6456
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 GaimChat * |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2124 gaim_blist_find_chat(GaimAccount *account, const char *name) |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2125 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2126 char *chat_name; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2127 GaimChat *chat; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2128 GaimPlugin *prpl; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2129 GaimPluginProtocolInfo *prpl_info = NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2130 struct proto_chat_entry *pce; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2131 GaimBlistNode *node, *group; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2132 GList *parts; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2133 |
9285 | 2134 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2135 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
2136 | |
2137 if (!gaim_account_is_connected(account)) | |
7970 | 2138 return NULL; |
2139 | |
7999 | 2140 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
2141 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
2142 | |
9285 | 2143 if (prpl_info->find_blist_chat != NULL) |
7999 | 2144 return prpl_info->find_blist_chat(account, name); |
2145 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2146 for (group = gaimbuddylist->root; group != NULL; group = group->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2147 for (node = group->child; node != NULL; node = node->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2148 if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2149 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2150 chat = (GaimChat*)node; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2151 |
9285 | 2152 if (account != chat->account) |
7970 | 2153 continue; |
2154 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2155 parts = prpl_info->chat_info( |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2156 gaim_account_get_connection(chat->account)); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2157 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2158 pce = parts->data; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2159 chat_name = g_hash_table_lookup(chat->components, |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2160 pce->identifier); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2161 |
9153 | 2162 if (chat->account == account && chat_name != NULL && |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2163 name != NULL && !strcmp(chat_name, name)) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2164 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2165 return chat; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2166 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2167 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2168 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2169 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2170 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2171 return NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2172 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2173 |
6695 | 2174 GaimGroup * |
7125 | 2175 gaim_chat_get_group(GaimChat *chat) |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2176 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2177 g_return_val_if_fail(chat != NULL, NULL); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2178 |
6695 | 2179 return (GaimGroup *)(((GaimBlistNode *)chat)->parent); |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2180 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2181 |
9285 | 2182 GaimContact *gaim_buddy_get_contact(GaimBuddy *buddy) |
2183 { | |
2184 g_return_val_if_fail(buddy != NULL, NULL); | |
2185 | |
2186 return (GaimContact*)((GaimBlistNode*)buddy)->parent; | |
2187 } | |
2188 | |
9949 | 2189 GaimPresence *gaim_buddy_get_presence(const GaimBuddy *buddy) |
2190 { | |
2191 g_return_val_if_fail(buddy != NULL, NULL); | |
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2192 return buddy->presence; |
9949 | 2193 } |
2194 | |
12088 | 2195 GaimGroup *gaim_buddy_get_group(GaimBuddy *buddy) |
5228 | 2196 { |
9285 | 2197 g_return_val_if_fail(buddy != NULL, NULL); |
6706
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2198 |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2199 if (((GaimBlistNode *)buddy)->parent == NULL) |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2200 return NULL; |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2201 |
6695 | 2202 return (GaimGroup *)(((GaimBlistNode*)buddy)->parent->parent); |
5228 | 2203 } |
2204 | |
9285 | 2205 GSList *gaim_group_get_accounts(GaimGroup *group) |
5228 | 2206 { |
2207 GSList *l = NULL; | |
6695 | 2208 GaimBlistNode *gnode, *cnode, *bnode; |
2209 | |
9285 | 2210 gnode = (GaimBlistNode *)group; |
2211 | |
2212 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
6695 | 2213 if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
9285 | 2214 if (!g_slist_find(l, ((GaimChat *)cnode)->account)) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2215 l = g_slist_append(l, ((GaimChat *)cnode)->account); |
9285 | 2216 } else if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { |
2217 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
2218 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
2219 if (!g_slist_find(l, ((GaimBuddy *)bnode)->account)) | |
6695 | 2220 l = g_slist_append(l, ((GaimBuddy *)bnode)->account); |
2221 } | |
2222 } | |
2223 } | |
5228 | 2224 } |
6695 | 2225 |
5228 | 2226 return l; |
2227 } | |
2228 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2229 void gaim_blist_add_account(GaimAccount *account) |
5234 | 2230 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2231 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 2232 GaimBlistNode *gnode, *cnode, *bnode; |
5234 | 2233 |
9285 | 2234 g_return_if_fail(gaimbuddylist != NULL); |
2235 | |
2236 if (!ops || !ops->update) | |
6695 | 2237 return; |
2238 | |
9285 | 2239 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
2240 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 2241 continue; |
9285 | 2242 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
2243 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6956 | 2244 gboolean recompute = FALSE; |
9285 | 2245 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
2246 if (GAIM_BLIST_NODE_IS_BUDDY(bnode) && | |
6695 | 2247 ((GaimBuddy*)bnode)->account == account) { |
6956 | 2248 recompute = TRUE; |
6695 | 2249 ((GaimContact*)cnode)->currentsize++; |
9285 | 2250 if (((GaimContact*)cnode)->currentsize == 1) |
6695 | 2251 ((GaimGroup*)gnode)->currentsize++; |
2252 ops->update(gaimbuddylist, bnode); | |
2253 } | |
2254 } | |
9285 | 2255 if (recompute || |
8960 | 2256 gaim_blist_node_get_bool(cnode, "show_offline")) { |
10378 | 2257 gaim_contact_invalidate_priority_buddy((GaimContact*)cnode); |
6956 | 2258 ops->update(gaimbuddylist, cnode); |
2259 } | |
9285 | 2260 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode) && |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2261 ((GaimChat*)cnode)->account == account) { |
6901 | 2262 ((GaimGroup *)gnode)->online++; |
2263 ((GaimGroup *)gnode)->currentsize++; | |
2264 ops->update(gaimbuddylist, cnode); | |
5234 | 2265 } |
2266 } | |
6695 | 2267 ops->update(gaimbuddylist, gnode); |
5234 | 2268 } |
2269 } | |
2270 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2271 void gaim_blist_remove_account(GaimAccount *account) |
5228 | 2272 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2273 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 2274 GaimBlistNode *gnode, *cnode, *bnode; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2275 GaimBuddy *buddy; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2276 GaimChat *chat; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2277 GaimContact *contact; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2278 GaimGroup *group; |
12305 | 2279 GList *list = NULL, *iter = NULL; |
5234 | 2280 |
9285 | 2281 g_return_if_fail(gaimbuddylist != NULL); |
2282 | |
2283 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
2284 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 2285 continue; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2286 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2287 group = (GaimGroup *)gnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2288 |
9285 | 2289 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
2290 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
10727 | 2291 gboolean recompute = FALSE; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2292 contact = (GaimContact *)cnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2293 |
9285 | 2294 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
2295 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6695 | 2296 continue; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2297 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2298 buddy = (GaimBuddy *)bnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2299 if (account == buddy->account) { |
10557 | 2300 GaimPresence *presence; |
6957 | 2301 recompute = TRUE; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2302 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2303 presence = gaim_buddy_get_presence(buddy); |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2304 |
10728 | 2305 if(gaim_presence_is_online(presence)) { |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2306 contact->online--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2307 if (contact->online == 0) |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2308 group->online--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2309 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2310 gaim_blist_node_set_int(&buddy->node, |
10475 | 2311 "last_seen", time(NULL)); |
6695 | 2312 } |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2313 |
10728 | 2314 contact->currentsize--; |
2315 if (contact->currentsize == 0) | |
2316 group->currentsize--; | |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2317 |
12305 | 2318 if (!g_list_find(list, presence)) |
2319 list = g_list_prepend(list, presence); | |
10557 | 2320 |
9285 | 2321 if (ops && ops->remove) |
6695 | 2322 ops->remove(gaimbuddylist, bnode); |
2323 } | |
5234 | 2324 } |
9285 | 2325 if (recompute) { |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2326 gaim_contact_invalidate_priority_buddy(contact); |
9285 | 2327 if (ops && ops->update) |
6983 | 2328 ops->update(gaimbuddylist, cnode); |
2329 } | |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2330 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2331 chat = (GaimChat *)cnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2332 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2333 if(chat->account == account) { |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2334 group->currentsize--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2335 group->online--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2336 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2337 if (ops && ops->remove) |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2338 ops->remove(gaimbuddylist, cnode); |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2339 } |
5228 | 2340 } |
2341 } | |
2342 } | |
12305 | 2343 |
2344 for (iter = list; iter; iter = iter->next) | |
2345 { | |
2346 gaim_presence_set_status_active(iter->data, "offline", TRUE); | |
2347 } | |
2348 g_list_free(list); | |
5228 | 2349 } |
2350 | |
9285 | 2351 gboolean gaim_group_on_account(GaimGroup *g, GaimAccount *account) |
2352 { | |
9787 | 2353 GaimBlistNode *cnode; |
9285 | 2354 for (cnode = ((GaimBlistNode *)g)->child; cnode; cnode = cnode->next) { |
2355 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
9787 | 2356 if(gaim_contact_on_account((GaimContact *) cnode, account)) |
2357 return TRUE; | |
9285 | 2358 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2359 GaimChat *chat = (GaimChat *)cnode; |
9285 | 2360 if ((!account && gaim_account_is_connected(chat->account)) |
6695 | 2361 || chat->account == account) |
2362 return TRUE; | |
2363 } | |
5228 | 2364 } |
2365 return FALSE; | |
2366 } | |
2367 | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2368 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2369 gaim_blist_request_add_buddy(GaimAccount *account, const char *username, |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2370 const char *group, const char *alias) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2371 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2372 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2373 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2374 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2375 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2376 if (ui_ops != NULL && ui_ops->request_add_buddy != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2377 ui_ops->request_add_buddy(account, username, group, alias); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2378 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2379 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2380 void |
9754 | 2381 gaim_blist_request_add_chat(GaimAccount *account, GaimGroup *group, |
2382 const char *alias, const char *name) | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2383 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2384 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2385 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2386 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2387 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2388 if (ui_ops != NULL && ui_ops->request_add_chat != NULL) |
9754 | 2389 ui_ops->request_add_chat(account, group, alias, name); |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2390 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2391 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2392 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2393 gaim_blist_request_add_group(void) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2394 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2395 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2396 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2397 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2398 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2399 if (ui_ops != NULL && ui_ops->request_add_group != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2400 ui_ops->request_add_group(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2401 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2402 |
10430 | 2403 static void |
2404 gaim_blist_node_setting_free(gpointer data) | |
7693 | 2405 { |
10430 | 2406 GaimValue *value; |
2407 | |
2408 value = (GaimValue *)data; | |
2409 | |
2410 gaim_value_destroy(value); | |
7693 | 2411 } |
2412 | |
9285 | 2413 static void gaim_blist_node_initialize_settings(GaimBlistNode *node) |
7693 | 2414 { |
9285 | 2415 if (node->settings) |
5228 | 2416 return; |
7693 | 2417 |
2418 node->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
2419 (GDestroyNotify)gaim_blist_node_setting_free); | |
2420 } | |
2421 | |
2422 void gaim_blist_node_remove_setting(GaimBlistNode *node, const char *key) | |
2423 { | |
2424 g_return_if_fail(node != NULL); | |
2425 g_return_if_fail(node->settings != NULL); | |
2426 g_return_if_fail(key != NULL); | |
2427 | |
2428 g_hash_table_remove(node->settings, key); | |
9285 | 2429 |
10704 | 2430 gaim_blist_schedule_save(); |
5228 | 2431 } |
2432 | |
10430 | 2433 void |
10548 | 2434 gaim_blist_node_set_flags(GaimBlistNode *node, GaimBlistNodeFlags flags) |
2435 { | |
2436 g_return_if_fail(node != NULL); | |
2437 | |
2438 node->flags = flags; | |
2439 } | |
2440 | |
2441 GaimBlistNodeFlags | |
2442 gaim_blist_node_get_flags(GaimBlistNode *node) | |
2443 { | |
2444 g_return_val_if_fail(node != NULL, 0); | |
2445 | |
2446 return node->flags; | |
2447 } | |
2448 | |
2449 void | |
10430 | 2450 gaim_blist_node_set_bool(GaimBlistNode* node, const char *key, gboolean data) |
7693 | 2451 { |
10430 | 2452 GaimValue *value; |
7693 | 2453 |
2454 g_return_if_fail(node != NULL); | |
2455 g_return_if_fail(node->settings != NULL); | |
2456 g_return_if_fail(key != NULL); | |
2457 | |
10430 | 2458 value = gaim_value_new(GAIM_TYPE_BOOLEAN); |
2459 gaim_value_set_boolean(value, data); | |
2460 | |
2461 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2462 |
10704 | 2463 gaim_blist_schedule_save(); |
7693 | 2464 } |
2465 | |
10430 | 2466 gboolean |
2467 gaim_blist_node_get_bool(GaimBlistNode* node, const char *key) | |
7693 | 2468 { |
10430 | 2469 GaimValue *value; |
7693 | 2470 |
2471 g_return_val_if_fail(node != NULL, FALSE); | |
2472 g_return_val_if_fail(node->settings != NULL, FALSE); | |
2473 g_return_val_if_fail(key != NULL, FALSE); | |
2474 | |
10430 | 2475 value = g_hash_table_lookup(node->settings, key); |
2476 | |
2477 if (value == NULL) | |
7849 | 2478 return FALSE; |
2479 | |
10430 | 2480 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_BOOLEAN, FALSE); |
2481 | |
2482 return gaim_value_get_boolean(value); | |
5228 | 2483 } |
2484 | |
10430 | 2485 void |
2486 gaim_blist_node_set_int(GaimBlistNode* node, const char *key, int data) | |
7693 | 2487 { |
10430 | 2488 GaimValue *value; |
7693 | 2489 |
2490 g_return_if_fail(node != NULL); | |
2491 g_return_if_fail(node->settings != NULL); | |
2492 g_return_if_fail(key != NULL); | |
2493 | |
10430 | 2494 value = gaim_value_new(GAIM_TYPE_INT); |
2495 gaim_value_set_int(value, data); | |
2496 | |
2497 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2498 |
10704 | 2499 gaim_blist_schedule_save(); |
7693 | 2500 } |
2501 | |
10430 | 2502 int |
2503 gaim_blist_node_get_int(GaimBlistNode* node, const char *key) | |
7693 | 2504 { |
10430 | 2505 GaimValue *value; |
7693 | 2506 |
2507 g_return_val_if_fail(node != NULL, 0); | |
2508 g_return_val_if_fail(node->settings != NULL, 0); | |
2509 g_return_val_if_fail(key != NULL, 0); | |
2510 | |
10430 | 2511 value = g_hash_table_lookup(node->settings, key); |
2512 | |
2513 if (value == NULL) | |
7849 | 2514 return 0; |
2515 | |
10430 | 2516 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_INT, 0); |
2517 | |
2518 return gaim_value_get_int(value); | |
7693 | 2519 } |
2520 | |
10430 | 2521 void |
2522 gaim_blist_node_set_string(GaimBlistNode* node, const char *key, const char *data) | |
5906 | 2523 { |
10430 | 2524 GaimValue *value; |
7693 | 2525 |
2526 g_return_if_fail(node != NULL); | |
2527 g_return_if_fail(node->settings != NULL); | |
2528 g_return_if_fail(key != NULL); | |
2529 | |
10430 | 2530 value = gaim_value_new(GAIM_TYPE_STRING); |
2531 gaim_value_set_string(value, data); | |
2532 | |
2533 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2534 |
10704 | 2535 gaim_blist_schedule_save(); |
7693 | 2536 } |
2537 | |
10430 | 2538 const char * |
2539 gaim_blist_node_get_string(GaimBlistNode* node, const char *key) | |
7693 | 2540 { |
10430 | 2541 GaimValue *value; |
7693 | 2542 |
2543 g_return_val_if_fail(node != NULL, NULL); | |
2544 g_return_val_if_fail(node->settings != NULL, NULL); | |
2545 g_return_val_if_fail(key != NULL, NULL); | |
2546 | |
10430 | 2547 value = g_hash_table_lookup(node->settings, key); |
2548 | |
2549 if (value == NULL) | |
7849 | 2550 return NULL; |
2551 | |
10430 | 2552 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_STRING, NULL); |
2553 | |
2554 return gaim_value_get_string(value); | |
7693 | 2555 } |
2556 | |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2557 GList * |
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2558 gaim_blist_node_get_extended_menu(GaimBlistNode *n) |
7693 | 2559 { |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2560 GList *menu = NULL; |
9030 | 2561 |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2562 g_return_val_if_fail(n != NULL, NULL); |
9030 | 2563 |
2564 gaim_signal_emit(gaim_blist_get_handle(), | |
2565 "blist-node-extended-menu", | |
2566 n, &menu); | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2567 return menu; |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2568 } |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2569 |
9285 | 2570 int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) |
2571 { | |
2572 if (!group) | |
5228 | 2573 return 0; |
2574 | |
5277 | 2575 return offline ? group->totalsize : group->currentsize; |
5228 | 2576 } |
2577 | |
9285 | 2578 int gaim_blist_get_group_online_count(GaimGroup *group) |
2579 { | |
2580 if (!group) | |
5228 | 2581 return 0; |
2582 | |
5277 | 2583 return group->online; |
5228 | 2584 } |
2585 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2586 void |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2587 gaim_blist_set_ui_ops(GaimBlistUiOps *ops) |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2588 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2589 blist_ui_ops = ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2590 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2591 |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2592 GaimBlistUiOps * |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2593 gaim_blist_get_ui_ops(void) |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2594 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2595 return blist_ui_ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2596 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2597 |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2598 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2599 void * |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2600 gaim_blist_get_handle(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2601 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2602 static int handle; |
5228 | 2603 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2604 return &handle; |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2605 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2606 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2607 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2608 gaim_blist_init(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2609 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2610 void *handle = gaim_blist_get_handle(); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2611 |
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2612 gaim_signal_register(handle, "buddy-status-changed", |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2613 gaim_marshal_VOID__POINTER_POINTER_POINTER, NULL, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2614 3, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2615 gaim_value_new(GAIM_TYPE_SUBTYPE, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2616 GAIM_SUBTYPE_BLIST_BUDDY), |
11979
717cbb3115bc
[gaim-migrate @ 14272]
Gary Kramlich <grim@reaperworld.com>
parents:
11935
diff
changeset
|
2617 gaim_value_new(GAIM_TYPE_SUBTYPE, |
12097 | 2618 GAIM_SUBTYPE_STATUS), |
11979
717cbb3115bc
[gaim-migrate @ 14272]
Gary Kramlich <grim@reaperworld.com>
parents:
11935
diff
changeset
|
2619 gaim_value_new(GAIM_TYPE_SUBTYPE, |
12097 | 2620 GAIM_SUBTYPE_STATUS)); |
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2621 |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2622 gaim_signal_register(handle, "buddy-idle-changed", |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2623 gaim_marshal_VOID__POINTER_INT_INT, NULL, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2624 3, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2625 gaim_value_new(GAIM_TYPE_SUBTYPE, |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2626 GAIM_SUBTYPE_BLIST_BUDDY), |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2627 gaim_value_new(GAIM_TYPE_INT), |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2628 gaim_value_new(GAIM_TYPE_INT)); |
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2629 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2630 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2631 gaim_signal_register(handle, "buddy-signed-on", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2632 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2633 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2634 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2635 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2636 gaim_signal_register(handle, "buddy-signed-off", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2637 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2638 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2639 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2640 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2641 gaim_signal_register(handle, "buddy-added", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2642 gaim_marshal_VOID__POINTER, NULL, 1, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2643 gaim_value_new(GAIM_TYPE_SUBTYPE, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2644 GAIM_SUBTYPE_BLIST_BUDDY)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2645 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2646 gaim_signal_register(handle, "buddy-removed", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2647 gaim_marshal_VOID__POINTER, NULL, 1, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2648 gaim_value_new(GAIM_TYPE_SUBTYPE, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2649 GAIM_SUBTYPE_BLIST_BUDDY)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2650 |
12097 | 2651 gaim_signal_register(handle, "buddy-icon-changed", |
2652 gaim_marshal_VOID__POINTER, NULL, 1, | |
2653 gaim_value_new(GAIM_TYPE_SUBTYPE, | |
2654 GAIM_SUBTYPE_BLIST_BUDDY)); | |
2655 | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2656 gaim_signal_register(handle, "update-idle", gaim_marshal_VOID, NULL, 0); |
9030 | 2657 |
2658 gaim_signal_register(handle, "blist-node-extended-menu", | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2659 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2660 gaim_value_new(GAIM_TYPE_SUBTYPE, |
9030 | 2661 GAIM_SUBTYPE_BLIST_NODE), |
8952 | 2662 gaim_value_new(GAIM_TYPE_BOXED, "GList **")); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2663 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2664 gaim_signal_register(handle, "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2665 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2666 gaim_value_new(GAIM_TYPE_SUBTYPE, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2667 GAIM_SUBTYPE_BLIST_NODE), |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2668 gaim_value_new(GAIM_TYPE_STRING)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2669 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2670 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2671 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2672 gaim_blist_uninit(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2673 { |
10428 | 2674 if (save_timer != 0) |
2675 { | |
2676 gaim_timeout_remove(save_timer); | |
2677 save_timer = 0; | |
9285 | 2678 gaim_blist_sync(); |
2679 } | |
2680 | |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2681 gaim_signals_unregister_by_instance(gaim_blist_get_handle()); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2682 } |