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