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