diff -urp xmms-scrobbler-0.3.8.1/gtkstuff.c xmms-scrobbler-0.3.8.1-enc/gtkstuff.c --- xmms-scrobbler-0.3.8.1/gtkstuff.c 2005-02-20 05:26:08.000000000 +0100 +++ xmms-scrobbler-0.3.8.1-enc/gtkstuff.c 2005-12-13 22:02:56.000000000 +0100 @@ -13,11 +13,14 @@ #endif #include #include +#include #include "config.h" #include "md5.h" +#include "tags/include/unicode.h" static GtkWidget *eduname, - *edpwd; + *edpwd, + *edenc; static int errorbox_done; void about_show(void) { @@ -115,6 +118,10 @@ const char *pwd = gtk_entry_get_text(GTK_ENTRY(edpwd)); const char *uid = gtk_entry_get_text(GTK_ENTRY(eduname)); + const char *enc = gtk_entry_get_text(GTK_ENTRY(edenc)); + + g_free(tags_encoding); + tags_encoding = g_strdup(enc); if ((cfgfile = xmms_cfg_open_default_file())) { @@ -130,6 +137,9 @@ xmms_cfg_write_string(cfgfile, "audioscrobbler", "password", (char *)hexify(md5pword, sizeof(md5pword))); } + + xmms_cfg_write_string(cfgfile, "audioscrobbler", "encoding", (char *)enc); + #ifdef MAKE_XMMS xmms_cfg_write_default_file(cfgfile); #endif @@ -147,8 +157,10 @@ *hbox, *unhbox, *pwhbox, + *enhbox, *lblun, *lblpw, + *lblen, *frame; ConfigFile *cfgfile; @@ -184,9 +196,16 @@ gtk_entry_set_visibility(GTK_ENTRY(edpwd), FALSE); gtk_box_pack_start(GTK_BOX(pwhbox), lblpw, FALSE, FALSE, 3); gtk_box_pack_start(GTK_BOX(pwhbox), edpwd, FALSE, FALSE, 3); + + enhbox = gtk_hbox_new(FALSE, 0); + edenc = gtk_entry_new(); + lblen = gtk_label_new("Tags encoding"); + gtk_box_pack_start(GTK_BOX(enhbox), lblen, FALSE, FALSE, 3); + gtk_box_pack_start(GTK_BOX(enhbox), edenc, FALSE, FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), unhbox, FALSE, FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), pwhbox, FALSE, FALSE, 3); + gtk_box_pack_start(GTK_BOX(vbox), enhbox, FALSE, FALSE, 3); hbox = gtk_hbox_new(FALSE, 0); @@ -202,17 +221,26 @@ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); - frame = gtk_frame_new(" The plugin will have to be restarted for changes to take effect! "); + frame = gtk_frame_new(" The plugin will have to be restarted for username/password changes to take effect! "); gtk_container_add(GTK_CONTAINER(frame), vbox); gtk_container_add(GTK_CONTAINER(cnfdlg), frame); if ((cfgfile = xmms_cfg_open_default_file())) { - gchar *username = NULL; - xmms_cfg_read_string(cfgfile, "audioscrobbler", "username", - &username); - if (username) { - gtk_entry_set_text(GTK_ENTRY(eduname), username); - g_free(username); + gchar *entry; + + entry = NULL; + xmms_cfg_read_string(cfgfile, "audioscrobbler", "username", &entry); + if (entry) { + gtk_entry_set_text(GTK_ENTRY(eduname), entry); + g_free(entry); + } + + entry = NULL; + xmms_cfg_read_string(cfgfile, "audioscrobbler", "encoding", &entry); + if (entry) { + gtk_entry_set_text(GTK_ENTRY(edenc), entry); + g_free(entry); } + xmms_cfg_free(cfgfile); } diff -urp xmms-scrobbler-0.3.8.1/tags/include/unicode.h xmms-scrobbler-0.3.8.1-enc/tags/include/unicode.h --- xmms-scrobbler-0.3.8.1/tags/include/unicode.h 2004-03-28 19:34:56.000000000 +0200 +++ xmms-scrobbler-0.3.8.1-enc/tags/include/unicode.h 2005-12-13 22:00:35.000000000 +0100 @@ -26,4 +26,6 @@ void iso88591_to_utf8(unsigned char *, s void utf16bom_to_utf8(unsigned char *, size_t, unsigned char **); void utf16be_to_utf8(unsigned char *, size_t, unsigned char **); void utf16le_to_utf8(unsigned char *, size_t, unsigned char **); + +extern char *tags_encoding; #endif diff -urp xmms-scrobbler-0.3.8.1/tags/unicode.c xmms-scrobbler-0.3.8.1-enc/tags/unicode.c --- xmms-scrobbler-0.3.8.1/tags/unicode.c 2004-03-28 20:15:37.000000000 +0200 +++ xmms-scrobbler-0.3.8.1-enc/tags/unicode.c 2005-12-13 22:31:34.000000000 +0100 @@ -21,9 +21,84 @@ #include #include #include +#include +#include +#include #include "include/endian.h" #include "include/unicode.h" +char *tags_encoding = NULL; + +/* + * generic iconv function + * taken from gentoo libxmms - looks nice and works + * + * Tue Dec 13 22:15:06 CET 2005 - Kosma Moczek + */ +static char* generic_iconv(const unsigned char *string, size_t insize, char *from, char *to) +{ + size_t outleft, outsize; + iconv_t cd; + char *out, *outptr; + char *input = (char *) string; + + if (!string) return NULL; + +// g_message("converting %s from %s to %s (%u)", string, from, to, insize); + + /* check if the conversion is needed */ + if (!strcmp(from,to)) return g_strdup(string); + + if ((cd = iconv_open(to, from)) == (iconv_t)-1) + { + g_warning("convert_string(): Conversion not supported. " + "Charsets: %s -> %s", from, to); + return g_strdup(string); + } + + /* Due to a GLIBC bug, round outbuf_size up to a multiple of 4 */ + /* + 1 for nul in case len == 1 */ + outsize = ((insize + 3) & ~3) + 1; + out = g_malloc(outsize); + outleft = outsize - 1; + outptr = out; + + retry: + if (iconv(cd, &input, &insize, &outptr, &outleft) == -1) + { + int used; + switch (errno) + { + case E2BIG: + used = outptr - out; + outsize = (outsize - 1) * 2 + 1; + out = g_realloc(out, outsize); + outptr = out + used; + outleft = outsize - 1 - used; + goto retry; + case EINVAL: + /* incomplete multibyte sequence (at the end of string) + * - just quit, nothing to do here */ + break; + case EILSEQ: + /* Invalid sequence, try to get the + rest of the string */ + input++; + insize--; + goto retry; + default: + g_warning("convert_string(): Conversion failed. " + "Inputstring: %s; Error: %s", + string, strerror(errno)); + break; + } + } + *outptr = '\0'; + + iconv_close(cd); + return out; +} + wchar_t *utf8_to_wchar(unsigned char *utf, size_t memsize) { int i, j = 0; @@ -141,6 +216,12 @@ unsigned char *wchar_to_utf8(wchar_t *wc void iso88591_to_utf8(unsigned char *iso, size_t memsize, unsigned char **utf) { + /* don't run recoder of setting is incomplete */ + if (tags_encoding && *tags_encoding) { + *utf = generic_iconv(iso, memsize, tags_encoding, "UTF-8"); + return; + } + int i; wchar_t *wchar; diff -urp xmms-scrobbler-0.3.8.1/xmms_scrobbler.c xmms-scrobbler-0.3.8.1-enc/xmms_scrobbler.c --- xmms-scrobbler-0.3.8.1/xmms_scrobbler.c 2005-02-21 02:25:47.000000000 +0100 +++ xmms-scrobbler-0.3.8.1-enc/xmms_scrobbler.c 2005-12-13 22:53:29.000000000 +0100 @@ -59,7 +59,7 @@ static GeneralPlugin xmms_scrobbler = static void init(void) { - char *username = NULL, *password = NULL; + char *username = NULL, *password = NULL, *encoding = NULL; ConfigFile *cfgfile; going = 1; @@ -68,6 +68,8 @@ static void init(void) &username); xmms_cfg_read_string(cfgfile, "audioscrobbler", "password", &password); + xmms_cfg_read_string(cfgfile, "audioscrobbler", "encoding", + &encoding); xmms_cfg_free(cfgfile); } if ((!username || !password) || (!*username || !*password)) { @@ -76,6 +78,10 @@ static void init(void) going = 0; return; } + if (encoding) { + tags_encoding = g_strdup(encoding); + g_free(encoding); + } sc_init(username, password); g_free(username); g_free(password);