# HG changeset patch # User Mark Doliner # Date 1043348041 0 # Node ID 16f7f9451814c67a2ba42653ae6f3865395aa854 # Parent 5a7fda352a8dfbb313ad64189b38e27ca5338eec [gaim-migrate @ 4673] This should fixing importing blists with mad crazy wild i18n characters. It's from Paco-Paco. No peeps have had problems with it, and it has helped a dude or dudet or two. Totally. committer: Tailor Script diff -r 5a7fda352a8d -r 16f7f9451814 AUTHORS --- a/AUTHORS Thu Jan 23 06:30:27 2003 +0000 +++ b/AUTHORS Thu Jan 23 18:54:01 2003 +0000 @@ -24,7 +24,7 @@ Nathan Walp Mark Doliner -We've got an IRC room now too, #gaim on irc.openprojects.net. Come check us out. +We've got an IRC room now too, #gaim on irc.freenode.net. Come check us out. Retired: -------- diff -r 5a7fda352a8d -r 16f7f9451814 src/list.c --- a/src/list.c Thu Jan 23 06:30:27 2003 +0000 +++ b/src/list.c Thu Jan 23 18:54:01 2003 +0000 @@ -41,6 +41,11 @@ #define PATHSIZE 1024 +/* This guy does its best to convert a string to UTF-8 from an unknown + * encoding by checking the locale and trying some sane defaults ... + * if everything fails it returns NULL. */ +static char *whatever_to_utf8(const char *str); + void remove_buddy(struct buddy *rem_b) { if(rem_b->user->gc) { @@ -257,30 +262,43 @@ if (c == NULL) break; if (*c == 'g') { - strncpy(current, c + 2, sizeof(current)); + char *utf8 = NULL; + utf8 = whatever_to_utf8(c + 2); + if (utf8 == NULL) { + g_strlcpy(current, _("Invalid Groupname"), sizeof(current)); + } else { + g_strlcpy(current, utf8, sizeof(current)); + g_free(utf8); + } if (!find_group(current)) { add_group(current); } - } else if (*c == 'b' && !find_buddy(user, c + 2)) { - char nm[80], sw[BUDDY_ALIAS_MAXLEN], *tmp = c + 2; - int i = 0; - while (*tmp != ':' && *tmp && i < sizeof(nm) - 1) - nm[i++] = *tmp++; - - while (*tmp != ':' && *tmp) - tmp++; + } else if (*c == 'b') { /*&& !find_buddy(user, c + 2)) {*/ + char nm[80], sw[BUDDY_ALIAS_MAXLEN], *tmp = c + 2, *a, *utf8 = NULL; + + if ((a = strchr(c + 2, ':')) != NULL) { + *a++ = '\0'; /* nul the : */ + } - if (*tmp == ':') - *tmp++ = '\0'; - - nm[i] = '\0'; - i = 0; - while (*tmp && i < sizeof(sw) - 1) - sw[i++] = *tmp++; - sw[i] = '\0'; + g_strlcpy(nm, c + 2, sizeof(nm)); + if (a) { + utf8 = whatever_to_utf8(a); + if (utf8 == NULL) { + debug_printf ("Failed to convert alias for '%s' to UTF-8\n", nm); + } + } + if (utf8 == NULL) { + sw[0] = '\0'; + } else { + /* This can leave a partial sequence at the end, + * but who cares? */ + g_strlcpy(sw, utf8, sizeof(sw)); + g_free(utf8); + } + if (!find_buddy(user, nm)) { add_buddy(user, current, nm, sw); - bud = g_list_append(bud, c + 2); + bud = g_list_append(bud, nm); } } else if (*c == 'p') { gaim_privacy_permit_add(user, c + 2); @@ -1164,3 +1182,29 @@ return NULL; return g_strdup(g_hash_table_lookup(b->settings, key)); } + +static char *whatever_to_utf8(const char *str) +{ + int converted; + char *utf8; + + if (g_utf8_validate(str, -1, NULL)) { + return g_strdup(str); + } + + utf8 = g_locale_to_utf8(str, -1, &converted, NULL, NULL); + if (utf8 && converted == strlen (str)) { + return(utf8); + } else if (utf8) { + g_free(utf8); + } + + utf8 = g_convert(str, -1, "UTF-8", "ISO-8859-15", &converted, NULL, NULL); + if (utf8 && converted == strlen (str)) { + return(utf8); + } else if (utf8) { + g_free(utf8); + } + + return(NULL); +}