Mercurial > pidgin
annotate src/blist.c @ 7132:d17a587efeb3
[gaim-migrate @ 7699]
new blist parser code, and some tweaks to the account code to make my next commit possible. the other parser code can get moved over to this model to make things cleaner, but i'm too lazy to do it now.
committer: Tailor Script <tailor@pidgin.im>
| author | Nathan Walp <nwalp@pidgin.im> |
|---|---|
| date | Fri, 03 Oct 2003 21:49:11 +0000 |
| parents | 208cb260d7a7 |
| children | 28dd20b5f4cf |
| rev | line source |
|---|---|
| 5228 | 1 /* |
| 2 * gaim | |
| 3 * | |
| 4 * Copyright (C) 2003, Sean Egan <sean.egan@binghamton.edu> | |
| 5 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
| 6 * | |
| 7 * This program is free software; you can redistribute it and/or modify | |
| 8 * it under the terms of the GNU General Public License as published by | |
| 9 * the Free Software Foundation; either version 2 of the License, or | |
| 10 * (at your option) any later version. | |
| 11 * | |
| 12 * This program is distributed in the hope that it will be useful, | |
| 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 15 * GNU General Public License for more details. | |
| 16 * | |
| 17 * You should have received a copy of the GNU General Public License | |
| 18 * along with this program; if not, write to the Free Software | |
| 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 20 * | |
| 21 */ | |
|
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
22 #include "internal.h" |
| 5228 | 23 #include "blist.h" |
|
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
24 #include "conversation.h" |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
25 #include "debug.h" |
| 6034 | 26 #include "multi.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" |
| 7132 | 34 #include "xmlnode.h" |
| 5228 | 35 |
| 36 #define PATHSIZE 1024 | |
| 37 | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
38 GaimBuddyList *gaimbuddylist = NULL; |
|
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
39 static GaimBlistUiOps *blist_ui_ops = NULL; |
| 5228 | 40 |
|
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
41 |
| 5228 | 42 /***************************************************************************** |
| 43 * Private Utility functions * | |
| 44 *****************************************************************************/ | |
| 45 static GaimBlistNode *gaim_blist_get_last_sibling(GaimBlistNode *node) | |
| 46 { | |
| 47 GaimBlistNode *n = node; | |
| 48 if (!n) | |
| 49 return NULL; | |
| 50 while (n->next) | |
| 51 n = n->next; | |
| 52 return n; | |
| 53 } | |
| 6695 | 54 |
| 5228 | 55 static GaimBlistNode *gaim_blist_get_last_child(GaimBlistNode *node) |
| 56 { | |
| 57 if (!node) | |
| 58 return NULL; | |
| 59 return gaim_blist_get_last_sibling(node->child); | |
| 60 } | |
| 61 | |
| 5247 | 62 struct _gaim_hbuddy { |
| 63 char *name; | |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
64 GaimAccount *account; |
| 5758 | 65 GaimBlistNode *group; |
| 5247 | 66 }; |
| 67 | |
| 68 static guint _gaim_blist_hbuddy_hash (struct _gaim_hbuddy *hb) | |
| 69 { | |
| 70 return g_str_hash(hb->name); | |
| 71 } | |
| 72 | |
| 73 static guint _gaim_blist_hbuddy_equal (struct _gaim_hbuddy *hb1, struct _gaim_hbuddy *hb2) | |
| 74 { | |
| 5758 | 75 return ((!strcmp(hb1->name, hb2->name)) && hb1->account == hb2->account && hb1->group == hb2->group); |
| 5247 | 76 } |
| 77 | |
| 6742 | 78 static void _gaim_blist_hbuddy_free_key(struct _gaim_hbuddy *hb) |
| 79 { | |
| 80 g_free(hb->name); | |
| 81 g_free(hb); | |
| 82 } | |
| 83 | |
| 6006 | 84 static void blist_pref_cb(const char *name, GaimPrefType typ, gpointer value, gpointer data) |
| 85 { | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
86 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 87 GaimBlistNode *gnode, *cnode, *bnode; |
| 6012 | 88 |
| 89 if (!ops) | |
| 90 return; | |
| 91 | |
| 6695 | 92 for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
| 93 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 6012 | 94 continue; |
| 6695 | 95 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 96 if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 97 for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 98 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
| 99 continue; | |
| 100 ops->update(gaimbuddylist, bnode); | |
| 101 } | |
| 102 } else if(GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
| 103 ops->update(gaimbuddylist, cnode); | |
| 104 } | |
| 6012 | 105 } |
| 106 } | |
| 6006 | 107 } |
| 108 | |
| 6843 | 109 static GaimContact *gaim_buddy_get_contact(GaimBuddy *buddy) |
| 110 { | |
| 111 return (GaimContact*)((GaimBlistNode*)buddy)->parent; | |
| 112 } | |
| 113 | |
| 114 static void gaim_contact_compute_priority_buddy(GaimContact *contact) { | |
| 115 GaimBlistNode *bnode; | |
| 6870 | 116 contact->priority = NULL; |
| 6843 | 117 |
| 118 for(bnode = ((GaimBlistNode*)contact)->child; bnode; bnode = bnode->next) { | |
| 119 GaimBuddy *buddy; | |
| 120 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
| 121 continue; | |
| 122 buddy = (GaimBuddy*)bnode; | |
| 123 if(!gaim_account_is_connected(buddy->account)) | |
| 124 continue; | |
| 125 | |
| 126 if(!contact->priority) { | |
| 127 contact->priority = buddy; | |
| 128 } else if(GAIM_BUDDY_IS_ONLINE(buddy)) { | |
| 129 if(!GAIM_BUDDY_IS_ONLINE(contact->priority)) { | |
| 130 contact->priority = buddy; | |
| 131 } else if(!(buddy->uc & UC_UNAVAILABLE) && !buddy->idle && | |
| 132 (contact->priority->uc & UC_UNAVAILABLE || | |
| 133 contact->priority->idle)) { | |
| 134 contact->priority = buddy; | |
| 135 } else if(!buddy->idle && contact->priority->idle) { | |
| 136 contact->priority = buddy; | |
| 137 } else if(contact->priority->uc & UC_UNAVAILABLE && | |
| 138 contact->priority->idle && (!(buddy->uc & UC_UNAVAILABLE) || | |
| 139 !buddy->idle)) { | |
| 140 contact->priority = buddy; | |
| 141 } | |
| 142 } | |
| 143 } | |
| 144 } | |
| 145 | |
| 146 | |
| 5228 | 147 /***************************************************************************** |
| 148 * Public API functions * | |
| 149 *****************************************************************************/ | |
| 150 | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
151 GaimBuddyList *gaim_blist_new() |
| 5228 | 152 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
153 GaimBuddyList *gbl = g_new0(GaimBuddyList, 1); |
| 5228 | 154 |
|
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
155 gbl->ui_ops = gaim_blist_get_ui_ops(); |
| 5228 | 156 |
| 6742 | 157 gbl->buddies = g_hash_table_new_full((GHashFunc)_gaim_blist_hbuddy_hash, |
| 158 (GEqualFunc)_gaim_blist_hbuddy_equal, | |
| 159 (GDestroyNotify)_gaim_blist_hbuddy_free_key, NULL); | |
| 5247 | 160 |
| 5228 | 161 if (gbl->ui_ops != NULL && gbl->ui_ops->new_list != NULL) |
| 162 gbl->ui_ops->new_list(gbl); | |
| 163 | |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
164 gaim_prefs_connect_callback("/core/buddies/use_server_alias", |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
165 blist_pref_cb, NULL); |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
166 |
| 6006 | 167 |
| 5228 | 168 return gbl; |
| 169 } | |
| 170 | |
| 171 void | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
172 gaim_set_blist(GaimBuddyList *list) |
| 5228 | 173 { |
| 174 gaimbuddylist = list; | |
| 175 } | |
| 176 | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
177 GaimBuddyList * |
| 5228 | 178 gaim_get_blist(void) |
| 179 { | |
| 180 return gaimbuddylist; | |
| 181 } | |
| 182 | |
| 6695 | 183 void gaim_blist_show () |
| 5228 | 184 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
185 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5228 | 186 if (ops) |
| 187 ops->show(gaimbuddylist); | |
| 188 } | |
| 189 | |
| 190 void gaim_blist_destroy() | |
| 191 { | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
192 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5228 | 193 if (ops) |
| 194 ops->destroy(gaimbuddylist); | |
| 195 } | |
| 196 | |
| 197 void gaim_blist_set_visible (gboolean show) | |
| 198 { | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
199 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5228 | 200 if (ops) |
| 201 ops->set_visible(gaimbuddylist, show); | |
| 202 } | |
| 203 | |
| 6695 | 204 void gaim_blist_update_buddy_status (GaimBuddy *buddy, int status) |
| 5228 | 205 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
206 GaimBlistUiOps *ops; |
|
5266
b3a03b86b09b
[gaim-migrate @ 5638]
Christian Hammond <chipx86@chipx86.com>
parents:
5259
diff
changeset
|
207 |
|
b3a03b86b09b
[gaim-migrate @ 5638]
Christian Hammond <chipx86@chipx86.com>
parents:
5259
diff
changeset
|
208 if (buddy->uc == status) |
|
b3a03b86b09b
[gaim-migrate @ 5638]
Christian Hammond <chipx86@chipx86.com>
parents:
5259
diff
changeset
|
209 return; |
|
b3a03b86b09b
[gaim-migrate @ 5638]
Christian Hammond <chipx86@chipx86.com>
parents:
5259
diff
changeset
|
210 |
|
b3a03b86b09b
[gaim-migrate @ 5638]
Christian Hammond <chipx86@chipx86.com>
parents:
5259
diff
changeset
|
211 ops = gaimbuddylist->ui_ops; |
| 5228 | 212 |
| 5305 | 213 if((status & UC_UNAVAILABLE) != (buddy->uc & UC_UNAVAILABLE)) { |
| 214 if(status & UC_UNAVAILABLE) | |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
215 gaim_signal_emit(gaim_blist_get_handle(), "buddy-away", buddy); |
| 5305 | 216 else |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
217 gaim_signal_emit(gaim_blist_get_handle(), "buddy-back", buddy); |
| 5305 | 218 } |
| 5228 | 219 |
| 5305 | 220 buddy->uc = status; |
| 6843 | 221 gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); |
| 5228 | 222 if (ops) |
| 223 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 224 } | |
| 225 | |
| 6695 | 226 static gboolean presence_update_timeout_cb(GaimBuddy *buddy) { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
227 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
|
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
228 GaimConversation *conv; |
|
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
229 |
|
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
230 conv = gaim_find_conversation_with_account(buddy->name, buddy->account); |
| 5228 | 231 |
| 232 if(buddy->present == GAIM_BUDDY_SIGNING_ON) { | |
| 233 buddy->present = GAIM_BUDDY_ONLINE; | |
| 234 } else if(buddy->present == GAIM_BUDDY_SIGNING_OFF) { | |
| 235 buddy->present = GAIM_BUDDY_OFFLINE; | |
| 6860 | 236 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online--; |
| 237 if(((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 0) | |
| 238 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online--; | |
| 5228 | 239 } |
| 240 | |
| 241 buddy->timer = 0; | |
| 242 | |
| 243 if (ops) | |
| 244 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 245 | |
|
6392
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
246 if (conv) { |
|
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
247 if (buddy->present == GAIM_BUDDY_ONLINE) |
|
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
248 gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_ONLINE); |
|
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
249 else if (buddy->present == GAIM_BUDDY_OFFLINE) |
|
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
250 gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_OFFLINE); |
|
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
251 } |
|
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
252 |
| 5228 | 253 return FALSE; |
| 254 } | |
| 255 | |
| 6695 | 256 void gaim_blist_update_buddy_presence(GaimBuddy *buddy, int presence) { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
257 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6961 | 258 gboolean do_something = FALSE; |
| 5228 | 259 |
| 260 if (!GAIM_BUDDY_IS_ONLINE(buddy) && presence) { | |
| 6901 | 261 int old_present = buddy->present; |
| 5228 | 262 buddy->present = GAIM_BUDDY_SIGNING_ON; |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
263 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-on", buddy); |
| 6961 | 264 do_something = TRUE; |
| 6901 | 265 |
| 266 if(old_present != GAIM_BUDDY_SIGNING_OFF) { | |
| 267 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online++; | |
| 268 if(((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 1) | |
| 269 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online++; | |
| 270 } | |
| 5228 | 271 } else if(GAIM_BUDDY_IS_ONLINE(buddy) && !presence) { |
| 272 buddy->present = GAIM_BUDDY_SIGNING_OFF; | |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
273 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-off", buddy); |
| 6961 | 274 do_something = TRUE; |
| 5228 | 275 } |
| 276 | |
| 6961 | 277 if(do_something) { |
| 5228 | 278 if(buddy->timer > 0) |
| 279 g_source_remove(buddy->timer); | |
| 280 buddy->timer = g_timeout_add(10000, (GSourceFunc)presence_update_timeout_cb, buddy); | |
| 6961 | 281 |
| 282 gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); | |
| 283 if (ops) | |
| 284 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 5228 | 285 } |
| 286 } | |
| 287 | |
| 288 | |
| 6695 | 289 void gaim_blist_update_buddy_idle (GaimBuddy *buddy, int idle) |
| 5228 | 290 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
291 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6961 | 292 if(buddy->idle == idle) |
| 293 return; | |
| 294 | |
| 5228 | 295 buddy->idle = idle; |
| 6843 | 296 gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); |
| 5228 | 297 if (ops) |
| 298 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 299 } | |
| 6695 | 300 |
| 301 void gaim_blist_update_buddy_evil (GaimBuddy *buddy, int warning) | |
| 5228 | 302 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
303 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6961 | 304 if(buddy->evil == warning) |
| 305 return; | |
| 306 | |
| 5228 | 307 buddy->evil = warning; |
| 308 if (ops) | |
| 309 ops->update(gaimbuddylist,(GaimBlistNode*)buddy); | |
| 310 } | |
| 6695 | 311 |
| 312 void gaim_blist_update_buddy_icon(GaimBuddy *buddy) { | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
313 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5228 | 314 if(ops) |
| 315 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 316 } | |
| 6695 | 317 |
| 318 void gaim_blist_rename_buddy (GaimBuddy *buddy, const char *name) | |
| 5228 | 319 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
320 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5634 | 321 g_free(buddy->name); |
| 5228 | 322 buddy->name = g_strdup(name); |
| 323 if (ops) | |
| 324 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 325 } | |
| 5234 | 326 |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
327 void gaim_blist_alias_chat(GaimChat *chat, const char *alias) |
| 5234 | 328 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
329 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5234 | 330 |
| 5237 | 331 g_free(chat->alias); |
| 5234 | 332 |
| 5237 | 333 if(alias && strlen(alias)) |
| 334 chat->alias = g_strdup(alias); | |
| 335 else | |
| 336 chat->alias = NULL; | |
| 337 | |
| 5234 | 338 if(ops) |
| 339 ops->update(gaimbuddylist, (GaimBlistNode*)chat); | |
| 340 } | |
| 341 | |
| 6695 | 342 void gaim_blist_alias_buddy (GaimBuddy *buddy, const char *alias) |
| 5228 | 343 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
344 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
|
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5634
diff
changeset
|
345 GaimConversation *conv; |
| 5228 | 346 |
| 347 g_free(buddy->alias); | |
| 348 | |
| 349 if(alias && strlen(alias)) | |
| 350 buddy->alias = g_strdup(alias); | |
| 351 else | |
| 352 buddy->alias = NULL; | |
| 353 | |
| 354 if (ops) | |
| 355 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 356 | |
| 357 conv = gaim_find_conversation_with_account(buddy->name, buddy->account); | |
| 358 | |
| 359 if (conv) | |
| 360 gaim_conversation_autoset_title(conv); | |
| 361 } | |
| 362 | |
| 6695 | 363 void gaim_blist_server_alias_buddy (GaimBuddy *buddy, const char *alias) |
| 6058 | 364 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
365 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6058 | 366 GaimConversation *conv; |
| 367 | |
| 368 g_free(buddy->server_alias); | |
| 369 | |
| 370 if(alias && strlen(alias) && g_utf8_validate(alias, -1, NULL)) | |
| 371 buddy->server_alias = g_strdup(alias); | |
| 372 else | |
| 373 buddy->server_alias = NULL; | |
| 374 | |
| 375 if (ops) | |
| 376 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 377 | |
| 378 conv = gaim_find_conversation_with_account(buddy->name, buddy->account); | |
| 379 | |
| 380 if (conv) | |
| 381 gaim_conversation_autoset_title(conv); | |
| 382 } | |
| 383 | |
| 6695 | 384 void gaim_blist_rename_group(GaimGroup *group, const char *name) |
| 5228 | 385 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
386 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 387 GaimGroup *dest_group; |
| 5346 | 388 GaimBlistNode *prev, *child, *next; |
| 389 GSList *accts; | |
| 390 | |
| 391 if(!name || !strlen(name) || !strcmp(name, group->name)) { | |
| 392 /* nothing to do here */ | |
| 393 return; | |
| 394 } else if((dest_group = gaim_find_group(name))) { | |
| 395 /* here we're merging two groups */ | |
| 396 prev = gaim_blist_get_last_child((GaimBlistNode*)dest_group); | |
| 397 child = ((GaimBlistNode*)group)->child; | |
| 398 | |
| 399 while(child) | |
| 400 { | |
| 401 next = child->next; | |
| 6695 | 402 if(GAIM_BLIST_NODE_IS_CONTACT(child)) { |
| 403 GaimBlistNode *bnode; | |
| 404 gaim_blist_add_contact((GaimContact *)child, dest_group, prev); | |
| 405 for(bnode = child->child; bnode; bnode = bnode->next) | |
| 406 gaim_blist_add_buddy((GaimBuddy*)bnode, (GaimContact*)child, | |
| 407 NULL, bnode->prev); | |
| 5346 | 408 prev = child; |
| 409 } else if(GAIM_BLIST_NODE_IS_CHAT(child)) { | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
410 gaim_blist_add_chat((GaimChat *)child, dest_group, prev); |
| 5346 | 411 prev = child; |
| 412 } else { | |
| 413 gaim_debug(GAIM_DEBUG_ERROR, "blist", | |
| 414 "Unknown child type in group %s\n", group->name); | |
| 415 } | |
| 416 child = next; | |
| 417 } | |
| 418 for (accts = gaim_group_get_accounts(group); accts; accts = g_slist_remove(accts, accts->data)) { | |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
419 GaimAccount *account = accts->data; |
| 5346 | 420 serv_rename_group(account->gc, group, name); |
| 421 } | |
| 422 gaim_blist_remove_group(group); | |
| 423 } else { | |
| 424 /* a simple rename */ | |
| 425 for (accts = gaim_group_get_accounts(group); accts; accts = g_slist_remove(accts, accts->data)) { | |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
426 GaimAccount *account = accts->data; |
| 5346 | 427 serv_rename_group(account->gc, group, name); |
| 428 } | |
| 429 g_free(group->name); | |
| 430 group->name = g_strdup(name); | |
| 431 if (ops) | |
| 432 ops->update(gaimbuddylist, (GaimBlistNode*)group); | |
| 433 } | |
| 5228 | 434 } |
| 5234 | 435 |
| 7125 | 436 GaimChat *gaim_chat_new(GaimAccount *account, const char *alias, GHashTable *components) |
| 5234 | 437 { |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
438 GaimChat *chat; |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
439 GaimBlistUiOps *ops; |
| 5234 | 440 |
| 5237 | 441 if(!components) |
| 5234 | 442 return NULL; |
| 443 | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
444 chat = g_new0(GaimChat, 1); |
| 5234 | 445 chat->account = account; |
| 5237 | 446 if(alias && strlen(alias)) |
| 447 chat->alias = g_strdup(alias); | |
| 5234 | 448 chat->components = components; |
| 5906 | 449 chat->settings = g_hash_table_new_full(g_str_hash, g_str_equal, |
| 450 g_free, g_free); | |
| 5234 | 451 |
| 452 ((GaimBlistNode*)chat)->type = GAIM_BLIST_CHAT_NODE; | |
| 453 | |
|
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
454 ops = gaim_blist_get_ui_ops(); |
| 5234 | 455 |
| 456 if (ops != NULL && ops->new_node != NULL) | |
| 457 ops->new_node((GaimBlistNode *)chat); | |
| 458 | |
| 459 return chat; | |
| 460 } | |
| 461 | |
| 7125 | 462 char *gaim_chat_get_display_name(GaimChat *chat) |
| 6034 | 463 { |
| 464 char *name; | |
| 465 | |
| 466 if(chat->alias){ | |
| 467 name = g_strdup(chat->alias); | |
| 468 } | |
| 469 else{ | |
| 470 GList *parts; | |
| 471 GaimPlugin *prpl; | |
| 472 GaimPluginProtocolInfo *prpl_info; | |
| 473 struct proto_chat_entry *pce; | |
| 474 | |
| 475 prpl = gaim_find_prpl(gaim_account_get_protocol(chat->account)); | |
| 476 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
| 477 | |
| 478 parts = prpl_info->chat_info(chat->account->gc); | |
| 479 | |
| 480 pce = parts->data; | |
| 481 name = g_markup_escape_text(g_hash_table_lookup(chat->components, | |
| 482 pce->identifier), -1); | |
| 483 g_list_free(parts); | |
| 484 } | |
| 485 | |
| 486 return name; | |
| 487 } | |
| 488 | |
| 6695 | 489 GaimBuddy *gaim_buddy_new(GaimAccount *account, const char *screenname, const char *alias) |
| 5228 | 490 { |
| 6695 | 491 GaimBuddy *b; |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
492 GaimBlistUiOps *ops; |
| 5228 | 493 |
| 6695 | 494 b = g_new0(GaimBuddy, 1); |
| 5228 | 495 b->account = account; |
| 496 b->name = g_strdup(screenname); | |
| 497 b->alias = g_strdup(alias); | |
| 498 b->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
| 499 ((GaimBlistNode*)b)->type = GAIM_BLIST_BUDDY_NODE; | |
| 500 | |
|
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
501 ops = gaim_blist_get_ui_ops(); |
| 5228 | 502 |
| 503 if (ops != NULL && ops->new_node != NULL) | |
| 504 ops->new_node((GaimBlistNode *)b); | |
| 505 | |
| 506 return b; | |
| 507 } | |
| 5634 | 508 |
|
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
509 void |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
510 gaim_buddy_set_icon(GaimBuddy *buddy, GaimBuddyIcon *icon) |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
511 { |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
512 g_return_if_fail(buddy != NULL); |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
513 |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
514 if (buddy->icon == icon) |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
515 return; |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
516 |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
517 if (buddy->icon != NULL) |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
518 gaim_buddy_icon_unref(buddy->icon); |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
519 |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
520 buddy->icon = (icon == NULL ? NULL : gaim_buddy_icon_ref(icon)); |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
521 |
|
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6885
diff
changeset
|
522 gaim_buddy_icon_cache(icon, buddy); |
|
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
523 |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
524 gaim_blist_update_buddy_icon(buddy); |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
525 } |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
526 |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
527 GaimBuddyIcon * |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
528 gaim_buddy_get_icon(const GaimBuddy *buddy) |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
529 { |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
530 g_return_val_if_fail(buddy != NULL, NULL); |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
531 |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
532 return buddy->icon; |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
533 } |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
534 |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
535 void gaim_blist_add_chat(GaimChat *chat, GaimGroup *group, GaimBlistNode *node) |
| 5234 | 536 { |
| 537 GaimBlistNode *n = node, *cnode = (GaimBlistNode*)chat; | |
| 6695 | 538 GaimGroup *g = group; |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
539 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5234 | 540 gboolean save = FALSE; |
| 541 | |
| 6774 | 542 |
| 543 g_return_if_fail(chat != NULL); | |
| 544 g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT((GaimBlistNode*)chat)); | |
| 545 | |
| 5234 | 546 if (!n) { |
| 547 if (!g) { | |
| 548 g = gaim_group_new(_("Chats")); | |
| 5634 | 549 gaim_blist_add_group(g, |
| 550 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 5234 | 551 } |
| 552 } else { | |
| 6695 | 553 g = (GaimGroup*)n->parent; |
| 5234 | 554 } |
| 555 | |
| 556 /* if we're moving to overtop of ourselves, do nothing */ | |
| 557 if(cnode == n) | |
| 558 return; | |
| 559 | |
| 560 if (cnode->parent) { | |
| 561 /* This chat was already in the list and is | |
| 562 * being moved. | |
| 563 */ | |
| 6695 | 564 ((GaimGroup *)cnode->parent)->totalsize--; |
| 5855 | 565 if (gaim_account_is_connected(chat->account)) { |
| 6695 | 566 ((GaimGroup *)cnode->parent)->online--; |
| 567 ((GaimGroup *)cnode->parent)->currentsize--; | |
| 5287 | 568 } |
| 5234 | 569 if(cnode->next) |
| 570 cnode->next->prev = cnode->prev; | |
| 571 if(cnode->prev) | |
| 572 cnode->prev->next = cnode->next; | |
| 573 if(cnode->parent->child == cnode) | |
| 574 cnode->parent->child = cnode->next; | |
| 575 | |
| 576 ops->remove(gaimbuddylist, cnode); | |
| 577 | |
| 578 save = TRUE; | |
| 579 } | |
| 580 | |
| 581 if (n) { | |
| 582 if(n->next) | |
| 583 n->next->prev = cnode; | |
| 584 cnode->next = n->next; | |
| 585 cnode->prev = n; | |
| 586 cnode->parent = n->parent; | |
| 587 n->next = cnode; | |
| 6695 | 588 ((GaimGroup *)n->parent)->totalsize++; |
| 5855 | 589 if (gaim_account_is_connected(chat->account)) { |
| 6695 | 590 ((GaimGroup *)n->parent)->online++; |
| 591 ((GaimGroup *)n->parent)->currentsize++; | |
| 5287 | 592 } |
| 5234 | 593 } else { |
| 5634 | 594 if(((GaimBlistNode*)g)->child) |
| 595 ((GaimBlistNode*)g)->child->prev = cnode; | |
| 596 cnode->next = ((GaimBlistNode*)g)->child; | |
| 597 cnode->prev = NULL; | |
| 5234 | 598 ((GaimBlistNode*)g)->child = cnode; |
| 599 cnode->parent = (GaimBlistNode*)g; | |
| 5277 | 600 g->totalsize++; |
| 5855 | 601 if (gaim_account_is_connected(chat->account)) { |
| 5287 | 602 g->online++; |
| 5277 | 603 g->currentsize++; |
| 5287 | 604 } |
| 5234 | 605 } |
| 606 | |
| 607 if (ops) | |
| 608 ops->update(gaimbuddylist, (GaimBlistNode*)cnode); | |
| 609 if (save) | |
| 610 gaim_blist_save(); | |
| 611 } | |
| 612 | |
| 6695 | 613 void gaim_blist_add_buddy (GaimBuddy *buddy, GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
| 5228 | 614 { |
| 6695 | 615 GaimBlistNode *cnode, *bnode; |
| 616 GaimGroup *g; | |
| 617 GaimContact *c; | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
618 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 619 gboolean save = FALSE; |
| 5247 | 620 struct _gaim_hbuddy *hb; |
| 6695 | 621 |
| 622 g_return_if_fail(buddy != NULL); | |
| 6774 | 623 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY((GaimBlistNode*)buddy)); |
| 6695 | 624 |
| 625 bnode = (GaimBlistNode *)buddy; | |
| 5228 | 626 |
| 6695 | 627 /* if we're moving to overtop of ourselves, do nothing */ |
| 628 if(bnode == node || (!node && bnode->parent && | |
| 629 contact && bnode->parent == (GaimBlistNode*)contact | |
| 630 && bnode == bnode->parent->child)) | |
| 631 return; | |
| 632 | |
| 633 if(node && GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 634 c = (GaimContact*)node->parent; | |
| 635 g = (GaimGroup*)node->parent->parent; | |
| 636 } else if(contact) { | |
| 637 c = contact; | |
| 638 g = (GaimGroup*)((GaimBlistNode*)c)->parent; | |
| 639 } else { | |
| 640 if(group) { | |
| 641 g = group; | |
| 642 } else { | |
| 5228 | 643 g = gaim_group_new(_("Buddies")); |
| 5634 | 644 gaim_blist_add_group(g, |
| 645 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 5228 | 646 } |
| 6695 | 647 c = gaim_contact_new(); |
| 648 gaim_blist_add_contact(c, g, | |
| 649 gaim_blist_get_last_child((GaimBlistNode*)g)); | |
| 5228 | 650 } |
| 651 | |
| 6695 | 652 cnode = (GaimBlistNode *)c; |
| 5228 | 653 |
| 6695 | 654 if(bnode->parent) { |
| 655 if(GAIM_BUDDY_IS_ONLINE(buddy)) { | |
| 656 ((GaimContact*)bnode->parent)->online--; | |
| 657 if(((GaimContact*)bnode->parent)->online == 0) | |
| 658 ((GaimGroup*)bnode->parent->parent)->online--; | |
| 659 } | |
| 660 if(gaim_account_is_connected(buddy->account)) { | |
| 661 ((GaimContact*)bnode->parent)->currentsize--; | |
| 662 if(((GaimContact*)bnode->parent)->currentsize == 0) | |
| 663 ((GaimGroup*)bnode->parent->parent)->currentsize--; | |
| 664 } | |
| 665 ((GaimContact*)bnode->parent)->totalsize--; | |
| 666 /* the group totalsize will be taken care of by remove_contact below */ | |
| 667 | |
| 668 if(bnode->parent->parent != (GaimBlistNode*)g) | |
| 669 serv_move_buddy(buddy, (GaimGroup *)bnode->parent->parent, g); | |
| 5277 | 670 |
| 5228 | 671 if(bnode->next) |
| 672 bnode->next->prev = bnode->prev; | |
| 673 if(bnode->prev) | |
| 674 bnode->prev->next = bnode->next; | |
| 6794 | 675 if(bnode->parent->child == bnode) |
| 5228 | 676 bnode->parent->child = bnode->next; |
| 677 | |
| 678 ops->remove(gaimbuddylist, bnode); | |
| 679 | |
| 680 save = TRUE; | |
| 6742 | 681 |
| 682 if(bnode->parent->parent != (GaimBlistNode*)g) { | |
| 683 hb = g_new(struct _gaim_hbuddy, 1); | |
|
7107
9220c7490cd1
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
684 hb->name = gaim_normalize(buddy->name); |
| 6742 | 685 hb->account = buddy->account; |
| 686 hb->group = bnode->parent->parent; | |
| 6775 | 687 g_hash_table_remove(gaimbuddylist->buddies, hb); |
| 6742 | 688 g_free(hb); |
| 689 } | |
| 6794 | 690 |
| 7003 | 691 if(!bnode->parent->child) { |
| 6794 | 692 gaim_blist_remove_contact((GaimContact*)bnode->parent); |
| 7003 | 693 } else { |
| 694 gaim_contact_compute_priority_buddy((GaimContact*)bnode->parent); | |
| 695 ops->update(gaimbuddylist, bnode->parent); | |
| 696 } | |
| 5228 | 697 } |
| 698 | |
| 6695 | 699 if(node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 700 if(node->next) | |
| 701 node->next->prev = bnode; | |
| 702 bnode->next = node->next; | |
| 703 bnode->prev = node; | |
| 704 bnode->parent = node->parent; | |
| 705 node->next = bnode; | |
| 5228 | 706 } else { |
| 6695 | 707 if(cnode->child) |
| 708 cnode->child->prev = bnode; | |
| 709 bnode->prev = NULL; | |
| 710 bnode->next = cnode->child; | |
| 711 cnode->child = bnode; | |
| 712 bnode->parent = cnode; | |
| 5228 | 713 } |
| 714 | |
| 6695 | 715 if(GAIM_BUDDY_IS_ONLINE(buddy)) { |
| 716 ((GaimContact*)bnode->parent)->online++; | |
| 717 if(((GaimContact*)bnode->parent)->online == 1) | |
| 718 ((GaimGroup*)bnode->parent->parent)->online++; | |
| 719 } | |
| 720 if(gaim_account_is_connected(buddy->account)) { | |
| 721 ((GaimContact*)bnode->parent)->currentsize++; | |
| 722 if(((GaimContact*)bnode->parent)->currentsize == 1) | |
| 723 ((GaimGroup*)bnode->parent->parent)->currentsize++; | |
| 724 } | |
| 725 ((GaimContact*)bnode->parent)->totalsize++; | |
| 726 | |
| 727 | |
| 6742 | 728 hb = g_new(struct _gaim_hbuddy, 1); |
|
7107
9220c7490cd1
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
729 hb->name = g_strdup(gaim_normalize(buddy->name)); |
| 5247 | 730 hb->account = buddy->account; |
| 6695 | 731 hb->group = ((GaimBlistNode*)buddy)->parent->parent; |
| 5247 | 732 |
| 6742 | 733 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); |
| 5247 | 734 |
| 6843 | 735 gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); |
| 5228 | 736 if (ops) |
| 737 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 738 if (save) | |
| 739 gaim_blist_save(); | |
| 740 } | |
| 741 | |
| 6695 | 742 GaimContact *gaim_contact_new() |
| 5228 | 743 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
744 GaimBlistUiOps *ops; |
| 6695 | 745 GaimContact *c = g_new0(GaimContact, 1); |
| 746 ((GaimBlistNode*)c)->type = GAIM_BLIST_CONTACT_NODE; | |
| 747 | |
| 748 c->totalsize = c->currentsize = c->online = 0; | |
| 749 | |
|
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
750 ops = gaim_blist_get_ui_ops(); |
| 6695 | 751 if (ops != NULL && ops->new_node != NULL) |
| 752 ops->new_node((GaimBlistNode *)c); | |
| 753 | |
| 754 return c; | |
| 755 } | |
| 756 | |
| 6755 | 757 void gaim_contact_set_alias(GaimContact* contact, const char *alias) |
| 758 { | |
| 759 g_return_if_fail(contact != NULL); | |
| 760 | |
| 761 if(contact->alias) | |
| 762 g_free(contact->alias); | |
| 763 | |
| 764 contact->alias = g_strdup(alias); | |
| 765 } | |
| 766 | |
| 767 const char *gaim_contact_get_alias(GaimContact* contact) | |
| 768 { | |
| 769 return contact ? contact->alias : NULL; | |
| 770 } | |
| 771 | |
| 6695 | 772 GaimGroup *gaim_group_new(const char *name) |
| 773 { | |
| 774 GaimGroup *g = gaim_find_group(name); | |
| 5228 | 775 |
| 776 if (!g) { | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
777 GaimBlistUiOps *ops; |
| 6695 | 778 g= g_new0(GaimGroup, 1); |
| 5228 | 779 g->name = g_strdup(name); |
| 5277 | 780 g->totalsize = 0; |
| 781 g->currentsize = 0; | |
| 782 g->online = 0; | |
| 5228 | 783 g->settings = g_hash_table_new_full(g_str_hash, g_str_equal, |
| 784 g_free, g_free); | |
| 785 ((GaimBlistNode*)g)->type = GAIM_BLIST_GROUP_NODE; | |
| 786 | |
|
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
787 ops = gaim_blist_get_ui_ops(); |
| 5228 | 788 |
| 789 if (ops != NULL && ops->new_node != NULL) | |
| 790 ops->new_node((GaimBlistNode *)g); | |
| 791 | |
| 792 } | |
| 793 return g; | |
| 794 } | |
| 795 | |
| 6695 | 796 void gaim_blist_add_contact(GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
| 797 { | |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
798 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 799 GaimGroup *g; |
| 6742 | 800 GaimBlistNode *gnode, *cnode, *bnode; |
| 6695 | 801 gboolean save = FALSE; |
| 802 | |
| 6774 | 803 g_return_if_fail(contact != NULL); |
| 804 g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT((GaimBlistNode*)contact)); | |
| 6695 | 805 |
| 6975 | 806 if((GaimBlistNode*)contact == node) |
| 807 return; | |
| 808 | |
| 6695 | 809 if(node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
| 810 GAIM_BLIST_NODE_IS_CHAT(node))) | |
| 811 g = (GaimGroup*)node->parent; | |
| 812 else if(group) | |
| 813 g = group; | |
| 814 else { | |
| 815 g = gaim_group_new(_("Buddies")); | |
| 816 gaim_blist_add_group(g, | |
| 817 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 818 } | |
| 819 | |
| 820 gnode = (GaimBlistNode*)g; | |
| 821 cnode = (GaimBlistNode*)contact; | |
| 822 | |
| 823 if(cnode->parent) { | |
| 6731 | 824 if(cnode->parent->child == cnode) |
| 825 cnode->parent->child = cnode->next; | |
| 6695 | 826 if(cnode->prev) |
| 827 cnode->prev->next = cnode->next; | |
| 828 if(cnode->next) | |
| 829 cnode->next->prev = cnode->prev; | |
| 830 | |
| 831 | |
| 832 if(contact->online > 0) | |
| 833 ((GaimGroup*)cnode->parent)->online--; | |
| 834 if(contact->currentsize > 0) | |
| 835 ((GaimGroup*)cnode->parent)->currentsize--; | |
| 836 ((GaimGroup*)cnode->parent)->totalsize--; | |
| 837 | |
| 6731 | 838 ops->remove(gaimbuddylist, cnode); |
| 839 | |
| 6695 | 840 save = TRUE; |
| 6742 | 841 |
| 842 if(cnode->parent != gnode) { | |
| 843 for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 844 GaimBuddy *b = (GaimBuddy*)bnode; | |
| 845 | |
| 846 struct _gaim_hbuddy *hb = g_new(struct _gaim_hbuddy, 1); | |
|
7107
9220c7490cd1
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
847 hb->name = g_strdup(gaim_normalize(b->name)); |
| 6742 | 848 hb->account = b->account; |
| 849 hb->group = cnode->parent; | |
| 850 | |
| 6776 | 851 g_hash_table_remove(gaimbuddylist->buddies, hb); |
| 6742 | 852 |
| 853 hb->group = gnode; | |
| 854 g_hash_table_replace(gaimbuddylist->buddies, hb, b); | |
| 855 | |
| 856 if(b->account->gc) | |
| 857 serv_move_buddy(b, (GaimGroup*)cnode->parent, g); | |
| 858 } | |
| 859 } | |
| 6695 | 860 } |
| 861 | |
| 6775 | 862 |
| 6695 | 863 if(node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
| 864 GAIM_BLIST_NODE_IS_CHAT(node))) { | |
| 865 if(node->next) | |
| 866 node->next->prev = cnode; | |
| 867 cnode->next = node->next; | |
| 868 cnode->prev = node; | |
| 869 cnode->parent = node->parent; | |
| 870 node->next = cnode; | |
| 871 } else { | |
| 872 if(gnode->child) | |
| 873 gnode->child->prev = cnode; | |
| 874 cnode->prev = NULL; | |
| 875 cnode->next = gnode->child; | |
| 876 gnode->child = cnode; | |
| 877 cnode->parent = gnode; | |
| 878 } | |
| 879 | |
| 880 if(contact->online > 0) | |
| 881 g->online++; | |
| 882 if(contact->currentsize > 0) | |
| 883 g->currentsize++; | |
| 884 g->totalsize++; | |
| 885 | |
| 886 if(ops && cnode->child) | |
| 887 ops->update(gaimbuddylist, cnode); | |
| 6775 | 888 |
| 889 for(bnode = cnode->child; bnode; bnode = bnode->next) | |
| 890 ops->update(gaimbuddylist, bnode); | |
| 891 | |
| 6695 | 892 if (save) |
| 893 gaim_blist_save(); | |
| 894 } | |
| 895 | |
| 6965 | 896 void gaim_blist_merge_contact(GaimContact *source, GaimContact *target) |
| 897 { | |
| 898 GaimBlistNode *sourcenode = (GaimBlistNode*)source; | |
| 899 GaimBlistNode *targetnode = (GaimBlistNode*)target; | |
| 900 GaimBlistNode *child, *child2; | |
| 901 | |
| 902 if(source == target) | |
| 903 return; | |
| 904 | |
| 905 child = sourcenode->child; | |
| 906 | |
| 907 while(child) { | |
| 908 child2 = child; | |
| 909 child = child->next; | |
| 910 if(GAIM_BLIST_NODE_IS_BUDDY(child2)) | |
| 911 gaim_blist_add_buddy((GaimBuddy*)child2, target, NULL, | |
| 912 gaim_blist_get_last_child(targetnode)); | |
| 913 } | |
| 914 } | |
| 915 | |
| 6695 | 916 void gaim_blist_add_group (GaimGroup *group, GaimBlistNode *node) |
| 5228 | 917 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
918 GaimBlistUiOps *ops; |
| 5228 | 919 GaimBlistNode *gnode = (GaimBlistNode*)group; |
| 920 gboolean save = FALSE; | |
| 921 | |
| 6774 | 922 g_return_if_fail(group != NULL); |
| 923 g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP((GaimBlistNode*)group)); | |
| 924 | |
| 5228 | 925 if (!gaimbuddylist) |
| 926 gaimbuddylist = gaim_blist_new(); | |
| 927 ops = gaimbuddylist->ui_ops; | |
| 928 | |
| 929 if (!gaimbuddylist->root) { | |
| 930 gaimbuddylist->root = gnode; | |
| 931 return; | |
| 932 } | |
| 933 | |
| 934 /* if we're moving to overtop of ourselves, do nothing */ | |
| 935 if(gnode == node) | |
| 936 return; | |
| 937 | |
| 938 if (gaim_find_group(group->name)) { | |
| 939 /* This is just being moved */ | |
| 940 | |
| 941 ops->remove(gaimbuddylist, (GaimBlistNode*)group); | |
| 942 | |
| 943 if(gnode == gaimbuddylist->root) | |
| 944 gaimbuddylist->root = gnode->next; | |
| 945 if(gnode->prev) | |
| 946 gnode->prev->next = gnode->next; | |
| 947 if(gnode->next) | |
| 948 gnode->next->prev = gnode->prev; | |
| 949 | |
| 950 save = TRUE; | |
| 951 } | |
| 952 | |
| 6695 | 953 if (node && GAIM_BLIST_NODE_IS_GROUP(node)) { |
| 5634 | 954 gnode->next = node->next; |
| 955 gnode->prev = node; | |
| 956 if(node->next) | |
| 957 node->next->prev = gnode; | |
| 958 node->next = gnode; | |
| 959 } else { | |
| 6807 | 960 if(gaimbuddylist->root) |
| 961 gaimbuddylist->root->prev = gnode; | |
| 5634 | 962 gnode->next = gaimbuddylist->root; |
| 963 gnode->prev = NULL; | |
| 964 gaimbuddylist->root = gnode; | |
| 965 } | |
| 966 | |
| 5228 | 967 |
| 968 if (ops) { | |
| 969 ops->update(gaimbuddylist, gnode); | |
| 970 for(node = gnode->child; node; node = node->next) | |
| 971 ops->update(gaimbuddylist, node); | |
| 972 } | |
| 973 if (save) | |
| 974 gaim_blist_save(); | |
| 975 } | |
| 976 | |
| 6695 | 977 void gaim_blist_remove_contact(GaimContact* contact) |
| 5228 | 978 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
979 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5228 | 980 |
| 6695 | 981 GaimBlistNode *gnode, *cnode = (GaimBlistNode*)contact; |
| 982 | |
| 983 gnode = cnode->parent; | |
| 984 | |
| 985 if(cnode->child) { | |
| 986 while(cnode->child) { | |
| 987 gaim_blist_remove_buddy((GaimBuddy*)cnode->child); | |
| 988 } | |
| 989 } else { | |
| 990 if(ops) | |
| 991 ops->remove(gaimbuddylist, cnode); | |
| 992 | |
| 993 if(gnode->child == cnode) | |
| 994 gnode->child = cnode->next; | |
| 995 if(cnode->prev) | |
| 996 cnode->prev->next = cnode->next; | |
| 997 if(cnode->next) | |
| 998 cnode->next->prev = cnode->prev; | |
| 999 | |
| 1000 g_free(contact); | |
| 1001 } | |
| 1002 } | |
| 1003 | |
| 6742 | 1004 void gaim_blist_remove_buddy (GaimBuddy *buddy) |
| 6695 | 1005 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1006 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 1007 |
| 1008 GaimBlistNode *cnode, *node = (GaimBlistNode*)buddy; | |
| 1009 GaimGroup *group; | |
| 6742 | 1010 struct _gaim_hbuddy hb; |
| 5228 | 1011 |
| 6695 | 1012 cnode = node->parent; |
| 1013 group = (GaimGroup *)cnode->parent; | |
| 5228 | 1014 |
| 6695 | 1015 if(GAIM_BUDDY_IS_ONLINE(buddy)) { |
| 1016 ((GaimContact*)cnode)->online--; | |
| 1017 if(((GaimContact*)cnode)->online == 0) | |
| 1018 group->online--; | |
| 1019 } | |
| 1020 if(gaim_account_is_connected(buddy->account)) { | |
| 1021 ((GaimContact*)cnode)->currentsize--; | |
| 1022 if(((GaimContact*)cnode)->currentsize == 0) | |
| 1023 group->currentsize--; | |
| 1024 } | |
| 1025 ((GaimContact*)cnode)->totalsize--; | |
| 1026 | |
| 5228 | 1027 if (node->prev) |
| 1028 node->prev->next = node->next; | |
| 1029 if (node->next) | |
| 1030 node->next->prev = node->prev; | |
| 6695 | 1031 if(cnode->child == node) { |
| 1032 cnode->child = node->next; | |
| 1033 } | |
| 5228 | 1034 |
| 6755 | 1035 |
|
7107
9220c7490cd1
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
1036 hb.name = gaim_normalize(buddy->name); |
| 5247 | 1037 hb.account = buddy->account; |
| 6695 | 1038 hb.group = ((GaimBlistNode*)buddy)->parent->parent; |
| 6742 | 1039 g_hash_table_remove(gaimbuddylist->buddies, &hb); |
| 5247 | 1040 |
| 5292 | 1041 if(buddy->timer > 0) |
| 1042 g_source_remove(buddy->timer); | |
| 1043 | |
|
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1044 if (buddy->icon != NULL) |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1045 gaim_buddy_icon_unref(buddy->icon); |
|
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1046 |
| 5228 | 1047 ops->remove(gaimbuddylist, node); |
| 1048 g_hash_table_destroy(buddy->settings); | |
| 1049 g_free(buddy->name); | |
| 1050 g_free(buddy->alias); | |
| 1051 g_free(buddy); | |
| 6755 | 1052 |
| 1053 if(!cnode->child) | |
| 1054 gaim_blist_remove_contact((GaimContact*)cnode); | |
| 5228 | 1055 } |
| 1056 | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1057 void gaim_blist_remove_chat (GaimChat *chat) |
| 5234 | 1058 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1059 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5234 | 1060 |
| 1061 GaimBlistNode *gnode, *node = (GaimBlistNode*)chat; | |
| 6695 | 1062 GaimGroup *group; |
| 5234 | 1063 |
| 1064 gnode = node->parent; | |
| 6695 | 1065 group = (GaimGroup *)gnode; |
| 5234 | 1066 |
| 1067 if(gnode->child == node) | |
| 1068 gnode->child = node->next; | |
| 1069 if (node->prev) | |
| 1070 node->prev->next = node->next; | |
| 1071 if (node->next) | |
| 1072 node->next->prev = node->prev; | |
| 5277 | 1073 group->totalsize--; |
| 5855 | 1074 if (gaim_account_is_connected(chat->account)) { |
| 5277 | 1075 group->currentsize--; |
| 5394 | 1076 group->online--; |
| 1077 } | |
| 5234 | 1078 |
| 1079 ops->remove(gaimbuddylist, node); | |
| 1080 g_hash_table_destroy(chat->components); | |
| 1081 g_free(chat->alias); | |
| 1082 g_free(chat); | |
| 1083 } | |
| 1084 | |
| 6695 | 1085 void gaim_blist_remove_group (GaimGroup *group) |
| 5228 | 1086 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1087 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5228 | 1088 GaimBlistNode *node = (GaimBlistNode*)group; |
|
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1089 GList *l; |
| 5228 | 1090 |
| 1091 if(node->child) { | |
| 1092 char *buf; | |
| 1093 int count = 0; | |
| 1094 GaimBlistNode *child = node->child; | |
| 1095 | |
| 1096 while(child) { | |
| 1097 count++; | |
| 1098 child = child->next; | |
| 1099 } | |
| 1100 | |
| 6308 | 1101 buf = g_strdup_printf(ngettext("%d buddy from group %s was not removed " |
| 1102 "because its account was not logged in." | |
| 1103 " This buddy and the group were not " | |
| 1104 "removed.\n", | |
| 1105 "%d buddies from group %s were not " | |
| 1106 "removed because their accounts were " | |
| 6336 | 1107 "not logged in. These buddies and " |
| 1108 "the group were not removed.\n", count), | |
| 6308 | 1109 count, group->name); |
|
5541
aee0ee458974
[gaim-migrate @ 5941]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1110 gaim_notify_error(NULL, NULL, _("Group not removed"), buf); |
| 5228 | 1111 g_free(buf); |
| 1112 return; | |
| 1113 } | |
| 1114 | |
| 1115 if(gaimbuddylist->root == node) | |
| 1116 gaimbuddylist->root = node->next; | |
| 1117 if (node->prev) | |
| 1118 node->prev->next = node->next; | |
| 1119 if (node->next) | |
| 1120 node->next->prev = node->prev; | |
| 1121 | |
|
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1122 for (l = gaim_connections_get_all(); l != NULL; l = l->next) |
|
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1123 { |
|
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1124 GaimConnection *gc = (GaimConnection *)l->data; |
|
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1125 |
|
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1126 if (gaim_connection_get_state(gc) == GAIM_CONNECTED) |
|
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1127 serv_remove_group(gc, group->name); |
|
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1128 } |
|
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1129 |
| 5228 | 1130 ops->remove(gaimbuddylist, node); |
| 1131 g_free(group->name); | |
| 1132 g_free(group); | |
| 1133 } | |
| 1134 | |
| 6695 | 1135 GaimBuddy *gaim_contact_get_priority_buddy(GaimContact *contact) { |
| 6843 | 1136 return contact->priority; |
| 6695 | 1137 } |
| 1138 | |
| 1139 const char *gaim_get_buddy_alias_only(GaimBuddy *b) { | |
|
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1140 if(!b) |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1141 return NULL; |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1142 |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1143 if(b->alias && b->alias[0]) { |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1144 return b->alias; |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1145 } |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1146 else if (b->server_alias != NULL && |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1147 gaim_prefs_get_bool("/core/buddies/use_server_alias")) { |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1148 |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1149 return b->server_alias; |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1150 } |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1151 |
|
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1152 return NULL; |
| 5228 | 1153 } |
| 1154 | |
| 6695 | 1155 const char * gaim_get_buddy_alias (GaimBuddy *buddy) |
| 5228 | 1156 { |
| 6755 | 1157 GaimContact *contact; |
| 1158 const char *ret; | |
| 1159 | |
| 1160 if(!buddy) | |
| 1161 return _("Unknown"); | |
| 5228 | 1162 |
| 6755 | 1163 contact = (GaimContact*)((GaimBlistNode*)buddy)->parent; |
| 6036 | 1164 |
| 6755 | 1165 if(contact && contact->alias) |
| 1166 return contact->alias; | |
| 1167 | |
| 1168 ret= gaim_get_buddy_alias_only(buddy); | |
| 1169 | |
| 1170 return ret ? ret : buddy->name; | |
| 5228 | 1171 } |
| 1172 | |
| 7125 | 1173 const char *gaim_chat_get_name(GaimChat *chat) |
| 6744 | 1174 { |
| 1175 if(chat->alias && *chat->alias) { | |
| 1176 return chat->alias; | |
| 1177 } else { | |
| 1178 struct proto_chat_entry *pce; | |
| 1179 GList *parts, *tmp; | |
| 1180 char *ret; | |
| 1181 | |
| 1182 parts = GAIM_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); | |
| 1183 pce = parts->data; | |
| 1184 ret = g_hash_table_lookup(chat->components, pce->identifier); | |
| 1185 for(tmp = parts; tmp; tmp = tmp->next) | |
| 1186 g_free(tmp->data); | |
| 1187 g_list_free(parts); | |
| 1188 | |
| 1189 return ret; | |
| 1190 } | |
| 1191 } | |
| 1192 | |
| 6695 | 1193 GaimBuddy *gaim_find_buddy(GaimAccount *account, const char *name) |
| 5228 | 1194 { |
| 6695 | 1195 GaimBuddy *buddy; |
| 5247 | 1196 struct _gaim_hbuddy hb; |
| 5758 | 1197 GaimBlistNode *group; |
| 5228 | 1198 |
| 1199 if (!gaimbuddylist) | |
| 1200 return NULL; | |
| 6245 | 1201 |
| 1202 if (!name) | |
|
5985
60d9cbfb6bf8
[gaim-migrate @ 6433]
Christian Hammond <chipx86@chipx86.com>
parents:
5947
diff
changeset
|
1203 return NULL; |
| 5228 | 1204 |
|
7107
9220c7490cd1
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
1205 hb.name = gaim_normalize(name); |
| 6245 | 1206 hb.account = account; |
| 5247 | 1207 |
| 6245 | 1208 for(group = gaimbuddylist->root; group; group = group->next) { |
| 5758 | 1209 hb.group = group; |
| 5776 | 1210 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) != NULL) |
| 5758 | 1211 return buddy; |
| 1212 } | |
| 6245 | 1213 |
| 5758 | 1214 return NULL; |
| 5228 | 1215 } |
| 1216 | |
| 6872 | 1217 GaimBuddy *gaim_find_buddy_in_group(GaimAccount *account, const char *name, |
| 1218 GaimGroup *group) | |
| 1219 { | |
| 1220 struct _gaim_hbuddy hb; | |
| 1221 | |
| 1222 if (!gaimbuddylist) | |
| 1223 return NULL; | |
| 1224 | |
| 1225 if (!name) | |
| 1226 return NULL; | |
| 1227 | |
|
7107
9220c7490cd1
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
1228 hb.name = gaim_normalize(name); |
| 6872 | 1229 hb.account = account; |
| 1230 hb.group = (GaimBlistNode*)group; | |
| 1231 | |
| 1232 return g_hash_table_lookup(gaimbuddylist->buddies, &hb); | |
| 1233 } | |
| 1234 | |
| 6245 | 1235 GSList *gaim_find_buddies(GaimAccount *account, const char *name) |
| 1236 { | |
| 1237 struct buddy *buddy; | |
| 1238 struct _gaim_hbuddy hb; | |
| 1239 GaimBlistNode *group; | |
| 1240 GSList *ret = NULL; | |
| 1241 | |
| 1242 if (!gaimbuddylist) | |
| 1243 return NULL; | |
| 1244 | |
| 1245 if (!name) | |
| 1246 return NULL; | |
| 1247 | |
|
7107
9220c7490cd1
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
1248 hb.name = gaim_normalize(name); |
| 6245 | 1249 hb.account = account; |
| 1250 | |
| 1251 for(group = gaimbuddylist->root; group; group = group->next) { | |
| 1252 hb.group = group; | |
| 1253 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) != NULL) | |
| 1254 ret = g_slist_append(ret, buddy); | |
| 1255 } | |
| 1256 | |
| 1257 return ret; | |
| 1258 } | |
| 1259 | |
| 6695 | 1260 GaimGroup *gaim_find_group(const char *name) |
| 5228 | 1261 { |
| 1262 GaimBlistNode *node; | |
| 1263 if (!gaimbuddylist) | |
| 1264 return NULL; | |
| 1265 node = gaimbuddylist->root; | |
| 1266 while(node) { | |
| 6695 | 1267 if (!strcmp(((GaimGroup *)node)->name, name)) |
| 1268 return (GaimGroup *)node; | |
| 5228 | 1269 node = node->next; |
| 1270 } | |
| 1271 return NULL; | |
| 1272 } | |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1273 |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1274 GaimChat * |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1275 gaim_blist_find_chat(GaimAccount *account, const char *name) |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1276 { |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1277 char *chat_name; |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1278 GaimChat *chat; |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1279 GaimPlugin *prpl; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1280 GaimPluginProtocolInfo *prpl_info = NULL; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1281 struct proto_chat_entry *pce; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1282 GaimBlistNode *node, *group; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1283 GList *parts; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1284 |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1285 g_return_val_if_fail(gaim_get_blist() != NULL, NULL); |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1286 g_return_val_if_fail(name != NULL, NULL); |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1287 |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1288 for (group = gaimbuddylist->root; group != NULL; group = group->next) { |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1289 for (node = group->child; node != NULL; node = node->next) { |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1290 if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1291 |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1292 chat = (GaimChat*)node; |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1293 |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1294 prpl = gaim_find_prpl(gaim_account_get_protocol(chat->account)); |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1295 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1296 |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1297 parts = prpl_info->chat_info( |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1298 gaim_account_get_connection(chat->account)); |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1299 |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1300 pce = parts->data; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1301 chat_name = g_hash_table_lookup(chat->components, |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1302 pce->identifier); |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1303 |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1304 if (chat->account == account && |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1305 name != NULL && !strcmp(chat_name, name)) { |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1306 |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1307 return chat; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1308 } |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1309 } |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1310 } |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1311 } |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1312 |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1313 return NULL; |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1314 } |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1315 |
| 6695 | 1316 GaimGroup * |
| 7125 | 1317 gaim_chat_get_group(GaimChat *chat) |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1318 { |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1319 g_return_val_if_fail(chat != NULL, NULL); |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1320 |
| 6695 | 1321 return (GaimGroup *)(((GaimBlistNode *)chat)->parent); |
|
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1322 } |
|
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1323 |
| 6695 | 1324 GaimGroup *gaim_find_buddys_group(GaimBuddy *buddy) |
| 5228 | 1325 { |
| 1326 if (!buddy) | |
| 1327 return NULL; | |
|
6706
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1328 |
|
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1329 if (((GaimBlistNode *)buddy)->parent == NULL) |
|
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1330 return NULL; |
|
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1331 |
| 6695 | 1332 return (GaimGroup *)(((GaimBlistNode*)buddy)->parent->parent); |
| 5228 | 1333 } |
| 1334 | |
| 6695 | 1335 GSList *gaim_group_get_accounts(GaimGroup *g) |
| 5228 | 1336 { |
| 1337 GSList *l = NULL; | |
| 6695 | 1338 GaimBlistNode *gnode, *cnode, *bnode; |
| 1339 | |
| 1340 gnode = (GaimBlistNode *)g; | |
| 5228 | 1341 |
| 6695 | 1342 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 1343 if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1344 if(!g_slist_find(l, ((GaimChat *)cnode)->account)) |
|
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1345 l = g_slist_append(l, ((GaimChat *)cnode)->account); |
| 6695 | 1346 } else if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { |
| 1347 for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 1348 if(GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
| 1349 if(!g_slist_find(l, ((GaimBuddy *)bnode)->account)) | |
| 1350 l = g_slist_append(l, ((GaimBuddy *)bnode)->account); | |
| 1351 } | |
| 1352 } | |
| 1353 } | |
| 5228 | 1354 } |
| 6695 | 1355 |
| 5228 | 1356 return l; |
| 1357 } | |
| 1358 | |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1359 void gaim_blist_add_account(GaimAccount *account) |
| 5234 | 1360 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1361 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 1362 GaimBlistNode *gnode, *cnode, *bnode; |
| 5234 | 1363 |
| 1364 if(!gaimbuddylist) | |
| 1365 return; | |
| 1366 | |
| 6695 | 1367 if(!ops) |
| 1368 return; | |
| 1369 | |
| 1370 for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
| 1371 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 5234 | 1372 continue; |
| 6695 | 1373 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 1374 if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 6956 | 1375 gboolean recompute = FALSE; |
| 6695 | 1376 for(bnode = cnode->child; bnode; bnode = bnode->next) { |
| 1377 if(GAIM_BLIST_NODE_IS_BUDDY(bnode) && | |
| 1378 ((GaimBuddy*)bnode)->account == account) { | |
| 6956 | 1379 recompute = TRUE; |
| 6695 | 1380 ((GaimContact*)cnode)->currentsize++; |
| 1381 if(((GaimContact*)cnode)->currentsize == 1) | |
| 1382 ((GaimGroup*)gnode)->currentsize++; | |
| 1383 if(GAIM_BUDDY_IS_ONLINE((GaimBuddy*)bnode)) { | |
| 1384 ((GaimContact*)cnode)->online++; | |
| 1385 if(((GaimContact*)cnode)->online == 1) | |
| 1386 ((GaimGroup*)gnode)->online++; | |
| 1387 } | |
| 1388 ops->update(gaimbuddylist, bnode); | |
| 1389 } | |
| 1390 } | |
| 6956 | 1391 if(recompute) { |
| 1392 gaim_contact_compute_priority_buddy((GaimContact*)cnode); | |
| 1393 ops->update(gaimbuddylist, cnode); | |
| 1394 } | |
| 6695 | 1395 } else if(GAIM_BLIST_NODE_IS_CHAT(cnode) && |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1396 ((GaimChat*)cnode)->account == account) { |
| 6901 | 1397 ((GaimGroup *)gnode)->online++; |
| 1398 ((GaimGroup *)gnode)->currentsize++; | |
| 1399 ops->update(gaimbuddylist, cnode); | |
| 5234 | 1400 } |
| 1401 } | |
| 6695 | 1402 ops->update(gaimbuddylist, gnode); |
| 5234 | 1403 } |
| 1404 } | |
| 1405 | |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1406 void gaim_blist_remove_account(GaimAccount *account) |
| 5228 | 1407 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1408 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 1409 GaimBlistNode *gnode, *cnode, *bnode; |
| 5234 | 1410 |
| 5228 | 1411 if (!gaimbuddylist) |
| 1412 return; | |
| 5234 | 1413 |
| 6695 | 1414 for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
| 1415 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 5234 | 1416 continue; |
| 6695 | 1417 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 1418 if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 6957 | 1419 gboolean recompute = FALSE; |
| 6695 | 1420 for(bnode = cnode->child; bnode; bnode = bnode->next) { |
| 1421 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
| 1422 continue; | |
| 1423 if(account == ((GaimBuddy *)bnode)->account) { | |
| 6957 | 1424 recompute = TRUE; |
| 6695 | 1425 if(((GaimBuddy*)bnode)->present == GAIM_BUDDY_ONLINE || |
| 1426 ((GaimBuddy*)bnode)->present == GAIM_BUDDY_SIGNING_ON) { | |
| 1427 ((GaimContact*)cnode)->online--; | |
| 1428 if(((GaimContact*)cnode)->online == 0) | |
| 1429 ((GaimGroup*)gnode)->online--; | |
| 1430 } | |
| 1431 ((GaimContact*)cnode)->currentsize--; | |
| 1432 if(((GaimContact*)cnode)->currentsize == 0) | |
| 1433 ((GaimGroup*)gnode)->currentsize--; | |
| 1434 | |
| 1435 ((GaimBuddy*)bnode)->present = GAIM_BUDDY_OFFLINE; | |
| 1436 | |
| 6803 | 1437 ((GaimBuddy*)bnode)->uc = 0; |
| 1438 ((GaimBuddy*)bnode)->idle = 0; | |
| 1439 ((GaimBuddy*)bnode)->evil = 0; | |
| 1440 | |
| 6945 | 1441 |
| 6695 | 1442 if(ops) |
| 1443 ops->remove(gaimbuddylist, bnode); | |
| 1444 } | |
| 5234 | 1445 } |
| 6983 | 1446 if(recompute) { |
| 6959 | 1447 gaim_contact_compute_priority_buddy((GaimContact*)cnode); |
| 6983 | 1448 if(ops) |
| 1449 ops->update(gaimbuddylist, cnode); | |
| 1450 } | |
| 6695 | 1451 } else if(GAIM_BLIST_NODE_IS_CHAT(cnode) && |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1452 ((GaimChat*)cnode)->account == account) { |
| 6695 | 1453 ((GaimGroup*)gnode)->currentsize--; |
| 1454 ((GaimGroup*)gnode)->online--; | |
| 1455 if(ops) | |
| 1456 ops->remove(gaimbuddylist, cnode); | |
| 5228 | 1457 } |
| 1458 } | |
| 1459 } | |
| 1460 } | |
| 1461 | |
|
7117
943085b0ff8b
[gaim-migrate @ 7684]
Christian Hammond <chipx86@chipx86.com>
parents:
7115
diff
changeset
|
1462 void gaim_blist_parse_toc_buddy_list(GaimAccount *account, char *config) |
| 5228 | 1463 { |
| 1464 char *c; | |
| 1465 char current[256]; | |
| 1466 GList *bud = NULL; | |
| 1467 | |
| 1468 | |
| 1469 if (config != NULL) { | |
| 1470 | |
| 1471 /* skip "CONFIG:" (if it exists) */ | |
| 1472 c = strncmp(config + 6 /* sizeof(struct sflap_hdr) */ , "CONFIG:", strlen("CONFIG:")) ? | |
| 1473 strtok(config, "\n") : | |
| 1474 strtok(config + 6 /* sizeof(struct sflap_hdr) */ + strlen("CONFIG:"), "\n"); | |
| 1475 do { | |
| 1476 if (c == NULL) | |
| 1477 break; | |
| 1478 if (*c == 'g') { | |
| 1479 char *utf8 = NULL; | |
|
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1480 utf8 = gaim_utf8_try_convert(c + 2); |
| 5228 | 1481 if (utf8 == NULL) { |
| 1482 g_strlcpy(current, _("Invalid Groupname"), sizeof(current)); | |
| 1483 } else { | |
| 1484 g_strlcpy(current, utf8, sizeof(current)); | |
| 1485 g_free(utf8); | |
| 1486 } | |
| 1487 if (!gaim_find_group(current)) { | |
| 6695 | 1488 GaimGroup *g = gaim_group_new(current); |
| 5634 | 1489 gaim_blist_add_group(g, |
| 1490 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 5228 | 1491 } |
| 1492 } else if (*c == 'b') { /*&& !gaim_find_buddy(user, c + 2)) {*/ | |
| 1493 char nm[80], sw[388], *a, *utf8 = NULL; | |
| 1494 | |
| 1495 if ((a = strchr(c + 2, ':')) != NULL) { | |
| 1496 *a++ = '\0'; /* nul the : */ | |
| 1497 } | |
| 1498 | |
| 1499 g_strlcpy(nm, c + 2, sizeof(nm)); | |
| 1500 if (a) { | |
|
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1501 utf8 = gaim_utf8_try_convert(a); |
| 5228 | 1502 if (utf8 == NULL) { |
| 1503 gaim_debug(GAIM_DEBUG_ERROR, "toc blist", | |
| 1504 "Failed to convert alias for " | |
| 1505 "'%s' to UTF-8\n", nm); | |
| 1506 } | |
| 1507 } | |
| 1508 if (utf8 == NULL) { | |
| 1509 sw[0] = '\0'; | |
| 1510 } else { | |
| 1511 /* This can leave a partial sequence at the end, | |
| 1512 * but who cares? */ | |
| 1513 g_strlcpy(sw, utf8, sizeof(sw)); | |
| 1514 g_free(utf8); | |
| 1515 } | |
| 1516 | |
| 1517 if (!gaim_find_buddy(account, nm)) { | |
| 6695 | 1518 GaimBuddy *b = gaim_buddy_new(account, nm, sw); |
| 1519 GaimGroup *g = gaim_find_group(current); | |
| 1520 gaim_blist_add_buddy(b, NULL, g, | |
| 5634 | 1521 gaim_blist_get_last_child((GaimBlistNode*)g)); |
| 5228 | 1522 bud = g_list_append(bud, g_strdup(nm)); |
| 1523 } | |
| 1524 } else if (*c == 'p') { | |
|
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
1525 gaim_privacy_permit_add(account, c + 2, TRUE); |
| 5228 | 1526 } else if (*c == 'd') { |
|
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
1527 gaim_privacy_deny_add(account, c + 2, TRUE); |
| 5228 | 1528 } else if (!strncmp("toc", c, 3)) { |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1529 sscanf(c + strlen(c) - 1, "%d", &account->perm_deny); |
| 5228 | 1530 gaim_debug(GAIM_DEBUG_MISC, "toc blist", |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1531 "permdeny: %d\n", account->perm_deny); |
|
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1532 if (account->perm_deny == 0) |
|
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1533 account->perm_deny = 1; |
| 5228 | 1534 } else if (*c == 'm') { |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1535 sscanf(c + 2, "%d", &account->perm_deny); |
| 5228 | 1536 gaim_debug(GAIM_DEBUG_MISC, "toc blist", |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1537 "permdeny: %d\n", account->perm_deny); |
|
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1538 if (account->perm_deny == 0) |
|
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1539 account->perm_deny = 1; |
| 5228 | 1540 } |
| 1541 } while ((c = strtok(NULL, "\n"))); | |
| 1542 | |
| 1543 if(account->gc) { | |
| 1544 if(bud) { | |
| 1545 GList *node = bud; | |
| 1546 serv_add_buddies(account->gc, bud); | |
| 1547 while(node) { | |
| 1548 g_free(node->data); | |
| 1549 node = node->next; | |
| 1550 } | |
| 1551 } | |
| 1552 serv_set_permit_deny(account->gc); | |
| 1553 } | |
| 1554 g_list_free(bud); | |
| 1555 } | |
| 1556 } | |
| 1557 | |
| 1558 #if 0 | |
| 1559 /* translate an AIM 3 buddylist (*.lst) to a Gaim buddylist */ | |
| 1560 static GString *translate_lst(FILE *src_fp) | |
| 1561 { | |
| 1562 char line[BUF_LEN], *line2; | |
| 1563 char *name; | |
| 1564 int i; | |
| 1565 | |
| 1566 GString *dest = g_string_new("m 1\n"); | |
| 1567 | |
| 1568 while (fgets(line, BUF_LEN, src_fp)) { | |
| 1569 line2 = g_strchug(line); | |
| 1570 if (strstr(line2, "group") == line2) { | |
| 1571 name = strpbrk(line2, " \t\n\r\f") + 1; | |
| 1572 dest = g_string_append(dest, "g "); | |
| 1573 for (i = 0; i < strcspn(name, "\n\r"); i++) | |
| 1574 if (name[i] != '\"') | |
| 1575 dest = g_string_append_c(dest, name[i]); | |
| 1576 dest = g_string_append_c(dest, '\n'); | |
| 1577 } | |
| 1578 if (strstr(line2, "buddy") == line2) { | |
| 1579 name = strpbrk(line2, " \t\n\r\f") + 1; | |
| 1580 dest = g_string_append(dest, "b "); | |
| 1581 for (i = 0; i < strcspn(name, "\n\r"); i++) | |
| 1582 if (name[i] != '\"') | |
| 1583 dest = g_string_append_c(dest, name[i]); | |
| 1584 dest = g_string_append_c(dest, '\n'); | |
| 1585 } | |
| 1586 } | |
| 1587 | |
| 1588 return dest; | |
| 1589 } | |
| 1590 | |
| 1591 | |
| 1592 /* translate an AIM 4 buddylist (*.blt) to Gaim format */ | |
| 1593 static GString *translate_blt(FILE *src_fp) | |
| 1594 { | |
| 1595 int i; | |
| 1596 char line[BUF_LEN]; | |
| 1597 char *buddy; | |
| 1598 | |
| 1599 GString *dest = g_string_new("m 1\n"); | |
| 1600 | |
| 1601 while (strstr(fgets(line, BUF_LEN, src_fp), "Buddy") == NULL); | |
| 1602 while (strstr(fgets(line, BUF_LEN, src_fp), "list") == NULL); | |
| 1603 | |
| 1604 while (1) { | |
| 1605 fgets(line, BUF_LEN, src_fp); g_strchomp(line); | |
| 1606 if (strchr(line, '}') != NULL) | |
| 1607 break; | |
| 1608 | |
| 1609 if (strchr(line, '{') != NULL) { | |
| 1610 /* Syntax starting with "<group> {" */ | |
| 1611 | |
| 1612 dest = g_string_append(dest, "g "); | |
| 1613 buddy = g_strchug(strtok(line, "{")); | |
| 1614 for (i = 0; i < strlen(buddy); i++) | |
| 1615 if (buddy[i] != '\"') | |
| 1616 dest = g_string_append_c(dest, buddy[i]); | |
| 1617 dest = g_string_append_c(dest, '\n'); | |
| 1618 while (strchr(fgets(line, BUF_LEN, src_fp), '}') == NULL) { | |
| 1619 gboolean pounce = FALSE; | |
| 1620 char *e; | |
| 1621 g_strchomp(line); | |
| 1622 buddy = g_strchug(line); | |
| 1623 gaim_debug(GAIM_DEBUG_MISC, "AIM 4 blt import", | |
| 1624 "buddy: \"%s\"\n", buddy); | |
| 1625 dest = g_string_append(dest, "b "); | |
| 1626 if (strchr(buddy, '{') != NULL) { | |
| 1627 /* buddy pounce, etc */ | |
| 1628 char *pos = strchr(buddy, '{') - 1; | |
| 1629 *pos = 0; | |
| 1630 pounce = TRUE; | |
| 1631 } | |
| 1632 if ((e = strchr(buddy, '\"')) != NULL) { | |
| 1633 *e = '\0'; | |
| 1634 buddy++; | |
| 1635 } | |
| 1636 dest = g_string_append(dest, buddy); | |
| 1637 dest = g_string_append_c(dest, '\n'); | |
| 1638 if (pounce) | |
| 1639 do | |
| 1640 fgets(line, BUF_LEN, src_fp); | |
| 1641 while (!strchr(line, '}')); | |
| 1642 } | |
| 1643 } else { | |
| 1644 | |
| 1645 /* Syntax "group buddy buddy ..." */ | |
| 1646 buddy = g_strchug(strtok(line, " \n")); | |
| 1647 dest = g_string_append(dest, "g "); | |
| 1648 if (strchr(buddy, '\"') != NULL) { | |
| 1649 dest = g_string_append(dest, &buddy[1]); | |
| 1650 dest = g_string_append_c(dest, ' '); | |
| 1651 buddy = g_strchug(strtok(NULL, " \n")); | |
| 1652 while (strchr(buddy, '\"') == NULL) { | |
| 1653 dest = g_string_append(dest, buddy); | |
| 1654 dest = g_string_append_c(dest, ' '); | |
| 1655 buddy = g_strchug(strtok(NULL, " \n")); | |
| 1656 } | |
| 1657 buddy[strlen(buddy) - 1] = '\0'; | |
| 1658 dest = g_string_append(dest, buddy); | |
| 1659 } else { | |
| 1660 dest = g_string_append(dest, buddy); | |
| 1661 } | |
| 1662 dest = g_string_append_c(dest, '\n'); | |
| 1663 while ((buddy = g_strchug(strtok(NULL, " \n"))) != NULL) { | |
| 1664 dest = g_string_append(dest, "b "); | |
| 1665 if (strchr(buddy, '\"') != NULL) { | |
| 1666 dest = g_string_append(dest, &buddy[1]); | |
| 1667 dest = g_string_append_c(dest, ' '); | |
| 1668 buddy = g_strchug(strtok(NULL, " \n")); | |
| 1669 while (strchr(buddy, '\"') == NULL) { | |
| 1670 dest = g_string_append(dest, buddy); | |
| 1671 dest = g_string_append_c(dest, ' '); | |
| 1672 buddy = g_strchug(strtok(NULL, " \n")); | |
| 1673 } | |
| 1674 buddy[strlen(buddy) - 1] = '\0'; | |
| 1675 dest = g_string_append(dest, buddy); | |
| 1676 } else { | |
| 1677 dest = g_string_append(dest, buddy); | |
| 1678 } | |
| 1679 dest = g_string_append_c(dest, '\n'); | |
| 1680 } | |
| 1681 } | |
| 1682 } | |
| 1683 | |
| 1684 return dest; | |
| 1685 } | |
| 1686 | |
| 1687 static GString *translate_gnomeicu(FILE *src_fp) | |
| 1688 { | |
| 1689 char line[BUF_LEN]; | |
| 1690 GString *dest = g_string_new("m 1\ng Buddies\n"); | |
| 1691 | |
| 1692 while (strstr(fgets(line, BUF_LEN, src_fp), "NewContacts") == NULL); | |
| 1693 | |
| 1694 while (fgets(line, BUF_LEN, src_fp)) { | |
| 1695 char *eq; | |
| 1696 g_strchomp(line); | |
| 1697 if (line[0] == '\n' || line[0] == '[') | |
| 1698 break; | |
| 1699 eq = strchr(line, '='); | |
| 1700 if (!eq) | |
| 1701 break; | |
| 1702 *eq = ':'; | |
| 1703 eq = strchr(eq, ','); | |
| 1704 if (eq) | |
| 1705 *eq = '\0'; | |
| 1706 dest = g_string_append(dest, "b "); | |
| 1707 dest = g_string_append(dest, line); | |
| 1708 dest = g_string_append_c(dest, '\n'); | |
| 1709 } | |
| 1710 | |
| 1711 return dest; | |
| 1712 } | |
| 1713 #endif | |
| 1714 | |
| 1715 static gchar *get_screenname_filename(const char *name) | |
| 1716 { | |
| 1717 gchar **split; | |
| 1718 gchar *good; | |
| 1719 gchar *ret; | |
| 1720 | |
| 1721 split = g_strsplit(name, G_DIR_SEPARATOR_S, -1); | |
| 1722 good = g_strjoinv(NULL, split); | |
| 1723 g_strfreev(split); | |
| 1724 | |
| 1725 ret = g_utf8_strup(good, -1); | |
| 1726 | |
| 1727 g_free(good); | |
| 1728 | |
| 1729 return ret; | |
| 1730 } | |
| 1731 | |
| 1732 static gboolean gaim_blist_read(const char *filename); | |
| 1733 | |
| 1734 | |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1735 static void do_import(GaimAccount *account, const char *filename) |
| 5228 | 1736 { |
| 1737 GString *buf = NULL; | |
| 1738 char first[64]; | |
| 1739 char path[PATHSIZE]; | |
| 1740 int len; | |
| 1741 FILE *f; | |
| 1742 struct stat st; | |
| 1743 | |
| 1744 if (filename) { | |
| 1745 g_snprintf(path, sizeof(path), "%s", filename); | |
| 1746 } else { | |
| 1747 char *g_screenname = get_screenname_filename(account->username); | |
|
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1748 const char *username; |
| 5228 | 1749 char *file = gaim_user_dir(); |
|
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1750 GaimProtocol prpl_num; |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1751 int protocol; |
| 6695 | 1752 |
|
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1753 prpl_num = gaim_account_get_protocol(account); |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1754 |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1755 protocol = prpl_num; |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1756 |
|
6450
e7b87c8e8c0a
[gaim-migrate @ 6959]
Christian Hammond <chipx86@chipx86.com>
parents:
6392
diff
changeset
|
1757 /* TODO Somehow move this checking into prpls */ |
|
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1758 if (prpl_num == GAIM_PROTO_OSCAR) { |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1759 if ((username = gaim_account_get_username(account)) != NULL) { |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1760 protocol = (isalpha(*username) |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1761 ? GAIM_PROTO_TOC : GAIM_PROTO_ICQ); |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1762 } |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1763 } |
| 5228 | 1764 |
| 1765 if (file != (char *)NULL) { | |
| 5435 | 1766 snprintf(path, PATHSIZE, "%s" G_DIR_SEPARATOR_S "%s.%d.blist", file, g_screenname, protocol); |
| 5228 | 1767 g_free(g_screenname); |
| 1768 } else { | |
| 1769 g_free(g_screenname); | |
| 1770 return; | |
| 1771 } | |
| 1772 } | |
| 1773 | |
| 1774 if (stat(path, &st)) { | |
| 1775 gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Unable to stat %s.\n", | |
| 1776 path); | |
| 1777 return; | |
| 1778 } | |
| 1779 | |
| 1780 if (!(f = fopen(path, "r"))) { | |
| 1781 gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Unable to open %s.\n", | |
| 1782 path); | |
| 1783 return; | |
| 1784 } | |
| 1785 | |
| 1786 fgets(first, 64, f); | |
| 1787 | |
| 1788 if ((first[0] == '\n') || (first[0] == '\r' && first[1] == '\n')) | |
| 1789 fgets(first, 64, f); | |
| 1790 | |
| 1791 #if 0 | |
| 1792 if (!g_strncasecmp(first, "<xml", strlen("<xml"))) { | |
| 1793 /* new gaim XML buddy list */ | |
| 1794 gaim_blist_read(path); | |
| 1795 | |
| 1796 /* We really don't need to bother doing stuf like translating AIM 3 buddy lists anymore */ | |
| 1797 | |
| 1798 } else if (!g_strncasecmp(first, "Config {", strlen("Config {"))) { | |
| 1799 /* AIM 4 buddy list */ | |
| 1800 gaim_debug(GAIM_DEBUG_MISC, "blist import", "aim 4\n"); | |
| 1801 rewind(f); | |
| 1802 buf = translate_blt(f); | |
| 1803 } else if (strstr(first, "group") != NULL) { | |
| 1804 /* AIM 3 buddy list */ | |
| 1805 gaim_debug(GAIM_DEBUG_MISC, "blist import", "aim 3\n"); | |
| 1806 rewind(f); | |
| 1807 buf = translate_lst(f); | |
| 1808 } else if (!g_strncasecmp(first, "[User]", strlen("[User]"))) { | |
| 1809 /* GnomeICU (hopefully) */ | |
| 1810 gaim_debug(GAIM_DEBUG_MISC, "blist import", "gnomeicu\n"); | |
| 1811 rewind(f); | |
| 1812 buf = translate_gnomeicu(f); | |
| 1813 | |
| 1814 } else | |
| 1815 #endif | |
| 1816 if (first[0] == 'm') { | |
| 1817 /* Gaim buddy list - no translation */ | |
| 1818 char buf2[BUF_LONG * 2]; | |
| 1819 buf = g_string_new(""); | |
| 1820 rewind(f); | |
| 1821 while (1) { | |
| 1822 len = fread(buf2, 1, BUF_LONG * 2 - 1, f); | |
| 1823 if (len <= 0) | |
| 1824 break; | |
| 1825 buf2[len] = '\0'; | |
| 1826 buf = g_string_append(buf, buf2); | |
| 1827 if (len != BUF_LONG * 2 - 1) | |
| 1828 break; | |
| 1829 } | |
| 1830 } | |
| 1831 | |
| 1832 fclose(f); | |
| 1833 | |
| 1834 if (buf) { | |
| 1835 buf = g_string_prepend(buf, "toc_set_config {"); | |
| 1836 buf = g_string_append(buf, "}\n"); | |
|
7117
943085b0ff8b
[gaim-migrate @ 7684]
Christian Hammond <chipx86@chipx86.com>
parents:
7115
diff
changeset
|
1837 gaim_blist_parse_toc_buddy_list(account, buf->str); |
| 5228 | 1838 g_string_free(buf, TRUE); |
| 1839 } | |
| 1840 } | |
| 1841 | |
| 6695 | 1842 gboolean gaim_group_on_account(GaimGroup *g, GaimAccount *account) { |
| 1843 GaimBlistNode *cnode, *bnode; | |
| 1844 for(cnode = ((GaimBlistNode *)g)->child; cnode; cnode = cnode->next) { | |
| 1845 if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 1846 for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 1847 if(GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
| 1848 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
| 1849 if((!account && gaim_account_is_connected(buddy->account)) | |
| 1850 || buddy->account == account) | |
| 1851 return TRUE; | |
| 1852 } | |
| 1853 } | |
| 1854 } else if(GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1855 GaimChat *chat = (GaimChat *)cnode; |
| 6695 | 1856 if((!account && gaim_account_is_connected(chat->account)) |
| 1857 || chat->account == account) | |
| 1858 return TRUE; | |
| 1859 } | |
| 5228 | 1860 } |
| 1861 return FALSE; | |
| 1862 } | |
| 1863 | |
| 1864 static gboolean blist_safe_to_write = FALSE; | |
| 1865 | |
| 7132 | 1866 static void parse_setting(GaimBlistNode *node, xmlnode *setting) |
| 1867 { | |
| 1868 const char *name = xmlnode_get_attrib(setting, "name"); | |
| 1869 char *value = xmlnode_get_data(setting); | |
| 1870 | |
| 1871 /* XXX: replace with generic settings stuff */ | |
| 1872 if(GAIM_BLIST_NODE_IS_GROUP(node)) | |
| 1873 gaim_group_set_setting((GaimGroup*)node, name, value); | |
| 1874 else if(GAIM_BLIST_NODE_IS_CHAT(node)) | |
| 1875 gaim_chat_set_setting((GaimChat*)node, name, value); | |
| 1876 else if(GAIM_BLIST_NODE_IS_BUDDY(node)) | |
| 1877 gaim_buddy_set_setting((GaimBuddy*)node, name, value); | |
| 1878 | |
| 1879 g_free(value); | |
| 1880 } | |
| 1881 | |
| 1882 static void parse_buddy(GaimGroup *group, GaimContact *contact, xmlnode *bnode) | |
| 1883 { | |
| 1884 GaimAccount *account; | |
| 1885 GaimBuddy *buddy; | |
| 1886 char *name = NULL, *alias = NULL; | |
| 1887 const char *acct_name, *proto; | |
| 1888 xmlnode *x; | |
| 1889 | |
| 1890 acct_name = xmlnode_get_attrib(bnode, "account"); | |
| 1891 proto = xmlnode_get_attrib(bnode, "protocol"); | |
| 1892 | |
| 1893 if(!acct_name || !proto) | |
| 1894 return; | |
| 1895 | |
| 1896 account = gaim_accounts_find(acct_name, proto); | |
| 1897 | |
| 1898 if(!account) | |
| 1899 return; | |
| 1900 | |
| 1901 if((x = xmlnode_get_child(bnode, "name"))) | |
| 1902 name = xmlnode_get_data(x); | |
| 1903 | |
| 1904 if(!name) | |
| 1905 return; | |
| 1906 | |
| 1907 if((x = xmlnode_get_child(bnode, "alias"))) | |
| 1908 alias = xmlnode_get_data(x); | |
| 1909 | |
| 1910 buddy = gaim_buddy_new(account, name, alias); | |
| 1911 gaim_blist_add_buddy(buddy, contact, group, | |
| 1912 gaim_blist_get_last_child((GaimBlistNode*)contact)); | |
| 1913 | |
| 1914 for(x = bnode->child; x; x = x->next) { | |
| 1915 if(x->type != NODE_TYPE_TAG || strcmp(x->name, "setting")) | |
| 1916 continue; | |
| 1917 parse_setting((GaimBlistNode*)buddy, x); | |
| 1918 } | |
| 1919 | |
| 1920 g_free(name); | |
| 1921 if(alias) | |
| 1922 g_free(alias); | |
| 1923 } | |
| 1924 | |
| 1925 static void parse_contact(GaimGroup *group, xmlnode *cnode) | |
| 1926 { | |
| 1927 GaimContact *contact = gaim_contact_new(); | |
| 1928 xmlnode *x; | |
| 1929 | |
| 1930 gaim_blist_add_contact(contact, group, | |
| 1931 gaim_blist_get_last_child((GaimBlistNode*)group)); | |
| 1932 | |
| 1933 if((x = xmlnode_get_child(cnode, "alias"))) { | |
| 1934 char *alias = xmlnode_get_data(x); | |
| 1935 gaim_contact_set_alias(contact, alias); | |
| 1936 g_free(alias); | |
| 1937 } | |
| 1938 | |
| 1939 for(x = cnode->child; x; x = x->next) { | |
| 1940 if(x->type != NODE_TYPE_TAG) | |
| 1941 continue; | |
| 1942 if(!strcmp(x->name, "buddy")) | |
| 1943 parse_buddy(group, contact, x); | |
| 1944 else if(strcmp(x->name, "setting")) | |
| 1945 parse_setting((GaimBlistNode*)contact, x); | |
| 5228 | 1946 } |
| 1947 } | |
| 1948 | |
| 7132 | 1949 static void parse_chat(GaimGroup *group, xmlnode *cnode) |
| 1950 { | |
| 1951 GaimChat *chat; | |
| 1952 GaimAccount *account; | |
| 1953 const char *acct_name, *proto; | |
| 1954 xmlnode *x; | |
| 1955 char *alias = NULL; | |
| 1956 GHashTable *components; | |
| 1957 | |
| 1958 acct_name = xmlnode_get_attrib(cnode, "account"); | |
| 1959 proto = xmlnode_get_attrib(cnode, "protocol"); | |
| 1960 | |
| 1961 if(!acct_name || !proto) | |
| 1962 return; | |
| 1963 | |
| 1964 account = gaim_accounts_find(acct_name, proto); | |
| 1965 | |
| 1966 if(!account) | |
| 1967 return; | |
| 1968 | |
| 1969 if((x = xmlnode_get_child(cnode, "alias"))) | |
| 1970 alias = xmlnode_get_data(x); | |
| 1971 | |
| 1972 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
| 1973 | |
| 1974 for(x = cnode->child; x; x = x->next) { | |
| 1975 const char *name; | |
| 1976 char *value; | |
| 1977 if(x->type != NODE_TYPE_TAG || strcmp(x->name, "component")) | |
| 1978 continue; | |
| 1979 | |
| 1980 name = xmlnode_get_attrib(x, "name"); | |
| 1981 value = xmlnode_get_data(x); | |
| 1982 g_hash_table_replace(components, g_strdup(name), value); | |
| 1983 } | |
| 1984 | |
| 1985 chat = gaim_chat_new(account, alias, components); | |
| 1986 | |
| 1987 for(x = cnode->child; x; x = x->next) { | |
| 1988 if(x->type != NODE_TYPE_TAG || strcmp(x->name, "setting")) | |
| 1989 continue; | |
| 1990 parse_setting((GaimBlistNode*)chat, x); | |
| 1991 } | |
| 1992 | |
| 1993 if(alias) | |
| 1994 g_free(alias); | |
| 1995 } | |
| 1996 | |
| 1997 | |
| 1998 static void parse_group(xmlnode *groupnode) | |
| 1999 { | |
| 2000 const char *name = xmlnode_get_attrib(groupnode, "name"); | |
| 2001 GaimGroup *group; | |
| 2002 xmlnode *cnode; | |
| 2003 | |
| 2004 if(!name) | |
| 2005 name = _("Buddies"); | |
| 2006 | |
| 2007 group = gaim_group_new(name); | |
| 2008 gaim_blist_add_group(group, | |
| 2009 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 2010 | |
| 2011 for(cnode = groupnode->child; cnode; cnode = cnode->next) { | |
| 2012 if(cnode->type != NODE_TYPE_TAG) | |
| 2013 continue; | |
| 2014 if(!strcmp(cnode->name, "setting")) | |
| 2015 parse_setting((GaimBlistNode*)group, cnode); | |
| 2016 else if(!strcmp(cnode->name, "contact") || | |
| 2017 !strcmp(cnode->name, "person")) | |
| 2018 parse_contact(group, cnode); | |
| 2019 else if(!strcmp(cnode->name, "chat")) | |
| 2020 parse_chat(group, cnode); | |
| 5228 | 2021 } |
| 2022 } | |
| 2023 | |
| 2024 static gboolean gaim_blist_read(const char *filename) { | |
| 7132 | 2025 GError *error; |
| 5228 | 2026 gchar *contents = NULL; |
| 2027 gsize length; | |
| 7132 | 2028 xmlnode *gaim, *blist, *privacy; |
| 5228 | 2029 |
| 2030 gaim_debug(GAIM_DEBUG_INFO, "blist import", | |
| 2031 "Reading %s\n", filename); | |
| 2032 if(!g_file_get_contents(filename, &contents, &length, &error)) { | |
| 2033 gaim_debug(GAIM_DEBUG_ERROR, "blist import", | |
| 2034 "Error reading blist: %s\n", error->message); | |
| 2035 g_error_free(error); | |
| 2036 return FALSE; | |
| 2037 } | |
| 2038 | |
| 7132 | 2039 gaim = xmlnode_from_str(contents, length); |
| 2040 g_free(contents); | |
| 2041 | |
| 2042 if(!gaim) { | |
| 2043 gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Error parsing %s\n", | |
| 2044 filename); | |
| 5228 | 2045 return FALSE; |
| 2046 } | |
| 2047 | |
| 7132 | 2048 blist = xmlnode_get_child(gaim, "blist"); |
| 2049 if(blist) { | |
| 2050 xmlnode *groupnode; | |
| 2051 for(groupnode = blist->child; groupnode; groupnode = groupnode->next) { | |
| 2052 if(groupnode->type != NODE_TYPE_TAG || | |
| 2053 strcmp(groupnode->name, "group")) | |
| 2054 continue; | |
| 2055 | |
| 2056 parse_group(groupnode); | |
| 2057 } | |
| 5228 | 2058 } |
| 2059 | |
| 7132 | 2060 privacy = xmlnode_get_child(gaim, "privacy"); |
| 2061 if(privacy) { | |
| 2062 xmlnode *anode; | |
| 2063 for(anode = privacy->child; anode; anode = anode->next) { | |
| 2064 xmlnode *x; | |
| 2065 GaimAccount *account; | |
| 2066 const char *acct_name, *proto, *mode; | |
| 2067 | |
| 2068 acct_name = xmlnode_get_attrib(anode, "name"); | |
| 2069 proto = xmlnode_get_attrib(anode, "protocol"); | |
| 2070 mode = xmlnode_get_attrib(anode, "mode"); | |
| 2071 | |
| 2072 if(!acct_name || !proto || !mode) | |
| 2073 continue; | |
| 2074 | |
| 2075 account = gaim_accounts_find(acct_name, proto); | |
| 2076 | |
| 2077 if(!account) | |
| 2078 continue; | |
| 2079 | |
| 2080 account->perm_deny = atoi(mode); | |
| 2081 | |
| 2082 for(x = anode->child; x; x = x->next) { | |
| 2083 char *name; | |
| 2084 if(x->type != NODE_TYPE_TAG) | |
| 2085 continue; | |
| 2086 | |
| 2087 if(!strcmp(x->name, "permit")) { | |
| 2088 name = xmlnode_get_data(x); | |
| 2089 gaim_privacy_permit_add(account, name, TRUE); | |
| 2090 g_free(name); | |
| 2091 } else if(!strcmp(x->name, "block")) { | |
| 2092 name = xmlnode_get_data(x); | |
| 2093 gaim_privacy_deny_add(account, name, TRUE); | |
| 2094 g_free(name); | |
| 2095 } | |
| 2096 } | |
| 2097 } | |
| 2098 } | |
| 5228 | 2099 |
| 2100 gaim_debug(GAIM_DEBUG_INFO, "blist import", "Finished reading %s\n", | |
| 2101 filename); | |
| 2102 | |
| 2103 return TRUE; | |
| 2104 } | |
| 2105 | |
| 2106 void gaim_blist_load() { | |
|
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2107 GList *accts; |
| 5228 | 2108 char *user_dir = gaim_user_dir(); |
| 2109 char *filename; | |
| 2110 char *msg; | |
| 2111 | |
| 2112 blist_safe_to_write = TRUE; | |
| 2113 | |
| 2114 if(!user_dir) | |
| 2115 return; | |
| 2116 | |
| 2117 filename = g_build_filename(user_dir, "blist.xml", NULL); | |
| 2118 | |
| 2119 if(g_file_test(filename, G_FILE_TEST_EXISTS)) { | |
| 2120 if(!gaim_blist_read(filename)) { | |
| 2121 msg = g_strdup_printf(_("An error was encountered parsing your " | |
| 2122 "buddy list. It has not been loaded.")); | |
|
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2123 gaim_notify_error(NULL, NULL, _("Buddy List Error"), msg); |
| 5228 | 2124 g_free(msg); |
| 2125 } | |
|
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2126 } else if(g_list_length(gaim_accounts_get_all())) { |
| 5228 | 2127 /* read in the old lists, then save to the new format */ |
|
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2128 for(accts = gaim_accounts_get_all(); accts; accts = accts->next) { |
| 5228 | 2129 do_import(accts->data, NULL); |
| 2130 } | |
| 2131 gaim_blist_save(); | |
| 2132 } | |
| 2133 | |
| 2134 g_free(filename); | |
| 2135 } | |
| 2136 | |
|
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2137 void |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2138 gaim_blist_request_add_buddy(GaimAccount *account, const char *username, |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2139 const char *group, const char *alias) |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2140 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2141 GaimBlistUiOps *ui_ops; |
|
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2142 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2143 ui_ops = gaim_blist_get_ui_ops(); |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2144 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2145 if (ui_ops != NULL && ui_ops->request_add_buddy != NULL) |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2146 ui_ops->request_add_buddy(account, username, group, alias); |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2147 } |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2148 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2149 void |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2150 gaim_blist_request_add_chat(GaimAccount *account, GaimGroup *group) |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2151 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2152 GaimBlistUiOps *ui_ops; |
|
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2153 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2154 ui_ops = gaim_blist_get_ui_ops(); |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2155 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2156 if (ui_ops != NULL && ui_ops->request_add_chat != NULL) |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2157 ui_ops->request_add_chat(account, group); |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2158 } |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2159 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2160 void |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2161 gaim_blist_request_add_group(void) |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2162 { |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2163 GaimBlistUiOps *ui_ops; |
|
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2164 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2165 ui_ops = gaim_blist_get_ui_ops(); |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2166 |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2167 if (ui_ops != NULL && ui_ops->request_add_group != NULL) |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2168 ui_ops->request_add_group(); |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2169 } |
|
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2170 |
| 5228 | 2171 static void blist_print_group_settings(gpointer key, gpointer data, |
| 2172 gpointer user_data) { | |
| 2173 char *key_val; | |
| 2174 char *data_val; | |
| 2175 FILE *file = user_data; | |
| 2176 | |
| 2177 if(!key || !data) | |
| 2178 return; | |
| 2179 | |
| 2180 key_val = g_markup_escape_text(key, -1); | |
| 2181 data_val = g_markup_escape_text(data, -1); | |
| 2182 | |
| 2183 fprintf(file, "\t\t\t<setting name=\"%s\">%s</setting>\n", key_val, | |
| 2184 data_val); | |
| 2185 g_free(key_val); | |
| 2186 g_free(data_val); | |
| 2187 } | |
| 2188 | |
| 2189 static void blist_print_buddy_settings(gpointer key, gpointer data, | |
| 2190 gpointer user_data) { | |
| 2191 char *key_val; | |
| 2192 char *data_val; | |
| 2193 FILE *file = user_data; | |
| 2194 | |
| 2195 if(!key || !data) | |
| 2196 return; | |
| 2197 | |
| 2198 key_val = g_markup_escape_text(key, -1); | |
| 2199 data_val = g_markup_escape_text(data, -1); | |
| 2200 | |
| 2201 fprintf(file, "\t\t\t\t\t<setting name=\"%s\">%s</setting>\n", key_val, | |
| 2202 data_val); | |
| 2203 g_free(key_val); | |
| 2204 g_free(data_val); | |
| 2205 } | |
| 2206 | |
| 6695 | 2207 static void blist_print_cnode_settings(gpointer key, gpointer data, |
| 2208 gpointer user_data) { | |
| 2209 char *key_val; | |
| 2210 char *data_val; | |
| 2211 FILE *file = user_data; | |
| 2212 | |
| 2213 if(!key || !data) | |
| 2214 return; | |
| 2215 | |
| 2216 key_val = g_markup_escape_text(key, -1); | |
| 2217 data_val = g_markup_escape_text(data, -1); | |
| 2218 | |
| 2219 fprintf(file, "\t\t\t\t<setting name=\"%s\">%s</setting>\n", key_val, | |
| 2220 data_val); | |
| 2221 g_free(key_val); | |
| 2222 g_free(data_val); | |
| 2223 } | |
| 2224 | |
| 5234 | 2225 static void blist_print_chat_components(gpointer key, gpointer data, |
| 2226 gpointer user_data) { | |
| 2227 char *key_val; | |
| 2228 char *data_val; | |
| 2229 FILE *file = user_data; | |
| 2230 | |
| 2231 if(!key || !data) | |
| 2232 return; | |
| 2233 | |
| 2234 key_val = g_markup_escape_text(key, -1); | |
| 2235 data_val = g_markup_escape_text(data, -1); | |
| 2236 | |
| 2237 fprintf(file, "\t\t\t\t<component name=\"%s\">%s</component>\n", key_val, | |
| 2238 data_val); | |
| 2239 g_free(key_val); | |
| 2240 g_free(data_val); | |
| 2241 } | |
| 2242 | |
| 6695 | 2243 static void print_buddy(FILE *file, GaimBuddy *buddy) { |
| 2244 char *bud_name = g_markup_escape_text(buddy->name, -1); | |
| 2245 char *bud_alias = NULL; | |
| 2246 char *acct_name = g_markup_escape_text(buddy->account->username, -1); | |
| 2247 if(buddy->alias) | |
| 2248 bud_alias= g_markup_escape_text(buddy->alias, -1); | |
| 2249 fprintf(file, "\t\t\t\t<buddy protocol=\"%d\" " | |
| 2250 "account=\"%s\">\n", | |
| 2251 gaim_account_get_protocol(buddy->account), | |
| 2252 acct_name); | |
| 2253 fprintf(file, "\t\t\t\t\t<name>%s</name>\n", bud_name); | |
| 2254 if(bud_alias) { | |
| 2255 fprintf(file, "\t\t\t\t\t<alias>%s</alias>\n", bud_alias); | |
| 2256 } | |
| 2257 g_hash_table_foreach(buddy->settings, blist_print_buddy_settings, file); | |
| 2258 fprintf(file, "\t\t\t\t</buddy>\n"); | |
| 2259 g_free(bud_name); | |
| 2260 g_free(bud_alias); | |
| 2261 g_free(acct_name); | |
| 2262 } | |
| 2263 | |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2264 static void gaim_blist_write(FILE *file, GaimAccount *exp_acct) { |
|
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2265 GList *accounts; |
|
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2266 GSList *buds; |
| 6695 | 2267 GaimBlistNode *gnode, *cnode, *bnode; |
| 5228 | 2268 fprintf(file, "<?xml version='1.0' encoding='UTF-8' ?>\n"); |
| 2269 fprintf(file, "<gaim version=\"1\">\n"); | |
| 2270 fprintf(file, "\t<blist>\n"); | |
| 2271 | |
| 2272 for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
| 6695 | 2273 GaimGroup *group; |
| 2274 | |
| 5228 | 2275 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
| 2276 continue; | |
| 6695 | 2277 |
| 2278 group = (GaimGroup *)gnode; | |
| 5228 | 2279 if(!exp_acct || gaim_group_on_account(group, exp_acct)) { |
| 2280 char *group_name = g_markup_escape_text(group->name, -1); | |
| 2281 fprintf(file, "\t\t<group name=\"%s\">\n", group_name); | |
| 2282 g_hash_table_foreach(group->settings, blist_print_group_settings, file); | |
| 6695 | 2283 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 2284 if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 6755 | 2285 GaimContact *contact = (GaimContact*)cnode; |
| 2286 fprintf(file, "\t\t\t<contact"); | |
| 2287 if(contact->alias) { | |
| 2288 char *alias = g_markup_escape_text(contact->alias, -1); | |
| 2289 fprintf(file, " alias=\"%s\"", alias); | |
| 2290 g_free(alias); | |
| 2291 } | |
| 2292 fprintf(file, ">\n"); | |
| 6695 | 2293 |
| 2294 for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 2295 if(GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
| 2296 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
| 2297 if(!exp_acct || buddy->account == exp_acct) { | |
| 2298 print_buddy(file, buddy); | |
| 2299 } | |
| 5234 | 2300 } |
| 5228 | 2301 } |
| 6695 | 2302 |
| 2303 fprintf(file, "\t\t\t</contact>\n"); | |
| 2304 } else if(GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2305 GaimChat *chat = (GaimChat *)cnode; |
| 5234 | 2306 if(!exp_acct || chat->account == exp_acct) { |
| 2307 char *acct_name = g_markup_escape_text(chat->account->username, -1); | |
|
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2308 fprintf(file, "\t\t\t<chat protocol=\"%d\" account=\"%s\">\n", |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2309 gaim_account_get_protocol(chat->account), |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2310 acct_name); |
| 5237 | 2311 if(chat->alias) { |
| 2312 char *chat_alias = g_markup_escape_text(chat->alias, -1); | |
| 2313 fprintf(file, "\t\t\t\t<alias>%s</alias>\n", chat_alias); | |
| 2314 g_free(chat_alias); | |
| 2315 } | |
| 5234 | 2316 g_hash_table_foreach(chat->components, |
| 2317 blist_print_chat_components, file); | |
| 5906 | 2318 g_hash_table_foreach(chat->settings, |
| 6695 | 2319 blist_print_cnode_settings, file); |
| 5234 | 2320 fprintf(file, "\t\t\t</chat>\n"); |
| 5237 | 2321 g_free(acct_name); |
| 5234 | 2322 } |
| 5228 | 2323 } |
| 2324 } | |
| 2325 fprintf(file, "\t\t</group>\n"); | |
| 2326 g_free(group_name); | |
| 2327 } | |
| 2328 } | |
| 2329 | |
| 2330 fprintf(file, "\t</blist>\n"); | |
| 2331 fprintf(file, "\t<privacy>\n"); | |
| 2332 | |
|
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2333 for(accounts = gaim_accounts_get_all(); |
|
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2334 accounts != NULL; |
|
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2335 accounts = accounts->next) { |
|
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2336 |
|
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2337 GaimAccount *account = accounts->data; |
| 5228 | 2338 char *acct_name = g_markup_escape_text(account->username, -1); |
| 2339 if(!exp_acct || account == exp_acct) { | |
| 2340 fprintf(file, "\t\t<account protocol=\"%d\" name=\"%s\" " | |
|
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2341 "mode=\"%d\">\n", gaim_account_get_protocol(account), |
|
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2342 acct_name, account->perm_deny); |
| 5228 | 2343 for(buds = account->permit; buds; buds = buds->next) { |
| 2344 char *bud_name = g_markup_escape_text(buds->data, -1); | |
| 2345 fprintf(file, "\t\t\t<permit>%s</permit>\n", bud_name); | |
| 2346 g_free(bud_name); | |
| 2347 } | |
| 2348 for(buds = account->deny; buds; buds = buds->next) { | |
| 2349 char *bud_name = g_markup_escape_text(buds->data, -1); | |
| 2350 fprintf(file, "\t\t\t<block>%s</block>\n", bud_name); | |
| 2351 g_free(bud_name); | |
| 2352 } | |
| 2353 fprintf(file, "\t\t</account>\n"); | |
| 2354 } | |
| 2355 g_free(acct_name); | |
| 2356 } | |
| 2357 | |
| 2358 fprintf(file, "\t</privacy>\n"); | |
| 2359 fprintf(file, "</gaim>\n"); | |
| 2360 } | |
| 2361 | |
| 2362 void gaim_blist_save() { | |
| 2363 FILE *file; | |
| 2364 char *user_dir = gaim_user_dir(); | |
| 2365 char *filename; | |
| 2366 char *filename_real; | |
| 2367 | |
| 2368 if(!user_dir) | |
| 2369 return; | |
| 2370 if(!blist_safe_to_write) { | |
| 2371 gaim_debug(GAIM_DEBUG_WARNING, "blist save", | |
| 2372 "AHH!! Tried to write the blist before we read it!\n"); | |
| 2373 return; | |
| 2374 } | |
| 2375 | |
| 2376 file = fopen(user_dir, "r"); | |
| 2377 if(!file) | |
| 2378 mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); | |
| 2379 else | |
| 2380 fclose(file); | |
| 2381 | |
| 2382 filename = g_build_filename(user_dir, "blist.xml.save", NULL); | |
| 2383 | |
| 2384 if((file = fopen(filename, "w"))) { | |
| 2385 gaim_blist_write(file, NULL); | |
| 2386 fclose(file); | |
| 2387 chmod(filename, S_IRUSR | S_IWUSR); | |
| 2388 } else { | |
| 2389 gaim_debug(GAIM_DEBUG_ERROR, "blist save", "Unable to write %s\n", | |
| 2390 filename); | |
| 2391 } | |
| 2392 | |
| 2393 filename_real = g_build_filename(user_dir, "blist.xml", NULL); | |
| 2394 | |
| 2395 if(rename(filename, filename_real) < 0) | |
| 2396 gaim_debug(GAIM_DEBUG_ERROR, "blist save", | |
| 2397 "Error renaming %s to %s\n", filename, filename_real); | |
| 2398 | |
| 2399 | |
| 2400 g_free(filename); | |
| 2401 g_free(filename_real); | |
| 2402 } | |
| 2403 | |
| 6695 | 2404 void gaim_group_set_setting(GaimGroup *g, const char *key, |
| 5228 | 2405 const char *value) { |
| 2406 if(!g) | |
| 2407 return; | |
| 2408 g_hash_table_replace(g->settings, g_strdup(key), g_strdup(value)); | |
| 2409 } | |
| 2410 | |
| 7125 | 2411 const char *gaim_group_get_setting(GaimGroup *g, const char *key) { |
| 5228 | 2412 if(!g) |
| 2413 return NULL; | |
| 7125 | 2414 return g_hash_table_lookup(g->settings, key); |
| 5228 | 2415 } |
| 2416 | |
| 7125 | 2417 void gaim_chat_set_setting(GaimChat *c, const char *key, |
| 5906 | 2418 const char *value) |
| 2419 { | |
| 2420 if(!c) | |
| 2421 return; | |
| 2422 g_hash_table_replace(c->settings, g_strdup(key), g_strdup(value)); | |
| 2423 } | |
| 2424 | |
| 7125 | 2425 const char *gaim_chat_get_setting(GaimChat *c, const char *key) |
| 5906 | 2426 { |
| 2427 if(!c) | |
| 2428 return NULL; | |
| 7125 | 2429 return g_hash_table_lookup(c->settings, key); |
| 5906 | 2430 } |
| 2431 | |
| 6695 | 2432 void gaim_buddy_set_setting(GaimBuddy *b, const char *key, |
| 5228 | 2433 const char *value) { |
| 2434 if(!b) | |
| 2435 return; | |
| 2436 g_hash_table_replace(b->settings, g_strdup(key), g_strdup(value)); | |
| 2437 } | |
| 2438 | |
| 7125 | 2439 const char *gaim_buddy_get_setting(GaimBuddy *b, const char *key) { |
| 5228 | 2440 if(!b) |
| 2441 return NULL; | |
| 7125 | 2442 return g_hash_table_lookup(b->settings, key); |
| 5228 | 2443 } |
| 2444 | |
| 6695 | 2445 int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) { |
| 5228 | 2446 if(!group) |
| 2447 return 0; | |
| 2448 | |
| 5277 | 2449 return offline ? group->totalsize : group->currentsize; |
| 5228 | 2450 } |
| 2451 | |
| 6695 | 2452 int gaim_blist_get_group_online_count(GaimGroup *group) { |
| 5228 | 2453 if(!group) |
| 2454 return 0; | |
| 2455 | |
| 5277 | 2456 return group->online; |
| 5228 | 2457 } |
| 2458 | |
|
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2459 void |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2460 gaim_blist_set_ui_ops(GaimBlistUiOps *ops) |
|
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2461 { |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2462 blist_ui_ops = ops; |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2463 } |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2464 |
|
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2465 GaimBlistUiOps * |
|
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2466 gaim_blist_get_ui_ops(void) |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2467 { |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2468 return blist_ui_ops; |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2469 } |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2470 |
|
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2471 |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2472 void * |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2473 gaim_blist_get_handle(void) |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2474 { |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2475 static int handle; |
| 5228 | 2476 |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2477 return &handle; |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2478 } |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2479 |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2480 void |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2481 gaim_blist_init(void) |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2482 { |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2483 void *handle = gaim_blist_get_handle(); |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2484 |
|
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2485 gaim_signal_register(handle, "buddy-away", |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2486 gaim_marshal_VOID__POINTER, NULL, 1, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2487 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2488 GAIM_SUBTYPE_BLIST_BUDDY)); |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2489 |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2490 gaim_signal_register(handle, "buddy-back", |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2491 gaim_marshal_VOID__POINTER, NULL, 1, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2492 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2493 GAIM_SUBTYPE_BLIST_BUDDY)); |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2494 |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2495 gaim_signal_register(handle, "buddy-idle", |
|
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2496 gaim_marshal_VOID__POINTER, NULL, 1, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2497 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2498 GAIM_SUBTYPE_BLIST_BUDDY)); |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2499 gaim_signal_register(handle, "buddy-unidle", |
|
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2500 gaim_marshal_VOID__POINTER, NULL, 1, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2501 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2502 GAIM_SUBTYPE_BLIST_BUDDY)); |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2503 |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2504 gaim_signal_register(handle, "buddy-signed-on", |
|
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2505 gaim_marshal_VOID__POINTER, NULL, 1, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2506 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2507 GAIM_SUBTYPE_BLIST_BUDDY)); |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2508 |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2509 gaim_signal_register(handle, "buddy-signed-off", |
|
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2510 gaim_marshal_VOID__POINTER, NULL, 1, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2511 gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2512 GAIM_SUBTYPE_BLIST_BUDDY)); |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2513 |
|
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2514 gaim_signal_register(handle, "update-idle", gaim_marshal_VOID, NULL, 0); |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2515 } |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2516 |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2517 void |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2518 gaim_blist_uninit(void) |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2519 { |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2520 gaim_signals_unregister_by_instance(gaim_blist_get_handle()); |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2521 } |
