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