Mercurial > pidgin.yaz
annotate src/list.c @ 4849:adf9ca39578f
[gaim-migrate @ 5174]
Christian, I got the following backtrace after opening and closing some
convos:
#4 <signal handler called>
#5 0x08066e47 in gaim_window_get_active_conversation (win=0x82b44d8)
at conversation.c:775
#6 0x08085599 in update_send_as_selection (win=0x82b44d8) at gtkconv.c:1964
#7 0x4067fa4c in g_timeout_dispatch () from /usr/lib/libglib-2.0.so.0
So although I couldn't reproduce it, I guess it's still possible for
Gaim to crash there. This fixes that by making sure that win still
exists before it tries to update the send as menu for it. The other
way to fix this would be to keep track of the g_timer thingy and then
remove it when destroying win. I don't know which was is better.
Probably the other way.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Fri, 21 Mar 2003 20:59:31 +0000 |
parents | 46fb754a3c10 |
children | 3bc5a65728fb |
rev | line source |
---|---|
2382 | 1 /* |
2 * gaim | |
3 * | |
4687 | 4 * Copyright (C) 2003, Sean Egan <sean.egan@binghamton.edu> |
2382 | 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 */ | |
22 | |
23 #ifdef HAVE_CONFIG_H | |
24 #include <config.h> | |
25 #endif | |
26 #include <string.h> | |
4349 | 27 #include <stdlib.h> |
2382 | 28 #include <sys/types.h> |
29 #include <sys/stat.h> | |
3630 | 30 #ifndef _WIN32 |
2382 | 31 #include <unistd.h> |
3630 | 32 #else |
33 #include <direct.h> | |
34 #endif | |
4349 | 35 #include <ctype.h> |
2382 | 36 #include "gaim.h" |
37 #include "prpl.h" | |
4687 | 38 #include "list.h" |
2382 | 39 |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
40 #ifdef _WIN32 |
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
41 #include "win32dep.h" |
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
42 #endif |
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
43 |
2382 | 44 #define PATHSIZE 1024 |
45 | |
4687 | 46 struct gaim_buddy_list *gaimbuddylist = NULL; |
47 static struct gaim_blist_ui_ops *blist_ui_ops = NULL; | |
2382 | 48 |
4687 | 49 /***************************************************************************** |
50 * Private Utility functions * | |
51 *****************************************************************************/ | |
52 static GaimBlistNode *gaim_blist_get_last_sibling(GaimBlistNode *node) | |
53 { | |
54 GaimBlistNode *n = node; | |
55 if (!n) | |
56 return NULL; | |
57 while (n->next) | |
58 n = n->next; | |
59 return n; | |
60 } | |
61 static GaimBlistNode *gaim_blist_get_last_child(GaimBlistNode *node) | |
62 { | |
63 if (!node) | |
64 return NULL; | |
65 return gaim_blist_get_last_sibling(node->child); | |
66 } | |
2382 | 67 |
4770 | 68 /***************************************************************************** |
4687 | 69 * Public API functions * |
70 *****************************************************************************/ | |
4349 | 71 |
4687 | 72 struct gaim_buddy_list *gaim_blist_new() |
73 { | |
74 struct gaim_buddy_list *gbl = g_new0(struct gaim_buddy_list, 1); | |
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
75 |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
76 gbl->ui_ops = gaim_get_blist_ui_ops(); |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
77 |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
78 if (gbl->ui_ops != NULL && gbl->ui_ops->new_list != NULL) |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
79 gbl->ui_ops->new_list(gbl); |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
80 |
4687 | 81 return gbl; |
82 } | |
2382 | 83 |
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
84 void |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
85 gaim_set_blist(struct gaim_buddy_list *list) |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
86 { |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
87 gaimbuddylist = list; |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
88 } |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
89 |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
90 struct gaim_buddy_list * |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
91 gaim_get_blist(void) |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
92 { |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
93 return gaimbuddylist; |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
94 } |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
95 |
4687 | 96 void gaim_blist_show () |
97 { | |
98 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
99 if (ops) | |
100 ops->show(gaimbuddylist); | |
101 } | |
2382 | 102 |
4687 | 103 void gaim_blist_destroy() |
104 { | |
105 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
106 if (ops) | |
107 ops->destroy(gaimbuddylist); | |
108 } | |
2382 | 109 |
4687 | 110 void gaim_blist_set_visible (gboolean show) |
111 { | |
112 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
113 if (ops) | |
114 ops->set_visible(gaimbuddylist, show); | |
115 } | |
2382 | 116 |
4687 | 117 void gaim_blist_update_buddy_status (struct buddy *buddy, int status) |
118 { | |
119 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
120 buddy->uc = status; | |
121 if (ops) | |
122 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
2382 | 123 } |
124 | |
4687 | 125 void gaim_blist_update_buddy_presence(struct buddy *buddy, int presence) { |
126 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
127 if (!buddy->present && presence) | |
128 buddy->present = 2; | |
129 else if (buddy->present != 2) | |
130 buddy->present = presence; | |
131 if (ops) | |
132 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
133 } | |
2382 | 134 |
135 | |
4687 | 136 void gaim_blist_update_buddy_idle (struct buddy *buddy, int idle) |
137 { | |
138 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
139 buddy->idle = idle; | |
140 if (ops) | |
141 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
142 } | |
143 void gaim_blist_update_buddy_evil (struct buddy *buddy, int warning) | |
144 { | |
145 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
146 buddy->evil = warning; | |
147 if (ops) | |
148 ops->update(gaimbuddylist,(GaimBlistNode*)buddy); | |
149 } | |
4757 | 150 void gaim_blist_update_buddy_icon(struct buddy *buddy) { |
151 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
152 if(ops) | |
153 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
154 } | |
4687 | 155 void gaim_blist_rename_buddy (struct buddy *buddy, const char *name) |
156 { | |
157 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
158 g_free(buddy->name); | |
159 buddy->name = g_strdup(name); | |
160 if (ops) | |
161 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
162 } | |
163 void gaim_blist_alias_buddy (struct buddy *buddy, const char *alias) | |
164 { | |
165 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
166 g_free(buddy->alias); | |
167 buddy->alias = g_strdup(alias); | |
168 if (ops) | |
169 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
170 } | |
171 void gaim_blist_rename_group(struct group *group, const char *name) | |
172 { | |
173 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
174 g_free(group->name); | |
175 group->name = g_strdup(name); | |
176 if (ops) | |
177 ops->update(gaimbuddylist, (GaimBlistNode*)group); | |
178 } | |
179 struct buddy *gaim_buddy_new(struct gaim_account *account, const char *screenname, const char *alias) | |
180 { | |
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
181 struct buddy *b; |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
182 struct gaim_blist_ui_ops *ops; |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
183 |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
184 b = g_new0(struct buddy, 1); |
4491 | 185 b->account = account; |
4687 | 186 b->name = g_strdup(screenname); |
187 b->alias = g_strdup(alias); | |
4349 | 188 b->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); |
4687 | 189 ((GaimBlistNode*)b)->type = GAIM_BLIST_BUDDY_NODE; |
2382 | 190 |
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
191 ops = gaim_get_blist_ui_ops(); |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
192 |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
193 if (ops != NULL && ops->new_node != NULL) |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
194 ops->new_node((GaimBlistNode *)b); |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
195 |
2382 | 196 return b; |
197 } | |
4687 | 198 void gaim_blist_add_buddy (struct buddy *buddy, struct group *group, GaimBlistNode *node) |
2382 | 199 { |
4687 | 200 GaimBlistNode *n = node, *node2, *node3; |
201 struct group *g = group; | |
202 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
4770 | 203 gboolean save = FALSE; |
4687 | 204 if (!n) { |
205 if (!g) { | |
206 g = gaim_group_new(_("Buddies")); | |
207 gaim_blist_add_group(g, NULL); | |
208 } | |
209 n = gaim_blist_get_last_child((GaimBlistNode*)g); | |
210 } | |
211 | |
4770 | 212 if (((GaimBlistNode*)buddy)->parent) { |
213 /* This buddy was already in the list and is | |
214 * being moved. | |
215 */ | |
216 ops->remove(gaimbuddylist, (GaimBlistNode*)buddy); | |
217 node2 = ((GaimBlistNode*)buddy)->next; | |
218 node3 = ((GaimBlistNode*)buddy)->prev; | |
219 | |
220 if (node2) | |
221 node2->prev = node3; | |
222 if (node3) | |
223 node3->next = node2; | |
224 | |
225 if (((GaimBlistNode*)buddy)->parent != n->parent) | |
226 serv_move_buddy(buddy, (struct group*)((GaimBlistNode*)buddy)->parent, | |
227 (struct group*)n->parent); | |
228 save = TRUE; | |
229 } | |
2382 | 230 |
4687 | 231 if (n) { |
232 ((GaimBlistNode*)buddy)->next = n->next; | |
233 ((GaimBlistNode*)buddy)->prev = n; | |
234 ((GaimBlistNode*)buddy)->parent = n->parent; | |
235 n->next = (GaimBlistNode*)buddy; | |
236 } else { | |
237 ((GaimBlistNode*)g)->child = (GaimBlistNode*)buddy; | |
238 ((GaimBlistNode*)buddy)->next = NULL; | |
239 ((GaimBlistNode*)buddy)->prev = NULL; | |
240 ((GaimBlistNode*)buddy)->parent = (GaimBlistNode*)g; | |
241 } | |
2382 | 242 |
4687 | 243 if (ops) |
244 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
4770 | 245 if (save) |
246 gaim_blist_save(); | |
4687 | 247 } |
2382 | 248 |
4687 | 249 struct group *gaim_group_new(const char *name) |
250 { | |
251 struct group *g = gaim_find_group(name); | |
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
252 |
4687 | 253 if (!g) { |
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
254 struct gaim_blist_ui_ops *ops; |
4687 | 255 g= g_new0(struct group, 1); |
256 g->name = g_strdup(name); | |
257 ((GaimBlistNode*)g)->type = GAIM_BLIST_GROUP_NODE; | |
2382 | 258 |
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
259 ops = gaim_get_blist_ui_ops(); |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
260 |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
261 if (ops != NULL && ops->new_node != NULL) |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
262 ops->new_node((GaimBlistNode *)g); |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
263 |
4687 | 264 } |
2382 | 265 return g; |
266 } | |
267 | |
4687 | 268 void gaim_blist_add_group (struct group *group, GaimBlistNode *node) |
2382 | 269 { |
4687 | 270 struct gaim_blist_ui_ops *ops; |
4785 | 271 gboolean save = FALSE; |
272 | |
4687 | 273 if (!gaimbuddylist) |
274 gaimbuddylist = gaim_blist_new(); | |
275 ops = gaimbuddylist->ui_ops; | |
4785 | 276 |
4687 | 277 if (!gaimbuddylist->root) { |
278 gaimbuddylist->root = (GaimBlistNode*)group; | |
279 return; | |
280 } | |
4785 | 281 |
282 | |
283 if (!node) | |
4687 | 284 node = gaim_blist_get_last_sibling(gaimbuddylist->root); |
4785 | 285 |
4781 | 286 if (gaim_find_group(group->name)) { |
287 /* This is just being moved */ | |
288 GaimBlistNode *node2 = ((GaimBlistNode*)group)->next; | |
289 GaimBlistNode *node3 = ((GaimBlistNode*)group)->prev; | |
2382 | 290 |
4781 | 291 ops->remove(gaimbuddylist, (GaimBlistNode*)group); |
292 | |
293 if (node2) | |
294 node2->prev = node3; | |
295 if (node3) | |
296 node3->next = node2; | |
297 save = TRUE; | |
298 } | |
4785 | 299 |
4687 | 300 ((GaimBlistNode*)group)->next = node ? node->next : NULL; |
301 ((GaimBlistNode*)group)->prev = node; | |
302 node->next = (GaimBlistNode*)group; | |
303 | |
304 if (ops) | |
305 ops->update(gaimbuddylist, (GaimBlistNode*)group); | |
4785 | 306 if (save) |
4781 | 307 gaim_blist_save(); |
4687 | 308 } |
309 | |
310 void gaim_blist_remove_buddy (struct buddy *buddy) | |
311 { | |
312 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
313 | |
4721 | 314 GaimBlistNode *gnode, *node = (GaimBlistNode*)buddy; |
315 struct group *group; | |
316 | |
317 gnode = node->parent; | |
318 group = (struct group *)gnode; | |
319 | |
320 if(gnode->child == node) | |
321 gnode->child = node->next; | |
4687 | 322 if (node->prev) |
323 node->prev->next = node->next; | |
324 if (node->next) | |
325 node->next->prev = node->prev; | |
4721 | 326 |
4687 | 327 ops->remove(gaimbuddylist, node); |
328 g_free(buddy->name); | |
329 g_free(buddy->alias); | |
330 g_free(buddy); | |
2382 | 331 } |
332 | |
4687 | 333 void gaim_blist_remove_group (struct group *group) |
4349 | 334 { |
4687 | 335 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; |
336 GaimBlistNode *node = (GaimBlistNode*)group; | |
337 GaimBlistNode *child = node->child; | |
338 while (child) { | |
339 GaimBlistNode *n = child; | |
340 child = child->next; | |
341 gaim_blist_remove_buddy((struct buddy*)n); | |
342 } | |
343 ops->remove(gaimbuddylist, node); | |
344 g_free(group->name); | |
345 g_free(group); | |
346 } | |
4349 | 347 |
4687 | 348 char *gaim_get_buddy_alias_only(struct buddy *b) { |
349 if(!b) | |
350 return NULL; | |
351 if(b->alias && b->alias[0]) | |
352 return b->alias; | |
353 else if((misc_options & OPT_MISC_USE_SERVER_ALIAS) && b->server_alias) | |
354 return b->server_alias; | |
355 return NULL; | |
356 } | |
357 | |
358 char * gaim_get_buddy_alias (struct buddy *buddy) | |
359 { | |
360 char *ret = gaim_get_buddy_alias_only(buddy); | |
361 if(!ret) | |
362 return buddy ? buddy->name : _("Unknown"); | |
363 return ret; | |
364 | |
365 } | |
366 | |
367 struct buddy *gaim_find_buddy(struct gaim_account *account, const char *name) | |
368 { | |
4757 | 369 GaimBlistNode *group; |
4687 | 370 GaimBlistNode *buddy; |
4757 | 371 char *norm_name = g_strdup(normalize(name)); |
372 | |
4687 | 373 if (!gaimbuddylist) |
374 return NULL; | |
4757 | 375 |
376 group = gaimbuddylist->root; | |
4687 | 377 while (group) { |
378 buddy = group->child; | |
379 while (buddy) { | |
4793 | 380 if (!gaim_utf8_strcasecmp(normalize(((struct buddy*)buddy)->name), norm_name) && account == ((struct buddy*)buddy)->account) { |
4757 | 381 g_free(norm_name); |
4687 | 382 return (struct buddy*)buddy; |
4757 | 383 } |
4687 | 384 buddy = buddy->next; |
385 } | |
386 group = group->next; | |
4349 | 387 } |
4757 | 388 g_free(norm_name); |
4349 | 389 return NULL; |
390 } | |
391 | |
4687 | 392 struct group *gaim_find_group(const char *name) |
2382 | 393 { |
4687 | 394 GaimBlistNode *node; |
395 if (!gaimbuddylist) | |
396 return NULL; | |
397 node = gaimbuddylist->root; | |
398 while(node) { | |
399 if (!strcmp(((struct group*)node)->name, name)) | |
400 return (struct group*)node; | |
401 node = node->next; | |
2382 | 402 } |
4349 | 403 return NULL; |
2382 | 404 } |
4687 | 405 struct group *gaim_find_buddys_group(struct buddy *buddy) |
406 { | |
4830 | 407 if (!buddy) |
408 return NULL; | |
4687 | 409 return (struct group*)(((GaimBlistNode*)buddy)->parent); |
410 } | |
411 | |
412 GSList *gaim_group_get_accounts(struct group *g) | |
413 { | |
414 GSList *l = NULL; | |
415 GaimBlistNode *child = ((GaimBlistNode *)g)->child; | |
416 | |
417 while (child) { | |
418 if (!g_slist_find(l, ((struct buddy*)child)->account)) | |
419 l = g_slist_append(l, ((struct buddy*)child)->account); | |
420 child = child->next; | |
421 } | |
422 return l; | |
423 } | |
424 | |
425 void gaim_blist_remove_account(struct gaim_account *account) | |
426 { | |
427 struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; | |
428 GaimBlistNode *group = gaimbuddylist->root; | |
429 GaimBlistNode *buddy; | |
430 if (!gaimbuddylist) | |
431 return; | |
432 while (group) { | |
433 buddy = group->child; | |
434 while (buddy) { | |
435 if (account == ((struct buddy*)buddy)->account) { | |
436 ((struct buddy*)buddy)->present = 0; | |
437 ops->remove(gaimbuddylist, buddy); | |
438 } | |
439 buddy = buddy->next; | |
440 } | |
441 group = group->next; | |
442 } | |
443 } | |
2382 | 444 |
4491 | 445 void parse_toc_buddy_list(struct gaim_account *account, char *config) |
2382 | 446 { |
447 char *c; | |
448 char current[256]; | |
4351 | 449 GList *bud = NULL; |
4349 | 450 |
2382 | 451 |
452 if (config != NULL) { | |
4349 | 453 |
2382 | 454 /* skip "CONFIG:" (if it exists) */ |
455 c = strncmp(config + 6 /* sizeof(struct sflap_hdr) */ , "CONFIG:", strlen("CONFIG:")) ? | |
2998 | 456 strtok(config, "\n") : |
457 strtok(config + 6 /* sizeof(struct sflap_hdr) */ + strlen("CONFIG:"), "\n"); | |
2382 | 458 do { |
459 if (c == NULL) | |
460 break; | |
461 if (*c == 'g') { | |
4404 | 462 char *utf8 = NULL; |
4458 | 463 utf8 = gaim_try_conv_to_utf8(c + 2); |
4404 | 464 if (utf8 == NULL) { |
465 g_strlcpy(current, _("Invalid Groupname"), sizeof(current)); | |
466 } else { | |
467 g_strlcpy(current, utf8, sizeof(current)); | |
468 g_free(utf8); | |
469 } | |
4687 | 470 if (!gaim_find_group(current)) { |
471 struct group *g = gaim_group_new(current); | |
472 gaim_blist_add_group(g, NULL); | |
2526
413a81136e3a
[gaim-migrate @ 2539]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
473 } |
4687 | 474 } else if (*c == 'b') { /*&& !gaim_find_buddy(user, c + 2)) {*/ |
475 char nm[80], sw[388], *a, *utf8 = NULL; | |
4408 | 476 |
4404 | 477 if ((a = strchr(c + 2, ':')) != NULL) { |
478 *a++ = '\0'; /* nul the : */ | |
479 } | |
4349 | 480 |
4404 | 481 g_strlcpy(nm, c + 2, sizeof(nm)); |
482 if (a) { | |
4458 | 483 utf8 = gaim_try_conv_to_utf8(a); |
4404 | 484 if (utf8 == NULL) { |
485 debug_printf ("Failed to convert alias for '%s' to UTF-8\n", nm); | |
486 } | |
487 } | |
488 if (utf8 == NULL) { | |
489 sw[0] = '\0'; | |
490 } else { | |
4491 | 491 /* This can leave a partial sequence at the end, |
4404 | 492 * but who cares? */ |
493 g_strlcpy(sw, utf8, sizeof(sw)); | |
494 g_free(utf8); | |
495 } | |
4491 | 496 |
4687 | 497 if (!gaim_find_buddy(account, nm)) { |
498 struct buddy *b = gaim_buddy_new(account, nm, sw); | |
499 struct group *g = gaim_find_group(current); | |
500 gaim_blist_add_buddy(b, g, NULL); | |
4404 | 501 bud = g_list_append(bud, nm); |
2526
413a81136e3a
[gaim-migrate @ 2539]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
502 } |
2382 | 503 } else if (*c == 'p') { |
4491 | 504 gaim_privacy_permit_add(account, c + 2); |
2382 | 505 } else if (*c == 'd') { |
4491 | 506 gaim_privacy_deny_add(account, c + 2); |
2382 | 507 } else if (!strncmp("toc", c, 3)) { |
4491 | 508 sscanf(c + strlen(c) - 1, "%d", &account->permdeny); |
509 debug_printf("permdeny: %d\n", account->permdeny); | |
510 if (account->permdeny == 0) | |
511 account->permdeny = 1; | |
2382 | 512 } else if (*c == 'm') { |
4491 | 513 sscanf(c + 2, "%d", &account->permdeny); |
514 debug_printf("permdeny: %d\n", account->permdeny); | |
515 if (account->permdeny == 0) | |
516 account->permdeny = 1; | |
2382 | 517 } |
518 } while ((c = strtok(NULL, "\n"))); | |
4351 | 519 |
4491 | 520 if(account->gc) { |
4351 | 521 if(bud) |
4491 | 522 serv_add_buddies(account->gc, bud); |
523 serv_set_permit_deny(account->gc); | |
4351 | 524 } |
525 g_list_free(bud); | |
2382 | 526 } |
527 } | |
528 | |
4687 | 529 #if 0 |
2536
0e0a54e5819a
[gaim-migrate @ 2549]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2526
diff
changeset
|
530 /* translate an AIM 3 buddylist (*.lst) to a Gaim buddylist */ |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
531 static GString *translate_lst(FILE *src_fp) |
2382 | 532 { |
533 char line[BUF_LEN], *line2; | |
534 char *name; | |
535 int i; | |
536 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
537 GString *dest = g_string_new("m 1\n"); |
2382 | 538 |
539 while (fgets(line, BUF_LEN, src_fp)) { | |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
540 line2 = g_strchug(line); |
2382 | 541 if (strstr(line2, "group") == line2) { |
542 name = strpbrk(line2, " \t\n\r\f") + 1; | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
543 dest = g_string_append(dest, "g "); |
2382 | 544 for (i = 0; i < strcspn(name, "\n\r"); i++) |
545 if (name[i] != '\"') | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
546 dest = g_string_append_c(dest, name[i]); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
547 dest = g_string_append_c(dest, '\n'); |
2382 | 548 } |
549 if (strstr(line2, "buddy") == line2) { | |
550 name = strpbrk(line2, " \t\n\r\f") + 1; | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
551 dest = g_string_append(dest, "b "); |
2382 | 552 for (i = 0; i < strcspn(name, "\n\r"); i++) |
553 if (name[i] != '\"') | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
554 dest = g_string_append_c(dest, name[i]); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
555 dest = g_string_append_c(dest, '\n'); |
2382 | 556 } |
557 } | |
558 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
559 return dest; |
2382 | 560 } |
561 | |
562 | |
2536
0e0a54e5819a
[gaim-migrate @ 2549]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2526
diff
changeset
|
563 /* translate an AIM 4 buddylist (*.blt) to Gaim format */ |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
564 static GString *translate_blt(FILE *src_fp) |
2382 | 565 { |
566 int i; | |
567 char line[BUF_LEN]; | |
568 char *buddy; | |
569 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
570 GString *dest = g_string_new("m 1\n"); |
2382 | 571 |
572 while (strstr(fgets(line, BUF_LEN, src_fp), "Buddy") == NULL); | |
573 while (strstr(fgets(line, BUF_LEN, src_fp), "list") == NULL); | |
574 | |
575 while (1) { | |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
576 fgets(line, BUF_LEN, src_fp); g_strchomp(line); |
2382 | 577 if (strchr(line, '}') != NULL) |
578 break; | |
579 | |
580 if (strchr(line, '{') != NULL) { | |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
581 /* Syntax starting with "<group> {" */ |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
582 |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
583 dest = g_string_append(dest, "g "); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
584 buddy = g_strchug(strtok(line, "{")); |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
585 for (i = 0; i < strlen(buddy); i++) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
586 if (buddy[i] != '\"') |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
587 dest = g_string_append_c(dest, buddy[i]); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
588 dest = g_string_append_c(dest, '\n'); |
2382 | 589 while (strchr(fgets(line, BUF_LEN, src_fp), '}') == NULL) { |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
590 gboolean pounce = FALSE; |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
591 char *e; |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
592 g_strchomp(line); |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
593 buddy = g_strchug(line); |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
594 debug_printf("\nbuddy: \"%s\"\n\n", buddy); |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
595 dest = g_string_append(dest, "b "); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
596 if (strchr(buddy, '{') != NULL) { |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
597 /* buddy pounce, etc */ |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
598 char *pos = strchr(buddy, '{') - 1; |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
599 *pos = 0; |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
600 pounce = TRUE; |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
601 } |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
602 if ((e = strchr(buddy, '\"')) != NULL) { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
603 *e = '\0'; |
2382 | 604 buddy++; |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
605 } |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
606 dest = g_string_append(dest, buddy); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
607 dest = g_string_append_c(dest, '\n'); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
608 if (pounce) |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
609 do |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
610 fgets(line, BUF_LEN, src_fp); |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
611 while (!strchr(line, '}')); |
2382 | 612 } |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
613 } else { |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
614 |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
615 /* Syntax "group buddy buddy ..." */ |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
616 buddy = g_strchug(strtok(line, " \n")); |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
617 dest = g_string_append(dest, "g "); |
2382 | 618 if (strchr(buddy, '\"') != NULL) { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
619 dest = g_string_append(dest, &buddy[1]); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
620 dest = g_string_append_c(dest, ' '); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
621 buddy = g_strchug(strtok(NULL, " \n")); |
2382 | 622 while (strchr(buddy, '\"') == NULL) { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
623 dest = g_string_append(dest, buddy); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
624 dest = g_string_append_c(dest, ' '); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
625 buddy = g_strchug(strtok(NULL, " \n")); |
2382 | 626 } |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
627 buddy[strlen(buddy) - 1] = '\0'; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
628 dest = g_string_append(dest, buddy); |
2382 | 629 } else { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
630 dest = g_string_append(dest, buddy); |
2382 | 631 } |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
632 dest = g_string_append_c(dest, '\n'); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
633 while ((buddy = g_strchug(strtok(NULL, " \n"))) != NULL) { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
634 dest = g_string_append(dest, "b "); |
2382 | 635 if (strchr(buddy, '\"') != NULL) { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
636 dest = g_string_append(dest, &buddy[1]); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
637 dest = g_string_append_c(dest, ' '); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
638 buddy = g_strchug(strtok(NULL, " \n")); |
2382 | 639 while (strchr(buddy, '\"') == NULL) { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
640 dest = g_string_append(dest, buddy); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
641 dest = g_string_append_c(dest, ' '); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
642 buddy = g_strchug(strtok(NULL, " \n")); |
2382 | 643 } |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
644 buddy[strlen(buddy) - 1] = '\0'; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
645 dest = g_string_append(dest, buddy); |
2382 | 646 } else { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
647 dest = g_string_append(dest, buddy); |
2382 | 648 } |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
649 dest = g_string_append_c(dest, '\n'); |
2382 | 650 } |
651 } | |
652 } | |
653 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
654 return dest; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
655 } |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
656 |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
657 static GString *translate_gnomeicu(FILE *src_fp) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
658 { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
659 char line[BUF_LEN]; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
660 GString *dest = g_string_new("m 1\ng Buddies\n"); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
661 |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
662 while (strstr(fgets(line, BUF_LEN, src_fp), "NewContacts") == NULL); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
663 |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
664 while (fgets(line, BUF_LEN, src_fp)) { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
665 char *eq; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
666 g_strchomp(line); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
667 if (line[0] == '\n' || line[0] == '[') |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
668 break; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
669 eq = strchr(line, '='); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
670 if (!eq) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
671 break; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
672 *eq = ':'; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
673 eq = strchr(eq, ','); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
674 if (eq) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
675 *eq = '\0'; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
676 dest = g_string_append(dest, "b "); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
677 dest = g_string_append(dest, line); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
678 dest = g_string_append_c(dest, '\n'); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
679 } |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
680 |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
681 return dest; |
2382 | 682 } |
4687 | 683 #endif |
2382 | 684 |
685 static gchar *get_screenname_filename(const char *name) | |
686 { | |
687 gchar **split; | |
688 gchar *good; | |
4793 | 689 gchar *ret; |
2382 | 690 |
691 split = g_strsplit(name, G_DIR_SEPARATOR_S, -1); | |
692 good = g_strjoinv(NULL, split); | |
693 g_strfreev(split); | |
694 | |
4793 | 695 ret = g_utf8_strup(good, -1); |
2382 | 696 |
4793 | 697 g_free(good); |
698 | |
699 return ret; | |
2382 | 700 } |
701 | |
4349 | 702 static gboolean gaim_blist_read(const char *filename); |
2382 | 703 |
4687 | 704 |
705 static void do_import(struct gaim_account *account, const char *filename) | |
2382 | 706 { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
707 GString *buf = NULL; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
708 char first[64]; |
2382 | 709 char path[PATHSIZE]; |
710 int len; | |
711 FILE *f; | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
712 struct stat st; |
2382 | 713 |
714 if (filename) { | |
715 g_snprintf(path, sizeof(path), "%s", filename); | |
716 } else { | |
4491 | 717 char *g_screenname = get_screenname_filename(account->username); |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
718 char *file = gaim_user_dir(); |
4491 | 719 int protocol = (account->protocol == PROTO_OSCAR) ? (isalpha(account->username[0]) ? PROTO_TOC : PROTO_ICQ): account->protocol; |
2382 | 720 |
721 if (file != (char *)NULL) { | |
4349 | 722 sprintf(path, "%s" G_DIR_SEPARATOR_S "%s.%d.blist", file, g_screenname, protocol); |
2382 | 723 g_free(g_screenname); |
724 } else { | |
725 g_free(g_screenname); | |
726 return; | |
727 } | |
728 } | |
729 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
730 if (stat(path, &st)) { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
731 debug_printf("Unable to stat %s.\n", path); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
732 return; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
733 } |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
734 |
2382 | 735 if (!(f = fopen(path, "r"))) { |
736 debug_printf("Unable to open %s.\n", path); | |
737 return; | |
738 } | |
739 | |
740 fgets(first, 64, f); | |
741 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
742 if ((first[0] == '\n') || (first[0] == '\r' && first[1] == '\n')) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
743 fgets(first, 64, f); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
744 |
4687 | 745 #if 0 |
4349 | 746 if (!g_strncasecmp(first, "<xml", strlen("<xml"))) { |
747 /* new gaim XML buddy list */ | |
748 gaim_blist_read(path); | |
4687 | 749 |
750 /* We really don't need to bother doing stuf like translating AIM 3 buddy lists anymore */ | |
751 | |
4349 | 752 } else if (!g_strncasecmp(first, "Config {", strlen("Config {"))) { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
753 /* AIM 4 buddy list */ |
2382 | 754 debug_printf("aim 4\n"); |
755 rewind(f); | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
756 buf = translate_blt(f); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
757 } else if (strstr(first, "group") != NULL) { |
2382 | 758 /* AIM 3 buddy list */ |
759 debug_printf("aim 3\n"); | |
760 rewind(f); | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
761 buf = translate_lst(f); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
762 } else if (!g_strncasecmp(first, "[User]", strlen("[User]"))) { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
763 /* GnomeICU (hopefully) */ |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
764 debug_printf("gnomeicu\n"); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
765 rewind(f); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
766 buf = translate_gnomeicu(f); |
4687 | 767 |
768 } else | |
769 #endif | |
770 if (first[0] == 'm') { | |
771 /* Gaim buddy list - no translation */ | |
772 char buf2[BUF_LONG * 2]; | |
773 buf = g_string_new(""); | |
774 rewind(f); | |
775 while (1) { | |
776 len = fread(buf2, 1, BUF_LONG * 2 - 1, f); | |
777 if (len <= 0) | |
778 break; | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
779 buf2[len] = '\0'; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
780 buf = g_string_append(buf, buf2); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
781 if (len != BUF_LONG * 2 - 1) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
782 break; |
4687 | 783 } |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
784 } |
4687 | 785 |
2382 | 786 fclose(f); |
787 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
788 if (buf) { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
789 buf = g_string_prepend(buf, "toc_set_config {"); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
790 buf = g_string_append(buf, "}\n"); |
4491 | 791 parse_toc_buddy_list(account, buf->str); |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
792 g_string_free(buf, TRUE); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
793 } |
2382 | 794 } |
795 | |
4491 | 796 gboolean gaim_group_on_account(struct group *g, struct gaim_account *account) { |
4785 | 797 GaimBlistNode *bnode; |
798 for(bnode = g->node.child; bnode; bnode = bnode->next) { | |
799 struct buddy *b = (struct buddy *)bnode; | |
800 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
801 continue; | |
4491 | 802 if((!account && b->account->gc) || b->account == account) |
4349 | 803 return TRUE; |
804 } | |
805 return FALSE; | |
806 } | |
807 | |
4497 | 808 static gboolean blist_safe_to_write = FALSE; |
4349 | 809 |
810 static char *blist_parser_group_name = NULL; | |
811 static char *blist_parser_person_name = NULL; | |
812 static char *blist_parser_account_name = NULL; | |
813 static int blist_parser_account_protocol = 0; | |
814 static char *blist_parser_buddy_name = NULL; | |
815 static char *blist_parser_buddy_alias = NULL; | |
816 static char *blist_parser_setting_name = NULL; | |
817 static char *blist_parser_setting_value = NULL; | |
818 static GHashTable *blist_parser_buddy_settings = NULL; | |
819 static int blist_parser_privacy_mode = 0; | |
820 static enum { | |
821 BLIST_TAG_GAIM, | |
822 BLIST_TAG_BLIST, | |
823 BLIST_TAG_GROUP, | |
824 BLIST_TAG_PERSON, | |
825 BLIST_TAG_BUDDY, | |
826 BLIST_TAG_NAME, | |
827 BLIST_TAG_ALIAS, | |
828 BLIST_TAG_SETTING, | |
829 BLIST_TAG_PRIVACY, | |
830 BLIST_TAG_ACCOUNT, | |
831 BLIST_TAG_PERMIT, | |
832 BLIST_TAG_BLOCK, | |
833 BLIST_TAG_IGNORE | |
834 } blist_parser_current_tag; | |
4439 | 835 static gboolean blist_parser_error_occurred = FALSE; |
4349 | 836 |
837 static void blist_start_element_handler (GMarkupParseContext *context, | |
838 const gchar *element_name, | |
839 const gchar **attribute_names, | |
840 const gchar **attribute_values, | |
841 gpointer user_data, | |
842 GError **error) { | |
843 int i; | |
844 | |
845 if(!strcmp(element_name, "gaim")) { | |
846 blist_parser_current_tag = BLIST_TAG_GAIM; | |
847 } else if(!strcmp(element_name, "blist")) { | |
848 blist_parser_current_tag = BLIST_TAG_BLIST; | |
849 } else if(!strcmp(element_name, "group")) { | |
850 blist_parser_current_tag = BLIST_TAG_GROUP; | |
851 for(i=0; attribute_names[i]; i++) { | |
4444 | 852 if(!strcmp(attribute_names[i], "name")) { |
853 g_free(blist_parser_group_name); | |
4349 | 854 blist_parser_group_name = g_strdup(attribute_values[i]); |
4444 | 855 } |
4349 | 856 } |
857 if(blist_parser_group_name) { | |
4687 | 858 struct group *g = gaim_group_new(blist_parser_group_name); |
859 gaim_blist_add_group(g,NULL); | |
4349 | 860 } |
861 } else if(!strcmp(element_name, "person")) { | |
862 blist_parser_current_tag = BLIST_TAG_PERSON; | |
863 for(i=0; attribute_names[i]; i++) { | |
4444 | 864 if(!strcmp(attribute_names[i], "name")) { |
865 g_free(blist_parser_person_name); | |
4349 | 866 blist_parser_person_name = g_strdup(attribute_values[i]); |
4444 | 867 } |
4349 | 868 } |
869 } else if(!strcmp(element_name, "buddy")) { | |
870 blist_parser_current_tag = BLIST_TAG_BUDDY; | |
871 for(i=0; attribute_names[i]; i++) { | |
4444 | 872 if(!strcmp(attribute_names[i], "account")) { |
873 g_free(blist_parser_account_name); | |
4349 | 874 blist_parser_account_name = g_strdup(attribute_values[i]); |
4444 | 875 } else if(!strcmp(attribute_names[i], "protocol")) { |
4349 | 876 blist_parser_account_protocol = atoi(attribute_values[i]); |
4444 | 877 } |
4349 | 878 } |
879 } else if(!strcmp(element_name, "name")) { | |
880 blist_parser_current_tag = BLIST_TAG_NAME; | |
881 } else if(!strcmp(element_name, "alias")) { | |
882 blist_parser_current_tag = BLIST_TAG_ALIAS; | |
883 } else if(!strcmp(element_name, "setting")) { | |
884 blist_parser_current_tag = BLIST_TAG_SETTING; | |
885 for(i=0; attribute_names[i]; i++) { | |
4444 | 886 if(!strcmp(attribute_names[i], "name")) { |
887 g_free(blist_parser_setting_name); | |
4349 | 888 blist_parser_setting_name = g_strdup(attribute_values[i]); |
4444 | 889 } |
4349 | 890 } |
891 } else if(!strcmp(element_name, "privacy")) { | |
892 blist_parser_current_tag = BLIST_TAG_PRIVACY; | |
893 } else if(!strcmp(element_name, "account")) { | |
894 blist_parser_current_tag = BLIST_TAG_ACCOUNT; | |
895 for(i=0; attribute_names[i]; i++) { | |
896 if(!strcmp(attribute_names[i], "protocol")) | |
897 blist_parser_account_protocol = atoi(attribute_values[i]); | |
898 else if(!strcmp(attribute_names[i], "mode")) | |
899 blist_parser_privacy_mode = atoi(attribute_values[i]); | |
4444 | 900 else if(!strcmp(attribute_names[i], "name")) { |
901 g_free(blist_parser_account_name); | |
4349 | 902 blist_parser_account_name = g_strdup(attribute_values[i]); |
4444 | 903 } |
4349 | 904 } |
905 } else if(!strcmp(element_name, "permit")) { | |
906 blist_parser_current_tag = BLIST_TAG_PERMIT; | |
907 } else if(!strcmp(element_name, "block")) { | |
908 blist_parser_current_tag = BLIST_TAG_BLOCK; | |
909 } else if(!strcmp(element_name, "ignore")) { | |
910 blist_parser_current_tag = BLIST_TAG_IGNORE; | |
911 } | |
912 } | |
913 | |
914 static void blist_end_element_handler(GMarkupParseContext *context, | |
915 const gchar *element_name, gpointer user_data, GError **error) { | |
916 if(!strcmp(element_name, "gaim")) { | |
917 } else if(!strcmp(element_name, "blist")) { | |
918 blist_parser_current_tag = BLIST_TAG_GAIM; | |
919 } else if(!strcmp(element_name, "group")) { | |
920 blist_parser_current_tag = BLIST_TAG_BLIST; | |
921 } else if(!strcmp(element_name, "person")) { | |
922 blist_parser_current_tag = BLIST_TAG_GROUP; | |
923 g_free(blist_parser_person_name); | |
924 blist_parser_person_name = NULL; | |
925 } else if(!strcmp(element_name, "buddy")) { | |
4491 | 926 struct gaim_account *account = gaim_account_find(blist_parser_account_name, |
4349 | 927 blist_parser_account_protocol); |
4491 | 928 if(account) { |
4687 | 929 struct buddy *b = gaim_buddy_new(account, blist_parser_buddy_name, blist_parser_buddy_alias); |
930 struct group *g = gaim_find_group(blist_parser_group_name); | |
931 gaim_blist_add_buddy(b,g,NULL); | |
4349 | 932 if(blist_parser_buddy_settings) { |
933 g_hash_table_destroy(b->settings); | |
934 b->settings = blist_parser_buddy_settings; | |
935 } | |
936 } | |
937 blist_parser_current_tag = BLIST_TAG_PERSON; | |
938 g_free(blist_parser_buddy_name); | |
939 blist_parser_buddy_name = NULL; | |
940 g_free(blist_parser_buddy_alias); | |
941 blist_parser_buddy_alias = NULL; | |
942 g_free(blist_parser_account_name); | |
943 blist_parser_account_name = NULL; | |
944 blist_parser_buddy_settings = NULL; | |
945 } else if(!strcmp(element_name, "name")) { | |
946 blist_parser_current_tag = BLIST_TAG_BUDDY; | |
947 } else if(!strcmp(element_name, "alias")) { | |
948 blist_parser_current_tag = BLIST_TAG_BUDDY; | |
949 } else if(!strcmp(element_name, "setting")) { | |
950 if(!blist_parser_buddy_settings) | |
951 blist_parser_buddy_settings = g_hash_table_new_full(g_str_hash, | |
952 g_str_equal, g_free, g_free); | |
953 if(blist_parser_setting_name && blist_parser_setting_value) { | |
954 g_hash_table_replace(blist_parser_buddy_settings, | |
955 g_strdup(blist_parser_setting_name), | |
956 g_strdup(blist_parser_setting_value)); | |
957 } | |
958 g_free(blist_parser_setting_name); | |
959 g_free(blist_parser_setting_value); | |
4720 | 960 blist_parser_setting_name = NULL; |
961 blist_parser_setting_value = NULL; | |
4349 | 962 blist_parser_current_tag = BLIST_TAG_BUDDY; |
963 } else if(!strcmp(element_name, "privacy")) { | |
964 blist_parser_current_tag = BLIST_TAG_GAIM; | |
965 } else if(!strcmp(element_name, "account")) { | |
4491 | 966 struct gaim_account *account = gaim_account_find(blist_parser_account_name, |
4349 | 967 blist_parser_account_protocol); |
4491 | 968 if(account) { |
969 account->permdeny = blist_parser_privacy_mode; | |
4349 | 970 } |
971 blist_parser_current_tag = BLIST_TAG_PRIVACY; | |
972 g_free(blist_parser_account_name); | |
973 blist_parser_account_name = NULL; | |
974 } else if(!strcmp(element_name, "permit")) { | |
4491 | 975 struct gaim_account *account = gaim_account_find(blist_parser_account_name, |
4349 | 976 blist_parser_account_protocol); |
4491 | 977 if(account) { |
978 gaim_privacy_permit_add(account, blist_parser_buddy_name); | |
4349 | 979 } |
4444 | 980 blist_parser_current_tag = BLIST_TAG_ACCOUNT; |
4442 | 981 g_free(blist_parser_buddy_name); |
4444 | 982 blist_parser_buddy_name = NULL; |
4349 | 983 } else if(!strcmp(element_name, "block")) { |
4491 | 984 struct gaim_account *account = gaim_account_find(blist_parser_account_name, |
4349 | 985 blist_parser_account_protocol); |
4491 | 986 if(account) { |
987 gaim_privacy_deny_add(account, blist_parser_buddy_name); | |
4349 | 988 } |
4444 | 989 blist_parser_current_tag = BLIST_TAG_ACCOUNT; |
4442 | 990 g_free(blist_parser_buddy_name); |
4444 | 991 blist_parser_buddy_name = NULL; |
4349 | 992 } else if(!strcmp(element_name, "ignore")) { |
993 /* we'll apparently do something with this later */ | |
994 blist_parser_current_tag = BLIST_TAG_ACCOUNT; | |
995 } | |
996 } | |
997 | |
998 static void blist_text_handler(GMarkupParseContext *context, const gchar *text, | |
999 gsize text_len, gpointer user_data, GError **error) { | |
1000 switch(blist_parser_current_tag) { | |
1001 case BLIST_TAG_NAME: | |
1002 blist_parser_buddy_name = g_strndup(text, text_len); | |
1003 break; | |
1004 case BLIST_TAG_ALIAS: | |
1005 blist_parser_buddy_alias = g_strndup(text, text_len); | |
1006 break; | |
1007 case BLIST_TAG_PERMIT: | |
1008 case BLIST_TAG_BLOCK: | |
1009 case BLIST_TAG_IGNORE: | |
1010 blist_parser_buddy_name = g_strndup(text, text_len); | |
1011 break; | |
1012 case BLIST_TAG_SETTING: | |
1013 blist_parser_setting_value = g_strndup(text, text_len); | |
1014 break; | |
1015 default: | |
1016 break; | |
1017 } | |
1018 } | |
1019 | |
4439 | 1020 static void blist_error_handler(GMarkupParseContext *context, GError *error, |
1021 gpointer user_data) { | |
1022 blist_parser_error_occurred = TRUE; | |
1023 debug_printf("error parsing blist.xml: %s\n", error->message); | |
1024 } | |
1025 | |
4349 | 1026 static GMarkupParser blist_parser = { |
1027 blist_start_element_handler, | |
1028 blist_end_element_handler, | |
1029 blist_text_handler, | |
1030 NULL, | |
4439 | 1031 blist_error_handler |
4349 | 1032 }; |
1033 | |
1034 static gboolean gaim_blist_read(const char *filename) { | |
4441 | 1035 gchar *contents = NULL; |
4349 | 1036 gsize length; |
1037 GMarkupParseContext *context; | |
1038 GError *error = NULL; | |
4496 | 1039 |
1040 debug_printf("gaim_blist_read: reading %s\n", filename); | |
4349 | 1041 if(!g_file_get_contents(filename, &contents, &length, &error)) { |
1042 debug_printf("error reading blist: %s\n", error->message); | |
1043 g_error_free(error); | |
1044 return FALSE; | |
1045 } | |
1046 | |
1047 context = g_markup_parse_context_new(&blist_parser, 0, NULL, NULL); | |
1048 | |
1049 if(!g_markup_parse_context_parse(context, contents, length, NULL)) { | |
1050 g_markup_parse_context_free(context); | |
4441 | 1051 g_free(contents); |
4349 | 1052 return FALSE; |
1053 } | |
1054 | |
1055 if(!g_markup_parse_context_end_parse(context, NULL)) { | |
1056 debug_printf("error parsing blist\n"); | |
1057 g_markup_parse_context_free(context); | |
4441 | 1058 g_free(contents); |
4349 | 1059 return FALSE; |
1060 } | |
1061 | |
1062 g_markup_parse_context_free(context); | |
4441 | 1063 g_free(contents); |
1064 | |
4439 | 1065 if(blist_parser_error_occurred) |
1066 return FALSE; | |
1067 | |
4496 | 1068 debug_printf("gaim_blist_read: finished reading %s\n", filename); |
1069 | |
4349 | 1070 return TRUE; |
1071 } | |
1072 | |
1073 void gaim_blist_load() { | |
1074 GSList *accts; | |
1075 char *user_dir = gaim_user_dir(); | |
1076 char *filename; | |
1077 char *msg; | |
1078 | |
4497 | 1079 blist_safe_to_write = TRUE; |
1080 | |
1081 if(!user_dir) | |
4349 | 1082 return; |
1083 | |
1084 filename = g_build_filename(user_dir, "blist.xml", NULL); | |
1085 | |
1086 if(g_file_test(filename, G_FILE_TEST_EXISTS)) { | |
1087 if(!gaim_blist_read(filename)) { | |
1088 msg = g_strdup_printf(_("An error was encountered parsing your " | |
1089 "buddy list. It has not been loaded.")); | |
1090 do_error_dialog(_("Buddy List Error"), msg, GAIM_ERROR); | |
1091 g_free(msg); | |
1092 } | |
4491 | 1093 } else if(g_slist_length(gaim_accounts)) { |
4349 | 1094 /* rob wants to inform the user that their buddy lists are |
1095 * being converted */ | |
1096 msg = g_strdup_printf(_("Gaim is converting your old buddy lists " | |
1097 "to a new format, which will now be located at %s"), | |
1098 filename); | |
1099 do_error_dialog(_("Converting Buddy List"), msg, GAIM_INFO); | |
1100 g_free(msg); | |
1101 | |
1102 /* now, let gtk actually display the dialog before we start anything */ | |
1103 while(gtk_events_pending()) | |
1104 gtk_main_iteration(); | |
1105 | |
1106 /* read in the old lists, then save to the new format */ | |
4491 | 1107 for(accts = gaim_accounts; accts; accts = accts->next) { |
4349 | 1108 do_import(accts->data, NULL); |
1109 } | |
1110 gaim_blist_save(); | |
1111 } | |
1112 | |
1113 g_free(filename); | |
1114 } | |
1115 | |
1116 static void blist_print_buddy_settings(gpointer key, gpointer data, | |
1117 gpointer user_data) { | |
1118 char *key_val = g_markup_escape_text(key, -1); | |
1119 char *data_val = g_markup_escape_text(data, -1); | |
1120 FILE *file = user_data; | |
1121 fprintf(file, "\t\t\t\t\t<setting name=\"%s\">%s</setting>\n", key_val, | |
1122 data_val); | |
1123 g_free(key_val); | |
1124 g_free(data_val); | |
1125 } | |
1126 | |
4491 | 1127 static void gaim_blist_write(FILE *file, struct gaim_account *exp_acct) { |
4687 | 1128 GSList *accounts, *buds; |
4785 | 1129 GaimBlistNode *gnode,*bnode; |
4687 | 1130 struct group *group; |
1131 struct buddy *bud; | |
4349 | 1132 fprintf(file, "<?xml version='1.0' encoding='UTF-8' ?>\n"); |
1133 fprintf(file, "<gaim version=\"1\">\n"); | |
1134 fprintf(file, "\t<blist>\n"); | |
1135 | |
4785 | 1136 for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
1137 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
1138 continue; | |
1139 group = (struct group *)gnode; | |
4687 | 1140 if(!exp_acct || gaim_group_on_account(group, exp_acct)) { |
1141 char *group_name = g_markup_escape_text(group->name, -1); | |
4349 | 1142 fprintf(file, "\t\t<group name=\"%s\">\n", group_name); |
4785 | 1143 for(bnode = gnode->child; bnode; bnode = bnode->next) { |
1144 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
1145 continue; | |
1146 bud = (struct buddy *)bnode; | |
4687 | 1147 if(!exp_acct || bud->account == exp_acct) { |
1148 char *bud_name = g_markup_escape_text(bud->name, -1); | |
4349 | 1149 char *bud_alias = NULL; |
4687 | 1150 char *acct_name = g_markup_escape_text(bud->account->username, -1); |
1151 if(bud->alias) | |
1152 bud_alias= g_markup_escape_text(bud->alias, -1); | |
4349 | 1153 fprintf(file, "\t\t\t<person name=\"%s\">\n", |
1154 bud_alias ? bud_alias : bud_name); | |
1155 fprintf(file, "\t\t\t\t<buddy protocol=\"%d\" " | |
4687 | 1156 "account=\"%s\">\n", bud->account->protocol, |
4349 | 1157 acct_name); |
1158 fprintf(file, "\t\t\t\t\t<name>%s</name>\n", bud_name); | |
1159 if(bud_alias) { | |
1160 fprintf(file, "\t\t\t\t\t<alias>%s</alias>\n", | |
1161 bud_alias); | |
1162 } | |
4687 | 1163 g_hash_table_foreach(bud->settings, |
4349 | 1164 blist_print_buddy_settings, file); |
1165 fprintf(file, "\t\t\t\t</buddy>\n"); | |
1166 fprintf(file, "\t\t\t</person>\n"); | |
1167 g_free(bud_name); | |
1168 g_free(bud_alias); | |
1169 g_free(acct_name); | |
1170 } | |
1171 } | |
1172 fprintf(file, "\t\t</group>\n"); | |
1173 g_free(group_name); | |
1174 } | |
1175 } | |
1176 | |
1177 fprintf(file, "\t</blist>\n"); | |
1178 fprintf(file, "\t<privacy>\n"); | |
1179 | |
4491 | 1180 for(accounts = gaim_accounts; accounts; accounts = accounts->next) { |
1181 struct gaim_account *account = accounts->data; | |
1182 char *acct_name = g_markup_escape_text(account->username, -1); | |
1183 if(!exp_acct || account == exp_acct) { | |
4349 | 1184 fprintf(file, "\t\t<account protocol=\"%d\" name=\"%s\" " |
4491 | 1185 "mode=\"%d\">\n", account->protocol, acct_name, account->permdeny); |
1186 for(buds = account->permit; buds; buds = buds->next) { | |
4349 | 1187 char *bud_name = g_markup_escape_text(buds->data, -1); |
1188 fprintf(file, "\t\t\t<permit>%s</permit>\n", bud_name); | |
1189 g_free(bud_name); | |
1190 } | |
4491 | 1191 for(buds = account->deny; buds; buds = buds->next) { |
4349 | 1192 char *bud_name = g_markup_escape_text(buds->data, -1); |
1193 fprintf(file, "\t\t\t<block>%s</block>\n", bud_name); | |
1194 g_free(bud_name); | |
1195 } | |
1196 fprintf(file, "\t\t</account>\n"); | |
1197 } | |
4491 | 1198 g_free(acct_name); |
4349 | 1199 } |
1200 | |
1201 fprintf(file, "\t</privacy>\n"); | |
1202 fprintf(file, "</gaim>\n"); | |
1203 } | |
1204 | |
1205 void gaim_blist_save() { | |
1206 FILE *file; | |
1207 char *user_dir = gaim_user_dir(); | |
1208 char *filename; | |
1209 | |
1210 if(!user_dir) | |
1211 return; | |
4497 | 1212 if(!blist_safe_to_write) { |
1213 debug_printf("AHH!! tried to write the blist before we read it!\n"); | |
1214 return; | |
1215 } | |
1216 | |
4349 | 1217 file = fopen(user_dir, "r"); |
1218 if(!file) | |
1219 mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); | |
1220 else | |
1221 fclose(file); | |
1222 | |
1223 filename = g_build_filename(user_dir, "blist.xml", NULL); | |
1224 | |
1225 if((file = fopen(filename, "w"))) { | |
1226 gaim_blist_write(file, NULL); | |
1227 fclose(file); | |
1228 chmod(filename, S_IRUSR | S_IWUSR); | |
1229 } else { | |
1230 debug_printf("unable to write %s\n", filename); | |
1231 } | |
1232 | |
1233 g_free(filename); | |
1234 } | |
1235 | |
4491 | 1236 gboolean gaim_privacy_permit_add(struct gaim_account *account, const char *who) { |
1237 GSList *d = account->permit; | |
4349 | 1238 char *n = g_strdup(normalize(who)); |
1239 while(d) { | |
4793 | 1240 if(!gaim_utf8_strcasecmp(n, normalize(d->data))) |
4349 | 1241 break; |
1242 d = d->next; | |
1243 } | |
1244 g_free(n); | |
1245 if(!d) { | |
4491 | 1246 account->permit = g_slist_append(account->permit, g_strdup(who)); |
4349 | 1247 return TRUE; |
1248 } | |
1249 | |
1250 return FALSE; | |
1251 } | |
1252 | |
4491 | 1253 gboolean gaim_privacy_permit_remove(struct gaim_account *account, const char *who) { |
1254 GSList *d = account->permit; | |
4349 | 1255 char *n = g_strdup(normalize(who)); |
1256 while(d) { | |
4793 | 1257 if(!gaim_utf8_strcasecmp(n, normalize(d->data))) |
4349 | 1258 break; |
1259 d = d->next; | |
1260 } | |
1261 g_free(n); | |
1262 if(d) { | |
4491 | 1263 account->permit = g_slist_remove(account->permit, d->data); |
4349 | 1264 g_free(d->data); |
1265 return TRUE; | |
1266 } | |
1267 return FALSE; | |
1268 } | |
1269 | |
4491 | 1270 gboolean gaim_privacy_deny_add(struct gaim_account *account, const char *who) { |
1271 GSList *d = account->deny; | |
4349 | 1272 char *n = g_strdup(normalize(who)); |
1273 while(d) { | |
4793 | 1274 if(!gaim_utf8_strcasecmp(n, normalize(d->data))) |
4349 | 1275 break; |
1276 d = d->next; | |
1277 } | |
1278 g_free(n); | |
1279 if(!d) { | |
4491 | 1280 account->deny = g_slist_append(account->deny, g_strdup(who)); |
4349 | 1281 return TRUE; |
1282 } | |
1283 | |
1284 return FALSE; | |
1285 } | |
1286 | |
4491 | 1287 gboolean gaim_privacy_deny_remove(struct gaim_account *account, const char *who) { |
1288 GSList *d = account->deny; | |
4349 | 1289 char *n = g_strdup(normalize(who)); |
1290 while(d) { | |
4793 | 1291 if(!gaim_utf8_strcasecmp(n, normalize(d->data))) |
4349 | 1292 break; |
1293 d = d->next; | |
1294 } | |
1295 g_free(n); | |
1296 if(d) { | |
4491 | 1297 account->deny = g_slist_remove(account->deny, d->data); |
4349 | 1298 g_free(d->data); |
1299 return TRUE; | |
1300 } | |
1301 return FALSE; | |
1302 } | |
1303 | |
1304 void gaim_buddy_set_setting(struct buddy *b, const char *key, | |
1305 const char *value) { | |
1306 if(!b) | |
1307 return; | |
1308 g_hash_table_replace(b->settings, g_strdup(key), g_strdup(value)); | |
1309 } | |
1310 | |
1311 char *gaim_buddy_get_setting(struct buddy *b, const char *key) { | |
1312 if(!b) | |
1313 return NULL; | |
1314 return g_strdup(g_hash_table_lookup(b->settings, key)); | |
1315 } | |
4687 | 1316 |
1317 void gaim_set_blist_ui_ops(struct gaim_blist_ui_ops *ops) | |
1318 { | |
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
1319 blist_ui_ops = ops; |
4687 | 1320 } |
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
1321 |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
1322 struct gaim_blist_ui_ops * |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
1323 gaim_get_blist_ui_ops(void) |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
1324 { |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
1325 return blist_ui_ops; |
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4690
diff
changeset
|
1326 } |
4701 | 1327 |
1328 int gaim_blist_get_group_size(struct group *group, gboolean offline) { | |
1329 GaimBlistNode *node; | |
1330 int count = 0; | |
1331 | |
1332 if(!group) | |
1333 return 0; | |
1334 | |
1335 for(node = group->node.child; node; node = node->next) { | |
1336 if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
1337 struct buddy *b = (struct buddy *)node; | |
1338 if(b->account->gc || offline) | |
1339 count++; | |
1340 } | |
1341 } | |
1342 | |
1343 return count; | |
1344 } | |
1345 | |
1346 int gaim_blist_get_group_online_count(struct group *group) { | |
1347 GaimBlistNode *node; | |
1348 int count = 0; | |
1349 | |
1350 if(!group) | |
1351 return 0; | |
1352 | |
1353 for(node = group->node.child; node; node = node->next) { | |
1354 if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
1355 struct buddy *b = (struct buddy *)node; | |
1356 if(b->present) | |
1357 count++; | |
1358 } | |
1359 } | |
1360 | |
1361 return count; | |
1362 } | |
1363 | |
1364 |