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