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