Mercurial > pidgin.yaz
annotate src/blist.c @ 11319:d9debf609b79
[gaim-migrate @ 13522]
I'm quite amazed this worked at all. Did no-one notice debug output like this:
Gtk: Invalid text buffer iterator: either the iterator is uninitialized, or the characters/pixbufs/widgets in the buffer have been modified since the iterator was created.
You must use marks, character numbers, or line numbers to preserve a position across buffer modifications.
You can apply tags and insert marks without invalidating your iterators,
but any mutation that affects 'indexable' buffer contents (contents that can be referred to by character offset)
will invalidate all outstanding iterators
Gtk: gtk_text_buffer_set_mark: assertion `gtk_text_iter_get_buffer (iter) == buffer' failed
committer: Tailor Script <tailor@pidgin.im>
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Sat, 20 Aug 2005 21:11:57 +0000 |
parents | fc17554c32c5 |
children | 17142948653e |
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 | |
11302
fc17554c32c5
[gaim-migrate @ 13502]
Richard Laager <rlaager@wiktel.com>
parents:
11268
diff
changeset
|
1714 /* Delete any buddy icon. */ |
fc17554c32c5
[gaim-migrate @ 13502]
Richard Laager <rlaager@wiktel.com>
parents:
11268
diff
changeset
|
1715 gaim_buddy_set_icon(buddy, NULL); |
fc17554c32c5
[gaim-migrate @ 13502]
Richard Laager <rlaager@wiktel.com>
parents:
11268
diff
changeset
|
1716 |
9285 | 1717 /* Remove the node from its parent */ |
5228 | 1718 if (node->prev) |
1719 node->prev->next = node->next; | |
1720 if (node->next) | |
1721 node->next->prev = node->prev; | |
9285 | 1722 if (cnode->child == node) |
6695 | 1723 cnode->child = node->next; |
9285 | 1724 |
1725 /* Adjust size counts */ | |
1726 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
1727 contact->online--; | |
1728 if (contact->online == 0) | |
1729 group->online--; | |
6695 | 1730 } |
9285 | 1731 if (gaim_account_is_connected(buddy->account)) { |
1732 contact->currentsize--; | |
1733 if (contact->currentsize == 0) | |
1734 group->currentsize--; | |
8194 | 1735 } |
9285 | 1736 contact->totalsize--; |
1737 | |
10704 | 1738 gaim_blist_schedule_save(); |
9285 | 1739 |
1740 /* Re-sort the contact */ | |
1741 if (contact->priority == buddy) { | |
10378 | 1742 gaim_contact_invalidate_priority_buddy(contact); |
9285 | 1743 if (ops && ops->update) |
1744 ops->update(gaimbuddylist, cnode); | |
1745 } | |
1746 | |
1747 /* Remove this buddy from the buddies hash table */ | |
7261 | 1748 hb.name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
5247 | 1749 hb.account = buddy->account; |
6695 | 1750 hb.group = ((GaimBlistNode*)buddy)->parent->parent; |
6742 | 1751 g_hash_table_remove(gaimbuddylist->buddies, &hb); |
7162 | 1752 g_free(hb.name); |
5247 | 1753 |
9285 | 1754 /* Update the UI */ |
1755 if (ops && ops->remove) | |
1756 ops->remove(gaimbuddylist, node); | |
1757 | |
1758 /* Delete the node */ | |
1759 if (buddy->timer > 0) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1760 gaim_timeout_remove(buddy->timer); |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1761 if (buddy->icon != NULL) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1762 gaim_buddy_icon_unref(buddy->icon); |
7693 | 1763 g_hash_table_destroy(buddy->node.settings); |
9944 | 1764 gaim_presence_remove_buddy(buddy->presence, buddy); |
1765 gaim_presence_destroy(buddy->presence); | |
5228 | 1766 g_free(buddy->name); |
1767 g_free(buddy->alias); | |
10504 | 1768 g_free(buddy->server_alias); |
11067 | 1769 |
1770 GAIM_DBUS_UNREGISTER_POINTER(buddy); | |
5228 | 1771 g_free(buddy); |
6755 | 1772 |
9285 | 1773 /* If the contact is empty then remove it */ |
1774 if (!cnode->child) | |
1775 gaim_blist_remove_contact(contact); | |
5228 | 1776 } |
1777 | |
9285 | 1778 void gaim_blist_remove_chat(GaimChat *chat) |
5234 | 1779 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1780 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1781 GaimBlistNode *node, *gnode; |
6695 | 1782 GaimGroup *group; |
5234 | 1783 |
9285 | 1784 g_return_if_fail(chat != NULL); |
1785 | |
1786 node = (GaimBlistNode *)chat; | |
5234 | 1787 gnode = node->parent; |
6695 | 1788 group = (GaimGroup *)gnode; |
5234 | 1789 |
9285 | 1790 /* Remove the node from its parent */ |
1791 if (gnode->child == node) | |
5234 | 1792 gnode->child = node->next; |
1793 if (node->prev) | |
1794 node->prev->next = node->next; | |
1795 if (node->next) | |
1796 node->next->prev = node->prev; | |
9285 | 1797 |
1798 /* Adjust size counts */ | |
5855 | 1799 if (gaim_account_is_connected(chat->account)) { |
5394 | 1800 group->online--; |
9285 | 1801 group->currentsize--; |
5394 | 1802 } |
9285 | 1803 group->totalsize--; |
1804 | |
10704 | 1805 gaim_blist_schedule_save(); |
9285 | 1806 |
1807 /* Update the UI */ | |
1808 if (ops && ops->remove) | |
1809 ops->remove(gaimbuddylist, node); | |
1810 | |
1811 /* Delete the node */ | |
5234 | 1812 g_hash_table_destroy(chat->components); |
10504 | 1813 g_hash_table_destroy(chat->node.settings); |
5234 | 1814 g_free(chat->alias); |
11067 | 1815 GAIM_DBUS_UNREGISTER_POINTER(chat); |
5234 | 1816 g_free(chat); |
1817 } | |
1818 | |
9285 | 1819 void gaim_blist_remove_group(GaimGroup *group) |
5228 | 1820 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1821 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1822 GaimBlistNode *node; |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1823 GList *l; |
5228 | 1824 |
9285 | 1825 g_return_if_fail(group != NULL); |
1826 | |
1827 node = (GaimBlistNode *)group; | |
1828 | |
1829 /* Make sure the group is empty */ | |
1830 if (node->child) { | |
5228 | 1831 char *buf; |
1832 int count = 0; | |
9285 | 1833 GaimBlistNode *child; |
1834 | |
1835 for (child = node->child; child != NULL; child = child->next) | |
5228 | 1836 count++; |
1837 | |
6308 | 1838 buf = g_strdup_printf(ngettext("%d buddy from group %s was not removed " |
1839 "because its account was not logged in." | |
1840 " This buddy and the group were not " | |
1841 "removed.\n", | |
1842 "%d buddies from group %s were not " | |
1843 "removed because their accounts were " | |
6336 | 1844 "not logged in. These buddies and " |
1845 "the group were not removed.\n", count), | |
6308 | 1846 count, group->name); |
5541
aee0ee458974
[gaim-migrate @ 5941]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1847 gaim_notify_error(NULL, NULL, _("Group not removed"), buf); |
5228 | 1848 g_free(buf); |
1849 return; | |
1850 } | |
1851 | |
9285 | 1852 /* Remove the node from its parent */ |
1853 if (gaimbuddylist->root == node) | |
5228 | 1854 gaimbuddylist->root = node->next; |
1855 if (node->prev) | |
1856 node->prev->next = node->next; | |
1857 if (node->next) | |
1858 node->next->prev = node->prev; | |
1859 | |
10704 | 1860 gaim_blist_schedule_save(); |
9285 | 1861 |
1862 /* Update the UI */ | |
1863 if (ops && ops->remove) | |
1864 ops->remove(gaimbuddylist, node); | |
1865 | |
1866 /* Remove the group from all accounts that are online */ | |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1867 for (l = gaim_connections_get_all(); l != NULL; l = l->next) |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1868 { |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1869 GaimConnection *gc = (GaimConnection *)l->data; |
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 if (gaim_connection_get_state(gc) == GAIM_CONNECTED) |
9285 | 1872 serv_remove_group(gc, group); |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1873 } |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1874 |
9285 | 1875 /* Delete the node */ |
10504 | 1876 g_hash_table_destroy(group->node.settings); |
5228 | 1877 g_free(group->name); |
11067 | 1878 GAIM_DBUS_UNREGISTER_POINTER(group); |
5228 | 1879 g_free(group); |
1880 } | |
1881 | |
9285 | 1882 GaimBuddy *gaim_contact_get_priority_buddy(GaimContact *contact) |
1883 { | |
1884 g_return_val_if_fail(contact != NULL, NULL); | |
1885 | |
10378 | 1886 if (!contact->priority_valid) |
1887 gaim_contact_compute_priority_buddy(contact); | |
1888 | |
6843 | 1889 return contact->priority; |
6695 | 1890 } |
1891 | |
9620 | 1892 const char *gaim_buddy_get_alias_only(GaimBuddy *buddy) |
9285 | 1893 { |
1894 g_return_val_if_fail(buddy != NULL, NULL); | |
1895 | |
1896 if ((buddy->alias != NULL) && (*buddy->alias != '\0')) { | |
1897 return buddy->alias; | |
1898 } else if ((buddy->server_alias != NULL) && | |
10389 | 1899 (*buddy->server_alias != '\0')) { |
9285 | 1900 |
1901 return buddy->server_alias; | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1902 } |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1903 |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1904 return NULL; |
5228 | 1905 } |
1906 | |
9620 | 1907 |
1908 const char *gaim_buddy_get_contact_alias(GaimBuddy *buddy) | |
5228 | 1909 { |
9620 | 1910 GaimContact *c; |
1911 | |
1912 g_return_val_if_fail(buddy != NULL, NULL); | |
1913 | |
1914 /* Search for an alias for the buddy. In order of precedence: */ | |
1915 /* The buddy alias */ | |
1916 if (buddy->alias != NULL) | |
1917 return buddy->alias; | |
1918 | |
1919 /* The contact alias */ | |
1920 c = gaim_buddy_get_contact(buddy); | |
1921 if ((c != NULL) && (c->alias != NULL)) | |
1922 return c->alias; | |
1923 | |
10349 | 1924 /* The server alias */ |
1925 if ((buddy->server_alias) && (*buddy->server_alias)) | |
9620 | 1926 return buddy->server_alias; |
1927 | |
1928 /* The buddy's user name (i.e. no alias) */ | |
1929 return buddy->name; | |
5228 | 1930 } |
1931 | |
9620 | 1932 |
1933 const char *gaim_buddy_get_alias(GaimBuddy *buddy) | |
1934 { | |
1935 g_return_val_if_fail(buddy != NULL, NULL); | |
1936 | |
1937 /* Search for an alias for the buddy. In order of precedence: */ | |
1938 /* The buddy alias */ | |
1939 if (buddy->alias != NULL) | |
1940 return buddy->alias; | |
1941 | |
11266 | 1942 /* The server alias */ |
10389 | 1943 if ((buddy->server_alias) && (*buddy->server_alias)) |
9620 | 1944 return buddy->server_alias; |
1945 | |
1946 /* The buddy's user name (i.e. no alias) */ | |
1947 return buddy->name; | |
1948 } | |
1949 | |
10349 | 1950 const char *gaim_buddy_get_local_alias(GaimBuddy *buddy) |
1951 { | |
1952 GaimContact *c; | |
1953 | |
1954 g_return_val_if_fail(buddy != NULL, NULL); | |
1955 | |
1956 /* Search for an alias for the buddy. In order of precedence: */ | |
1957 /* The buddy alias */ | |
1958 if (buddy->alias != NULL) | |
1959 return buddy->alias; | |
1960 | |
1961 /* The contact alias */ | |
1962 c = gaim_buddy_get_contact(buddy); | |
1963 if ((c != NULL) && (c->alias != NULL)) | |
1964 return c->alias; | |
1965 | |
1966 /* The buddy's user name (i.e. no alias) */ | |
1967 return buddy->name; | |
1968 } | |
9620 | 1969 |
7125 | 1970 const char *gaim_chat_get_name(GaimChat *chat) |
6744 | 1971 { |
9285 | 1972 struct proto_chat_entry *pce; |
1973 GList *parts, *tmp; | |
1974 char *ret; | |
1975 | |
1976 g_return_val_if_fail(chat != NULL, NULL); | |
1977 | |
1978 if ((chat->alias != NULL) && (*chat->alias != '\0')) | |
6744 | 1979 return chat->alias; |
9285 | 1980 |
1981 parts = GAIM_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); | |
1982 pce = parts->data; | |
1983 ret = g_hash_table_lookup(chat->components, pce->identifier); | |
1984 for (tmp = parts; tmp; tmp = tmp->next) | |
1985 g_free(tmp->data); | |
1986 g_list_free(parts); | |
1987 | |
1988 return ret; | |
6744 | 1989 } |
1990 | |
6695 | 1991 GaimBuddy *gaim_find_buddy(GaimAccount *account, const char *name) |
5228 | 1992 { |
6695 | 1993 GaimBuddy *buddy; |
5247 | 1994 struct _gaim_hbuddy hb; |
5758 | 1995 GaimBlistNode *group; |
5228 | 1996 |
9285 | 1997 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
1998 g_return_val_if_fail(account != NULL, NULL); | |
1999 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
5228 | 2000 |
7429 | 2001 hb.account = account; |
7261 | 2002 hb.name = g_strdup(gaim_normalize(account, name)); |
7429 | 2003 |
9285 | 2004 for (group = gaimbuddylist->root; group; group = group->next) { |
5758 | 2005 hb.group = group; |
7162 | 2006 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb))) { |
2007 g_free(hb.name); | |
5758 | 2008 return buddy; |
7162 | 2009 } |
5758 | 2010 } |
7162 | 2011 g_free(hb.name); |
9285 | 2012 |
5758 | 2013 return NULL; |
5228 | 2014 } |
2015 | |
6872 | 2016 GaimBuddy *gaim_find_buddy_in_group(GaimAccount *account, const char *name, |
2017 GaimGroup *group) | |
2018 { | |
2019 struct _gaim_hbuddy hb; | |
7162 | 2020 GaimBuddy *ret; |
6872 | 2021 |
9285 | 2022 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2023 g_return_val_if_fail(account != NULL, NULL); | |
2024 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6872 | 2025 |
7261 | 2026 hb.name = g_strdup(gaim_normalize(account, name)); |
6872 | 2027 hb.account = account; |
2028 hb.group = (GaimBlistNode*)group; | |
2029 | |
7162 | 2030 ret = g_hash_table_lookup(gaimbuddylist->buddies, &hb); |
2031 g_free(hb.name); | |
9285 | 2032 |
7162 | 2033 return ret; |
6872 | 2034 } |
2035 | |
6245 | 2036 GSList *gaim_find_buddies(GaimAccount *account, const char *name) |
2037 { | |
2038 struct buddy *buddy; | |
2039 struct _gaim_hbuddy hb; | |
9285 | 2040 GaimBlistNode *node; |
6245 | 2041 GSList *ret = NULL; |
2042 | |
9285 | 2043 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2044 g_return_val_if_fail(account != NULL, NULL); | |
2045 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6245 | 2046 |
7261 | 2047 hb.name = g_strdup(gaim_normalize(account, name)); |
6245 | 2048 hb.account = account; |
2049 | |
9285 | 2050 for (node = gaimbuddylist->root; node != NULL; node = node->next) { |
2051 hb.group = node; | |
6245 | 2052 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) != NULL) |
2053 ret = g_slist_append(ret, buddy); | |
2054 } | |
7162 | 2055 g_free(hb.name); |
9285 | 2056 |
6245 | 2057 return ret; |
2058 } | |
2059 | |
6695 | 2060 GaimGroup *gaim_find_group(const char *name) |
5228 | 2061 { |
2062 GaimBlistNode *node; | |
9285 | 2063 |
2064 g_return_val_if_fail(gaimbuddylist != NULL, NULL); | |
2065 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
2066 | |
2067 for (node = gaimbuddylist->root; node != NULL; node = node->next) { | |
6695 | 2068 if (!strcmp(((GaimGroup *)node)->name, name)) |
2069 return (GaimGroup *)node; | |
5228 | 2070 } |
9285 | 2071 |
5228 | 2072 return NULL; |
2073 } | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2074 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2075 GaimChat * |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2076 gaim_blist_find_chat(GaimAccount *account, const char *name) |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2077 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2078 char *chat_name; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2079 GaimChat *chat; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2080 GaimPlugin *prpl; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2081 GaimPluginProtocolInfo *prpl_info = NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2082 struct proto_chat_entry *pce; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2083 GaimBlistNode *node, *group; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2084 GList *parts; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2085 |
9285 | 2086 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
2087 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
2088 | |
2089 if (!gaim_account_is_connected(account)) | |
7970 | 2090 return NULL; |
2091 | |
7999 | 2092 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
2093 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
2094 | |
9285 | 2095 if (prpl_info->find_blist_chat != NULL) |
7999 | 2096 return prpl_info->find_blist_chat(account, name); |
2097 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2098 for (group = gaimbuddylist->root; group != NULL; group = group->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2099 for (node = group->child; node != NULL; node = node->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2100 if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2101 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2102 chat = (GaimChat*)node; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2103 |
9285 | 2104 if (account != chat->account) |
7970 | 2105 continue; |
2106 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2107 parts = prpl_info->chat_info( |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2108 gaim_account_get_connection(chat->account)); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2109 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2110 pce = parts->data; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2111 chat_name = g_hash_table_lookup(chat->components, |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2112 pce->identifier); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2113 |
9153 | 2114 if (chat->account == account && chat_name != NULL && |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2115 name != NULL && !strcmp(chat_name, name)) { |
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 return chat; |
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 } |
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 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2123 return NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2124 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2125 |
6695 | 2126 GaimGroup * |
7125 | 2127 gaim_chat_get_group(GaimChat *chat) |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2128 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2129 g_return_val_if_fail(chat != NULL, NULL); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2130 |
6695 | 2131 return (GaimGroup *)(((GaimBlistNode *)chat)->parent); |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2132 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2133 |
9285 | 2134 GaimContact *gaim_buddy_get_contact(GaimBuddy *buddy) |
2135 { | |
2136 g_return_val_if_fail(buddy != NULL, NULL); | |
2137 | |
2138 return (GaimContact*)((GaimBlistNode*)buddy)->parent; | |
2139 } | |
2140 | |
9949 | 2141 GaimPresence *gaim_buddy_get_presence(const GaimBuddy *buddy) |
2142 { | |
2143 g_return_val_if_fail(buddy != NULL, NULL); | |
2144 return buddy->presence; | |
2145 } | |
2146 | |
2147 | |
6695 | 2148 GaimGroup *gaim_find_buddys_group(GaimBuddy *buddy) |
5228 | 2149 { |
9285 | 2150 g_return_val_if_fail(buddy != NULL, NULL); |
6706
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2151 |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2152 if (((GaimBlistNode *)buddy)->parent == NULL) |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2153 return NULL; |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2154 |
6695 | 2155 return (GaimGroup *)(((GaimBlistNode*)buddy)->parent->parent); |
5228 | 2156 } |
2157 | |
9285 | 2158 GSList *gaim_group_get_accounts(GaimGroup *group) |
5228 | 2159 { |
2160 GSList *l = NULL; | |
6695 | 2161 GaimBlistNode *gnode, *cnode, *bnode; |
2162 | |
9285 | 2163 gnode = (GaimBlistNode *)group; |
2164 | |
2165 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
6695 | 2166 if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
9285 | 2167 if (!g_slist_find(l, ((GaimChat *)cnode)->account)) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2168 l = g_slist_append(l, ((GaimChat *)cnode)->account); |
9285 | 2169 } else if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { |
2170 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
2171 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
2172 if (!g_slist_find(l, ((GaimBuddy *)bnode)->account)) | |
6695 | 2173 l = g_slist_append(l, ((GaimBuddy *)bnode)->account); |
2174 } | |
2175 } | |
2176 } | |
5228 | 2177 } |
6695 | 2178 |
5228 | 2179 return l; |
2180 } | |
2181 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2182 void gaim_blist_add_account(GaimAccount *account) |
5234 | 2183 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2184 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 2185 GaimBlistNode *gnode, *cnode, *bnode; |
5234 | 2186 |
9285 | 2187 g_return_if_fail(gaimbuddylist != NULL); |
2188 | |
2189 if (!ops || !ops->update) | |
6695 | 2190 return; |
2191 | |
9285 | 2192 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
2193 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 2194 continue; |
9285 | 2195 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
2196 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6956 | 2197 gboolean recompute = FALSE; |
9285 | 2198 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
2199 if (GAIM_BLIST_NODE_IS_BUDDY(bnode) && | |
6695 | 2200 ((GaimBuddy*)bnode)->account == account) { |
6956 | 2201 recompute = TRUE; |
6695 | 2202 ((GaimContact*)cnode)->currentsize++; |
9285 | 2203 if (((GaimContact*)cnode)->currentsize == 1) |
6695 | 2204 ((GaimGroup*)gnode)->currentsize++; |
2205 ops->update(gaimbuddylist, bnode); | |
2206 } | |
2207 } | |
9285 | 2208 if (recompute || |
8960 | 2209 gaim_blist_node_get_bool(cnode, "show_offline")) { |
10378 | 2210 gaim_contact_invalidate_priority_buddy((GaimContact*)cnode); |
6956 | 2211 ops->update(gaimbuddylist, cnode); |
2212 } | |
9285 | 2213 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode) && |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2214 ((GaimChat*)cnode)->account == account) { |
6901 | 2215 ((GaimGroup *)gnode)->online++; |
2216 ((GaimGroup *)gnode)->currentsize++; | |
2217 ops->update(gaimbuddylist, cnode); | |
5234 | 2218 } |
2219 } | |
6695 | 2220 ops->update(gaimbuddylist, gnode); |
5234 | 2221 } |
2222 } | |
2223 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2224 void gaim_blist_remove_account(GaimAccount *account) |
5228 | 2225 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2226 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 2227 GaimBlistNode *gnode, *cnode, *bnode; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2228 GaimBuddy *buddy; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2229 GaimChat *chat; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2230 GaimContact *contact; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2231 GaimGroup *group; |
5234 | 2232 |
9285 | 2233 g_return_if_fail(gaimbuddylist != NULL); |
2234 | |
2235 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
2236 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 2237 continue; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2238 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2239 group = (GaimGroup *)gnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2240 |
9285 | 2241 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
2242 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
10727 | 2243 gboolean recompute = FALSE; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2244 contact = (GaimContact *)cnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2245 |
9285 | 2246 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
2247 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6695 | 2248 continue; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2249 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2250 buddy = (GaimBuddy *)bnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2251 if (account == buddy->account) { |
10557 | 2252 GaimPresence *presence; |
6957 | 2253 recompute = TRUE; |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2254 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2255 presence = gaim_buddy_get_presence(buddy); |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2256 |
10728 | 2257 if(gaim_presence_is_online(presence)) { |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2258 contact->online--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2259 if (contact->online == 0) |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2260 group->online--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2261 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2262 gaim_blist_node_set_int(&buddy->node, |
10475 | 2263 "last_seen", time(NULL)); |
6695 | 2264 } |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2265 |
10728 | 2266 contact->currentsize--; |
2267 if (contact->currentsize == 0) | |
2268 group->currentsize--; | |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2269 |
10557 | 2270 gaim_presence_set_status_active(presence, "offline", TRUE); |
2271 | |
9285 | 2272 if (ops && ops->remove) |
6695 | 2273 ops->remove(gaimbuddylist, bnode); |
2274 } | |
5234 | 2275 } |
9285 | 2276 if (recompute) { |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2277 gaim_contact_invalidate_priority_buddy(contact); |
9285 | 2278 if (ops && ops->update) |
6983 | 2279 ops->update(gaimbuddylist, cnode); |
2280 } | |
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2281 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2282 chat = (GaimChat *)cnode; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2283 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2284 if(chat->account == account) { |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2285 group->currentsize--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2286 group->online--; |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2287 |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2288 if (ops && ops->remove) |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2289 ops->remove(gaimbuddylist, cnode); |
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2290 } |
5228 | 2291 } |
2292 } | |
2293 } | |
2294 } | |
2295 | |
9285 | 2296 gboolean gaim_group_on_account(GaimGroup *g, GaimAccount *account) |
2297 { | |
9787 | 2298 GaimBlistNode *cnode; |
9285 | 2299 for (cnode = ((GaimBlistNode *)g)->child; cnode; cnode = cnode->next) { |
2300 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
9787 | 2301 if(gaim_contact_on_account((GaimContact *) cnode, account)) |
2302 return TRUE; | |
9285 | 2303 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2304 GaimChat *chat = (GaimChat *)cnode; |
9285 | 2305 if ((!account && gaim_account_is_connected(chat->account)) |
6695 | 2306 || chat->account == account) |
2307 return TRUE; | |
2308 } | |
5228 | 2309 } |
2310 return FALSE; | |
2311 } | |
2312 | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2313 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2314 gaim_blist_request_add_buddy(GaimAccount *account, const char *username, |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2315 const char *group, const char *alias) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2316 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2317 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2318 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2319 ui_ops = gaim_blist_get_ui_ops(); |
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 if (ui_ops != NULL && ui_ops->request_add_buddy != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2322 ui_ops->request_add_buddy(account, username, group, alias); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2323 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2324 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2325 void |
9754 | 2326 gaim_blist_request_add_chat(GaimAccount *account, GaimGroup *group, |
2327 const char *alias, const char *name) | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2328 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2329 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2330 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2331 ui_ops = gaim_blist_get_ui_ops(); |
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 if (ui_ops != NULL && ui_ops->request_add_chat != NULL) |
9754 | 2334 ui_ops->request_add_chat(account, group, alias, name); |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2335 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2336 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2337 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2338 gaim_blist_request_add_group(void) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2339 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2340 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2341 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2342 ui_ops = gaim_blist_get_ui_ops(); |
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 if (ui_ops != NULL && ui_ops->request_add_group != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2345 ui_ops->request_add_group(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2346 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2347 |
10430 | 2348 static void |
2349 gaim_blist_node_setting_free(gpointer data) | |
7693 | 2350 { |
10430 | 2351 GaimValue *value; |
2352 | |
2353 value = (GaimValue *)data; | |
2354 | |
2355 gaim_value_destroy(value); | |
7693 | 2356 } |
2357 | |
9285 | 2358 static void gaim_blist_node_initialize_settings(GaimBlistNode *node) |
7693 | 2359 { |
9285 | 2360 if (node->settings) |
5228 | 2361 return; |
7693 | 2362 |
2363 node->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
2364 (GDestroyNotify)gaim_blist_node_setting_free); | |
2365 } | |
2366 | |
2367 void gaim_blist_node_remove_setting(GaimBlistNode *node, const char *key) | |
2368 { | |
2369 g_return_if_fail(node != NULL); | |
2370 g_return_if_fail(node->settings != NULL); | |
2371 g_return_if_fail(key != NULL); | |
2372 | |
2373 g_hash_table_remove(node->settings, key); | |
9285 | 2374 |
10704 | 2375 gaim_blist_schedule_save(); |
5228 | 2376 } |
2377 | |
10430 | 2378 void |
10548 | 2379 gaim_blist_node_set_flags(GaimBlistNode *node, GaimBlistNodeFlags flags) |
2380 { | |
2381 g_return_if_fail(node != NULL); | |
2382 | |
2383 node->flags = flags; | |
2384 } | |
2385 | |
2386 GaimBlistNodeFlags | |
2387 gaim_blist_node_get_flags(GaimBlistNode *node) | |
2388 { | |
2389 g_return_val_if_fail(node != NULL, 0); | |
2390 | |
2391 return node->flags; | |
2392 } | |
2393 | |
2394 void | |
10430 | 2395 gaim_blist_node_set_bool(GaimBlistNode* node, const char *key, gboolean data) |
7693 | 2396 { |
10430 | 2397 GaimValue *value; |
7693 | 2398 |
2399 g_return_if_fail(node != NULL); | |
2400 g_return_if_fail(node->settings != NULL); | |
2401 g_return_if_fail(key != NULL); | |
2402 | |
10430 | 2403 value = gaim_value_new(GAIM_TYPE_BOOLEAN); |
2404 gaim_value_set_boolean(value, data); | |
2405 | |
2406 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2407 |
10704 | 2408 gaim_blist_schedule_save(); |
7693 | 2409 } |
2410 | |
10430 | 2411 gboolean |
2412 gaim_blist_node_get_bool(GaimBlistNode* node, const char *key) | |
7693 | 2413 { |
10430 | 2414 GaimValue *value; |
7693 | 2415 |
2416 g_return_val_if_fail(node != NULL, FALSE); | |
2417 g_return_val_if_fail(node->settings != NULL, FALSE); | |
2418 g_return_val_if_fail(key != NULL, FALSE); | |
2419 | |
10430 | 2420 value = g_hash_table_lookup(node->settings, key); |
2421 | |
2422 if (value == NULL) | |
7849 | 2423 return FALSE; |
2424 | |
10430 | 2425 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_BOOLEAN, FALSE); |
2426 | |
2427 return gaim_value_get_boolean(value); | |
5228 | 2428 } |
2429 | |
10430 | 2430 void |
2431 gaim_blist_node_set_int(GaimBlistNode* node, const char *key, int data) | |
7693 | 2432 { |
10430 | 2433 GaimValue *value; |
7693 | 2434 |
2435 g_return_if_fail(node != NULL); | |
2436 g_return_if_fail(node->settings != NULL); | |
2437 g_return_if_fail(key != NULL); | |
2438 | |
10430 | 2439 value = gaim_value_new(GAIM_TYPE_INT); |
2440 gaim_value_set_int(value, data); | |
2441 | |
2442 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2443 |
10704 | 2444 gaim_blist_schedule_save(); |
7693 | 2445 } |
2446 | |
10430 | 2447 int |
2448 gaim_blist_node_get_int(GaimBlistNode* node, const char *key) | |
7693 | 2449 { |
10430 | 2450 GaimValue *value; |
7693 | 2451 |
2452 g_return_val_if_fail(node != NULL, 0); | |
2453 g_return_val_if_fail(node->settings != NULL, 0); | |
2454 g_return_val_if_fail(key != NULL, 0); | |
2455 | |
10430 | 2456 value = g_hash_table_lookup(node->settings, key); |
2457 | |
2458 if (value == NULL) | |
7849 | 2459 return 0; |
2460 | |
10430 | 2461 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_INT, 0); |
2462 | |
2463 return gaim_value_get_int(value); | |
7693 | 2464 } |
2465 | |
10430 | 2466 void |
2467 gaim_blist_node_set_string(GaimBlistNode* node, const char *key, const char *data) | |
5906 | 2468 { |
10430 | 2469 GaimValue *value; |
7693 | 2470 |
2471 g_return_if_fail(node != NULL); | |
2472 g_return_if_fail(node->settings != NULL); | |
2473 g_return_if_fail(key != NULL); | |
2474 | |
10430 | 2475 value = gaim_value_new(GAIM_TYPE_STRING); |
2476 gaim_value_set_string(value, data); | |
2477 | |
2478 g_hash_table_replace(node->settings, g_strdup(key), value); | |
9285 | 2479 |
10704 | 2480 gaim_blist_schedule_save(); |
7693 | 2481 } |
2482 | |
10430 | 2483 const char * |
2484 gaim_blist_node_get_string(GaimBlistNode* node, const char *key) | |
7693 | 2485 { |
10430 | 2486 GaimValue *value; |
7693 | 2487 |
2488 g_return_val_if_fail(node != NULL, NULL); | |
2489 g_return_val_if_fail(node->settings != NULL, NULL); | |
2490 g_return_val_if_fail(key != NULL, NULL); | |
2491 | |
10430 | 2492 value = g_hash_table_lookup(node->settings, key); |
2493 | |
2494 if (value == NULL) | |
7849 | 2495 return NULL; |
2496 | |
10430 | 2497 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_STRING, NULL); |
2498 | |
2499 return gaim_value_get_string(value); | |
7693 | 2500 } |
2501 | |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2502 GList * |
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2503 gaim_blist_node_get_extended_menu(GaimBlistNode *n) |
7693 | 2504 { |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2505 GList *menu = NULL; |
9030 | 2506 |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2507 g_return_val_if_fail(n != NULL, NULL); |
9030 | 2508 |
2509 gaim_signal_emit(gaim_blist_get_handle(), | |
2510 "blist-node-extended-menu", | |
2511 n, &menu); | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2512 return menu; |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2513 } |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2514 |
9030 | 2515 GaimBlistNodeAction * |
2516 gaim_blist_node_action_new(char *label, | |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2517 void (*callback)(GaimBlistNode *, gpointer), |
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2518 gpointer data, GList *children) |
9030 | 2519 { |
2520 GaimBlistNodeAction *act = g_new0(GaimBlistNodeAction, 1); | |
2521 act->label = label; | |
2522 act->callback = callback; | |
2523 act->data = data; | |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2524 act->children = children; |
9030 | 2525 return act; |
8952 | 2526 } |
2527 | |
9285 | 2528 int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) |
2529 { | |
2530 if (!group) | |
5228 | 2531 return 0; |
2532 | |
5277 | 2533 return offline ? group->totalsize : group->currentsize; |
5228 | 2534 } |
2535 | |
9285 | 2536 int gaim_blist_get_group_online_count(GaimGroup *group) |
2537 { | |
2538 if (!group) | |
5228 | 2539 return 0; |
2540 | |
5277 | 2541 return group->online; |
5228 | 2542 } |
2543 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2544 void |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2545 gaim_blist_set_ui_ops(GaimBlistUiOps *ops) |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2546 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2547 blist_ui_ops = ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2548 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2549 |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2550 GaimBlistUiOps * |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2551 gaim_blist_get_ui_ops(void) |
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 return blist_ui_ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2554 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2555 |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2556 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2557 void * |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2558 gaim_blist_get_handle(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2559 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2560 static int handle; |
5228 | 2561 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2562 return &handle; |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2563 } |
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 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2566 gaim_blist_init(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2567 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2568 void *handle = gaim_blist_get_handle(); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2569 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2570 gaim_signal_register(handle, "buddy-away", |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2571 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2572 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2573 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2574 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2575 gaim_signal_register(handle, "buddy-back", |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2576 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2577 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2578 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2579 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2580 gaim_signal_register(handle, "buddy-idle", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2581 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2582 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2583 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2584 gaim_signal_register(handle, "buddy-unidle", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2585 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2586 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2587 GAIM_SUBTYPE_BLIST_BUDDY)); |
9109
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2588 gaim_signal_register(handle, "buddy-idle-updated", |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2589 gaim_marshal_VOID__POINTER, NULL, 1, |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2590 gaim_value_new(GAIM_TYPE_SUBTYPE, |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2591 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2592 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2593 gaim_signal_register(handle, "buddy-signed-on", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2594 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2595 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2596 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2597 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2598 gaim_signal_register(handle, "buddy-signed-off", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2599 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2600 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2601 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2602 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2603 gaim_signal_register(handle, "update-idle", gaim_marshal_VOID, NULL, 0); |
9030 | 2604 |
2605 gaim_signal_register(handle, "blist-node-extended-menu", | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2606 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2607 gaim_value_new(GAIM_TYPE_SUBTYPE, |
9030 | 2608 GAIM_SUBTYPE_BLIST_NODE), |
8952 | 2609 gaim_value_new(GAIM_TYPE_BOXED, "GList **")); |
6485
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 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2612 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2613 gaim_blist_uninit(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2614 { |
10428 | 2615 if (save_timer != 0) |
2616 { | |
2617 gaim_timeout_remove(save_timer); | |
2618 save_timer = 0; | |
9285 | 2619 gaim_blist_sync(); |
2620 } | |
2621 | |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2622 gaim_signals_unregister_by_instance(gaim_blist_get_handle()); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2623 } |