Mercurial > pidgin
annotate src/list.c @ 4469:d76095396a0e
[gaim-migrate @ 4744]
Phase 2 of the conversation rewrite! Did you think I was done?
Okay everybody, the prefs page was slightly redesigned. Not much, though.
It needs an overhaul, and still, not everything works.. What we have now
is:
Conversations
|
|- IMs
|- Chats
`- Tabs
But that's not the good part of this patch. Oh no, not close. You see, in
Conversations, we now have a "Placement" drop-down box. Though this prefs
page is ugly and will eventually be redesigned, this gives you the
opportunity to set one of a number of different types of conversation
placement options.
The defaults are:
- Last created window: Adds the new conversation to the last created
window, like how things have been lately.
- New window: Adds the new conversation to a brand new window, every
time. Tabs are still there, so you can drag them between windows if you
want to manually group them.
- By group: This is my new favorite. This will put the new conversation
in whatever window it finds first that has another member from that
same group on your buddy list. If it doesn't find one, it creates a new
window. If the person you IM'd or the person who IM'd you is not on your
list, it gets put in a window with other people not on your list.
These are the only ones implemented, but don't think you're limited to
that. You see, we have new API functions for registering these
Conversation Placement functions. All a plugin would need to do is to write
a function, take into account OPT_CONVO_COMBINE (oh yeah, "Show IMs and
chats in same tabbed window" works again), make sure the conversation is
added _somewhere_, and then just register that function. If the plugin is
loaded, the user can select it from the existing drop-down box.
Cool, huh? Make sure to unregister the function when the plugin is
unloaded.
Have fun.
committer: Tailor Script <tailor@pidgin.im>
| author | Christian Hammond <chipx86@chipx86.com> |
|---|---|
| date | Thu, 30 Jan 2003 09:22:15 +0000 |
| parents | a46c57f2d58b |
| children | 3196d9044a45 |
| 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]; | |
| 4351 | 247 GList *bud = NULL; |
| 4349 | 248 |
| 2382 | 249 |
| 250 if (config != NULL) { | |
| 4349 | 251 |
| 2382 | 252 /* skip "CONFIG:" (if it exists) */ |
| 253 c = strncmp(config + 6 /* sizeof(struct sflap_hdr) */ , "CONFIG:", strlen("CONFIG:")) ? | |
| 2998 | 254 strtok(config, "\n") : |
| 255 strtok(config + 6 /* sizeof(struct sflap_hdr) */ + strlen("CONFIG:"), "\n"); | |
| 2382 | 256 do { |
| 257 if (c == NULL) | |
| 258 break; | |
| 259 if (*c == 'g') { | |
| 4404 | 260 char *utf8 = NULL; |
| 4458 | 261 utf8 = gaim_try_conv_to_utf8(c + 2); |
| 4404 | 262 if (utf8 == NULL) { |
| 263 g_strlcpy(current, _("Invalid Groupname"), sizeof(current)); | |
| 264 } else { | |
| 265 g_strlcpy(current, utf8, sizeof(current)); | |
| 266 g_free(utf8); | |
| 267 } | |
| 4349 | 268 if (!find_group(current)) { |
| 269 add_group(current); | |
|
2526
413a81136e3a
[gaim-migrate @ 2539]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
270 } |
| 4404 | 271 } else if (*c == 'b') { /*&& !find_buddy(user, c + 2)) {*/ |
| 4408 | 272 char nm[80], sw[BUDDY_ALIAS_MAXLEN], *a, *utf8 = NULL; |
| 273 | |
| 4404 | 274 if ((a = strchr(c + 2, ':')) != NULL) { |
| 275 *a++ = '\0'; /* nul the : */ | |
| 276 } | |
| 4349 | 277 |
| 4404 | 278 g_strlcpy(nm, c + 2, sizeof(nm)); |
| 279 if (a) { | |
| 4458 | 280 utf8 = gaim_try_conv_to_utf8(a); |
| 4404 | 281 if (utf8 == NULL) { |
| 282 debug_printf ("Failed to convert alias for '%s' to UTF-8\n", nm); | |
| 283 } | |
| 284 } | |
| 285 if (utf8 == NULL) { | |
| 286 sw[0] = '\0'; | |
| 287 } else { | |
| 288 /* This can leave a partial sequence at the end, | |
| 289 * but who cares? */ | |
| 290 g_strlcpy(sw, utf8, sizeof(sw)); | |
| 291 g_free(utf8); | |
| 292 } | |
| 293 | |
| 4349 | 294 if (!find_buddy(user, nm)) { |
| 295 add_buddy(user, current, nm, sw); | |
| 4404 | 296 bud = g_list_append(bud, nm); |
|
2526
413a81136e3a
[gaim-migrate @ 2539]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
297 } |
| 2382 | 298 } else if (*c == 'p') { |
| 4349 | 299 gaim_privacy_permit_add(user, c + 2); |
| 2382 | 300 } else if (*c == 'd') { |
| 4349 | 301 gaim_privacy_deny_add(user, c + 2); |
| 2382 | 302 } else if (!strncmp("toc", c, 3)) { |
| 4349 | 303 sscanf(c + strlen(c) - 1, "%d", &user->permdeny); |
| 304 debug_printf("permdeny: %d\n", user->permdeny); | |
| 305 if (user->permdeny == 0) | |
| 306 user->permdeny = 1; | |
| 2382 | 307 } else if (*c == 'm') { |
| 4349 | 308 sscanf(c + 2, "%d", &user->permdeny); |
| 309 debug_printf("permdeny: %d\n", user->permdeny); | |
| 310 if (user->permdeny == 0) | |
| 311 user->permdeny = 1; | |
| 2382 | 312 } |
| 313 } while ((c = strtok(NULL, "\n"))); | |
| 4351 | 314 |
| 315 if(user->gc) { | |
| 316 if(bud) | |
| 317 serv_add_buddies(user->gc, bud); | |
| 318 serv_set_permit_deny(user->gc); | |
| 319 } | |
| 320 g_list_free(bud); | |
| 2382 | 321 } |
| 322 } | |
| 323 | |
| 4349 | 324 void toc_build_config(struct aim_user *user, char *s, int len, gboolean show) |
| 2382 | 325 { |
| 4349 | 326 GSList *grp = groups; |
| 2382 | 327 GSList *mem; |
| 328 struct group *g; | |
| 329 struct buddy *b; | |
| 4349 | 330 GSList *plist = user->permit; |
| 331 GSList *dlist = user->deny; | |
| 2382 | 332 |
| 333 int pos = 0; | |
| 334 | |
| 4349 | 335 if (!user->permdeny) |
| 336 user->permdeny = 1; | |
| 2382 | 337 |
| 4349 | 338 pos += g_snprintf(&s[pos], len - pos, "m %d\n", user->permdeny); |
| 2382 | 339 while (len > pos && grp) { |
| 340 g = (struct group *)grp->data; | |
| 4349 | 341 if(gaim_group_on_account(g, user)) { |
| 342 pos += g_snprintf(&s[pos], len - pos, "g %s\n", g->name); | |
| 343 mem = g->members; | |
| 344 while (len > pos && mem) { | |
| 345 b = (struct buddy *)mem->data; | |
| 346 if(b->user == user) { | |
| 347 pos += g_snprintf(&s[pos], len - pos, "b %s%s%s\n", b->name, | |
| 348 (show && b->alias[0]) ? ":" : "", | |
| 349 (show && b->alias[0]) ? b->alias : ""); | |
| 350 } | |
| 351 mem = mem->next; | |
| 352 } | |
| 2382 | 353 } |
| 354 grp = g_slist_next(grp); | |
| 355 } | |
| 356 | |
| 357 while (len > pos && plist) { | |
| 358 pos += g_snprintf(&s[pos], len - pos, "p %s\n", (char *)plist->data); | |
| 359 plist = plist->next; | |
| 360 } | |
| 361 | |
| 362 while (len > pos && dlist) { | |
| 363 pos += g_snprintf(&s[pos], len - pos, "d %s\n", (char *)dlist->data); | |
| 364 dlist = dlist->next; | |
| 365 } | |
| 366 } | |
| 367 | |
|
2536
0e0a54e5819a
[gaim-migrate @ 2549]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2526
diff
changeset
|
368 /* translate an AIM 3 buddylist (*.lst) to a Gaim buddylist */ |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
369 static GString *translate_lst(FILE *src_fp) |
| 2382 | 370 { |
| 371 char line[BUF_LEN], *line2; | |
| 372 char *name; | |
| 373 int i; | |
| 374 | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
375 GString *dest = g_string_new("m 1\n"); |
| 2382 | 376 |
| 377 while (fgets(line, BUF_LEN, src_fp)) { | |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
378 line2 = g_strchug(line); |
| 2382 | 379 if (strstr(line2, "group") == line2) { |
| 380 name = strpbrk(line2, " \t\n\r\f") + 1; | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
381 dest = g_string_append(dest, "g "); |
| 2382 | 382 for (i = 0; i < strcspn(name, "\n\r"); i++) |
| 383 if (name[i] != '\"') | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
384 dest = g_string_append_c(dest, name[i]); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
385 dest = g_string_append_c(dest, '\n'); |
| 2382 | 386 } |
| 387 if (strstr(line2, "buddy") == line2) { | |
| 388 name = strpbrk(line2, " \t\n\r\f") + 1; | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
389 dest = g_string_append(dest, "b "); |
| 2382 | 390 for (i = 0; i < strcspn(name, "\n\r"); i++) |
| 391 if (name[i] != '\"') | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
392 dest = g_string_append_c(dest, name[i]); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
393 dest = g_string_append_c(dest, '\n'); |
| 2382 | 394 } |
| 395 } | |
| 396 | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
397 return dest; |
| 2382 | 398 } |
| 399 | |
| 400 | |
|
2536
0e0a54e5819a
[gaim-migrate @ 2549]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2526
diff
changeset
|
401 /* translate an AIM 4 buddylist (*.blt) to Gaim format */ |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
402 static GString *translate_blt(FILE *src_fp) |
| 2382 | 403 { |
| 404 int i; | |
| 405 char line[BUF_LEN]; | |
| 406 char *buddy; | |
| 407 | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
408 GString *dest = g_string_new("m 1\n"); |
| 2382 | 409 |
| 410 while (strstr(fgets(line, BUF_LEN, src_fp), "Buddy") == NULL); | |
| 411 while (strstr(fgets(line, BUF_LEN, src_fp), "list") == NULL); | |
| 412 | |
| 413 while (1) { | |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
414 fgets(line, BUF_LEN, src_fp); g_strchomp(line); |
| 2382 | 415 if (strchr(line, '}') != NULL) |
| 416 break; | |
| 417 | |
| 418 if (strchr(line, '{') != NULL) { | |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
419 /* Syntax starting with "<group> {" */ |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
420 |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
421 dest = g_string_append(dest, "g "); |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
422 buddy = g_strchug(strtok(line, "{")); |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
423 for (i = 0; i < strlen(buddy); i++) |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
424 if (buddy[i] != '\"') |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
425 dest = g_string_append_c(dest, buddy[i]); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
426 dest = g_string_append_c(dest, '\n'); |
| 2382 | 427 while (strchr(fgets(line, BUF_LEN, src_fp), '}') == NULL) { |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
428 gboolean pounce = FALSE; |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
429 char *e; |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
430 g_strchomp(line); |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
431 buddy = g_strchug(line); |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
432 debug_printf("\nbuddy: \"%s\"\n\n", buddy); |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
433 dest = g_string_append(dest, "b "); |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
434 if (strchr(buddy, '{') != NULL) { |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
435 /* buddy pounce, etc */ |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
436 char *pos = strchr(buddy, '{') - 1; |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
437 *pos = 0; |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
438 pounce = TRUE; |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
439 } |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
440 if ((e = strchr(buddy, '\"')) != NULL) { |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
441 *e = '\0'; |
| 2382 | 442 buddy++; |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
443 } |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
444 dest = g_string_append(dest, buddy); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
445 dest = g_string_append_c(dest, '\n'); |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
446 if (pounce) |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
447 do |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
448 fgets(line, BUF_LEN, src_fp); |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
449 while (!strchr(line, '}')); |
| 2382 | 450 } |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
451 } else { |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
452 |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
453 /* Syntax "group buddy buddy ..." */ |
|
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
454 buddy = g_strchug(strtok(line, " \n")); |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
455 dest = g_string_append(dest, "g "); |
| 2382 | 456 if (strchr(buddy, '\"') != NULL) { |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
457 dest = g_string_append(dest, &buddy[1]); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
458 dest = g_string_append_c(dest, ' '); |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
459 buddy = g_strchug(strtok(NULL, " \n")); |
| 2382 | 460 while (strchr(buddy, '\"') == NULL) { |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
461 dest = g_string_append(dest, buddy); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
462 dest = g_string_append_c(dest, ' '); |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
463 buddy = g_strchug(strtok(NULL, " \n")); |
| 2382 | 464 } |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
465 buddy[strlen(buddy) - 1] = '\0'; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
466 dest = g_string_append(dest, buddy); |
| 2382 | 467 } else { |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
468 dest = g_string_append(dest, buddy); |
| 2382 | 469 } |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
470 dest = g_string_append_c(dest, '\n'); |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
471 while ((buddy = g_strchug(strtok(NULL, " \n"))) != NULL) { |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
472 dest = g_string_append(dest, "b "); |
| 2382 | 473 if (strchr(buddy, '\"') != NULL) { |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
474 dest = g_string_append(dest, &buddy[1]); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
475 dest = g_string_append_c(dest, ' '); |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
476 buddy = g_strchug(strtok(NULL, " \n")); |
| 2382 | 477 while (strchr(buddy, '\"') == NULL) { |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
478 dest = g_string_append(dest, buddy); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
479 dest = g_string_append_c(dest, ' '); |
|
2548
20418e5702eb
[gaim-migrate @ 2561]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
480 buddy = g_strchug(strtok(NULL, " \n")); |
| 2382 | 481 } |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
482 buddy[strlen(buddy) - 1] = '\0'; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
483 dest = g_string_append(dest, buddy); |
| 2382 | 484 } else { |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
485 dest = g_string_append(dest, buddy); |
| 2382 | 486 } |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
487 dest = g_string_append_c(dest, '\n'); |
| 2382 | 488 } |
| 489 } | |
| 490 } | |
| 491 | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
492 return dest; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
493 } |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
494 |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
495 static GString *translate_gnomeicu(FILE *src_fp) |
|
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 char line[BUF_LEN]; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
498 GString *dest = g_string_new("m 1\ng Buddies\n"); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
499 |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
500 while (strstr(fgets(line, BUF_LEN, src_fp), "NewContacts") == NULL); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
501 |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
502 while (fgets(line, BUF_LEN, src_fp)) { |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
503 char *eq; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
504 g_strchomp(line); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
505 if (line[0] == '\n' || line[0] == '[') |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
506 break; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
507 eq = strchr(line, '='); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
508 if (!eq) |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
509 break; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
510 *eq = ':'; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
511 eq = strchr(eq, ','); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
512 if (eq) |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
513 *eq = '\0'; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
514 dest = g_string_append(dest, "b "); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
515 dest = g_string_append(dest, line); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
516 dest = g_string_append_c(dest, '\n'); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
517 } |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
518 |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
519 return dest; |
| 2382 | 520 } |
| 521 | |
| 522 static gchar *get_screenname_filename(const char *name) | |
| 523 { | |
| 524 gchar **split; | |
| 525 gchar *good; | |
| 526 | |
| 527 split = g_strsplit(name, G_DIR_SEPARATOR_S, -1); | |
| 528 good = g_strjoinv(NULL, split); | |
| 529 g_strfreev(split); | |
| 530 | |
| 531 g_strup(good); | |
| 532 | |
| 533 return good; | |
| 534 } | |
| 535 | |
| 4349 | 536 static gboolean gaim_blist_read(const char *filename); |
| 2382 | 537 |
| 4349 | 538 void do_import(struct aim_user *user, const char *filename) |
| 2382 | 539 { |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
540 GString *buf = NULL; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
541 char first[64]; |
| 2382 | 542 char path[PATHSIZE]; |
| 543 int len; | |
| 544 FILE *f; | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
545 struct stat st; |
| 2382 | 546 |
| 547 if (filename) { | |
| 548 g_snprintf(path, sizeof(path), "%s", filename); | |
| 549 } else { | |
| 4349 | 550 char *g_screenname = get_screenname_filename(user->username); |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
551 char *file = gaim_user_dir(); |
| 4349 | 552 int protocol = (user->protocol == PROTO_OSCAR) ? (isalpha(user->username[0]) ? PROTO_TOC : PROTO_ICQ): user->protocol; |
| 2382 | 553 |
| 554 if (file != (char *)NULL) { | |
| 4349 | 555 sprintf(path, "%s" G_DIR_SEPARATOR_S "%s.%d.blist", file, g_screenname, protocol); |
| 2382 | 556 g_free(g_screenname); |
| 557 } else { | |
| 558 g_free(g_screenname); | |
| 559 return; | |
| 560 } | |
| 561 } | |
| 562 | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
563 if (stat(path, &st)) { |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
564 debug_printf("Unable to stat %s.\n", path); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
565 return; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
566 } |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
567 |
| 2382 | 568 if (!(f = fopen(path, "r"))) { |
| 569 debug_printf("Unable to open %s.\n", path); | |
| 570 return; | |
| 571 } | |
| 572 | |
| 573 fgets(first, 64, f); | |
| 574 | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
575 if ((first[0] == '\n') || (first[0] == '\r' && first[1] == '\n')) |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
576 fgets(first, 64, f); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
577 |
| 4349 | 578 if (!g_strncasecmp(first, "<xml", strlen("<xml"))) { |
| 579 /* new gaim XML buddy list */ | |
| 580 gaim_blist_read(path); | |
| 581 } else if (!g_strncasecmp(first, "Config {", strlen("Config {"))) { | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
582 /* AIM 4 buddy list */ |
| 2382 | 583 debug_printf("aim 4\n"); |
| 584 rewind(f); | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
585 buf = translate_blt(f); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
586 } else if (strstr(first, "group") != NULL) { |
| 2382 | 587 /* AIM 3 buddy list */ |
| 588 debug_printf("aim 3\n"); | |
| 589 rewind(f); | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
590 buf = translate_lst(f); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
591 } else if (!g_strncasecmp(first, "[User]", strlen("[User]"))) { |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
592 /* GnomeICU (hopefully) */ |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
593 debug_printf("gnomeicu\n"); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
594 rewind(f); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
595 buf = translate_gnomeicu(f); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
596 } else if (first[0] == 'm') { |
|
2536
0e0a54e5819a
[gaim-migrate @ 2549]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2526
diff
changeset
|
597 /* Gaim buddy list - no translation */ |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
598 char buf2[BUF_LONG * 2]; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
599 buf = g_string_new(""); |
| 2382 | 600 rewind(f); |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
601 while (1) { |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
602 len = fread(buf2, 1, BUF_LONG * 2 - 1, f); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
603 if (len <= 0) |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
604 break; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
605 buf2[len] = '\0'; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
606 buf = g_string_append(buf, buf2); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
607 if (len != BUF_LONG * 2 - 1) |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
608 break; |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
609 } |
| 2382 | 610 } |
| 611 | |
| 612 fclose(f); | |
| 613 | |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
614 if (buf) { |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
615 buf = g_string_prepend(buf, "toc_set_config {"); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
616 buf = g_string_append(buf, "}\n"); |
| 4349 | 617 parse_toc_buddy_list(user, buf->str); |
|
2825
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
618 g_string_free(buf, TRUE); |
|
8cd878c14090
[gaim-migrate @ 2838]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
619 } |
| 2382 | 620 } |
| 621 | |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
622 static gboolean is_blocked(struct buddy *b) |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
623 { |
| 4349 | 624 struct aim_user *user = b->user; |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
625 |
| 4349 | 626 if (user->permdeny == PERMIT_ALL) |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
627 return FALSE; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
628 |
| 4349 | 629 if (user->permdeny == PERMIT_NONE) { |
| 630 if (user->gc && g_strcasecmp(b->name, user->gc->username)) | |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
631 return TRUE; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
632 else |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
633 return FALSE; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
634 } |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
635 |
| 4349 | 636 if (user->permdeny == PERMIT_SOME) { |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
637 char *x = g_strdup(normalize(b->name)); |
| 4349 | 638 GSList *s = user->permit; |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
639 while (s) { |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
640 if (!g_strcasecmp(x, normalize(s->data))) |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
641 break; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
642 s = s->next; |
|
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 g_free(x); |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
645 if (s) |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
646 return FALSE; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
647 return TRUE; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
648 } |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
649 |
| 4349 | 650 if (user->permdeny == DENY_SOME) { |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
651 char *x = g_strdup(normalize(b->name)); |
| 4349 | 652 GSList *s = user->deny; |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
653 while (s) { |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
654 if (!g_strcasecmp(x, normalize(s->data))) |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
655 break; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
656 s = s->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 g_free(x); |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
659 if (s) |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
660 return TRUE; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
661 return FALSE; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
662 } |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
663 |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
664 return FALSE; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
665 } |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
666 |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
667 void signoff_blocked(struct gaim_connection *gc) |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
668 { |
| 4349 | 669 GSList *g = groups; |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
670 while (g) { |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
671 GSList *m = ((struct group *)g->data)->members; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
672 while (m) { |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
673 struct buddy *b = m->data; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
674 if (is_blocked(b)) |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
675 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
|
676 m = m->next; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
677 } |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
678 g = g->next; |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
679 } |
|
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2590
diff
changeset
|
680 } |
| 4227 | 681 |
| 682 char *get_buddy_alias_only(struct buddy *b) { | |
| 683 if(!b) | |
| 684 return NULL; | |
| 685 if(b->alias[0]) | |
| 686 return b->alias; | |
| 687 else if((misc_options & OPT_MISC_USE_SERVER_ALIAS) && b->server_alias[0]) | |
| 688 return b->server_alias; | |
| 689 return NULL; | |
| 690 } | |
| 691 | |
| 692 | |
| 693 char *get_buddy_alias(struct buddy *b) { | |
| 694 char *ret = get_buddy_alias_only(b); | |
| 695 if(!ret) | |
| 696 return b ? b->name : _("Unknown"); | |
| 697 return ret; | |
| 698 } | |
| 699 | |
| 4349 | 700 GSList *gaim_group_get_accounts(struct group *g) { |
| 701 GSList *buds = g->members; | |
| 702 GSList *ret = NULL; | |
| 703 while(buds) { | |
| 704 struct buddy *b = buds->data; | |
| 705 if(!g_slist_find(ret, b->user)) | |
| 706 ret = g_slist_append(ret, b->user); | |
| 707 buds = buds->next; | |
| 708 } | |
| 709 return ret; | |
| 710 } | |
| 711 | |
| 712 gboolean gaim_group_on_account(struct group *g, struct aim_user *user) { | |
| 713 GSList *buds = g->members; | |
| 714 while(buds) { | |
| 715 struct buddy *b = buds->data; | |
| 716 if((!user && b->user->gc) || b->user == user) | |
| 717 return TRUE; | |
| 718 buds = buds->next; | |
| 719 } | |
| 720 return FALSE; | |
| 721 } | |
| 722 | |
| 723 | |
| 724 static char *blist_parser_group_name = NULL; | |
| 725 static char *blist_parser_person_name = NULL; | |
| 726 static char *blist_parser_account_name = NULL; | |
| 727 static int blist_parser_account_protocol = 0; | |
| 728 static char *blist_parser_buddy_name = NULL; | |
| 729 static char *blist_parser_buddy_alias = NULL; | |
| 730 static char *blist_parser_setting_name = NULL; | |
| 731 static char *blist_parser_setting_value = NULL; | |
| 732 static GHashTable *blist_parser_buddy_settings = NULL; | |
| 733 static int blist_parser_privacy_mode = 0; | |
| 734 static enum { | |
| 735 BLIST_TAG_GAIM, | |
| 736 BLIST_TAG_BLIST, | |
| 737 BLIST_TAG_GROUP, | |
| 738 BLIST_TAG_PERSON, | |
| 739 BLIST_TAG_BUDDY, | |
| 740 BLIST_TAG_NAME, | |
| 741 BLIST_TAG_ALIAS, | |
| 742 BLIST_TAG_SETTING, | |
| 743 BLIST_TAG_PRIVACY, | |
| 744 BLIST_TAG_ACCOUNT, | |
| 745 BLIST_TAG_PERMIT, | |
| 746 BLIST_TAG_BLOCK, | |
| 747 BLIST_TAG_IGNORE | |
| 748 } blist_parser_current_tag; | |
| 4439 | 749 static gboolean blist_parser_error_occurred = FALSE; |
| 4349 | 750 |
| 751 static void blist_start_element_handler (GMarkupParseContext *context, | |
| 752 const gchar *element_name, | |
| 753 const gchar **attribute_names, | |
| 754 const gchar **attribute_values, | |
| 755 gpointer user_data, | |
| 756 GError **error) { | |
| 757 int i; | |
| 758 | |
| 759 if(!strcmp(element_name, "gaim")) { | |
| 760 blist_parser_current_tag = BLIST_TAG_GAIM; | |
| 761 } else if(!strcmp(element_name, "blist")) { | |
| 762 blist_parser_current_tag = BLIST_TAG_BLIST; | |
| 763 } else if(!strcmp(element_name, "group")) { | |
| 764 blist_parser_current_tag = BLIST_TAG_GROUP; | |
| 765 for(i=0; attribute_names[i]; i++) { | |
| 4444 | 766 if(!strcmp(attribute_names[i], "name")) { |
| 767 g_free(blist_parser_group_name); | |
| 4349 | 768 blist_parser_group_name = g_strdup(attribute_values[i]); |
| 4444 | 769 } |
| 4349 | 770 } |
| 771 if(blist_parser_group_name) { | |
| 772 add_group(blist_parser_group_name); | |
| 773 } | |
| 774 } else if(!strcmp(element_name, "person")) { | |
| 775 blist_parser_current_tag = BLIST_TAG_PERSON; | |
| 776 for(i=0; attribute_names[i]; i++) { | |
| 4444 | 777 if(!strcmp(attribute_names[i], "name")) { |
| 778 g_free(blist_parser_person_name); | |
| 4349 | 779 blist_parser_person_name = g_strdup(attribute_values[i]); |
| 4444 | 780 } |
| 4349 | 781 } |
| 782 } else if(!strcmp(element_name, "buddy")) { | |
| 783 blist_parser_current_tag = BLIST_TAG_BUDDY; | |
| 784 for(i=0; attribute_names[i]; i++) { | |
| 4444 | 785 if(!strcmp(attribute_names[i], "account")) { |
| 786 g_free(blist_parser_account_name); | |
| 4349 | 787 blist_parser_account_name = g_strdup(attribute_values[i]); |
| 4444 | 788 } else if(!strcmp(attribute_names[i], "protocol")) { |
| 4349 | 789 blist_parser_account_protocol = atoi(attribute_values[i]); |
| 4444 | 790 } |
| 4349 | 791 } |
| 792 } else if(!strcmp(element_name, "name")) { | |
| 793 blist_parser_current_tag = BLIST_TAG_NAME; | |
| 794 } else if(!strcmp(element_name, "alias")) { | |
| 795 blist_parser_current_tag = BLIST_TAG_ALIAS; | |
| 796 } else if(!strcmp(element_name, "setting")) { | |
| 797 blist_parser_current_tag = BLIST_TAG_SETTING; | |
| 798 for(i=0; attribute_names[i]; i++) { | |
| 4444 | 799 if(!strcmp(attribute_names[i], "name")) { |
| 800 g_free(blist_parser_setting_name); | |
| 4349 | 801 blist_parser_setting_name = g_strdup(attribute_values[i]); |
| 4444 | 802 } |
| 4349 | 803 } |
| 804 } else if(!strcmp(element_name, "privacy")) { | |
| 805 blist_parser_current_tag = BLIST_TAG_PRIVACY; | |
| 806 } else if(!strcmp(element_name, "account")) { | |
| 807 blist_parser_current_tag = BLIST_TAG_ACCOUNT; | |
| 808 for(i=0; attribute_names[i]; i++) { | |
| 809 if(!strcmp(attribute_names[i], "protocol")) | |
| 810 blist_parser_account_protocol = atoi(attribute_values[i]); | |
| 811 else if(!strcmp(attribute_names[i], "mode")) | |
| 812 blist_parser_privacy_mode = atoi(attribute_values[i]); | |
| 4444 | 813 else if(!strcmp(attribute_names[i], "name")) { |
| 814 g_free(blist_parser_account_name); | |
| 4349 | 815 blist_parser_account_name = g_strdup(attribute_values[i]); |
| 4444 | 816 } |
| 4349 | 817 } |
| 818 } else if(!strcmp(element_name, "permit")) { | |
| 819 blist_parser_current_tag = BLIST_TAG_PERMIT; | |
| 820 } else if(!strcmp(element_name, "block")) { | |
| 821 blist_parser_current_tag = BLIST_TAG_BLOCK; | |
| 822 } else if(!strcmp(element_name, "ignore")) { | |
| 823 blist_parser_current_tag = BLIST_TAG_IGNORE; | |
| 824 } | |
| 825 } | |
| 826 | |
| 827 static void blist_end_element_handler(GMarkupParseContext *context, | |
| 828 const gchar *element_name, gpointer user_data, GError **error) { | |
| 829 if(!strcmp(element_name, "gaim")) { | |
| 830 } else if(!strcmp(element_name, "blist")) { | |
| 831 blist_parser_current_tag = BLIST_TAG_GAIM; | |
| 832 } else if(!strcmp(element_name, "group")) { | |
| 833 blist_parser_current_tag = BLIST_TAG_BLIST; | |
| 834 } else if(!strcmp(element_name, "person")) { | |
| 835 blist_parser_current_tag = BLIST_TAG_GROUP; | |
| 836 g_free(blist_parser_person_name); | |
| 837 blist_parser_person_name = NULL; | |
| 838 } else if(!strcmp(element_name, "buddy")) { | |
| 839 struct aim_user *user = find_user(blist_parser_account_name, | |
| 840 blist_parser_account_protocol); | |
| 841 if(user) { | |
| 842 struct buddy *b = add_buddy(user, blist_parser_group_name, | |
| 843 blist_parser_buddy_name, blist_parser_buddy_alias); | |
| 844 if(blist_parser_buddy_settings) { | |
| 845 g_hash_table_destroy(b->settings); | |
| 846 b->settings = blist_parser_buddy_settings; | |
| 847 } | |
| 848 } | |
| 849 blist_parser_current_tag = BLIST_TAG_PERSON; | |
| 850 g_free(blist_parser_buddy_name); | |
| 851 blist_parser_buddy_name = NULL; | |
| 852 g_free(blist_parser_buddy_alias); | |
| 853 blist_parser_buddy_alias = NULL; | |
| 854 g_free(blist_parser_account_name); | |
| 855 blist_parser_account_name = NULL; | |
| 856 blist_parser_buddy_settings = NULL; | |
| 857 } else if(!strcmp(element_name, "name")) { | |
| 858 blist_parser_current_tag = BLIST_TAG_BUDDY; | |
| 859 } else if(!strcmp(element_name, "alias")) { | |
| 860 blist_parser_current_tag = BLIST_TAG_BUDDY; | |
| 861 } else if(!strcmp(element_name, "setting")) { | |
| 862 if(!blist_parser_buddy_settings) | |
| 863 blist_parser_buddy_settings = g_hash_table_new_full(g_str_hash, | |
| 864 g_str_equal, g_free, g_free); | |
| 865 if(blist_parser_setting_name && blist_parser_setting_value) { | |
| 866 g_hash_table_replace(blist_parser_buddy_settings, | |
| 867 g_strdup(blist_parser_setting_name), | |
| 868 g_strdup(blist_parser_setting_value)); | |
| 869 } | |
| 870 g_free(blist_parser_setting_name); | |
| 871 g_free(blist_parser_setting_value); | |
| 872 blist_parser_current_tag = BLIST_TAG_BUDDY; | |
| 873 } else if(!strcmp(element_name, "privacy")) { | |
| 874 blist_parser_current_tag = BLIST_TAG_GAIM; | |
| 875 } else if(!strcmp(element_name, "account")) { | |
| 876 struct aim_user *user = find_user(blist_parser_account_name, | |
| 877 blist_parser_account_protocol); | |
| 878 if(user) { | |
| 879 user->permdeny = blist_parser_privacy_mode; | |
| 880 } | |
| 881 blist_parser_current_tag = BLIST_TAG_PRIVACY; | |
| 882 g_free(blist_parser_account_name); | |
| 883 blist_parser_account_name = NULL; | |
| 884 } else if(!strcmp(element_name, "permit")) { | |
| 885 struct aim_user *user = find_user(blist_parser_account_name, | |
| 886 blist_parser_account_protocol); | |
| 887 if(user) { | |
| 888 gaim_privacy_permit_add(user, blist_parser_buddy_name); | |
| 889 } | |
| 4444 | 890 blist_parser_current_tag = BLIST_TAG_ACCOUNT; |
| 4442 | 891 g_free(blist_parser_buddy_name); |
| 4444 | 892 blist_parser_buddy_name = NULL; |
| 4349 | 893 } else if(!strcmp(element_name, "block")) { |
| 894 struct aim_user *user = find_user(blist_parser_account_name, | |
| 895 blist_parser_account_protocol); | |
| 896 if(user) { | |
| 897 gaim_privacy_deny_add(user, blist_parser_buddy_name); | |
| 898 } | |
| 4444 | 899 blist_parser_current_tag = BLIST_TAG_ACCOUNT; |
| 4442 | 900 g_free(blist_parser_buddy_name); |
| 4444 | 901 blist_parser_buddy_name = NULL; |
| 4349 | 902 } else if(!strcmp(element_name, "ignore")) { |
| 903 /* we'll apparently do something with this later */ | |
| 904 blist_parser_current_tag = BLIST_TAG_ACCOUNT; | |
| 905 } | |
| 906 } | |
| 907 | |
| 908 static void blist_text_handler(GMarkupParseContext *context, const gchar *text, | |
| 909 gsize text_len, gpointer user_data, GError **error) { | |
| 910 switch(blist_parser_current_tag) { | |
| 911 case BLIST_TAG_NAME: | |
| 912 blist_parser_buddy_name = g_strndup(text, text_len); | |
| 913 break; | |
| 914 case BLIST_TAG_ALIAS: | |
| 915 blist_parser_buddy_alias = g_strndup(text, text_len); | |
| 916 break; | |
| 917 case BLIST_TAG_PERMIT: | |
| 918 case BLIST_TAG_BLOCK: | |
| 919 case BLIST_TAG_IGNORE: | |
| 920 blist_parser_buddy_name = g_strndup(text, text_len); | |
| 921 break; | |
| 922 case BLIST_TAG_SETTING: | |
| 923 blist_parser_setting_value = g_strndup(text, text_len); | |
| 924 break; | |
| 925 default: | |
| 926 break; | |
| 927 } | |
| 928 } | |
| 929 | |
| 4439 | 930 static void blist_error_handler(GMarkupParseContext *context, GError *error, |
| 931 gpointer user_data) { | |
| 932 blist_parser_error_occurred = TRUE; | |
| 933 debug_printf("error parsing blist.xml: %s\n", error->message); | |
| 934 } | |
| 935 | |
| 4349 | 936 static GMarkupParser blist_parser = { |
| 937 blist_start_element_handler, | |
| 938 blist_end_element_handler, | |
| 939 blist_text_handler, | |
| 940 NULL, | |
| 4439 | 941 blist_error_handler |
| 4349 | 942 }; |
| 943 | |
| 944 static gboolean gaim_blist_read(const char *filename) { | |
| 4441 | 945 gchar *contents = NULL; |
| 4349 | 946 gsize length; |
| 947 GMarkupParseContext *context; | |
| 948 GError *error = NULL; | |
| 949 if(!g_file_get_contents(filename, &contents, &length, &error)) { | |
| 950 debug_printf("error reading blist: %s\n", error->message); | |
| 951 g_error_free(error); | |
| 952 return FALSE; | |
| 953 } | |
| 954 | |
| 955 context = g_markup_parse_context_new(&blist_parser, 0, NULL, NULL); | |
| 956 | |
| 957 if(!g_markup_parse_context_parse(context, contents, length, NULL)) { | |
| 958 g_markup_parse_context_free(context); | |
| 4441 | 959 g_free(contents); |
| 4349 | 960 return FALSE; |
| 961 } | |
| 962 | |
| 963 if(!g_markup_parse_context_end_parse(context, NULL)) { | |
| 964 debug_printf("error parsing blist\n"); | |
| 965 g_markup_parse_context_free(context); | |
| 4441 | 966 g_free(contents); |
| 4349 | 967 return FALSE; |
| 968 } | |
| 969 | |
| 970 g_markup_parse_context_free(context); | |
| 4441 | 971 g_free(contents); |
| 972 | |
| 4439 | 973 if(blist_parser_error_occurred) |
| 974 return FALSE; | |
| 975 | |
| 4349 | 976 return TRUE; |
| 977 } | |
| 978 | |
| 979 void gaim_blist_load() { | |
| 980 GSList *accts; | |
| 981 char *user_dir = gaim_user_dir(); | |
| 982 char *filename; | |
| 983 char *msg; | |
| 984 | |
| 985 if(!user_dir) | |
| 986 return; | |
| 987 | |
| 988 filename = g_build_filename(user_dir, "blist.xml", NULL); | |
| 989 | |
| 990 if(g_file_test(filename, G_FILE_TEST_EXISTS)) { | |
| 991 if(!gaim_blist_read(filename)) { | |
| 992 msg = g_strdup_printf(_("An error was encountered parsing your " | |
| 993 "buddy list. It has not been loaded.")); | |
| 994 do_error_dialog(_("Buddy List Error"), msg, GAIM_ERROR); | |
| 995 g_free(msg); | |
| 996 } | |
| 4352 | 997 } else if(g_slist_length(aim_users)) { |
| 4349 | 998 /* rob wants to inform the user that their buddy lists are |
| 999 * being converted */ | |
| 1000 msg = g_strdup_printf(_("Gaim is converting your old buddy lists " | |
| 1001 "to a new format, which will now be located at %s"), | |
| 1002 filename); | |
| 1003 do_error_dialog(_("Converting Buddy List"), msg, GAIM_INFO); | |
| 1004 g_free(msg); | |
| 1005 | |
| 1006 /* now, let gtk actually display the dialog before we start anything */ | |
| 1007 while(gtk_events_pending()) | |
| 1008 gtk_main_iteration(); | |
| 1009 | |
| 1010 /* read in the old lists, then save to the new format */ | |
| 1011 for(accts = aim_users; accts; accts = accts->next) { | |
| 1012 do_import(accts->data, NULL); | |
| 1013 } | |
| 1014 gaim_blist_save(); | |
| 1015 } | |
| 1016 | |
| 1017 g_free(filename); | |
| 1018 } | |
| 1019 | |
| 1020 static void blist_print_buddy_settings(gpointer key, gpointer data, | |
| 1021 gpointer user_data) { | |
| 1022 char *key_val = g_markup_escape_text(key, -1); | |
| 1023 char *data_val = g_markup_escape_text(data, -1); | |
| 1024 FILE *file = user_data; | |
| 1025 fprintf(file, "\t\t\t\t\t<setting name=\"%s\">%s</setting>\n", key_val, | |
| 1026 data_val); | |
| 1027 g_free(key_val); | |
| 1028 g_free(data_val); | |
| 1029 } | |
| 1030 | |
| 1031 static void gaim_blist_write(FILE *file, struct aim_user *user) { | |
| 1032 GSList *grps, *buds, *users; | |
| 1033 fprintf(file, "<?xml version='1.0' encoding='UTF-8' ?>\n"); | |
| 1034 fprintf(file, "<gaim version=\"1\">\n"); | |
| 1035 fprintf(file, "\t<blist>\n"); | |
| 1036 | |
| 1037 for(grps = groups; grps; grps = grps->next) { | |
| 1038 struct group *g = grps->data; | |
| 1039 if(!user || gaim_group_on_account(g, user)) { | |
| 1040 char *group_name = g_markup_escape_text(g->name, -1); | |
| 1041 fprintf(file, "\t\t<group name=\"%s\">\n", group_name); | |
| 1042 for(buds = g->members; buds; buds = buds->next) { | |
| 1043 struct buddy *b = buds->data; | |
| 1044 if(!user || b->user == user) { | |
| 1045 char *bud_name = g_markup_escape_text(b->name, -1); | |
| 1046 char *bud_alias = NULL; | |
| 1047 char *acct_name = g_markup_escape_text(b->user->username, -1); | |
| 1048 if(b->alias[0]) | |
| 1049 bud_alias= g_markup_escape_text(b->alias, -1); | |
| 1050 fprintf(file, "\t\t\t<person name=\"%s\">\n", | |
| 1051 bud_alias ? bud_alias : bud_name); | |
| 1052 fprintf(file, "\t\t\t\t<buddy protocol=\"%d\" " | |
| 1053 "account=\"%s\">\n", b->user->protocol, | |
| 1054 acct_name); | |
| 1055 fprintf(file, "\t\t\t\t\t<name>%s</name>\n", bud_name); | |
| 1056 if(bud_alias) { | |
| 1057 fprintf(file, "\t\t\t\t\t<alias>%s</alias>\n", | |
| 1058 bud_alias); | |
| 1059 } | |
| 1060 g_hash_table_foreach(b->settings, | |
| 1061 blist_print_buddy_settings, file); | |
| 1062 fprintf(file, "\t\t\t\t</buddy>\n"); | |
| 1063 fprintf(file, "\t\t\t</person>\n"); | |
| 1064 g_free(bud_name); | |
| 1065 g_free(bud_alias); | |
| 1066 g_free(acct_name); | |
| 1067 } | |
| 1068 } | |
| 1069 fprintf(file, "\t\t</group>\n"); | |
| 1070 g_free(group_name); | |
| 1071 } | |
| 1072 } | |
| 1073 | |
| 1074 fprintf(file, "\t</blist>\n"); | |
| 1075 fprintf(file, "\t<privacy>\n"); | |
| 1076 | |
| 1077 for(users = aim_users; users; users = users->next) { | |
| 1078 struct aim_user *usr = users->data; | |
| 1079 char *acct_name = g_markup_escape_text(usr->username, -1); | |
| 1080 if(!user || usr == user) { | |
| 1081 fprintf(file, "\t\t<account protocol=\"%d\" name=\"%s\" " | |
| 1082 "mode=\"%d\">\n", usr->protocol, acct_name, usr->permdeny); | |
| 1083 for(buds = usr->permit; buds; buds = buds->next) { | |
| 1084 char *bud_name = g_markup_escape_text(buds->data, -1); | |
| 1085 fprintf(file, "\t\t\t<permit>%s</permit>\n", bud_name); | |
| 1086 g_free(bud_name); | |
| 1087 } | |
| 1088 for(buds = usr->deny; buds; buds = buds->next) { | |
| 1089 char *bud_name = g_markup_escape_text(buds->data, -1); | |
| 1090 fprintf(file, "\t\t\t<block>%s</block>\n", bud_name); | |
| 1091 g_free(bud_name); | |
| 1092 } | |
| 1093 fprintf(file, "\t\t</account>\n"); | |
| 1094 } | |
| 1095 } | |
| 1096 | |
| 1097 fprintf(file, "\t</privacy>\n"); | |
| 1098 fprintf(file, "</gaim>\n"); | |
| 1099 } | |
| 1100 | |
| 1101 void gaim_blist_save() { | |
| 1102 FILE *file; | |
| 1103 char *user_dir = gaim_user_dir(); | |
| 1104 char *filename; | |
| 1105 | |
| 1106 if(!user_dir) | |
| 1107 return; | |
| 1108 | |
| 1109 file = fopen(user_dir, "r"); | |
| 1110 if(!file) | |
| 1111 mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); | |
| 1112 else | |
| 1113 fclose(file); | |
| 1114 | |
| 1115 filename = g_build_filename(user_dir, "blist.xml", NULL); | |
| 1116 | |
| 1117 if((file = fopen(filename, "w"))) { | |
| 1118 gaim_blist_write(file, NULL); | |
| 1119 fclose(file); | |
| 1120 chmod(filename, S_IRUSR | S_IWUSR); | |
| 1121 } else { | |
| 1122 debug_printf("unable to write %s\n", filename); | |
| 1123 } | |
| 1124 | |
| 1125 g_free(filename); | |
| 1126 } | |
| 1127 | |
| 1128 gboolean gaim_privacy_permit_add(struct aim_user *user, const char *who) { | |
| 1129 GSList *d = user->permit; | |
| 1130 char *n = g_strdup(normalize(who)); | |
| 1131 while(d) { | |
| 1132 if(!g_strcasecmp(n, normalize(d->data))) | |
| 1133 break; | |
| 1134 d = d->next; | |
| 1135 } | |
| 1136 g_free(n); | |
| 1137 if(!d) { | |
| 1138 user->permit = g_slist_append(user->permit, g_strdup(who)); | |
| 1139 return TRUE; | |
| 1140 } | |
| 1141 | |
| 1142 return FALSE; | |
| 1143 } | |
| 1144 | |
| 1145 gboolean gaim_privacy_permit_remove(struct aim_user *user, const char *who) { | |
| 1146 GSList *d = user->permit; | |
| 1147 char *n = g_strdup(normalize(who)); | |
| 1148 while(d) { | |
| 1149 if(!g_strcasecmp(n, normalize(d->data))) | |
| 1150 break; | |
| 1151 d = d->next; | |
| 1152 } | |
| 1153 g_free(n); | |
| 1154 if(d) { | |
| 1155 user->permit = g_slist_remove(user->permit, d->data); | |
| 1156 g_free(d->data); | |
| 1157 return TRUE; | |
| 1158 } | |
| 1159 return FALSE; | |
| 1160 } | |
| 1161 | |
| 1162 gboolean gaim_privacy_deny_add(struct aim_user *user, const char *who) { | |
| 1163 GSList *d = user->deny; | |
| 1164 char *n = g_strdup(normalize(who)); | |
| 1165 while(d) { | |
| 1166 if(!g_strcasecmp(n, normalize(d->data))) | |
| 1167 break; | |
| 1168 d = d->next; | |
| 1169 } | |
| 1170 g_free(n); | |
| 1171 if(!d) { | |
| 1172 user->deny = g_slist_append(user->deny, g_strdup(who)); | |
| 1173 return TRUE; | |
| 1174 } | |
| 1175 | |
| 1176 return FALSE; | |
| 1177 } | |
| 1178 | |
| 1179 gboolean gaim_privacy_deny_remove(struct aim_user *user, const char *who) { | |
| 1180 GSList *d = user->deny; | |
| 1181 char *n = g_strdup(normalize(who)); | |
| 1182 while(d) { | |
| 1183 if(!g_strcasecmp(n, normalize(d->data))) | |
| 1184 break; | |
| 1185 d = d->next; | |
| 1186 } | |
| 1187 g_free(n); | |
| 1188 if(d) { | |
| 1189 user->deny = g_slist_remove(user->deny, d->data); | |
| 1190 g_free(d->data); | |
| 1191 return TRUE; | |
| 1192 } | |
| 1193 return FALSE; | |
| 1194 } | |
| 1195 | |
| 1196 void gaim_buddy_set_setting(struct buddy *b, const char *key, | |
| 1197 const char *value) { | |
| 1198 if(!b) | |
| 1199 return; | |
| 1200 g_hash_table_replace(b->settings, g_strdup(key), g_strdup(value)); | |
| 1201 } | |
| 1202 | |
| 1203 char *gaim_buddy_get_setting(struct buddy *b, const char *key) { | |
| 1204 if(!b) | |
| 1205 return NULL; | |
| 1206 return g_strdup(g_hash_table_lookup(b->settings, key)); | |
| 1207 } |
