Mercurial > pidgin
annotate src/blist.c @ 13253:87a7c3077c19
[gaim-migrate @ 15619]
More cleaning up of oscar. Renamed some functions to be more clear.
Got rid of some stuff that wasn't used. Inlined some small things
in conn.c that were only used once.
The goals of all this are
1. Non-blocking I/O for all connections
2. p2p stuff won't use the same struct as oscar connections, because
that's stupid
3. The oscar PRPL should be less scary
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Sun, 12 Feb 2006 21:27:04 +0000 |
| parents | c242836ff793 |
| children | b53fe4fa46b6 |
| 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); | |
| 13195 | 997 source = dest; |
| 5346 | 998 } else { |
| 9285 | 999 /* A simple rename */ |
| 1000 GaimBlistNode *cnode, *bnode; | |
| 1001 | |
| 1002 /* Build a GList of all buddies in this group */ | |
| 1003 for (cnode = ((GaimBlistNode *)source)->child; cnode != NULL; cnode = cnode->next) { | |
| 1004 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
| 1005 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) | |
| 1006 moved_buddies = g_list_append(moved_buddies, bnode); | |
| 5346 | 1007 } |
| 9285 | 1008 |
| 1009 old_name = source->name; | |
| 1010 source->name = g_strdup(new_name); | |
| 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 */ | |
| 13195 | 1021 /* TODO: Is this condition needed? Seems like it would always be TRUE */ |
|
10853
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1022 if(old_name && source && strcmp(source->name, old_name)) { |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1023 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
|
1024 GaimAccount *account = accts->data; |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1025 GaimPluginProtocolInfo *prpl_info = NULL; |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1026 GList *l = NULL, *buddies = NULL; |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1027 |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1028 if(account->gc && account->gc->prpl) |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1029 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl); |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1030 |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1031 if(!prpl_info) |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1032 continue; |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1033 |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1034 for(l = moved_buddies; l; l = l->next) { |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1035 GaimBuddy *buddy = (GaimBuddy *)l->data; |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1036 |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1037 if(buddy && buddy->account == account) |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1038 buddies = g_list_append(buddies, (GaimBlistNode *)buddy); |
|
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 |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1041 if(prpl_info->rename_group) { |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1042 prpl_info->rename_group(account->gc, old_name, source, buddies); |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1043 } else { |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1044 GList *cur, *groups = NULL; |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1045 |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1046 /* Make a list of what the groups each buddy is in */ |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1047 for(cur = buddies; cur; cur = cur->next) { |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1048 GaimBlistNode *node = (GaimBlistNode *)cur->data; |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1049 groups = g_list_append(groups, node->parent->parent); |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1050 } |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1051 |
| 11643 | 1052 gaim_account_remove_buddies(account, buddies, groups); |
|
10853
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1053 g_list_free(groups); |
| 11643 | 1054 gaim_account_add_buddies(account, buddies); |
|
10853
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 |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1057 g_list_free(buddies); |
|
2409700be3dc
[gaim-migrate @ 12527]
Luke Schierer <lschiere@pidgin.im>
parents:
10850
diff
changeset
|
1058 } |
| 9285 | 1059 } |
| 1060 g_list_free(moved_buddies); | |
| 1061 g_free(old_name); | |
| 5228 | 1062 } |
| 5234 | 1063 |
| 9285 | 1064 static void gaim_blist_node_initialize_settings(GaimBlistNode *node); |
| 7693 | 1065 |
| 7125 | 1066 GaimChat *gaim_chat_new(GaimAccount *account, const char *alias, GHashTable *components) |
| 5234 | 1067 { |
| 9285 | 1068 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1069 GaimChat *chat; |
| 9285 | 1070 |
| 1071 g_return_val_if_fail(account != NULL, FALSE); | |
| 1072 g_return_val_if_fail(components != NULL, FALSE); | |
| 5234 | 1073 |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1074 chat = g_new0(GaimChat, 1); |
| 5234 | 1075 chat->account = account; |
| 9285 | 1076 if ((alias != NULL) && (*alias != '\0')) |
| 5237 | 1077 chat->alias = g_strdup(alias); |
| 5234 | 1078 chat->components = components; |
| 9285 | 1079 gaim_blist_node_initialize_settings((GaimBlistNode *)chat); |
| 1080 ((GaimBlistNode *)chat)->type = GAIM_BLIST_CHAT_NODE; | |
| 5234 | 1081 |
| 1082 if (ops != NULL && ops->new_node != NULL) | |
| 1083 ops->new_node((GaimBlistNode *)chat); | |
| 1084 | |
| 11146 | 1085 GAIM_DBUS_REGISTER_POINTER(chat, GaimChat); |
| 5234 | 1086 return chat; |
| 1087 } | |
| 1088 | |
| 6695 | 1089 GaimBuddy *gaim_buddy_new(GaimAccount *account, const char *screenname, const char *alias) |
| 5228 | 1090 { |
| 9285 | 1091 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 1092 GaimBuddy *buddy; | |
| 1093 | |
| 1094 g_return_val_if_fail(account != NULL, FALSE); | |
| 1095 g_return_val_if_fail(screenname != NULL, FALSE); | |
| 1096 | |
| 1097 buddy = g_new0(GaimBuddy, 1); | |
| 9949 | 1098 buddy->account = account; |
| 1099 buddy->name = g_strdup(screenname); | |
| 1100 buddy->alias = g_strdup(alias); | |
| 1101 buddy->presence = gaim_presence_new_for_buddy(buddy); | |
| 11624 | 1102 ((GaimBlistNode *)buddy)->type = GAIM_BLIST_BUDDY_NODE; |
| 9949 | 1103 |
| 10052 | 1104 gaim_presence_set_status_active(buddy->presence, "offline", TRUE); |
| 1105 | |
| 9285 | 1106 gaim_blist_node_initialize_settings((GaimBlistNode *)buddy); |
| 1107 | |
| 1108 if (ops && ops->new_node) | |
| 1109 ops->new_node((GaimBlistNode *)buddy); | |
| 1110 | |
| 11146 | 1111 GAIM_DBUS_REGISTER_POINTER(buddy, GaimBuddy); |
| 9285 | 1112 return buddy; |
| 5228 | 1113 } |
| 5634 | 1114 |
|
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1115 void |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1116 gaim_buddy_set_icon(GaimBuddy *buddy, GaimBuddyIcon *icon) |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1117 { |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1118 g_return_if_fail(buddy != NULL); |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1119 |
|
12476
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1120 if (buddy->icon != icon) { |
|
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1121 if (buddy->icon != NULL) |
|
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1122 gaim_buddy_icon_unref(buddy->icon); |
|
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1123 |
|
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1124 buddy->icon = (icon != NULL ? gaim_buddy_icon_ref(icon) : NULL); |
|
18b16e801e6f
[gaim-migrate @ 14787]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
1125 } |
|
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1126 |
| 9324 | 1127 if (buddy->icon) |
| 1128 gaim_buddy_icon_cache(icon, buddy); | |
| 1129 else | |
|
11040
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
1130 gaim_buddy_icon_uncache(buddy); |
| 9299 | 1131 |
| 10704 | 1132 gaim_blist_schedule_save(); |
| 9926 | 1133 |
| 12097 | 1134 gaim_signal_emit(gaim_blist_get_handle(), "buddy-icon-changed", buddy); |
| 1135 | |
|
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1136 gaim_blist_update_buddy_icon(buddy); |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1137 } |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1138 |
|
10037
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1139 GaimAccount * |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1140 gaim_buddy_get_account(const GaimBuddy *buddy) |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1141 { |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1142 g_return_val_if_fail(buddy != NULL, NULL); |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1143 |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1144 return buddy->account; |
|
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 |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1147 const char * |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1148 gaim_buddy_get_name(const GaimBuddy *buddy) |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1149 { |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1150 g_return_val_if_fail(buddy != NULL, NULL); |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1151 |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1152 return buddy->name; |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1153 } |
|
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
1154 |
|
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1155 GaimBuddyIcon * |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1156 gaim_buddy_get_icon(const GaimBuddy *buddy) |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1157 { |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1158 g_return_val_if_fail(buddy != NULL, NULL); |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1159 |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1160 return buddy->icon; |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1161 } |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1162 |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1163 void gaim_blist_add_chat(GaimChat *chat, GaimGroup *group, GaimBlistNode *node) |
| 5234 | 1164 { |
| 9285 | 1165 GaimBlistNode *cnode = (GaimBlistNode*)chat; |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1166 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6774 | 1167 |
| 1168 g_return_if_fail(chat != NULL); | |
| 9285 | 1169 g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT((GaimBlistNode *)chat)); |
| 1170 | |
| 1171 if (node == NULL) { | |
| 1172 if (group == NULL) { | |
| 1173 group = gaim_group_new(_("Chats")); | |
| 1174 gaim_blist_add_group(group, | |
| 5634 | 1175 gaim_blist_get_last_sibling(gaimbuddylist->root)); |
| 5234 | 1176 } |
| 1177 } else { | |
| 9285 | 1178 group = (GaimGroup*)node->parent; |
| 5234 | 1179 } |
| 1180 | |
| 1181 /* if we're moving to overtop of ourselves, do nothing */ | |
| 9285 | 1182 if (cnode == node) |
| 5234 | 1183 return; |
| 1184 | |
| 1185 if (cnode->parent) { | |
| 1186 /* This chat was already in the list and is | |
| 1187 * being moved. | |
| 1188 */ | |
| 6695 | 1189 ((GaimGroup *)cnode->parent)->totalsize--; |
| 5855 | 1190 if (gaim_account_is_connected(chat->account)) { |
| 6695 | 1191 ((GaimGroup *)cnode->parent)->online--; |
| 1192 ((GaimGroup *)cnode->parent)->currentsize--; | |
| 5287 | 1193 } |
| 9285 | 1194 if (cnode->next) |
| 5234 | 1195 cnode->next->prev = cnode->prev; |
| 9285 | 1196 if (cnode->prev) |
| 5234 | 1197 cnode->prev->next = cnode->next; |
| 9285 | 1198 if (cnode->parent->child == cnode) |
| 5234 | 1199 cnode->parent->child = cnode->next; |
| 1200 | |
| 1201 ops->remove(gaimbuddylist, cnode); | |
|
11101
8b346ce5cdb8
[gaim-migrate @ 13140]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11067
diff
changeset
|
1202 /* 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
|
1203 * reinitialize it */ |
|
8b346ce5cdb8
[gaim-migrate @ 13140]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11067
diff
changeset
|
1204 ops->new_node(cnode); |
| 5234 | 1205 |
| 10704 | 1206 gaim_blist_schedule_save(); |
| 5234 | 1207 } |
| 1208 | |
| 9285 | 1209 if (node != NULL) { |
| 1210 if (node->next) | |
| 1211 node->next->prev = cnode; | |
| 1212 cnode->next = node->next; | |
| 1213 cnode->prev = node; | |
| 1214 cnode->parent = node->parent; | |
| 1215 node->next = cnode; | |
| 1216 ((GaimGroup *)node->parent)->totalsize++; | |
| 5855 | 1217 if (gaim_account_is_connected(chat->account)) { |
| 9285 | 1218 ((GaimGroup *)node->parent)->online++; |
| 1219 ((GaimGroup *)node->parent)->currentsize++; | |
| 5287 | 1220 } |
| 5234 | 1221 } else { |
| 9285 | 1222 if (((GaimBlistNode *)group)->child) |
| 1223 ((GaimBlistNode *)group)->child->prev = cnode; | |
| 1224 cnode->next = ((GaimBlistNode *)group)->child; | |
| 5634 | 1225 cnode->prev = NULL; |
| 9285 | 1226 ((GaimBlistNode *)group)->child = cnode; |
| 1227 cnode->parent = (GaimBlistNode *)group; | |
| 1228 group->totalsize++; | |
| 5855 | 1229 if (gaim_account_is_connected(chat->account)) { |
| 9285 | 1230 group->online++; |
| 1231 group->currentsize++; | |
| 5287 | 1232 } |
| 5234 | 1233 } |
| 1234 | |
| 10704 | 1235 gaim_blist_schedule_save(); |
| 9285 | 1236 |
| 1237 if (ops && ops->update) | |
| 1238 ops->update(gaimbuddylist, (GaimBlistNode *)cnode); | |
| 5234 | 1239 } |
| 1240 | |
| 7879 | 1241 void gaim_blist_add_buddy(GaimBuddy *buddy, GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
| 5228 | 1242 { |
| 6695 | 1243 GaimBlistNode *cnode, *bnode; |
| 1244 GaimGroup *g; | |
| 1245 GaimContact *c; | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1246 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5247 | 1247 struct _gaim_hbuddy *hb; |
| 6695 | 1248 |
| 1249 g_return_if_fail(buddy != NULL); | |
| 6774 | 1250 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY((GaimBlistNode*)buddy)); |
| 6695 | 1251 |
| 1252 bnode = (GaimBlistNode *)buddy; | |
| 5228 | 1253 |
| 6695 | 1254 /* if we're moving to overtop of ourselves, do nothing */ |
| 9285 | 1255 if (bnode == node || (!node && bnode->parent && |
| 6695 | 1256 contact && bnode->parent == (GaimBlistNode*)contact |
| 1257 && bnode == bnode->parent->child)) | |
| 1258 return; | |
| 1259 | |
| 9285 | 1260 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 6695 | 1261 c = (GaimContact*)node->parent; |
| 1262 g = (GaimGroup*)node->parent->parent; | |
| 9285 | 1263 } else if (contact) { |
| 6695 | 1264 c = contact; |
| 9285 | 1265 g = (GaimGroup *)((GaimBlistNode *)c)->parent; |
| 1266 } else { | |
| 1267 if (group) { | |
| 6695 | 1268 g = group; |
| 1269 } else { | |
| 5228 | 1270 g = gaim_group_new(_("Buddies")); |
| 5634 | 1271 gaim_blist_add_group(g, |
| 1272 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 5228 | 1273 } |
| 6695 | 1274 c = gaim_contact_new(); |
| 1275 gaim_blist_add_contact(c, g, | |
| 1276 gaim_blist_get_last_child((GaimBlistNode*)g)); | |
| 5228 | 1277 } |
| 1278 | |
| 6695 | 1279 cnode = (GaimBlistNode *)c; |
| 5228 | 1280 |
| 9285 | 1281 if (bnode->parent) { |
| 1282 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
| 6695 | 1283 ((GaimContact*)bnode->parent)->online--; |
| 9285 | 1284 if (((GaimContact*)bnode->parent)->online == 0) |
| 6695 | 1285 ((GaimGroup*)bnode->parent->parent)->online--; |
| 1286 } | |
| 9285 | 1287 if (gaim_account_is_connected(buddy->account)) { |
| 6695 | 1288 ((GaimContact*)bnode->parent)->currentsize--; |
| 9285 | 1289 if (((GaimContact*)bnode->parent)->currentsize == 0) |
| 6695 | 1290 ((GaimGroup*)bnode->parent->parent)->currentsize--; |
| 1291 } | |
| 1292 ((GaimContact*)bnode->parent)->totalsize--; | |
| 1293 /* the group totalsize will be taken care of by remove_contact below */ | |
| 1294 | |
| 9285 | 1295 if (bnode->parent->parent != (GaimBlistNode*)g) |
| 6695 | 1296 serv_move_buddy(buddy, (GaimGroup *)bnode->parent->parent, g); |
| 5277 | 1297 |
| 9285 | 1298 if (bnode->next) |
| 5228 | 1299 bnode->next->prev = bnode->prev; |
| 9285 | 1300 if (bnode->prev) |
| 5228 | 1301 bnode->prev->next = bnode->next; |
| 9285 | 1302 if (bnode->parent->child == bnode) |
| 5228 | 1303 bnode->parent->child = bnode->next; |
| 1304 | |
| 1305 ops->remove(gaimbuddylist, bnode); | |
| 1306 | |
| 10704 | 1307 gaim_blist_schedule_save(); |
| 9285 | 1308 |
| 1309 if (bnode->parent->parent != (GaimBlistNode*)g) { | |
| 6742 | 1310 hb = g_new(struct _gaim_hbuddy, 1); |
| 7261 | 1311 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
| 6742 | 1312 hb->account = buddy->account; |
| 1313 hb->group = bnode->parent->parent; | |
| 6775 | 1314 g_hash_table_remove(gaimbuddylist->buddies, hb); |
| 7162 | 1315 g_free(hb->name); |
| 6742 | 1316 g_free(hb); |
| 1317 } | |
| 6794 | 1318 |
| 9285 | 1319 if (!bnode->parent->child) { |
| 6794 | 1320 gaim_blist_remove_contact((GaimContact*)bnode->parent); |
| 7003 | 1321 } else { |
| 10378 | 1322 gaim_contact_invalidate_priority_buddy((GaimContact*)bnode->parent); |
| 7003 | 1323 ops->update(gaimbuddylist, bnode->parent); |
| 1324 } | |
| 5228 | 1325 } |
| 1326 | |
| 9285 | 1327 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 1328 if (node->next) | |
| 6695 | 1329 node->next->prev = bnode; |
| 1330 bnode->next = node->next; | |
| 1331 bnode->prev = node; | |
| 1332 bnode->parent = node->parent; | |
| 1333 node->next = bnode; | |
| 5228 | 1334 } else { |
| 9285 | 1335 if (cnode->child) |
| 6695 | 1336 cnode->child->prev = bnode; |
| 1337 bnode->prev = NULL; | |
| 1338 bnode->next = cnode->child; | |
| 1339 cnode->child = bnode; | |
| 1340 bnode->parent = cnode; | |
| 5228 | 1341 } |
| 1342 | |
| 9285 | 1343 if (GAIM_BUDDY_IS_ONLINE(buddy)) { |
| 6695 | 1344 ((GaimContact*)bnode->parent)->online++; |
| 9285 | 1345 if (((GaimContact*)bnode->parent)->online == 1) |
| 6695 | 1346 ((GaimGroup*)bnode->parent->parent)->online++; |
| 1347 } | |
| 9285 | 1348 if (gaim_account_is_connected(buddy->account)) { |
| 6695 | 1349 ((GaimContact*)bnode->parent)->currentsize++; |
| 9285 | 1350 if (((GaimContact*)bnode->parent)->currentsize == 1) |
| 6695 | 1351 ((GaimGroup*)bnode->parent->parent)->currentsize++; |
| 1352 } | |
| 1353 ((GaimContact*)bnode->parent)->totalsize++; | |
| 1354 | |
| 6742 | 1355 hb = g_new(struct _gaim_hbuddy, 1); |
| 7261 | 1356 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
| 5247 | 1357 hb->account = buddy->account; |
| 6695 | 1358 hb->group = ((GaimBlistNode*)buddy)->parent->parent; |
| 5247 | 1359 |
| 6742 | 1360 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); |
| 5247 | 1361 |
| 10378 | 1362 gaim_contact_invalidate_priority_buddy(gaim_buddy_get_contact(buddy)); |
| 9285 | 1363 |
| 10704 | 1364 gaim_blist_schedule_save(); |
| 9285 | 1365 |
| 1366 if (ops && ops->update) | |
| 5228 | 1367 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); |
|
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1368 |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1369 /* Signal that the buddy has been added */ |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1370 gaim_signal_emit(gaim_blist_get_handle(), "buddy-added", buddy); |
| 5228 | 1371 } |
| 1372 | |
| 6695 | 1373 GaimContact *gaim_contact_new() |
| 5228 | 1374 { |
| 9285 | 1375 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
| 1376 | |
| 1377 GaimContact *contact = g_new0(GaimContact, 1); | |
| 1378 contact->totalsize = 0; | |
| 1379 contact->currentsize = 0; | |
| 1380 contact->online = 0; | |
| 1381 gaim_blist_node_initialize_settings((GaimBlistNode *)contact); | |
| 1382 ((GaimBlistNode *)contact)->type = GAIM_BLIST_CONTACT_NODE; | |
| 1383 | |
| 1384 if (ops && ops->new_node) | |
| 1385 ops->new_node((GaimBlistNode *)contact); | |
| 1386 | |
| 11146 | 1387 GAIM_DBUS_REGISTER_POINTER(contact, GaimContact); |
| 9285 | 1388 return contact; |
| 6695 | 1389 } |
| 1390 | |
| 9285 | 1391 void gaim_contact_set_alias(GaimContact *contact, const char *alias) |
| 6755 | 1392 { |
| 7245 | 1393 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
|
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1394 char *old_alias = contact->alias; |
| 7245 | 1395 |
| 6755 | 1396 g_return_if_fail(contact != NULL); |
| 1397 | |
| 9285 | 1398 if ((alias != NULL) && (*alias != '\0')) |
| 7245 | 1399 contact->alias = g_strdup(alias); |
| 1400 else | |
| 1401 contact->alias = NULL; | |
| 1402 | |
| 10704 | 1403 gaim_blist_schedule_save(); |
| 9285 | 1404 |
| 1405 if (ops && ops->update) | |
| 7245 | 1406 ops->update(gaimbuddylist, (GaimBlistNode*)contact); |
|
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1407 |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1408 gaim_signal_emit(gaim_blist_get_handle(), "blist-node-aliased", |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1409 contact, old_alias); |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1410 g_free(old_alias); |
| 6755 | 1411 } |
| 1412 | |
| 1413 const char *gaim_contact_get_alias(GaimContact* contact) | |
| 1414 { | |
| 9285 | 1415 g_return_val_if_fail(contact != NULL, NULL); |
| 1416 | |
| 1417 if (contact->alias) | |
| 7312 | 1418 return contact->alias; |
| 1419 | |
| 10378 | 1420 return gaim_buddy_get_alias(gaim_contact_get_priority_buddy(contact)); |
| 6755 | 1421 } |
| 1422 | |
| 9787 | 1423 gboolean gaim_contact_on_account(GaimContact *c, GaimAccount *account) |
| 1424 { | |
| 1425 GaimBlistNode *bnode, *cnode = (GaimBlistNode *) c; | |
| 1426 | |
| 1427 g_return_val_if_fail(c != NULL, FALSE); | |
| 1428 g_return_val_if_fail(account != NULL, FALSE); | |
| 1429 | |
| 1430 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 1431 GaimBuddy *buddy; | |
| 1432 | |
| 1433 if (! GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
| 1434 continue; | |
| 1435 | |
| 1436 buddy = (GaimBuddy *)bnode; | |
| 1437 if (buddy->account == account) | |
| 1438 return TRUE; | |
| 1439 } | |
| 1440 return FALSE; | |
| 1441 } | |
| 1442 | |
| 10428 | 1443 void gaim_contact_invalidate_priority_buddy(GaimContact *contact) |
| 1444 { | |
| 1445 g_return_if_fail(contact != NULL); | |
| 1446 | |
| 1447 contact->priority_valid = FALSE; | |
| 1448 } | |
| 1449 | |
| 6695 | 1450 GaimGroup *gaim_group_new(const char *name) |
| 1451 { | |
| 9285 | 1452 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
| 12458 | 1453 GaimGroup *group; |
| 1454 | |
| 1455 g_return_val_if_fail(name != NULL, NULL); | |
| 1456 g_return_val_if_fail(*name != '\0', NULL); | |
| 1457 | |
| 1458 group = gaim_find_group(name); | |
| 9285 | 1459 if (group != NULL) |
| 1460 return group; | |
| 1461 | |
| 1462 group = g_new0(GaimGroup, 1); | |
| 1463 group->name = g_strdup(name); | |
| 1464 group->totalsize = 0; | |
| 1465 group->currentsize = 0; | |
| 1466 group->online = 0; | |
| 1467 gaim_blist_node_initialize_settings((GaimBlistNode *)group); | |
| 1468 ((GaimBlistNode *)group)->type = GAIM_BLIST_GROUP_NODE; | |
| 1469 | |
| 1470 if (ops && ops->new_node) | |
| 1471 ops->new_node((GaimBlistNode *)group); | |
| 1472 | |
| 11146 | 1473 GAIM_DBUS_REGISTER_POINTER(group, GaimGroup); |
| 9285 | 1474 return group; |
| 5228 | 1475 } |
| 1476 | |
| 6695 | 1477 void gaim_blist_add_contact(GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
| 1478 { | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1479 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 1480 GaimGroup *g; |
| 6742 | 1481 GaimBlistNode *gnode, *cnode, *bnode; |
| 6695 | 1482 |
| 6774 | 1483 g_return_if_fail(contact != NULL); |
| 1484 g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT((GaimBlistNode*)contact)); | |
| 6695 | 1485 |
| 9285 | 1486 if ((GaimBlistNode*)contact == node) |
| 6975 | 1487 return; |
| 1488 | |
| 9285 | 1489 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
| 6695 | 1490 GAIM_BLIST_NODE_IS_CHAT(node))) |
| 1491 g = (GaimGroup*)node->parent; | |
| 9285 | 1492 else if (group) |
| 6695 | 1493 g = group; |
| 1494 else { | |
| 1495 g = gaim_group_new(_("Buddies")); | |
| 1496 gaim_blist_add_group(g, | |
| 1497 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 1498 } | |
| 1499 | |
| 1500 gnode = (GaimBlistNode*)g; | |
| 1501 cnode = (GaimBlistNode*)contact; | |
| 1502 | |
| 9285 | 1503 if (cnode->parent) { |
| 1504 if (cnode->parent->child == cnode) | |
| 6731 | 1505 cnode->parent->child = cnode->next; |
| 9285 | 1506 if (cnode->prev) |
| 6695 | 1507 cnode->prev->next = cnode->next; |
| 9285 | 1508 if (cnode->next) |
| 6695 | 1509 cnode->next->prev = cnode->prev; |
| 1510 | |
| 9285 | 1511 if (cnode->parent != gnode) { |
| 9928 | 1512 bnode = cnode->child; |
| 1513 while (bnode) { | |
| 1514 GaimBlistNode *next_bnode = bnode->next; | |
| 6742 | 1515 GaimBuddy *b = (GaimBuddy*)bnode; |
| 1516 | |
| 1517 struct _gaim_hbuddy *hb = g_new(struct _gaim_hbuddy, 1); | |
| 7261 | 1518 hb->name = g_strdup(gaim_normalize(b->account, b->name)); |
| 6742 | 1519 hb->account = b->account; |
| 1520 hb->group = cnode->parent; | |
| 1521 | |
| 6776 | 1522 g_hash_table_remove(gaimbuddylist->buddies, hb); |
| 6742 | 1523 |
| 9285 | 1524 if (!gaim_find_buddy_in_group(b->account, b->name, g)) { |
| 8328 | 1525 hb->group = gnode; |
| 1526 g_hash_table_replace(gaimbuddylist->buddies, hb, b); | |
| 1527 | |
| 9285 | 1528 if (b->account->gc) |
| 1529 serv_move_buddy(b, (GaimGroup *)cnode->parent, g); | |
| 8328 | 1530 } else { |
| 9928 | 1531 gboolean empty_contact = FALSE; |
| 1532 | |
| 8328 | 1533 /* this buddy already exists in the group, so we're |
| 1534 * gonna delete it instead */ | |
| 1535 g_free(hb->name); | |
| 1536 g_free(hb); | |
| 9285 | 1537 if (b->account->gc) |
| 11643 | 1538 gaim_account_remove_buddy(b->account, b, (GaimGroup *)cnode->parent); |
| 9285 | 1539 |
| 1540 if (!cnode->child->next) | |
| 8328 | 1541 empty_contact = TRUE; |
| 1542 gaim_blist_remove_buddy(b); | |
| 9928 | 1543 |
| 1544 /** in gaim_blist_remove_buddy(), if the last buddy in a | |
| 1545 * contact is removed, the contact is cleaned up and | |
| 1546 * g_free'd, so we mustn't try to reference bnode->next */ | |
| 1547 if (empty_contact) | |
| 1548 return; | |
| 8328 | 1549 } |
| 9928 | 1550 bnode = next_bnode; |
| 6742 | 1551 } |
| 1552 } | |
| 9928 | 1553 |
| 1554 if (contact->online > 0) | |
| 1555 ((GaimGroup*)cnode->parent)->online--; | |
| 1556 if (contact->currentsize > 0) | |
| 1557 ((GaimGroup*)cnode->parent)->currentsize--; | |
| 1558 ((GaimGroup*)cnode->parent)->totalsize--; | |
| 1559 | |
| 1560 ops->remove(gaimbuddylist, cnode); | |
| 1561 | |
| 10704 | 1562 gaim_blist_schedule_save(); |
| 6695 | 1563 } |
| 1564 | |
| 9285 | 1565 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
| 6695 | 1566 GAIM_BLIST_NODE_IS_CHAT(node))) { |
| 9285 | 1567 if (node->next) |
| 6695 | 1568 node->next->prev = cnode; |
| 1569 cnode->next = node->next; | |
| 1570 cnode->prev = node; | |
| 1571 cnode->parent = node->parent; | |
| 1572 node->next = cnode; | |
| 1573 } else { | |
| 9285 | 1574 if (gnode->child) |
| 6695 | 1575 gnode->child->prev = cnode; |
| 1576 cnode->prev = NULL; | |
| 1577 cnode->next = gnode->child; | |
| 1578 gnode->child = cnode; | |
| 1579 cnode->parent = gnode; | |
| 1580 } | |
| 1581 | |
| 9285 | 1582 if (contact->online > 0) |
| 6695 | 1583 g->online++; |
| 9285 | 1584 if (contact->currentsize > 0) |
| 6695 | 1585 g->currentsize++; |
| 1586 g->totalsize++; | |
| 1587 | |
| 10704 | 1588 gaim_blist_schedule_save(); |
| 9285 | 1589 |
| 1590 if (ops && cnode->child) | |
| 6695 | 1591 ops->update(gaimbuddylist, cnode); |
| 6775 | 1592 |
| 9285 | 1593 for (bnode = cnode->child; bnode; bnode = bnode->next) |
| 6775 | 1594 ops->update(gaimbuddylist, bnode); |
| 6695 | 1595 } |
| 1596 | |
| 7246 | 1597 void gaim_blist_merge_contact(GaimContact *source, GaimBlistNode *node) |
| 6965 | 1598 { |
| 1599 GaimBlistNode *sourcenode = (GaimBlistNode*)source; | |
| 7246 | 1600 GaimBlistNode *targetnode; |
| 1601 GaimBlistNode *prev, *cur, *next; | |
| 1602 GaimContact *target; | |
| 1603 | |
| 9285 | 1604 g_return_if_fail(source != NULL); |
| 1605 g_return_if_fail(node != NULL); | |
| 1606 | |
| 1607 if (GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
| 1608 target = (GaimContact *)node; | |
| 7246 | 1609 prev = gaim_blist_get_last_child(node); |
| 9285 | 1610 } else if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 1611 target = (GaimContact *)node->parent; | |
| 7246 | 1612 prev = node; |
| 1613 } else { | |
| 6965 | 1614 return; |
| 7246 | 1615 } |
| 1616 | |
| 9285 | 1617 if (source == target || !target) |
| 7246 | 1618 return; |
| 1619 | |
| 9285 | 1620 targetnode = (GaimBlistNode *)target; |
| 7246 | 1621 next = sourcenode->child; |
| 1622 | |
| 9285 | 1623 while (next) { |
| 7246 | 1624 cur = next; |
| 1625 next = cur->next; | |
| 9285 | 1626 if (GAIM_BLIST_NODE_IS_BUDDY(cur)) { |
| 1627 gaim_blist_add_buddy((GaimBuddy *)cur, target, NULL, prev); | |
| 7246 | 1628 prev = cur; |
| 1629 } | |
| 6965 | 1630 } |
| 1631 } | |
| 1632 | |
| 9285 | 1633 void gaim_blist_add_group(GaimGroup *group, GaimBlistNode *node) |
| 5228 | 1634 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1635 GaimBlistUiOps *ops; |
| 5228 | 1636 GaimBlistNode *gnode = (GaimBlistNode*)group; |
| 1637 | |
| 6774 | 1638 g_return_if_fail(group != NULL); |
| 9285 | 1639 g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP((GaimBlistNode *)group)); |
| 1640 | |
| 5228 | 1641 ops = gaimbuddylist->ui_ops; |
| 1642 | |
| 1643 if (!gaimbuddylist->root) { | |
| 1644 gaimbuddylist->root = gnode; | |
| 1645 return; | |
| 1646 } | |
| 1647 | |
| 1648 /* if we're moving to overtop of ourselves, do nothing */ | |
| 9285 | 1649 if (gnode == node) |
| 5228 | 1650 return; |
| 1651 | |
| 1652 if (gaim_find_group(group->name)) { | |
| 1653 /* This is just being moved */ | |
| 1654 | |
| 9285 | 1655 ops->remove(gaimbuddylist, (GaimBlistNode *)group); |
| 1656 | |
| 1657 if (gnode == gaimbuddylist->root) | |
| 5228 | 1658 gaimbuddylist->root = gnode->next; |
| 9285 | 1659 if (gnode->prev) |
| 5228 | 1660 gnode->prev->next = gnode->next; |
| 9285 | 1661 if (gnode->next) |
| 5228 | 1662 gnode->next->prev = gnode->prev; |
| 1663 } | |
| 1664 | |
| 6695 | 1665 if (node && GAIM_BLIST_NODE_IS_GROUP(node)) { |
| 5634 | 1666 gnode->next = node->next; |
| 1667 gnode->prev = node; | |
| 9285 | 1668 if (node->next) |
| 5634 | 1669 node->next->prev = gnode; |
| 1670 node->next = gnode; | |
| 1671 } else { | |
| 9285 | 1672 if (gaimbuddylist->root) |
| 6807 | 1673 gaimbuddylist->root->prev = gnode; |
| 5634 | 1674 gnode->next = gaimbuddylist->root; |
| 1675 gnode->prev = NULL; | |
| 1676 gaimbuddylist->root = gnode; | |
| 1677 } | |
| 1678 | |
| 10704 | 1679 gaim_blist_schedule_save(); |
| 9285 | 1680 |
| 1681 if (ops && ops->update) { | |
| 5228 | 1682 ops->update(gaimbuddylist, gnode); |
| 9285 | 1683 for (node = gnode->child; node; node = node->next) |
| 5228 | 1684 ops->update(gaimbuddylist, node); |
| 1685 } | |
| 1686 } | |
| 1687 | |
| 9285 | 1688 void gaim_blist_remove_contact(GaimContact *contact) |
| 5228 | 1689 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1690 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 9285 | 1691 GaimBlistNode *node, *gnode; |
| 1692 | |
| 1693 g_return_if_fail(contact != NULL); | |
| 1694 | |
| 1695 node = (GaimBlistNode *)contact; | |
| 1696 gnode = node->parent; | |
| 1697 | |
| 1698 if (node->child) { | |
| 1699 /* | |
| 1700 * If this contact has children then remove them. When the last | |
| 10166 | 1701 * buddy is removed from the contact, the contact is automatically |
| 1702 * deleted. | |
| 9285 | 1703 */ |
| 10166 | 1704 while (node->child->next) { |
| 9285 | 1705 gaim_blist_remove_buddy((GaimBuddy*)node->child); |
| 6695 | 1706 } |
| 10166 | 1707 /* |
| 1708 * 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
|
1709 * It would probably be cleaner if contact-deletion was done after |
| 10166 | 1710 * a timeout? Or if it had to be done manually, like below? |
| 1711 */ | |
| 1712 gaim_blist_remove_buddy((GaimBuddy*)node->child); | |
| 6695 | 1713 } else { |
| 9285 | 1714 /* Remove the node from its parent */ |
| 1715 if (gnode->child == node) | |
| 1716 gnode->child = node->next; | |
| 1717 if (node->prev) | |
| 1718 node->prev->next = node->next; | |
| 1719 if (node->next) | |
| 1720 node->next->prev = node->prev; | |
| 1721 | |
| 10704 | 1722 gaim_blist_schedule_save(); |
| 9285 | 1723 |
| 1724 /* Update the UI */ | |
| 1725 if (ops && ops->remove) | |
| 1726 ops->remove(gaimbuddylist, node); | |
| 1727 | |
| 1728 /* Delete the node */ | |
| 10504 | 1729 g_hash_table_destroy(contact->node.settings); |
| 11067 | 1730 GAIM_DBUS_UNREGISTER_POINTER(contact); |
| 6695 | 1731 g_free(contact); |
| 1732 } | |
| 1733 } | |
| 1734 | |
| 9285 | 1735 void gaim_blist_remove_buddy(GaimBuddy *buddy) |
| 6695 | 1736 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1737 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 9285 | 1738 GaimBlistNode *node, *cnode, *gnode; |
| 1739 GaimContact *contact; | |
| 6695 | 1740 GaimGroup *group; |
| 6742 | 1741 struct _gaim_hbuddy hb; |
| 5228 | 1742 |
| 9285 | 1743 g_return_if_fail(buddy != NULL); |
| 1744 | |
| 1745 node = (GaimBlistNode *)buddy; | |
| 6695 | 1746 cnode = node->parent; |
| 9285 | 1747 gnode = cnode->parent; |
| 1748 contact = (GaimContact *)cnode; | |
| 1749 group = (GaimGroup *)gnode; | |
| 1750 | |
|
11302
fc17554c32c5
[gaim-migrate @ 13502]
Richard Laager <rlaager@wiktel.com>
parents:
11268
diff
changeset
|
1751 /* Delete any buddy icon. */ |
| 11860 | 1752 gaim_buddy_icon_uncache(buddy); |
|
11302
fc17554c32c5
[gaim-migrate @ 13502]
Richard Laager <rlaager@wiktel.com>
parents:
11268
diff
changeset
|
1753 |
| 9285 | 1754 /* Remove the node from its parent */ |
| 5228 | 1755 if (node->prev) |
| 1756 node->prev->next = node->next; | |
| 1757 if (node->next) | |
| 1758 node->next->prev = node->prev; | |
| 9285 | 1759 if (cnode->child == node) |
| 6695 | 1760 cnode->child = node->next; |
| 9285 | 1761 |
| 1762 /* Adjust size counts */ | |
| 1763 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
| 1764 contact->online--; | |
| 1765 if (contact->online == 0) | |
| 1766 group->online--; | |
| 6695 | 1767 } |
| 9285 | 1768 if (gaim_account_is_connected(buddy->account)) { |
| 1769 contact->currentsize--; | |
| 1770 if (contact->currentsize == 0) | |
| 1771 group->currentsize--; | |
| 8194 | 1772 } |
| 9285 | 1773 contact->totalsize--; |
| 1774 | |
| 10704 | 1775 gaim_blist_schedule_save(); |
| 9285 | 1776 |
| 1777 /* Re-sort the contact */ | |
| 1778 if (contact->priority == buddy) { | |
| 10378 | 1779 gaim_contact_invalidate_priority_buddy(contact); |
| 9285 | 1780 if (ops && ops->update) |
| 1781 ops->update(gaimbuddylist, cnode); | |
| 1782 } | |
| 1783 | |
| 1784 /* Remove this buddy from the buddies hash table */ | |
| 7261 | 1785 hb.name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
| 5247 | 1786 hb.account = buddy->account; |
| 6695 | 1787 hb.group = ((GaimBlistNode*)buddy)->parent->parent; |
| 6742 | 1788 g_hash_table_remove(gaimbuddylist->buddies, &hb); |
| 7162 | 1789 g_free(hb.name); |
| 5247 | 1790 |
| 9285 | 1791 /* Update the UI */ |
| 1792 if (ops && ops->remove) | |
| 1793 ops->remove(gaimbuddylist, node); | |
| 1794 | |
|
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1795 /* 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
|
1796 gaim_signal_emit(gaim_blist_get_handle(), "buddy-removed", buddy); |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
1797 |
| 9285 | 1798 /* Delete the node */ |
|
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1799 if (buddy->icon != NULL) |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1800 gaim_buddy_icon_unref(buddy->icon); |
| 7693 | 1801 g_hash_table_destroy(buddy->node.settings); |
| 9944 | 1802 gaim_presence_remove_buddy(buddy->presence, buddy); |
| 1803 gaim_presence_destroy(buddy->presence); | |
| 5228 | 1804 g_free(buddy->name); |
| 1805 g_free(buddy->alias); | |
| 10504 | 1806 g_free(buddy->server_alias); |
| 11067 | 1807 |
| 1808 GAIM_DBUS_UNREGISTER_POINTER(buddy); | |
| 5228 | 1809 g_free(buddy); |
| 6755 | 1810 |
|
12862
b503265495f7
[gaim-migrate @ 15213]
Richard Laager <rlaager@wiktel.com>
parents:
12860
diff
changeset
|
1811 /* FIXME: Once GaimBuddy is a GObject, timeout callbacks can |
|
b503265495f7
[gaim-migrate @ 15213]
Richard Laager <rlaager@wiktel.com>
parents:
12860
diff
changeset
|
1812 * g_object_ref() it when connecting the callback and |
|
b503265495f7
[gaim-migrate @ 15213]
Richard Laager <rlaager@wiktel.com>
parents:
12860
diff
changeset
|
1813 * 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
|
1814 * get freed while the timeout is pending and this line can |
|
b503265495f7
[gaim-migrate @ 15213]
Richard Laager <rlaager@wiktel.com>
parents:
12860
diff
changeset
|
1815 * be removed. */ |
|
12860
a35edda11737
[gaim-migrate @ 15211]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
1816 while (g_source_remove_by_user_data((gpointer *)buddy)); |
|
a35edda11737
[gaim-migrate @ 15211]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
1817 |
| 9285 | 1818 /* If the contact is empty then remove it */ |
| 1819 if (!cnode->child) | |
| 1820 gaim_blist_remove_contact(contact); | |
| 5228 | 1821 } |
| 1822 | |
| 9285 | 1823 void gaim_blist_remove_chat(GaimChat *chat) |
| 5234 | 1824 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1825 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 9285 | 1826 GaimBlistNode *node, *gnode; |
| 6695 | 1827 GaimGroup *group; |
| 5234 | 1828 |
| 9285 | 1829 g_return_if_fail(chat != NULL); |
| 1830 | |
| 1831 node = (GaimBlistNode *)chat; | |
| 5234 | 1832 gnode = node->parent; |
| 6695 | 1833 group = (GaimGroup *)gnode; |
| 5234 | 1834 |
|
12577
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1835 if (gnode != NULL) |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1836 { |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1837 /* Remove the node from its parent */ |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1838 if (gnode->child == node) |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1839 gnode->child = node->next; |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1840 if (node->prev) |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1841 node->prev->next = node->next; |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1842 if (node->next) |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1843 node->next->prev = node->prev; |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1844 |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1845 /* Adjust size counts */ |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1846 if (gaim_account_is_connected(chat->account)) { |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1847 group->online--; |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1848 group->currentsize--; |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1849 } |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1850 group->totalsize--; |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1851 |
|
f1ee8a29bd69
[gaim-migrate @ 14899]
Richard Laager <rlaager@wiktel.com>
parents:
12476
diff
changeset
|
1852 gaim_blist_schedule_save(); |
| 5394 | 1853 } |
| 9285 | 1854 |
| 1855 /* Update the UI */ | |
| 1856 if (ops && ops->remove) | |
| 1857 ops->remove(gaimbuddylist, node); | |
| 1858 | |
| 1859 /* Delete the node */ | |
| 5234 | 1860 g_hash_table_destroy(chat->components); |
| 10504 | 1861 g_hash_table_destroy(chat->node.settings); |
| 5234 | 1862 g_free(chat->alias); |
| 11067 | 1863 GAIM_DBUS_UNREGISTER_POINTER(chat); |
| 5234 | 1864 g_free(chat); |
| 1865 } | |
| 1866 | |
| 9285 | 1867 void gaim_blist_remove_group(GaimGroup *group) |
| 5228 | 1868 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1869 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 9285 | 1870 GaimBlistNode *node; |
|
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1871 GList *l; |
| 5228 | 1872 |
| 9285 | 1873 g_return_if_fail(group != NULL); |
| 1874 | |
| 1875 node = (GaimBlistNode *)group; | |
| 1876 | |
| 1877 /* Make sure the group is empty */ | |
| 1878 if (node->child) { | |
| 5228 | 1879 char *buf; |
| 1880 int count = 0; | |
| 9285 | 1881 GaimBlistNode *child; |
| 1882 | |
| 1883 for (child = node->child; child != NULL; child = child->next) | |
| 5228 | 1884 count++; |
| 1885 | |
| 6308 | 1886 buf = g_strdup_printf(ngettext("%d buddy from group %s was not removed " |
|
13043
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1887 "because it belongs to an account which is " |
|
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1888 "disabled or offline. This buddy and the " |
|
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1889 "group were not removed.\n", |
| 6308 | 1890 "%d buddies from group %s were not " |
|
13043
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1891 "removed because they belong to accounts " |
|
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1892 "which are currently disabled or offline. " |
|
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1893 "These buddies and the group were not " |
|
fa99be331f2f
[gaim-migrate @ 15402]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
1894 "removed.\n", count), |
| 6308 | 1895 count, group->name); |
|
5541
aee0ee458974
[gaim-migrate @ 5941]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1896 gaim_notify_error(NULL, NULL, _("Group not removed"), buf); |
| 5228 | 1897 g_free(buf); |
| 1898 return; | |
| 1899 } | |
| 1900 | |
| 9285 | 1901 /* Remove the node from its parent */ |
| 1902 if (gaimbuddylist->root == node) | |
| 5228 | 1903 gaimbuddylist->root = node->next; |
| 1904 if (node->prev) | |
| 1905 node->prev->next = node->next; | |
| 1906 if (node->next) | |
| 1907 node->next->prev = node->prev; | |
| 1908 | |
| 10704 | 1909 gaim_blist_schedule_save(); |
| 9285 | 1910 |
| 1911 /* Update the UI */ | |
| 1912 if (ops && ops->remove) | |
| 1913 ops->remove(gaimbuddylist, node); | |
| 1914 | |
| 1915 /* Remove the group from all accounts that are online */ | |
|
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1916 for (l = gaim_connections_get_all(); l != NULL; l = l->next) |
|
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 GaimConnection *gc = (GaimConnection *)l->data; |
|
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1919 |
|
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1920 if (gaim_connection_get_state(gc) == GAIM_CONNECTED) |
| 11643 | 1921 gaim_account_remove_group(gaim_connection_get_account(gc), group); |
|
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1922 } |
|
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1923 |
| 9285 | 1924 /* Delete the node */ |
| 10504 | 1925 g_hash_table_destroy(group->node.settings); |
| 5228 | 1926 g_free(group->name); |
| 11067 | 1927 GAIM_DBUS_UNREGISTER_POINTER(group); |
| 5228 | 1928 g_free(group); |
| 1929 } | |
| 1930 | |
| 9285 | 1931 GaimBuddy *gaim_contact_get_priority_buddy(GaimContact *contact) |
| 1932 { | |
| 1933 g_return_val_if_fail(contact != NULL, NULL); | |
| 1934 | |
| 10378 | 1935 if (!contact->priority_valid) |
| 1936 gaim_contact_compute_priority_buddy(contact); | |
| 1937 | |
| 6843 | 1938 return contact->priority; |
| 6695 | 1939 } |
| 1940 | |
| 9620 | 1941 const char *gaim_buddy_get_alias_only(GaimBuddy *buddy) |
| 9285 | 1942 { |
| 1943 g_return_val_if_fail(buddy != NULL, NULL); | |
| 1944 | |
| 1945 if ((buddy->alias != NULL) && (*buddy->alias != '\0')) { | |
| 1946 return buddy->alias; | |
| 1947 } else if ((buddy->server_alias != NULL) && | |
| 10389 | 1948 (*buddy->server_alias != '\0')) { |
| 9285 | 1949 |
| 1950 return buddy->server_alias; | |
|
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1951 } |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1952 |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1953 return NULL; |
| 5228 | 1954 } |
| 1955 | |
| 9620 | 1956 |
| 1957 const char *gaim_buddy_get_contact_alias(GaimBuddy *buddy) | |
| 5228 | 1958 { |
| 9620 | 1959 GaimContact *c; |
| 1960 | |
| 1961 g_return_val_if_fail(buddy != NULL, NULL); | |
| 1962 | |
| 1963 /* Search for an alias for the buddy. In order of precedence: */ | |
| 1964 /* The buddy alias */ | |
| 1965 if (buddy->alias != NULL) | |
| 1966 return buddy->alias; | |
| 1967 | |
| 1968 /* The contact alias */ | |
| 1969 c = gaim_buddy_get_contact(buddy); | |
| 1970 if ((c != NULL) && (c->alias != NULL)) | |
| 1971 return c->alias; | |
| 1972 | |
| 10349 | 1973 /* The server alias */ |
| 1974 if ((buddy->server_alias) && (*buddy->server_alias)) | |
| 9620 | 1975 return buddy->server_alias; |
| 1976 | |
| 1977 /* The buddy's user name (i.e. no alias) */ | |
| 1978 return buddy->name; | |
| 5228 | 1979 } |
| 1980 | |
| 9620 | 1981 |
| 1982 const char *gaim_buddy_get_alias(GaimBuddy *buddy) | |
| 1983 { | |
| 1984 g_return_val_if_fail(buddy != NULL, NULL); | |
| 1985 | |
| 1986 /* Search for an alias for the buddy. In order of precedence: */ | |
| 1987 /* The buddy alias */ | |
| 1988 if (buddy->alias != NULL) | |
| 1989 return buddy->alias; | |
| 1990 | |
| 11266 | 1991 /* The server alias */ |
| 10389 | 1992 if ((buddy->server_alias) && (*buddy->server_alias)) |
| 9620 | 1993 return buddy->server_alias; |
| 1994 | |
| 1995 /* The buddy's user name (i.e. no alias) */ | |
| 1996 return buddy->name; | |
| 1997 } | |
| 1998 | |
| 10349 | 1999 const char *gaim_buddy_get_local_alias(GaimBuddy *buddy) |
| 2000 { | |
| 2001 GaimContact *c; | |
| 2002 | |
| 2003 g_return_val_if_fail(buddy != NULL, NULL); | |
| 2004 | |
| 2005 /* Search for an alias for the buddy. In order of precedence: */ | |
| 2006 /* The buddy alias */ | |
| 2007 if (buddy->alias != NULL) | |
| 2008 return buddy->alias; | |
| 2009 | |
| 2010 /* The contact alias */ | |
| 2011 c = gaim_buddy_get_contact(buddy); | |
| 2012 if ((c != NULL) && (c->alias != NULL)) | |
| 2013 return c->alias; | |
| 2014 | |
| 2015 /* The buddy's user name (i.e. no alias) */ | |
| 2016 return buddy->name; | |
| 2017 } | |
| 9620 | 2018 |
| 7125 | 2019 const char *gaim_chat_get_name(GaimChat *chat) |
| 6744 | 2020 { |
| 9285 | 2021 struct proto_chat_entry *pce; |
| 2022 GList *parts, *tmp; | |
| 2023 char *ret; | |
| 2024 | |
| 2025 g_return_val_if_fail(chat != NULL, NULL); | |
| 2026 | |
| 2027 if ((chat->alias != NULL) && (*chat->alias != '\0')) | |
| 6744 | 2028 return chat->alias; |
| 9285 | 2029 |
| 2030 parts = GAIM_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); | |
| 2031 pce = parts->data; | |
| 2032 ret = g_hash_table_lookup(chat->components, pce->identifier); | |
| 2033 for (tmp = parts; tmp; tmp = tmp->next) | |
| 2034 g_free(tmp->data); | |
| 2035 g_list_free(parts); | |
| 2036 | |
| 2037 return ret; | |
| 6744 | 2038 } |
| 2039 | |
| 6695 | 2040 GaimBuddy *gaim_find_buddy(GaimAccount *account, const char *name) |
| 5228 | 2041 { |
| 6695 | 2042 GaimBuddy *buddy; |
| 5247 | 2043 struct _gaim_hbuddy hb; |
| 5758 | 2044 GaimBlistNode *group; |
| 5228 | 2045 |
| 9285 | 2046 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
| 2047 g_return_val_if_fail(account != NULL, NULL); | |
| 2048 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
| 5228 | 2049 |
| 7429 | 2050 hb.account = account; |
| 7261 | 2051 hb.name = g_strdup(gaim_normalize(account, name)); |
| 7429 | 2052 |
| 9285 | 2053 for (group = gaimbuddylist->root; group; group = group->next) { |
| 5758 | 2054 hb.group = group; |
| 7162 | 2055 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb))) { |
| 2056 g_free(hb.name); | |
| 5758 | 2057 return buddy; |
| 7162 | 2058 } |
| 5758 | 2059 } |
| 7162 | 2060 g_free(hb.name); |
| 9285 | 2061 |
| 5758 | 2062 return NULL; |
| 5228 | 2063 } |
| 2064 | |
| 6872 | 2065 GaimBuddy *gaim_find_buddy_in_group(GaimAccount *account, const char *name, |
| 2066 GaimGroup *group) | |
| 2067 { | |
| 2068 struct _gaim_hbuddy hb; | |
| 7162 | 2069 GaimBuddy *ret; |
| 6872 | 2070 |
| 9285 | 2071 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
| 2072 g_return_val_if_fail(account != NULL, NULL); | |
| 2073 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
| 6872 | 2074 |
| 7261 | 2075 hb.name = g_strdup(gaim_normalize(account, name)); |
| 6872 | 2076 hb.account = account; |
| 2077 hb.group = (GaimBlistNode*)group; | |
| 2078 | |
| 7162 | 2079 ret = g_hash_table_lookup(gaimbuddylist->buddies, &hb); |
| 2080 g_free(hb.name); | |
| 9285 | 2081 |
| 7162 | 2082 return ret; |
| 6872 | 2083 } |
| 2084 | |
| 6245 | 2085 GSList *gaim_find_buddies(GaimAccount *account, const char *name) |
| 2086 { | |
| 2087 struct buddy *buddy; | |
| 2088 struct _gaim_hbuddy hb; | |
| 9285 | 2089 GaimBlistNode *node; |
| 6245 | 2090 GSList *ret = NULL; |
| 2091 | |
| 9285 | 2092 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
| 2093 g_return_val_if_fail(account != NULL, NULL); | |
| 2094 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
| 6245 | 2095 |
| 7261 | 2096 hb.name = g_strdup(gaim_normalize(account, name)); |
| 6245 | 2097 hb.account = account; |
| 2098 | |
| 9285 | 2099 for (node = gaimbuddylist->root; node != NULL; node = node->next) { |
| 2100 hb.group = node; | |
| 6245 | 2101 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) != NULL) |
| 2102 ret = g_slist_append(ret, buddy); | |
| 2103 } | |
| 7162 | 2104 g_free(hb.name); |
| 9285 | 2105 |
| 6245 | 2106 return ret; |
| 2107 } | |
| 2108 | |
| 6695 | 2109 GaimGroup *gaim_find_group(const char *name) |
| 5228 | 2110 { |
| 2111 GaimBlistNode *node; | |
| 9285 | 2112 |
| 2113 g_return_val_if_fail(gaimbuddylist != NULL, NULL); | |
| 2114 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
| 2115 | |
| 2116 for (node = gaimbuddylist->root; node != NULL; node = node->next) { | |
| 6695 | 2117 if (!strcmp(((GaimGroup *)node)->name, name)) |
| 2118 return (GaimGroup *)node; | |
| 5228 | 2119 } |
| 9285 | 2120 |
| 5228 | 2121 return NULL; |
| 2122 } | |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2123 |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2124 GaimChat * |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2125 gaim_blist_find_chat(GaimAccount *account, const char *name) |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2126 { |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2127 char *chat_name; |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2128 GaimChat *chat; |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2129 GaimPlugin *prpl; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2130 GaimPluginProtocolInfo *prpl_info = NULL; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2131 struct proto_chat_entry *pce; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2132 GaimBlistNode *node, *group; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2133 GList *parts; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2134 |
| 9285 | 2135 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
| 2136 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
| 2137 | |
| 2138 if (!gaim_account_is_connected(account)) | |
| 7970 | 2139 return NULL; |
| 2140 | |
| 7999 | 2141 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
| 2142 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
| 2143 | |
| 9285 | 2144 if (prpl_info->find_blist_chat != NULL) |
| 7999 | 2145 return prpl_info->find_blist_chat(account, name); |
| 2146 | |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2147 for (group = gaimbuddylist->root; group != NULL; group = group->next) { |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2148 for (node = group->child; node != NULL; node = node->next) { |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2149 if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2150 |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2151 chat = (GaimChat*)node; |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2152 |
| 9285 | 2153 if (account != chat->account) |
| 7970 | 2154 continue; |
| 2155 | |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2156 parts = prpl_info->chat_info( |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2157 gaim_account_get_connection(chat->account)); |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2158 |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2159 pce = parts->data; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2160 chat_name = g_hash_table_lookup(chat->components, |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2161 pce->identifier); |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2162 |
| 9153 | 2163 if (chat->account == account && chat_name != NULL && |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2164 name != NULL && !strcmp(chat_name, name)) { |
|
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 return chat; |
|
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 } |
|
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 return NULL; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2173 } |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2174 |
| 6695 | 2175 GaimGroup * |
| 7125 | 2176 gaim_chat_get_group(GaimChat *chat) |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2177 { |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2178 g_return_val_if_fail(chat != NULL, NULL); |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2179 |
| 6695 | 2180 return (GaimGroup *)(((GaimBlistNode *)chat)->parent); |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2181 } |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
2182 |
| 9285 | 2183 GaimContact *gaim_buddy_get_contact(GaimBuddy *buddy) |
| 2184 { | |
| 2185 g_return_val_if_fail(buddy != NULL, NULL); | |
| 2186 | |
| 2187 return (GaimContact*)((GaimBlistNode*)buddy)->parent; | |
| 2188 } | |
| 2189 | |
| 9949 | 2190 GaimPresence *gaim_buddy_get_presence(const GaimBuddy *buddy) |
| 2191 { | |
| 2192 g_return_val_if_fail(buddy != NULL, NULL); | |
|
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2193 return buddy->presence; |
| 9949 | 2194 } |
| 2195 | |
| 12088 | 2196 GaimGroup *gaim_buddy_get_group(GaimBuddy *buddy) |
| 5228 | 2197 { |
| 9285 | 2198 g_return_val_if_fail(buddy != NULL, NULL); |
|
6706
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2199 |
|
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2200 if (((GaimBlistNode *)buddy)->parent == NULL) |
|
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2201 return NULL; |
|
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2202 |
| 6695 | 2203 return (GaimGroup *)(((GaimBlistNode*)buddy)->parent->parent); |
| 5228 | 2204 } |
| 2205 | |
| 9285 | 2206 GSList *gaim_group_get_accounts(GaimGroup *group) |
| 5228 | 2207 { |
| 2208 GSList *l = NULL; | |
| 6695 | 2209 GaimBlistNode *gnode, *cnode, *bnode; |
| 2210 | |
| 9285 | 2211 gnode = (GaimBlistNode *)group; |
| 2212 | |
| 2213 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
| 6695 | 2214 if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
| 9285 | 2215 if (!g_slist_find(l, ((GaimChat *)cnode)->account)) |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2216 l = g_slist_append(l, ((GaimChat *)cnode)->account); |
| 9285 | 2217 } else if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { |
| 2218 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 2219 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
| 2220 if (!g_slist_find(l, ((GaimBuddy *)bnode)->account)) | |
| 6695 | 2221 l = g_slist_append(l, ((GaimBuddy *)bnode)->account); |
| 2222 } | |
| 2223 } | |
| 2224 } | |
| 5228 | 2225 } |
| 6695 | 2226 |
| 5228 | 2227 return l; |
| 2228 } | |
| 2229 | |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2230 void gaim_blist_add_account(GaimAccount *account) |
| 5234 | 2231 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2232 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 2233 GaimBlistNode *gnode, *cnode, *bnode; |
| 5234 | 2234 |
| 9285 | 2235 g_return_if_fail(gaimbuddylist != NULL); |
| 2236 | |
| 2237 if (!ops || !ops->update) | |
| 6695 | 2238 return; |
| 2239 | |
| 9285 | 2240 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
| 2241 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 5234 | 2242 continue; |
| 9285 | 2243 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
| 2244 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 6956 | 2245 gboolean recompute = FALSE; |
| 9285 | 2246 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
| 2247 if (GAIM_BLIST_NODE_IS_BUDDY(bnode) && | |
| 6695 | 2248 ((GaimBuddy*)bnode)->account == account) { |
| 6956 | 2249 recompute = TRUE; |
| 6695 | 2250 ((GaimContact*)cnode)->currentsize++; |
| 9285 | 2251 if (((GaimContact*)cnode)->currentsize == 1) |
| 6695 | 2252 ((GaimGroup*)gnode)->currentsize++; |
| 2253 ops->update(gaimbuddylist, bnode); | |
| 2254 } | |
| 2255 } | |
| 9285 | 2256 if (recompute || |
| 8960 | 2257 gaim_blist_node_get_bool(cnode, "show_offline")) { |
| 10378 | 2258 gaim_contact_invalidate_priority_buddy((GaimContact*)cnode); |
| 6956 | 2259 ops->update(gaimbuddylist, cnode); |
| 2260 } | |
| 9285 | 2261 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode) && |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2262 ((GaimChat*)cnode)->account == account) { |
| 6901 | 2263 ((GaimGroup *)gnode)->online++; |
| 2264 ((GaimGroup *)gnode)->currentsize++; | |
| 2265 ops->update(gaimbuddylist, cnode); | |
| 5234 | 2266 } |
| 2267 } | |
| 6695 | 2268 ops->update(gaimbuddylist, gnode); |
| 5234 | 2269 } |
| 2270 } | |
| 2271 | |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2272 void gaim_blist_remove_account(GaimAccount *account) |
| 5228 | 2273 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2274 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 2275 GaimBlistNode *gnode, *cnode, *bnode; |
|
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2276 GaimBuddy *buddy; |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2277 GaimChat *chat; |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2278 GaimContact *contact; |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2279 GaimGroup *group; |
| 12305 | 2280 GList *list = NULL, *iter = NULL; |
| 5234 | 2281 |
| 9285 | 2282 g_return_if_fail(gaimbuddylist != NULL); |
| 2283 | |
| 2284 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
| 2285 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 5234 | 2286 continue; |
|
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2287 |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2288 group = (GaimGroup *)gnode; |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2289 |
| 9285 | 2290 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
| 2291 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 10727 | 2292 gboolean recompute = FALSE; |
|
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2293 contact = (GaimContact *)cnode; |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2294 |
| 9285 | 2295 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
| 2296 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
| 6695 | 2297 continue; |
|
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2298 |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2299 buddy = (GaimBuddy *)bnode; |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2300 if (account == buddy->account) { |
| 10557 | 2301 GaimPresence *presence; |
| 6957 | 2302 recompute = TRUE; |
|
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2303 |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2304 presence = gaim_buddy_get_presence(buddy); |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2305 |
| 10728 | 2306 if(gaim_presence_is_online(presence)) { |
|
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2307 contact->online--; |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2308 if (contact->online == 0) |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2309 group->online--; |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2310 |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2311 gaim_blist_node_set_int(&buddy->node, |
| 10475 | 2312 "last_seen", time(NULL)); |
| 6695 | 2313 } |
|
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2314 |
| 10728 | 2315 contact->currentsize--; |
| 2316 if (contact->currentsize == 0) | |
| 2317 group->currentsize--; | |
|
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2318 |
| 12305 | 2319 if (!g_list_find(list, presence)) |
| 2320 list = g_list_prepend(list, presence); | |
| 10557 | 2321 |
| 9285 | 2322 if (ops && ops->remove) |
| 6695 | 2323 ops->remove(gaimbuddylist, bnode); |
| 2324 } | |
| 5234 | 2325 } |
| 9285 | 2326 if (recompute) { |
|
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2327 gaim_contact_invalidate_priority_buddy(contact); |
| 9285 | 2328 if (ops && ops->update) |
| 6983 | 2329 ops->update(gaimbuddylist, cnode); |
| 2330 } | |
|
10726
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2331 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2332 chat = (GaimChat *)cnode; |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2333 |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2334 if(chat->account == account) { |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2335 group->currentsize--; |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2336 group->online--; |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2337 |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2338 if (ops && ops->remove) |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2339 ops->remove(gaimbuddylist, cnode); |
|
00e3dc1a0206
[gaim-migrate @ 12326]
Luke Schierer <lschiere@pidgin.im>
parents:
10704
diff
changeset
|
2340 } |
| 5228 | 2341 } |
| 2342 } | |
| 2343 } | |
| 12305 | 2344 |
| 2345 for (iter = list; iter; iter = iter->next) | |
| 2346 { | |
| 2347 gaim_presence_set_status_active(iter->data, "offline", TRUE); | |
| 2348 } | |
| 2349 g_list_free(list); | |
| 5228 | 2350 } |
| 2351 | |
| 9285 | 2352 gboolean gaim_group_on_account(GaimGroup *g, GaimAccount *account) |
| 2353 { | |
| 9787 | 2354 GaimBlistNode *cnode; |
| 9285 | 2355 for (cnode = ((GaimBlistNode *)g)->child; cnode; cnode = cnode->next) { |
| 2356 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 9787 | 2357 if(gaim_contact_on_account((GaimContact *) cnode, account)) |
| 2358 return TRUE; | |
| 9285 | 2359 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2360 GaimChat *chat = (GaimChat *)cnode; |
| 9285 | 2361 if ((!account && gaim_account_is_connected(chat->account)) |
| 6695 | 2362 || chat->account == account) |
| 2363 return TRUE; | |
| 2364 } | |
| 5228 | 2365 } |
| 2366 return FALSE; | |
| 2367 } | |
| 2368 | |
|
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2369 void |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2370 gaim_blist_request_add_buddy(GaimAccount *account, const char *username, |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2371 const char *group, const char *alias) |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2372 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2373 GaimBlistUiOps *ui_ops; |
|
7060
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 ui_ops = gaim_blist_get_ui_ops(); |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2376 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2377 if (ui_ops != NULL && ui_ops->request_add_buddy != NULL) |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2378 ui_ops->request_add_buddy(account, username, group, alias); |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2379 } |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2380 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2381 void |
| 9754 | 2382 gaim_blist_request_add_chat(GaimAccount *account, GaimGroup *group, |
| 2383 const char *alias, const char *name) | |
|
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2384 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2385 GaimBlistUiOps *ui_ops; |
|
7060
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 ui_ops = gaim_blist_get_ui_ops(); |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2388 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2389 if (ui_ops != NULL && ui_ops->request_add_chat != NULL) |
| 9754 | 2390 ui_ops->request_add_chat(account, group, alias, name); |
|
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2391 } |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2392 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2393 void |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2394 gaim_blist_request_add_group(void) |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2395 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2396 GaimBlistUiOps *ui_ops; |
|
7060
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 ui_ops = gaim_blist_get_ui_ops(); |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2399 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2400 if (ui_ops != NULL && ui_ops->request_add_group != NULL) |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2401 ui_ops->request_add_group(); |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2402 } |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2403 |
| 10430 | 2404 static void |
| 2405 gaim_blist_node_setting_free(gpointer data) | |
| 7693 | 2406 { |
| 10430 | 2407 GaimValue *value; |
| 2408 | |
| 2409 value = (GaimValue *)data; | |
| 2410 | |
| 2411 gaim_value_destroy(value); | |
| 7693 | 2412 } |
| 2413 | |
| 9285 | 2414 static void gaim_blist_node_initialize_settings(GaimBlistNode *node) |
| 7693 | 2415 { |
| 9285 | 2416 if (node->settings) |
| 5228 | 2417 return; |
| 7693 | 2418 |
| 2419 node->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
| 2420 (GDestroyNotify)gaim_blist_node_setting_free); | |
| 2421 } | |
| 2422 | |
| 2423 void gaim_blist_node_remove_setting(GaimBlistNode *node, const char *key) | |
| 2424 { | |
| 2425 g_return_if_fail(node != NULL); | |
| 2426 g_return_if_fail(node->settings != NULL); | |
| 2427 g_return_if_fail(key != NULL); | |
| 2428 | |
| 2429 g_hash_table_remove(node->settings, key); | |
| 9285 | 2430 |
| 10704 | 2431 gaim_blist_schedule_save(); |
| 5228 | 2432 } |
| 2433 | |
| 10430 | 2434 void |
| 10548 | 2435 gaim_blist_node_set_flags(GaimBlistNode *node, GaimBlistNodeFlags flags) |
| 2436 { | |
| 2437 g_return_if_fail(node != NULL); | |
| 2438 | |
| 2439 node->flags = flags; | |
| 2440 } | |
| 2441 | |
| 2442 GaimBlistNodeFlags | |
| 2443 gaim_blist_node_get_flags(GaimBlistNode *node) | |
| 2444 { | |
| 2445 g_return_val_if_fail(node != NULL, 0); | |
| 2446 | |
| 2447 return node->flags; | |
| 2448 } | |
| 2449 | |
| 2450 void | |
| 10430 | 2451 gaim_blist_node_set_bool(GaimBlistNode* node, const char *key, gboolean data) |
| 7693 | 2452 { |
| 10430 | 2453 GaimValue *value; |
| 7693 | 2454 |
| 2455 g_return_if_fail(node != NULL); | |
| 2456 g_return_if_fail(node->settings != NULL); | |
| 2457 g_return_if_fail(key != NULL); | |
| 2458 | |
| 10430 | 2459 value = gaim_value_new(GAIM_TYPE_BOOLEAN); |
| 2460 gaim_value_set_boolean(value, data); | |
| 2461 | |
| 2462 g_hash_table_replace(node->settings, g_strdup(key), value); | |
| 9285 | 2463 |
| 10704 | 2464 gaim_blist_schedule_save(); |
| 7693 | 2465 } |
| 2466 | |
| 10430 | 2467 gboolean |
| 2468 gaim_blist_node_get_bool(GaimBlistNode* node, const char *key) | |
| 7693 | 2469 { |
| 10430 | 2470 GaimValue *value; |
| 7693 | 2471 |
| 2472 g_return_val_if_fail(node != NULL, FALSE); | |
| 2473 g_return_val_if_fail(node->settings != NULL, FALSE); | |
| 2474 g_return_val_if_fail(key != NULL, FALSE); | |
| 2475 | |
| 10430 | 2476 value = g_hash_table_lookup(node->settings, key); |
| 2477 | |
| 2478 if (value == NULL) | |
| 7849 | 2479 return FALSE; |
| 2480 | |
| 10430 | 2481 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_BOOLEAN, FALSE); |
| 2482 | |
| 2483 return gaim_value_get_boolean(value); | |
| 5228 | 2484 } |
| 2485 | |
| 10430 | 2486 void |
| 2487 gaim_blist_node_set_int(GaimBlistNode* node, const char *key, int data) | |
| 7693 | 2488 { |
| 10430 | 2489 GaimValue *value; |
| 7693 | 2490 |
| 2491 g_return_if_fail(node != NULL); | |
| 2492 g_return_if_fail(node->settings != NULL); | |
| 2493 g_return_if_fail(key != NULL); | |
| 2494 | |
| 10430 | 2495 value = gaim_value_new(GAIM_TYPE_INT); |
| 2496 gaim_value_set_int(value, data); | |
| 2497 | |
| 2498 g_hash_table_replace(node->settings, g_strdup(key), value); | |
| 9285 | 2499 |
| 10704 | 2500 gaim_blist_schedule_save(); |
| 7693 | 2501 } |
| 2502 | |
| 10430 | 2503 int |
| 2504 gaim_blist_node_get_int(GaimBlistNode* node, const char *key) | |
| 7693 | 2505 { |
| 10430 | 2506 GaimValue *value; |
| 7693 | 2507 |
| 2508 g_return_val_if_fail(node != NULL, 0); | |
| 2509 g_return_val_if_fail(node->settings != NULL, 0); | |
| 2510 g_return_val_if_fail(key != NULL, 0); | |
| 2511 | |
| 10430 | 2512 value = g_hash_table_lookup(node->settings, key); |
| 2513 | |
| 2514 if (value == NULL) | |
| 7849 | 2515 return 0; |
| 2516 | |
| 10430 | 2517 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_INT, 0); |
| 2518 | |
| 2519 return gaim_value_get_int(value); | |
| 7693 | 2520 } |
| 2521 | |
| 10430 | 2522 void |
| 2523 gaim_blist_node_set_string(GaimBlistNode* node, const char *key, const char *data) | |
| 5906 | 2524 { |
| 10430 | 2525 GaimValue *value; |
| 7693 | 2526 |
| 2527 g_return_if_fail(node != NULL); | |
| 2528 g_return_if_fail(node->settings != NULL); | |
| 2529 g_return_if_fail(key != NULL); | |
| 2530 | |
| 10430 | 2531 value = gaim_value_new(GAIM_TYPE_STRING); |
| 2532 gaim_value_set_string(value, data); | |
| 2533 | |
| 2534 g_hash_table_replace(node->settings, g_strdup(key), value); | |
| 9285 | 2535 |
| 10704 | 2536 gaim_blist_schedule_save(); |
| 7693 | 2537 } |
| 2538 | |
| 10430 | 2539 const char * |
| 2540 gaim_blist_node_get_string(GaimBlistNode* node, const char *key) | |
| 7693 | 2541 { |
| 10430 | 2542 GaimValue *value; |
| 7693 | 2543 |
| 2544 g_return_val_if_fail(node != NULL, NULL); | |
| 2545 g_return_val_if_fail(node->settings != NULL, NULL); | |
| 2546 g_return_val_if_fail(key != NULL, NULL); | |
| 2547 | |
| 10430 | 2548 value = g_hash_table_lookup(node->settings, key); |
| 2549 | |
| 2550 if (value == NULL) | |
| 7849 | 2551 return NULL; |
| 2552 | |
| 10430 | 2553 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_STRING, NULL); |
| 2554 | |
| 2555 return gaim_value_get_string(value); | |
| 7693 | 2556 } |
| 2557 | |
|
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2558 GList * |
|
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2559 gaim_blist_node_get_extended_menu(GaimBlistNode *n) |
| 7693 | 2560 { |
|
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2561 GList *menu = NULL; |
| 9030 | 2562 |
|
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10567
diff
changeset
|
2563 g_return_val_if_fail(n != NULL, NULL); |
| 9030 | 2564 |
| 2565 gaim_signal_emit(gaim_blist_get_handle(), | |
| 2566 "blist-node-extended-menu", | |
| 2567 n, &menu); | |
|
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2568 return menu; |
|
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2569 } |
|
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2570 |
| 9285 | 2571 int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) |
| 2572 { | |
| 2573 if (!group) | |
| 5228 | 2574 return 0; |
| 2575 | |
| 5277 | 2576 return offline ? group->totalsize : group->currentsize; |
| 5228 | 2577 } |
| 2578 | |
| 9285 | 2579 int gaim_blist_get_group_online_count(GaimGroup *group) |
| 2580 { | |
| 2581 if (!group) | |
| 5228 | 2582 return 0; |
| 2583 | |
| 5277 | 2584 return group->online; |
| 5228 | 2585 } |
| 2586 | |
|
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2587 void |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2588 gaim_blist_set_ui_ops(GaimBlistUiOps *ops) |
|
7035
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 blist_ui_ops = ops; |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2591 } |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2592 |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2593 GaimBlistUiOps * |
|
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2594 gaim_blist_get_ui_ops(void) |
|
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 return blist_ui_ops; |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2597 } |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2598 |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2599 |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2600 void * |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2601 gaim_blist_get_handle(void) |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2602 { |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2603 static int handle; |
| 5228 | 2604 |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2605 return &handle; |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2606 } |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2607 |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2608 void |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2609 gaim_blist_init(void) |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2610 { |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2611 void *handle = gaim_blist_get_handle(); |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2612 |
|
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2613 gaim_signal_register(handle, "buddy-status-changed", |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2614 gaim_marshal_VOID__POINTER_POINTER_POINTER, NULL, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2615 3, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2616 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2617 GAIM_SUBTYPE_BLIST_BUDDY), |
|
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), |
|
11979
717cbb3115bc
[gaim-migrate @ 14272]
Gary Kramlich <grim@reaperworld.com>
parents:
11935
diff
changeset
|
2620 gaim_value_new(GAIM_TYPE_SUBTYPE, |
| 12097 | 2621 GAIM_SUBTYPE_STATUS)); |
|
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2622 |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2623 gaim_signal_register(handle, "buddy-idle-changed", |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2624 gaim_marshal_VOID__POINTER_INT_INT, NULL, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2625 3, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2626 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2627 GAIM_SUBTYPE_BLIST_BUDDY), |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2628 gaim_value_new(GAIM_TYPE_INT), |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2629 gaim_value_new(GAIM_TYPE_INT)); |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11910
diff
changeset
|
2630 |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2631 |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2632 gaim_signal_register(handle, "buddy-signed-on", |
|
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2633 gaim_marshal_VOID__POINTER, NULL, 1, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2634 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2635 GAIM_SUBTYPE_BLIST_BUDDY)); |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2636 |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2637 gaim_signal_register(handle, "buddy-signed-off", |
|
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2638 gaim_marshal_VOID__POINTER, NULL, 1, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2639 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2640 GAIM_SUBTYPE_BLIST_BUDDY)); |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2641 |
|
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2642 gaim_signal_register(handle, "buddy-added", |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2643 gaim_marshal_VOID__POINTER, NULL, 1, |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2644 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2645 GAIM_SUBTYPE_BLIST_BUDDY)); |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2646 |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2647 gaim_signal_register(handle, "buddy-removed", |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2648 gaim_marshal_VOID__POINTER, NULL, 1, |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2649 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2650 GAIM_SUBTYPE_BLIST_BUDDY)); |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2651 |
| 12097 | 2652 gaim_signal_register(handle, "buddy-icon-changed", |
| 2653 gaim_marshal_VOID__POINTER, NULL, 1, | |
| 2654 gaim_value_new(GAIM_TYPE_SUBTYPE, | |
| 2655 GAIM_SUBTYPE_BLIST_BUDDY)); | |
| 2656 | |
|
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2657 gaim_signal_register(handle, "update-idle", gaim_marshal_VOID, NULL, 0); |
| 9030 | 2658 |
| 2659 gaim_signal_register(handle, "blist-node-extended-menu", | |
|
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2660 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
|
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2661 gaim_value_new(GAIM_TYPE_SUBTYPE, |
| 9030 | 2662 GAIM_SUBTYPE_BLIST_NODE), |
| 8952 | 2663 gaim_value_new(GAIM_TYPE_BOXED, "GList **")); |
|
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2664 |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2665 gaim_signal_register(handle, "blist-node-aliased", |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2666 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2667 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2668 GAIM_SUBTYPE_BLIST_NODE), |
|
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11434
diff
changeset
|
2669 gaim_value_new(GAIM_TYPE_STRING)); |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2670 } |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2671 |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2672 void |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2673 gaim_blist_uninit(void) |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2674 { |
| 10428 | 2675 if (save_timer != 0) |
| 2676 { | |
| 2677 gaim_timeout_remove(save_timer); | |
| 2678 save_timer = 0; | |
| 9285 | 2679 gaim_blist_sync(); |
| 2680 } | |
| 2681 | |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2682 gaim_signals_unregister_by_instance(gaim_blist_get_handle()); |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2683 } |
