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