Mercurial > pidgin.yaz
annotate src/list.c @ 4349:0c68d402f59f
[gaim-migrate @ 4614]
XML Blist
Gaim stores all the buddy lists in one big happy file now. You can order
the buddies however you want, and they'll stay ordered that way.
We can also store some per-buddy information now, which will be cool.
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Sun, 19 Jan 2003 22:16:52 +0000 |
parents | a614423c648f |
children | bd1db4c2e00b |
rev | line source |
---|---|
2382 | 1 /* |
2 * gaim | |
3 * | |
4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
5 * | |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 * | |
20 */ | |
21 | |
22 #ifdef HAVE_CONFIG_H | |
23 #include <config.h> | |
24 #endif | |
25 #include <string.h> | |
4349 | 26 #include <stdlib.h> |
2382 | 27 #include <sys/types.h> |
28 #include <sys/stat.h> | |
3630 | 29 #ifndef _WIN32 |
2382 | 30 #include <unistd.h> |
3630 | 31 #else |
32 #include <direct.h> | |
33 #endif | |
4349 | 34 #include <ctype.h> |
2382 | 35 #include "gaim.h" |
36 #include "prpl.h" | |
37 | |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
38 #ifdef _WIN32 |
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
39 #include "win32dep.h" |
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
40 #endif |
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
41 |
2382 | 42 #define PATHSIZE 1024 |
43 | |
4349 | 44 void remove_buddy(struct buddy *rem_b) |
2382 | 45 { |
4349 | 46 if(rem_b->user->gc) { |
47 struct group *rem_g = find_group_by_buddy(rem_b); | |
2382 | 48 |
4349 | 49 ui_remove_buddy(rem_b); |
2382 | 50 |
4349 | 51 rem_g->members = g_slist_remove(rem_g->members, rem_b); |
2382 | 52 |
4349 | 53 g_hash_table_destroy(rem_b->settings); |
2382 | 54 |
4349 | 55 g_free(rem_b); |
56 } else { | |
57 char *buf = g_strdup_printf(_("%s was not removed from your buddy " | |
58 "list, because your account (%s) is not logged in."), | |
59 rem_b->name, rem_b->user->username); | |
60 do_error_dialog(_("Buddy Not Removed"), buf, GAIM_ERROR); | |
61 g_free(buf); | |
62 } | |
2382 | 63 } |
64 | |
4349 | 65 void remove_group(struct group *rem_g) |
2382 | 66 { |
4349 | 67 GSList *users; |
2382 | 68 |
4349 | 69 for(users = aim_users; users; users = users->next) { |
70 struct aim_user *user = users->data; | |
71 if(user->gc) { | |
72 GList *tmp = NULL; | |
73 GSList *buds = rem_g->members; | |
74 | |
75 while (buds) { | |
76 struct buddy *delb = (struct buddy *)buds->data; | |
77 buds = buds->next; | |
2382 | 78 |
4349 | 79 if(delb->user == user) { |
80 tmp = g_list_append(tmp, g_strdup(delb->name)); | |
81 remove_buddy(delb); /* this should take care of removing | |
82 the group_show if necessary */ | |
83 } | |
84 } | |
2382 | 85 |
4349 | 86 if(tmp) |
87 serv_remove_buddies(user->gc, tmp, rem_g->name); | |
2382 | 88 |
4349 | 89 while (tmp) { |
90 g_free(tmp->data); | |
91 tmp = g_list_remove(tmp, tmp->data); | |
92 } | |
93 } | |
2382 | 94 } |
95 | |
4349 | 96 if(rem_g->members) { |
97 char *buf = g_strdup_printf(_("%d buddies from group %s were not " | |
98 "removed because their accounts were not logged in. These " | |
99 "buddies, and the group were not removed.\n"), | |
100 g_slist_length(rem_g->members), rem_g->name); | |
101 do_error_dialog(_("Group Not Removed"), buf, GAIM_ERROR); | |
102 g_free(buf); | |
2382 | 103 |
4349 | 104 return; |
2382 | 105 } |
106 | |
4349 | 107 ui_remove_group(rem_g); |
108 | |
109 groups = g_slist_remove(groups, rem_g); | |
2382 | 110 |
111 g_free(rem_g); | |
112 | |
113 /* don't flush buddy list to cache in order to be consistent with remove_buddy, | |
114 * mostly. remove_group is only called from one place, so we'll let it handle it. */ | |
115 } | |
116 | |
4349 | 117 struct buddy *add_buddy(struct aim_user *user, const char *group, const char *buddy, const char *show) |
2382 | 118 { |
119 struct buddy *b; | |
120 struct group *g; | |
3466 | 121 const char *good; |
2382 | 122 |
4349 | 123 if ((b = find_buddy(user, buddy)) != NULL) |
2382 | 124 return b; |
125 | |
4349 | 126 g = find_group(group); |
2382 | 127 |
128 if (g == NULL) | |
4349 | 129 g = add_group(group); |
2382 | 130 |
131 b = (struct buddy *)g_new0(struct buddy, 1); | |
132 | |
133 if (!b) | |
134 return NULL; | |
135 | |
4349 | 136 b->user = user; |
2382 | 137 b->present = 0; |
138 | |
4349 | 139 b->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); |
140 | |
141 good = buddy; | |
2382 | 142 |
143 g_snprintf(b->name, sizeof(b->name), "%s", good); | |
4227 | 144 if(show && show[0]) |
145 g_snprintf(b->alias, sizeof(b->alias), "%s", show); | |
146 else | |
147 b->alias[0] = '\0'; | |
2382 | 148 |
149 g->members = g_slist_append(g->members, b); | |
150 | |
151 b->idle = 0; | |
152 b->caps = 0; | |
153 | |
4349 | 154 ui_add_buddy(user->gc, g, b); |
2382 | 155 |
156 return b; | |
157 } | |
158 | |
4349 | 159 struct group *add_group(const char *group) |
2382 | 160 { |
4349 | 161 struct group *g = find_group(group); |
2382 | 162 if (g) |
163 return g; | |
164 g = (struct group *)g_new0(struct group, 1); | |
165 if (!g) | |
166 return NULL; | |
167 | |
168 strncpy(g->name, group, sizeof(g->name)); | |
4349 | 169 groups = g_slist_append(groups, g); |
2382 | 170 |
171 g->members = NULL; | |
172 | |
4349 | 173 ui_add_group(g); |
2382 | 174 |
175 return g; | |
176 } | |
177 | |
4349 | 178 struct group *find_group(const char *group) |
2382 | 179 { |
180 struct group *g; | |
181 GSList *grp; | |
4349 | 182 char *grpname = g_strdup(normalize(group)); |
2382 | 183 |
4349 | 184 grp = groups; |
185 while (grp) { | |
186 g = (struct group *)grp->data; | |
187 if (!g_strcasecmp(normalize (g->name), grpname)) { | |
188 g_free(grpname); | |
189 return g; | |
2382 | 190 } |
4349 | 191 grp = g_slist_next(grp); |
2382 | 192 } |
4349 | 193 g_free(grpname); |
194 return NULL; | |
2382 | 195 } |
196 | |
4349 | 197 struct group *find_group_by_buddy(struct buddy *b) |
198 { | |
199 GSList *grp = groups; | |
200 | |
201 while(grp) { | |
202 struct group *g = grp->data; | |
203 if(g_slist_find(g->members, b)) | |
204 return g; | |
205 grp = grp->next; | |
206 } | |
207 return NULL; | |
208 } | |
209 | |
210 struct buddy *find_buddy(struct aim_user *user, const char *who) | |
2382 | 211 { |
212 struct group *g; | |
213 struct buddy *b; | |
214 GSList *grp; | |
215 GSList *mem; | |
4349 | 216 char *whoname = NULL; |
2382 | 217 char *(*norm)(const char *); |
218 | |
4349 | 219 grp = groups; |
220 while (grp) { | |
221 g = (struct group *)grp->data; | |
2382 | 222 |
4349 | 223 mem = g->members; |
224 while (mem) { | |
225 b = (struct buddy *)mem->data; | |
226 /* | |
227 norm = (b->user->gc && b->user->gc->prpl->normalize) ? b->user->gc->prpl->normalize : normalize; | |
228 */ | |
229 norm = normalize; | |
230 whoname = g_strdup(norm(who)); | |
231 if ((b->user == user || !user) && !strcmp(norm(b->name), whoname)) { | |
232 g_free(whoname); | |
233 return b; | |
2382 | 234 } |
4349 | 235 g_free(whoname); |
236 mem = mem->next; | |
2382 | 237 } |
4349 | 238 grp = g_slist_next(grp); |
2382 | 239 } |
4349 | 240 return NULL; |
2382 | 241 } |
242 | |
4349 | 243 void parse_toc_buddy_list(struct aim_user *user, char *config) |
2382 | 244 { |
245 char *c; | |
246 char current[256]; | |
4349 | 247 |
2382 | 248 |
249 if (config != NULL) { | |
4349 | 250 |
2382 | 251 /* skip "CONFIG:" (if it exists) */ |
252 c = strncmp(config + 6 /* sizeof(struct sflap_hdr) */ , "CONFIG:", strlen("CONFIG:")) ? | |
2998 | 253 strtok(config, "\n") : |
254 strtok(config + 6 /* sizeof(struct sflap_hdr) */ + strlen("CONFIG:"), "\n"); | |
2382 | 255 do { |
256 if (c == NULL) | |
257 break; | |
258 if (*c == 'g') { | |
259 strncpy(current, c + 2, sizeof(current)); | |
4349 | 260 if (!find_group(current)) { |
261 add_group(current); | |
2526
413a81136e3a
[gaim-migrate @ 2539]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
262 } |
4349 | 263 } else if (*c == 'b' && !find_buddy(user, c + 2)) { |
3136 | 264 char nm[80], sw[BUDDY_ALIAS_MAXLEN], *tmp = c + 2; |
2382 | 265 int i = 0; |
2998 | 266 while (*tmp != ':' && *tmp && i < sizeof(nm) - 1) |
267 nm[i++] = *tmp++; | |
4349 | 268 |
2382 | 269 while (*tmp != ':' && *tmp) |
3048 | 270 tmp++; |
4349 | 271 |
2382 | 272 if (*tmp == ':') |
273 *tmp++ = '\0'; | |
4349 | 274 |
2382 | 275 nm[i] = '\0'; |
276 i = 0; | |
2998 | 277 while (*tmp && i < sizeof(sw) - 1) |
2382 | 278 sw[i++] = *tmp++; |
279 sw[i] = '\0'; | |
4349 | 280 if (!find_buddy(user, nm)) { |
281 add_buddy(user, current, nm, sw); | |
2526
413a81136e3a
[gaim-migrate @ 2539]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
282 } |
2382 | 283 } else if (*c == 'p') { |
4349 | 284 gaim_privacy_permit_add(user, c + 2); |
2382 | 285 } else if (*c == 'd') { |
4349 | 286 gaim_privacy_deny_add(user, c + 2); |
2382 | 287 } else if (!strncmp("toc", c, 3)) { |
4349 | 288 sscanf(c + strlen(c) - 1, "%d", &user->permdeny); |
289 debug_printf("permdeny: %d\n", user->permdeny); | |
290 if (user->permdeny == 0) | |
291 user->permdeny = 1; | |
2382 | 292 } else if (*c == 'm') { |
4349 | 293 sscanf(c + 2, "%d", &user->permdeny); |
294 debug_printf("permdeny: %d\n", user->permdeny); | |
295 if (user->permdeny == 0) | |
296 user->permdeny = 1; | |
2382 | 297 } |
298 } while ((c = strtok(NULL, "\n"))); | |
299 } | |
300 } | |
301 | |
4349 | 302 void toc_build_config(struct aim_user *user, char *s, int len, gboolean show) |
2382 | 303 { |
4349 | 304 GSList *grp = groups; |
2382 | 305 GSList *mem; |
306 struct group *g; | |
307 struct buddy *b; | |
4349 | 308 GSList *plist = user->permit; |
309 GSList *dlist = user->deny; | |
2382 | 310 |
311 int pos = 0; | |
312 | |
4349 | 313 if (!user->permdeny) |
314 user->permdeny = 1; | |
2382 | 315 |
4349 | 316 pos += g_snprintf(&s[pos], len - pos, "m %d\n", user->permdeny); |
2382 | 317 while (len > pos && grp) { |
318 g = (struct group *)grp->data; | |
4349 | 319 if(gaim_group_on_account(g, user)) { |
320 pos += g_snprintf(&s[pos], len - pos, "g %s\n", g->name); | |
321 mem = g->members; | |
322 while (len > pos && mem) { | |
323 b = (struct buddy *)mem->data; | |
324 if(b->user == user) { | |
325 pos += g_snprintf(&s[pos], len - pos, "b %s%s%s\n", b->name, | |
326 (show && b->alias[0]) ? ":" : "", | |
327 (show && b->alias[0]) ? b->alias : ""); | |
328 } | |
329 mem = mem->next; | |
330 } | |
2382 | 331 } |
332 grp = g_slist_next(grp); | |
333 } | |
334 | |
335 while (len > pos && plist) { | |
336 pos += g_snprintf(&s[pos], len - pos, "p %s\n", (char *)plist->data); | |
337 plist = plist->next; | |
338 } | |
339 | |
340 while (len > pos && dlist) { | |
341 pos += g_snprintf(&s[pos], len - pos, "d %s\n", (char *)dlist->data); | |
342 dlist = dlist->next; | |
343 } | |
344 } | |
345 | |
2536
0e0a54e5819a
[gaim-migrate @ 2549]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2526
diff
changeset
|
346 /* translate an AIM 3 buddylist (*.lst) to a Gaim buddylist */ |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
347 static GString *translate_lst(FILE *src_fp) |
2382 | 348 { |
349 char line[BUF_LEN], *line2; | |
350 char *name; | |
351 int i; | |
352 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
353 GString *dest = g_string_new("m 1\n"); |
2382 | 354 |
355 while (fgets(line, BUF_LEN, src_fp)) { | |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
356 line2 = g_strchug(line); |
2382 | 357 if (strstr(line2, "group") == line2) { |
358 name = strpbrk(line2, " \t\n\r\f") + 1; | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
359 dest = g_string_append(dest, "g "); |
2382 | 360 for (i = 0; i < strcspn(name, "\n\r"); i++) |
361 if (name[i] != '\"') | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
362 dest = g_string_append_c(dest, name[i]); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
363 dest = g_string_append_c(dest, '\n'); |
2382 | 364 } |
365 if (strstr(line2, "buddy") == line2) { | |
366 name = strpbrk(line2, " \t\n\r\f") + 1; | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
367 dest = g_string_append(dest, "b "); |
2382 | 368 for (i = 0; i < strcspn(name, "\n\r"); i++) |
369 if (name[i] != '\"') | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
370 dest = g_string_append_c(dest, name[i]); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
371 dest = g_string_append_c(dest, '\n'); |
2382 | 372 } |
373 } | |
374 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
375 return dest; |
2382 | 376 } |
377 | |
378 | |
2536
0e0a54e5819a
[gaim-migrate @ 2549]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2526
diff
changeset
|
379 /* translate an AIM 4 buddylist (*.blt) to Gaim format */ |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
380 static GString *translate_blt(FILE *src_fp) |
2382 | 381 { |
382 int i; | |
383 char line[BUF_LEN]; | |
384 char *buddy; | |
385 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
386 GString *dest = g_string_new("m 1\n"); |
2382 | 387 |
388 while (strstr(fgets(line, BUF_LEN, src_fp), "Buddy") == NULL); | |
389 while (strstr(fgets(line, BUF_LEN, src_fp), "list") == NULL); | |
390 | |
391 while (1) { | |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
392 fgets(line, BUF_LEN, src_fp); g_strchomp(line); |
2382 | 393 if (strchr(line, '}') != NULL) |
394 break; | |
395 | |
396 if (strchr(line, '{') != NULL) { | |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
397 /* Syntax starting with "<group> {" */ |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
398 |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
399 dest = g_string_append(dest, "g "); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
400 buddy = g_strchug(strtok(line, "{")); |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
401 for (i = 0; i < strlen(buddy); i++) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
402 if (buddy[i] != '\"') |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
403 dest = g_string_append_c(dest, buddy[i]); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
404 dest = g_string_append_c(dest, '\n'); |
2382 | 405 while (strchr(fgets(line, BUF_LEN, src_fp), '}') == NULL) { |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
406 gboolean pounce = FALSE; |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
407 char *e; |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
408 g_strchomp(line); |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
409 buddy = g_strchug(line); |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
410 debug_printf("\nbuddy: \"%s\"\n\n", buddy); |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
411 dest = g_string_append(dest, "b "); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
412 if (strchr(buddy, '{') != NULL) { |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
413 /* buddy pounce, etc */ |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
414 char *pos = strchr(buddy, '{') - 1; |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
415 *pos = 0; |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
416 pounce = TRUE; |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
417 } |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
418 if ((e = strchr(buddy, '\"')) != NULL) { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
419 *e = '\0'; |
2382 | 420 buddy++; |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
421 } |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
422 dest = g_string_append(dest, buddy); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
423 dest = g_string_append_c(dest, '\n'); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
424 if (pounce) |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
425 do |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
426 fgets(line, BUF_LEN, src_fp); |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
427 while (!strchr(line, '}')); |
2382 | 428 } |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
429 } else { |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
430 |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
431 /* Syntax "group buddy buddy ..." */ |
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
432 buddy = g_strchug(strtok(line, " \n")); |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
433 dest = g_string_append(dest, "g "); |
2382 | 434 if (strchr(buddy, '\"') != NULL) { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
435 dest = g_string_append(dest, &buddy[1]); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
436 dest = g_string_append_c(dest, ' '); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
437 buddy = g_strchug(strtok(NULL, " \n")); |
2382 | 438 while (strchr(buddy, '\"') == NULL) { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
439 dest = g_string_append(dest, buddy); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
440 dest = g_string_append_c(dest, ' '); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
441 buddy = g_strchug(strtok(NULL, " \n")); |
2382 | 442 } |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
443 buddy[strlen(buddy) - 1] = '\0'; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
444 dest = g_string_append(dest, buddy); |
2382 | 445 } else { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
446 dest = g_string_append(dest, buddy); |
2382 | 447 } |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
448 dest = g_string_append_c(dest, '\n'); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
449 while ((buddy = g_strchug(strtok(NULL, " \n"))) != NULL) { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
450 dest = g_string_append(dest, "b "); |
2382 | 451 if (strchr(buddy, '\"') != NULL) { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
452 dest = g_string_append(dest, &buddy[1]); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
453 dest = g_string_append_c(dest, ' '); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
454 buddy = g_strchug(strtok(NULL, " \n")); |
2382 | 455 while (strchr(buddy, '\"') == NULL) { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
456 dest = g_string_append(dest, buddy); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
457 dest = g_string_append_c(dest, ' '); |
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
458 buddy = g_strchug(strtok(NULL, " \n")); |
2382 | 459 } |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
460 buddy[strlen(buddy) - 1] = '\0'; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
461 dest = g_string_append(dest, buddy); |
2382 | 462 } else { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
463 dest = g_string_append(dest, buddy); |
2382 | 464 } |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
465 dest = g_string_append_c(dest, '\n'); |
2382 | 466 } |
467 } | |
468 } | |
469 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
470 return dest; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
471 } |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
472 |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
473 static GString *translate_gnomeicu(FILE *src_fp) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
474 { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
475 char line[BUF_LEN]; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
476 GString *dest = g_string_new("m 1\ng Buddies\n"); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
477 |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
478 while (strstr(fgets(line, BUF_LEN, src_fp), "NewContacts") == NULL); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
479 |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
480 while (fgets(line, BUF_LEN, src_fp)) { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
481 char *eq; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
482 g_strchomp(line); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
483 if (line[0] == '\n' || line[0] == '[') |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
484 break; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
485 eq = strchr(line, '='); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
486 if (!eq) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
487 break; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
488 *eq = ':'; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
489 eq = strchr(eq, ','); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
490 if (eq) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
491 *eq = '\0'; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
492 dest = g_string_append(dest, "b "); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
493 dest = g_string_append(dest, line); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
494 dest = g_string_append_c(dest, '\n'); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
495 } |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
496 |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
497 return dest; |
2382 | 498 } |
499 | |
500 static gchar *get_screenname_filename(const char *name) | |
501 { | |
502 gchar **split; | |
503 gchar *good; | |
504 | |
505 split = g_strsplit(name, G_DIR_SEPARATOR_S, -1); | |
506 good = g_strjoinv(NULL, split); | |
507 g_strfreev(split); | |
508 | |
509 g_strup(good); | |
510 | |
511 return good; | |
512 } | |
513 | |
4349 | 514 static gboolean gaim_blist_read(const char *filename); |
2382 | 515 |
4349 | 516 void do_import(struct aim_user *user, const char *filename) |
2382 | 517 { |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
518 GString *buf = NULL; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
519 char first[64]; |
2382 | 520 char path[PATHSIZE]; |
521 int len; | |
522 FILE *f; | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
523 struct stat st; |
2382 | 524 |
525 if (filename) { | |
526 g_snprintf(path, sizeof(path), "%s", filename); | |
527 } else { | |
4349 | 528 char *g_screenname = get_screenname_filename(user->username); |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
529 char *file = gaim_user_dir(); |
4349 | 530 int protocol = (user->protocol == PROTO_OSCAR) ? (isalpha(user->username[0]) ? PROTO_TOC : PROTO_ICQ): user->protocol; |
2382 | 531 |
532 if (file != (char *)NULL) { | |
4349 | 533 sprintf(path, "%s" G_DIR_SEPARATOR_S "%s.%d.blist", file, g_screenname, protocol); |
2382 | 534 g_free(g_screenname); |
535 } else { | |
536 g_free(g_screenname); | |
537 return; | |
538 } | |
539 } | |
540 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
541 if (stat(path, &st)) { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
542 debug_printf("Unable to stat %s.\n", path); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
543 return; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
544 } |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
545 |
2382 | 546 if (!(f = fopen(path, "r"))) { |
547 debug_printf("Unable to open %s.\n", path); | |
548 return; | |
549 } | |
550 | |
551 fgets(first, 64, f); | |
552 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
553 if ((first[0] == '\n') || (first[0] == '\r' && first[1] == '\n')) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
554 fgets(first, 64, f); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
555 |
4349 | 556 if (!g_strncasecmp(first, "<xml", strlen("<xml"))) { |
557 /* new gaim XML buddy list */ | |
558 gaim_blist_read(path); | |
559 } else if (!g_strncasecmp(first, "Config {", strlen("Config {"))) { | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
560 /* AIM 4 buddy list */ |
2382 | 561 debug_printf("aim 4\n"); |
562 rewind(f); | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
563 buf = translate_blt(f); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
564 } else if (strstr(first, "group") != NULL) { |
2382 | 565 /* AIM 3 buddy list */ |
566 debug_printf("aim 3\n"); | |
567 rewind(f); | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
568 buf = translate_lst(f); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
569 } else if (!g_strncasecmp(first, "[User]", strlen("[User]"))) { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
570 /* GnomeICU (hopefully) */ |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
571 debug_printf("gnomeicu\n"); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
572 rewind(f); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
573 buf = translate_gnomeicu(f); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
574 } else if (first[0] == 'm') { |
2536
0e0a54e5819a
[gaim-migrate @ 2549]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2526
diff
changeset
|
575 /* Gaim buddy list - no translation */ |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
576 char buf2[BUF_LONG * 2]; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
577 buf = g_string_new(""); |
2382 | 578 rewind(f); |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
579 while (1) { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
580 len = fread(buf2, 1, BUF_LONG * 2 - 1, f); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
581 if (len <= 0) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
582 break; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
583 buf2[len] = '\0'; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
584 buf = g_string_append(buf, buf2); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
585 if (len != BUF_LONG * 2 - 1) |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
586 break; |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
587 } |
2382 | 588 } |
589 | |
590 fclose(f); | |
591 | |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
592 if (buf) { |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
593 buf = g_string_prepend(buf, "toc_set_config {"); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
594 buf = g_string_append(buf, "}\n"); |
4349 | 595 parse_toc_buddy_list(user, buf->str); |
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
596 g_string_free(buf, TRUE); |
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
597 } |
2382 | 598 } |
599 | |
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
600 static gboolean is_blocked(struct buddy *b) |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
601 { |
4349 | 602 struct aim_user *user = b->user; |
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
603 |
4349 | 604 if (user->permdeny == PERMIT_ALL) |
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
605 return FALSE; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
606 |
4349 | 607 if (user->permdeny == PERMIT_NONE) { |
608 if (user->gc && g_strcasecmp(b->name, user->gc->username)) | |
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
609 return TRUE; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
610 else |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
611 return FALSE; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
612 } |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
613 |
4349 | 614 if (user->permdeny == PERMIT_SOME) { |
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
615 char *x = g_strdup(normalize(b->name)); |
4349 | 616 GSList *s = user->permit; |
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
617 while (s) { |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
618 if (!g_strcasecmp(x, normalize(s->data))) |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
619 break; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
620 s = s->next; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
621 } |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
622 g_free(x); |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
623 if (s) |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
624 return FALSE; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
625 return TRUE; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
626 } |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
627 |
4349 | 628 if (user->permdeny == DENY_SOME) { |
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
629 char *x = g_strdup(normalize(b->name)); |
4349 | 630 GSList *s = user->deny; |
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
631 while (s) { |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
632 if (!g_strcasecmp(x, normalize(s->data))) |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
633 break; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
634 s = s->next; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
635 } |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
636 g_free(x); |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
637 if (s) |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
638 return TRUE; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
639 return FALSE; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
640 } |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
641 |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
642 return FALSE; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
643 } |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
644 |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
645 void signoff_blocked(struct gaim_connection *gc) |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
646 { |
4349 | 647 GSList *g = groups; |
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
648 while (g) { |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
649 GSList *m = ((struct group *)g->data)->members; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
650 while (m) { |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
651 struct buddy *b = m->data; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
652 if (is_blocked(b)) |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
653 serv_got_update(gc, b->name, 0, 0, 0, 0, 0, 0); |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
654 m = m->next; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
655 } |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
656 g = g->next; |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
657 } |
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
658 } |
4227 | 659 |
660 char *get_buddy_alias_only(struct buddy *b) { | |
661 if(!b) | |
662 return NULL; | |
663 if(b->alias[0]) | |
664 return b->alias; | |
665 else if((misc_options & OPT_MISC_USE_SERVER_ALIAS) && b->server_alias[0]) | |
666 return b->server_alias; | |
667 return NULL; | |
668 } | |
669 | |
670 | |
671 char *get_buddy_alias(struct buddy *b) { | |
672 char *ret = get_buddy_alias_only(b); | |
673 if(!ret) | |
674 return b ? b->name : _("Unknown"); | |
675 return ret; | |
676 } | |
677 | |
4349 | 678 GSList *gaim_group_get_accounts(struct group *g) { |
679 GSList *buds = g->members; | |
680 GSList *ret = NULL; | |
681 while(buds) { | |
682 struct buddy *b = buds->data; | |
683 if(!g_slist_find(ret, b->user)) | |
684 ret = g_slist_append(ret, b->user); | |
685 buds = buds->next; | |
686 } | |
687 return ret; | |
688 } | |
689 | |
690 gboolean gaim_group_on_account(struct group *g, struct aim_user *user) { | |
691 GSList *buds = g->members; | |
692 while(buds) { | |
693 struct buddy *b = buds->data; | |
694 if((!user && b->user->gc) || b->user == user) | |
695 return TRUE; | |
696 buds = buds->next; | |
697 } | |
698 return FALSE; | |
699 } | |
700 | |
701 | |
702 static char *blist_parser_group_name = NULL; | |
703 static char *blist_parser_person_name = NULL; | |
704 static char *blist_parser_account_name = NULL; | |
705 static int blist_parser_account_protocol = 0; | |
706 static char *blist_parser_buddy_name = NULL; | |
707 static char *blist_parser_buddy_alias = NULL; | |
708 static char *blist_parser_setting_name = NULL; | |
709 static char *blist_parser_setting_value = NULL; | |
710 static GHashTable *blist_parser_buddy_settings = NULL; | |
711 static int blist_parser_privacy_mode = 0; | |
712 static enum { | |
713 BLIST_TAG_GAIM, | |
714 BLIST_TAG_BLIST, | |
715 BLIST_TAG_GROUP, | |
716 BLIST_TAG_PERSON, | |
717 BLIST_TAG_BUDDY, | |
718 BLIST_TAG_NAME, | |
719 BLIST_TAG_ALIAS, | |
720 BLIST_TAG_SETTING, | |
721 BLIST_TAG_PRIVACY, | |
722 BLIST_TAG_ACCOUNT, | |
723 BLIST_TAG_PERMIT, | |
724 BLIST_TAG_BLOCK, | |
725 BLIST_TAG_IGNORE | |
726 } blist_parser_current_tag; | |
727 | |
728 static void blist_start_element_handler (GMarkupParseContext *context, | |
729 const gchar *element_name, | |
730 const gchar **attribute_names, | |
731 const gchar **attribute_values, | |
732 gpointer user_data, | |
733 GError **error) { | |
734 int i; | |
735 | |
736 if(!strcmp(element_name, "gaim")) { | |
737 blist_parser_current_tag = BLIST_TAG_GAIM; | |
738 } else if(!strcmp(element_name, "blist")) { | |
739 blist_parser_current_tag = BLIST_TAG_BLIST; | |
740 } else if(!strcmp(element_name, "group")) { | |
741 blist_parser_current_tag = BLIST_TAG_GROUP; | |
742 for(i=0; attribute_names[i]; i++) { | |
743 if(!strcmp(attribute_names[i], "name")) | |
744 blist_parser_group_name = g_strdup(attribute_values[i]); | |
745 } | |
746 if(blist_parser_group_name) { | |
747 add_group(blist_parser_group_name); | |
748 } | |
749 } else if(!strcmp(element_name, "person")) { | |
750 blist_parser_current_tag = BLIST_TAG_PERSON; | |
751 for(i=0; attribute_names[i]; i++) { | |
752 if(!strcmp(attribute_names[i], "name")) | |
753 blist_parser_person_name = g_strdup(attribute_values[i]); | |
754 } | |
755 } else if(!strcmp(element_name, "buddy")) { | |
756 blist_parser_current_tag = BLIST_TAG_BUDDY; | |
757 for(i=0; attribute_names[i]; i++) { | |
758 if(!strcmp(attribute_names[i], "account")) | |
759 blist_parser_account_name = g_strdup(attribute_values[i]); | |
760 else if(!strcmp(attribute_names[i], "protocol")) | |
761 blist_parser_account_protocol = atoi(attribute_values[i]); | |
762 } | |
763 } else if(!strcmp(element_name, "name")) { | |
764 blist_parser_current_tag = BLIST_TAG_NAME; | |
765 } else if(!strcmp(element_name, "alias")) { | |
766 blist_parser_current_tag = BLIST_TAG_ALIAS; | |
767 } else if(!strcmp(element_name, "setting")) { | |
768 blist_parser_current_tag = BLIST_TAG_SETTING; | |
769 for(i=0; attribute_names[i]; i++) { | |
770 if(!strcmp(attribute_names[i], "name")) | |
771 blist_parser_setting_name = g_strdup(attribute_values[i]); | |
772 } | |
773 } else if(!strcmp(element_name, "privacy")) { | |
774 blist_parser_current_tag = BLIST_TAG_PRIVACY; | |
775 } else if(!strcmp(element_name, "account")) { | |
776 blist_parser_current_tag = BLIST_TAG_ACCOUNT; | |
777 for(i=0; attribute_names[i]; i++) { | |
778 if(!strcmp(attribute_names[i], "protocol")) | |
779 blist_parser_account_protocol = atoi(attribute_values[i]); | |
780 else if(!strcmp(attribute_names[i], "mode")) | |
781 blist_parser_privacy_mode = atoi(attribute_values[i]); | |
782 else if(!strcmp(attribute_names[i], "name")) | |
783 blist_parser_account_name = g_strdup(attribute_values[i]); | |
784 } | |
785 } else if(!strcmp(element_name, "permit")) { | |
786 blist_parser_current_tag = BLIST_TAG_PERMIT; | |
787 } else if(!strcmp(element_name, "block")) { | |
788 blist_parser_current_tag = BLIST_TAG_BLOCK; | |
789 } else if(!strcmp(element_name, "ignore")) { | |
790 blist_parser_current_tag = BLIST_TAG_IGNORE; | |
791 } | |
792 } | |
793 | |
794 static void blist_end_element_handler(GMarkupParseContext *context, | |
795 const gchar *element_name, gpointer user_data, GError **error) { | |
796 if(!strcmp(element_name, "gaim")) { | |
797 } else if(!strcmp(element_name, "blist")) { | |
798 blist_parser_current_tag = BLIST_TAG_GAIM; | |
799 } else if(!strcmp(element_name, "group")) { | |
800 blist_parser_current_tag = BLIST_TAG_BLIST; | |
801 } else if(!strcmp(element_name, "person")) { | |
802 blist_parser_current_tag = BLIST_TAG_GROUP; | |
803 g_free(blist_parser_person_name); | |
804 blist_parser_person_name = NULL; | |
805 } else if(!strcmp(element_name, "buddy")) { | |
806 struct aim_user *user = find_user(blist_parser_account_name, | |
807 blist_parser_account_protocol); | |
808 if(user) { | |
809 struct buddy *b = add_buddy(user, blist_parser_group_name, | |
810 blist_parser_buddy_name, blist_parser_buddy_alias); | |
811 if(blist_parser_buddy_settings) { | |
812 g_hash_table_destroy(b->settings); | |
813 b->settings = blist_parser_buddy_settings; | |
814 } | |
815 } | |
816 blist_parser_current_tag = BLIST_TAG_PERSON; | |
817 g_free(blist_parser_buddy_name); | |
818 blist_parser_buddy_name = NULL; | |
819 g_free(blist_parser_buddy_alias); | |
820 blist_parser_buddy_alias = NULL; | |
821 g_free(blist_parser_account_name); | |
822 blist_parser_account_name = NULL; | |
823 blist_parser_buddy_settings = NULL; | |
824 } else if(!strcmp(element_name, "name")) { | |
825 blist_parser_current_tag = BLIST_TAG_BUDDY; | |
826 } else if(!strcmp(element_name, "alias")) { | |
827 blist_parser_current_tag = BLIST_TAG_BUDDY; | |
828 } else if(!strcmp(element_name, "setting")) { | |
829 if(!blist_parser_buddy_settings) | |
830 blist_parser_buddy_settings = g_hash_table_new_full(g_str_hash, | |
831 g_str_equal, g_free, g_free); | |
832 if(blist_parser_setting_name && blist_parser_setting_value) { | |
833 g_hash_table_replace(blist_parser_buddy_settings, | |
834 g_strdup(blist_parser_setting_name), | |
835 g_strdup(blist_parser_setting_value)); | |
836 } | |
837 g_free(blist_parser_setting_name); | |
838 g_free(blist_parser_setting_value); | |
839 blist_parser_current_tag = BLIST_TAG_BUDDY; | |
840 } else if(!strcmp(element_name, "privacy")) { | |
841 blist_parser_current_tag = BLIST_TAG_GAIM; | |
842 } else if(!strcmp(element_name, "account")) { | |
843 struct aim_user *user = find_user(blist_parser_account_name, | |
844 blist_parser_account_protocol); | |
845 if(user) { | |
846 user->permdeny = blist_parser_privacy_mode; | |
847 } | |
848 blist_parser_current_tag = BLIST_TAG_PRIVACY; | |
849 g_free(blist_parser_account_name); | |
850 blist_parser_account_name = NULL; | |
851 } else if(!strcmp(element_name, "permit")) { | |
852 struct aim_user *user = find_user(blist_parser_account_name, | |
853 blist_parser_account_protocol); | |
854 if(user) { | |
855 gaim_privacy_permit_add(user, blist_parser_buddy_name); | |
856 } | |
857 blist_parser_current_tag = BLIST_TAG_ACCOUNT; | |
858 } else if(!strcmp(element_name, "block")) { | |
859 struct aim_user *user = find_user(blist_parser_account_name, | |
860 blist_parser_account_protocol); | |
861 if(user) { | |
862 gaim_privacy_deny_add(user, blist_parser_buddy_name); | |
863 } | |
864 blist_parser_current_tag = BLIST_TAG_ACCOUNT; | |
865 } else if(!strcmp(element_name, "ignore")) { | |
866 /* we'll apparently do something with this later */ | |
867 blist_parser_current_tag = BLIST_TAG_ACCOUNT; | |
868 } | |
869 } | |
870 | |
871 static void blist_text_handler(GMarkupParseContext *context, const gchar *text, | |
872 gsize text_len, gpointer user_data, GError **error) { | |
873 switch(blist_parser_current_tag) { | |
874 case BLIST_TAG_NAME: | |
875 blist_parser_buddy_name = g_strndup(text, text_len); | |
876 break; | |
877 case BLIST_TAG_ALIAS: | |
878 blist_parser_buddy_alias = g_strndup(text, text_len); | |
879 break; | |
880 case BLIST_TAG_PERMIT: | |
881 case BLIST_TAG_BLOCK: | |
882 case BLIST_TAG_IGNORE: | |
883 blist_parser_buddy_name = g_strndup(text, text_len); | |
884 break; | |
885 case BLIST_TAG_SETTING: | |
886 blist_parser_setting_value = g_strndup(text, text_len); | |
887 break; | |
888 default: | |
889 break; | |
890 } | |
891 } | |
892 | |
893 static GMarkupParser blist_parser = { | |
894 blist_start_element_handler, | |
895 blist_end_element_handler, | |
896 blist_text_handler, | |
897 NULL, | |
898 NULL | |
899 }; | |
900 | |
901 static gboolean gaim_blist_read(const char *filename) { | |
902 gchar *contents; | |
903 gsize length; | |
904 GMarkupParseContext *context; | |
905 GError *error = NULL; | |
906 if(!g_file_get_contents(filename, &contents, &length, &error)) { | |
907 debug_printf("error reading blist: %s\n", error->message); | |
908 g_error_free(error); | |
909 return FALSE; | |
910 } | |
911 | |
912 context = g_markup_parse_context_new(&blist_parser, 0, NULL, NULL); | |
913 | |
914 if(!g_markup_parse_context_parse(context, contents, length, NULL)) { | |
915 g_markup_parse_context_free(context); | |
916 return FALSE; | |
917 } | |
918 | |
919 if(!g_markup_parse_context_end_parse(context, NULL)) { | |
920 debug_printf("error parsing blist\n"); | |
921 g_markup_parse_context_free(context); | |
922 return FALSE; | |
923 } | |
924 | |
925 g_markup_parse_context_free(context); | |
926 return TRUE; | |
927 } | |
928 | |
929 void gaim_blist_load() { | |
930 GSList *accts; | |
931 char *user_dir = gaim_user_dir(); | |
932 char *filename; | |
933 char *msg; | |
934 | |
935 if(!user_dir) | |
936 return; | |
937 | |
938 filename = g_build_filename(user_dir, "blist.xml", NULL); | |
939 | |
940 if(g_file_test(filename, G_FILE_TEST_EXISTS)) { | |
941 if(!gaim_blist_read(filename)) { | |
942 msg = g_strdup_printf(_("An error was encountered parsing your " | |
943 "buddy list. It has not been loaded.")); | |
944 do_error_dialog(_("Buddy List Error"), msg, GAIM_ERROR); | |
945 g_free(msg); | |
946 } | |
947 } else { | |
948 /* rob wants to inform the user that their buddy lists are | |
949 * being converted */ | |
950 msg = g_strdup_printf(_("Gaim is converting your old buddy lists " | |
951 "to a new format, which will now be located at %s"), | |
952 filename); | |
953 do_error_dialog(_("Converting Buddy List"), msg, GAIM_INFO); | |
954 g_free(msg); | |
955 | |
956 /* now, let gtk actually display the dialog before we start anything */ | |
957 while(gtk_events_pending()) | |
958 gtk_main_iteration(); | |
959 | |
960 /* read in the old lists, then save to the new format */ | |
961 for(accts = aim_users; accts; accts = accts->next) { | |
962 do_import(accts->data, NULL); | |
963 } | |
964 gaim_blist_save(); | |
965 } | |
966 | |
967 g_free(filename); | |
968 } | |
969 | |
970 static void blist_print_buddy_settings(gpointer key, gpointer data, | |
971 gpointer user_data) { | |
972 char *key_val = g_markup_escape_text(key, -1); | |
973 char *data_val = g_markup_escape_text(data, -1); | |
974 FILE *file = user_data; | |
975 fprintf(file, "\t\t\t\t\t<setting name=\"%s\">%s</setting>\n", key_val, | |
976 data_val); | |
977 g_free(key_val); | |
978 g_free(data_val); | |
979 } | |
980 | |
981 static void gaim_blist_write(FILE *file, struct aim_user *user) { | |
982 GSList *grps, *buds, *users; | |
983 fprintf(file, "<?xml version='1.0' encoding='UTF-8' ?>\n"); | |
984 fprintf(file, "<gaim version=\"1\">\n"); | |
985 fprintf(file, "\t<blist>\n"); | |
986 | |
987 for(grps = groups; grps; grps = grps->next) { | |
988 struct group *g = grps->data; | |
989 if(!user || gaim_group_on_account(g, user)) { | |
990 char *group_name = g_markup_escape_text(g->name, -1); | |
991 fprintf(file, "\t\t<group name=\"%s\">\n", group_name); | |
992 for(buds = g->members; buds; buds = buds->next) { | |
993 struct buddy *b = buds->data; | |
994 if(!user || b->user == user) { | |
995 char *bud_name = g_markup_escape_text(b->name, -1); | |
996 char *bud_alias = NULL; | |
997 char *acct_name = g_markup_escape_text(b->user->username, -1); | |
998 if(b->alias[0]) | |
999 bud_alias= g_markup_escape_text(b->alias, -1); | |
1000 fprintf(file, "\t\t\t<person name=\"%s\">\n", | |
1001 bud_alias ? bud_alias : bud_name); | |
1002 fprintf(file, "\t\t\t\t<buddy protocol=\"%d\" " | |
1003 "account=\"%s\">\n", b->user->protocol, | |
1004 acct_name); | |
1005 fprintf(file, "\t\t\t\t\t<name>%s</name>\n", bud_name); | |
1006 if(bud_alias) { | |
1007 fprintf(file, "\t\t\t\t\t<alias>%s</alias>\n", | |
1008 bud_alias); | |
1009 } | |
1010 g_hash_table_foreach(b->settings, | |
1011 blist_print_buddy_settings, file); | |
1012 fprintf(file, "\t\t\t\t</buddy>\n"); | |
1013 fprintf(file, "\t\t\t</person>\n"); | |
1014 g_free(bud_name); | |
1015 g_free(bud_alias); | |
1016 g_free(acct_name); | |
1017 } | |
1018 } | |
1019 fprintf(file, "\t\t</group>\n"); | |
1020 g_free(group_name); | |
1021 } | |
1022 } | |
1023 | |
1024 fprintf(file, "\t</blist>\n"); | |
1025 fprintf(file, "\t<privacy>\n"); | |
1026 | |
1027 for(users = aim_users; users; users = users->next) { | |
1028 struct aim_user *usr = users->data; | |
1029 char *acct_name = g_markup_escape_text(usr->username, -1); | |
1030 if(!user || usr == user) { | |
1031 fprintf(file, "\t\t<account protocol=\"%d\" name=\"%s\" " | |
1032 "mode=\"%d\">\n", usr->protocol, acct_name, usr->permdeny); | |
1033 for(buds = usr->permit; buds; buds = buds->next) { | |
1034 char *bud_name = g_markup_escape_text(buds->data, -1); | |
1035 fprintf(file, "\t\t\t<permit>%s</permit>\n", bud_name); | |
1036 g_free(bud_name); | |
1037 } | |
1038 for(buds = usr->deny; buds; buds = buds->next) { | |
1039 char *bud_name = g_markup_escape_text(buds->data, -1); | |
1040 fprintf(file, "\t\t\t<block>%s</block>\n", bud_name); | |
1041 g_free(bud_name); | |
1042 } | |
1043 fprintf(file, "\t\t</account>\n"); | |
1044 } | |
1045 } | |
1046 | |
1047 fprintf(file, "\t</privacy>\n"); | |
1048 fprintf(file, "</gaim>\n"); | |
1049 } | |
1050 | |
1051 void gaim_blist_save() { | |
1052 FILE *file; | |
1053 char *user_dir = gaim_user_dir(); | |
1054 char *filename; | |
1055 | |
1056 if(!user_dir) | |
1057 return; | |
1058 | |
1059 file = fopen(user_dir, "r"); | |
1060 if(!file) | |
1061 mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); | |
1062 else | |
1063 fclose(file); | |
1064 | |
1065 filename = g_build_filename(user_dir, "blist.xml", NULL); | |
1066 | |
1067 if((file = fopen(filename, "w"))) { | |
1068 gaim_blist_write(file, NULL); | |
1069 fclose(file); | |
1070 chmod(filename, S_IRUSR | S_IWUSR); | |
1071 } else { | |
1072 debug_printf("unable to write %s\n", filename); | |
1073 } | |
1074 | |
1075 g_free(filename); | |
1076 } | |
1077 | |
1078 gboolean gaim_privacy_permit_add(struct aim_user *user, const char *who) { | |
1079 GSList *d = user->permit; | |
1080 char *n = g_strdup(normalize(who)); | |
1081 while(d) { | |
1082 if(!g_strcasecmp(n, normalize(d->data))) | |
1083 break; | |
1084 d = d->next; | |
1085 } | |
1086 g_free(n); | |
1087 if(!d) { | |
1088 user->permit = g_slist_append(user->permit, g_strdup(who)); | |
1089 return TRUE; | |
1090 } | |
1091 | |
1092 return FALSE; | |
1093 } | |
1094 | |
1095 gboolean gaim_privacy_permit_remove(struct aim_user *user, const char *who) { | |
1096 GSList *d = user->permit; | |
1097 char *n = g_strdup(normalize(who)); | |
1098 while(d) { | |
1099 if(!g_strcasecmp(n, normalize(d->data))) | |
1100 break; | |
1101 d = d->next; | |
1102 } | |
1103 g_free(n); | |
1104 if(d) { | |
1105 user->permit = g_slist_remove(user->permit, d->data); | |
1106 g_free(d->data); | |
1107 return TRUE; | |
1108 } | |
1109 return FALSE; | |
1110 } | |
1111 | |
1112 gboolean gaim_privacy_deny_add(struct aim_user *user, const char *who) { | |
1113 GSList *d = user->deny; | |
1114 char *n = g_strdup(normalize(who)); | |
1115 while(d) { | |
1116 if(!g_strcasecmp(n, normalize(d->data))) | |
1117 break; | |
1118 d = d->next; | |
1119 } | |
1120 g_free(n); | |
1121 if(!d) { | |
1122 user->deny = g_slist_append(user->deny, g_strdup(who)); | |
1123 return TRUE; | |
1124 } | |
1125 | |
1126 return FALSE; | |
1127 } | |
1128 | |
1129 gboolean gaim_privacy_deny_remove(struct aim_user *user, const char *who) { | |
1130 GSList *d = user->deny; | |
1131 char *n = g_strdup(normalize(who)); | |
1132 while(d) { | |
1133 if(!g_strcasecmp(n, normalize(d->data))) | |
1134 break; | |
1135 d = d->next; | |
1136 } | |
1137 g_free(n); | |
1138 if(d) { | |
1139 user->deny = g_slist_remove(user->deny, d->data); | |
1140 g_free(d->data); | |
1141 return TRUE; | |
1142 } | |
1143 return FALSE; | |
1144 } | |
1145 | |
1146 void gaim_buddy_set_setting(struct buddy *b, const char *key, | |
1147 const char *value) { | |
1148 if(!b) | |
1149 return; | |
1150 g_hash_table_replace(b->settings, g_strdup(key), g_strdup(value)); | |
1151 } | |
1152 | |
1153 char *gaim_buddy_get_setting(struct buddy *b, const char *key) { | |
1154 if(!b) | |
1155 return NULL; | |
1156 return g_strdup(g_hash_table_lookup(b->settings, key)); | |
1157 } |