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