fix bug: source file needs to be explicitly rewound before reading/writing in callbac...
[flac.git] / src / plugin_xmms / charset.c
1 /* libxmms-flac - XMMS FLAC input plugin
2  * Copyright (C) 2002,2003,2004  Daisuke Shimamura
3  *
4  * Almost from charset.c
5  *  EasyTAG - Tag editor for MP3 and OGG files
6  *  Copyright (C) 1999-2001  Håvard Kvålen <havardk@xmms.org>
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  */
22
23 #include <stdlib.h>
24 #include <glib.h>
25 #include <string.h>
26 #include <errno.h>
27
28 #include "plugin_common/charset.h"
29 #include "plugin_common/locale_hack.h"
30 #include "charset.h"
31 #include "configure.h"
32
33
34 /****************
35  * Declarations *
36  ****************/
37
38 #define CHARSET_TRANS_ARRAY_LEN ( sizeof(charset_trans_array) / sizeof((charset_trans_array)[0]) )
39 const CharsetInfo charset_trans_array[] = {
40         {N_("Arabic (IBM-864)"),                  "IBM864"        },
41         {N_("Arabic (ISO-8859-6)"),               "ISO-8859-6"    },
42         {N_("Arabic (Windows-1256)"),             "windows-1256"  },
43         {N_("Baltic (ISO-8859-13)"),              "ISO-8859-13"   },
44         {N_("Baltic (ISO-8859-4)"),               "ISO-8859-4"    },
45         {N_("Baltic (Windows-1257)"),             "windows-1257"  },
46         {N_("Celtic (ISO-8859-14)"),              "ISO-8859-14"   },
47         {N_("Central European (IBM-852)"),        "IBM852"        },
48         {N_("Central European (ISO-8859-2)"),     "ISO-8859-2"    },
49         {N_("Central European (Windows-1250)"),   "windows-1250"  },
50         {N_("Chinese Simplified (GB18030)"),      "gb18030"       },
51         {N_("Chinese Simplified (GB2312)"),       "GB2312"        },
52         {N_("Chinese Traditional (Big5)"),        "Big5"          },
53         {N_("Chinese Traditional (Big5-HKSCS)"),  "Big5-HKSCS"    },
54         {N_("Cyrillic (IBM-855)"),                "IBM855"        },
55         {N_("Cyrillic (ISO-8859-5)"),             "ISO-8859-5"    },
56         {N_("Cyrillic (ISO-IR-111)"),             "ISO-IR-111"    },
57         {N_("Cyrillic (KOI8-R)"),                 "KOI8-R"        },
58         {N_("Cyrillic (Windows-1251)"),           "windows-1251"  },
59         {N_("Cyrillic/Russian (CP-866)"),         "IBM866"        },
60         {N_("Cyrillic/Ukrainian (KOI8-U)"),       "KOI8-U"        },
61         {N_("English (US-ASCII)"),                "us-ascii"      },
62         {N_("Greek (ISO-8859-7)"),                "ISO-8859-7"    },
63         {N_("Greek (Windows-1253)"),              "windows-1253"  },
64         {N_("Hebrew (IBM-862)"),                  "IBM862"        },
65         {N_("Hebrew (Windows-1255)"),             "windows-1255"  },
66         {N_("Japanese (EUC-JP)"),                 "EUC-JP"        },
67         {N_("Japanese (ISO-2022-JP)"),            "ISO-2022-JP"   },
68         {N_("Japanese (Shift_JIS)"),              "Shift_JIS"     },
69         {N_("Korean (EUC-KR)"),                   "EUC-KR"        },
70         {N_("Nordic (ISO-8859-10)"),              "ISO-8859-10"   },
71         {N_("South European (ISO-8859-3)"),       "ISO-8859-3"    },
72         {N_("Thai (TIS-620)"),                    "TIS-620"       },
73         {N_("Turkish (IBM-857)"),                 "IBM857"        },
74         {N_("Turkish (ISO-8859-9)"),              "ISO-8859-9"    },
75         {N_("Turkish (Windows-1254)"),            "windows-1254"  },
76         {N_("Unicode (UTF-7)"),                   "UTF-7"         },
77         {N_("Unicode (UTF-8)"),                   "UTF-8"         },
78         {N_("Unicode (UTF-16BE)"),                "UTF-16BE"      },
79         {N_("Unicode (UTF-16LE)"),                "UTF-16LE"      },
80         {N_("Unicode (UTF-32BE)"),                "UTF-32BE"      },
81         {N_("Unicode (UTF-32LE)"),                "UTF-32LE"      },
82         {N_("Vietnamese (VISCII)"),               "VISCII"        },
83         {N_("Vietnamese (Windows-1258)"),         "windows-1258"  },
84         {N_("Visual Hebrew (ISO-8859-8)"),        "ISO-8859-8"    },
85         {N_("Western (IBM-850)"),                 "IBM850"        },
86         {N_("Western (ISO-8859-1)"),              "ISO-8859-1"    },
87         {N_("Western (ISO-8859-15)"),             "ISO-8859-15"   },
88         {N_("Western (Windows-1252)"),            "windows-1252"  }
89
90         /*
91          * From this point, character sets aren't supported by iconv
92          */
93 #if 0
94         {N_("Arabic (IBM-864-I)"),                "IBM864i"              },
95         {N_("Arabic (ISO-8859-6-E)"),             "ISO-8859-6-E"         },
96         {N_("Arabic (ISO-8859-6-I)"),             "ISO-8859-6-I"         },
97         {N_("Arabic (MacArabic)"),                "x-mac-arabic"         },
98         {N_("Armenian (ARMSCII-8)"),              "armscii-8"            },
99         {N_("Central European (MacCE)"),          "x-mac-ce"             },
100         {N_("Chinese Simplified (GBK)"),          "x-gbk"                },
101         {N_("Chinese Simplified (HZ)"),           "HZ-GB-2312"           },
102         {N_("Chinese Traditional (EUC-TW)"),      "x-euc-tw"             },
103         {N_("Croatian (MacCroatian)"),            "x-mac-croatian"       },
104         {N_("Cyrillic (MacCyrillic)"),            "x-mac-cyrillic"       },
105         {N_("Cyrillic/Ukrainian (MacUkrainian)"), "x-mac-ukrainian"      },
106         {N_("Farsi (MacFarsi)"),                  "x-mac-farsi"},
107         {N_("Greek (MacGreek)"),                  "x-mac-greek"          },
108         {N_("Gujarati (MacGujarati)"),            "x-mac-gujarati"       },
109         {N_("Gurmukhi (MacGurmukhi)"),            "x-mac-gurmukhi"       },
110         {N_("Hebrew (ISO-8859-8-E)"),             "ISO-8859-8-E"         },
111         {N_("Hebrew (ISO-8859-8-I)"),             "ISO-8859-8-I"         },
112         {N_("Hebrew (MacHebrew)"),                "x-mac-hebrew"         },
113         {N_("Hindi (MacDevanagari)"),             "x-mac-devanagari"     },
114         {N_("Icelandic (MacIcelandic)"),          "x-mac-icelandic"      },
115         {N_("Korean (JOHAB)"),                    "x-johab"              },
116         {N_("Korean (UHC)"),                      "x-windows-949"        },
117         {N_("Romanian (MacRomanian)"),            "x-mac-romanian"       },
118         {N_("Turkish (MacTurkish)"),              "x-mac-turkish"        },
119         {N_("User Defined"),                      "x-user-defined"       },
120         {N_("Vietnamese (TCVN)"),                 "x-viet-tcvn5712"      },
121         {N_("Vietnamese (VPS)"),                  "x-viet-vps"           },
122         {N_("Western (MacRoman)"),                "x-mac-roman"          },
123         /* charsets whithout posibly translatable names */
124         {"T61.8bit",                              "T61.8bit"             },
125         {"x-imap4-modified-utf7",                 "x-imap4-modified-utf7"},
126         {"x-u-escaped",                           "x-u-escaped"          },
127         {"windows-936",                           "windows-936"          }
128 #endif
129 };
130
131 /*************
132  * Functions *
133  *************/
134
135 /*
136  * Commons conversion functions
137  */
138 char *convert_from_file_to_user(const char *string)
139 {
140         return FLAC_plugin__charset_convert_string(string, flac_cfg.title.file_char_set, flac_cfg.title.user_char_set);
141 }
142
143 char *convert_from_user_to_file(const char *string)
144 {
145         return FLAC_plugin__charset_convert_string(string, flac_cfg.title.user_char_set, flac_cfg.title.file_char_set);
146 }
147
148 void convert_from_file_to_user_in_place(char **string)
149 {
150         if(0 != *string) {
151                 char *tmp;
152
153                 tmp = convert_from_file_to_user(*string);
154                 free(*string);
155                 *string = tmp;
156         }
157 }
158
159 void convert_from_user_to_file_in_place(char **string)
160 {
161         if(0 != *string) {
162                 char *tmp;
163
164                 tmp = convert_from_user_to_file(*string);
165                 free(*string);
166                 *string = tmp;
167         }
168 }
169
170 GList *Charset_Create_List (void)
171 {
172         GList *list = NULL;
173         guint i;
174
175         for (i=0; i<CHARSET_TRANS_ARRAY_LEN; i++)
176                 list = g_list_append(list,_(charset_trans_array[i].charset_title));
177         return list;
178 }
179
180
181 /*
182  * Return charset_name from charset_title
183  */
184 gchar *Charset_Get_Name_From_Title (gchar *charset_title)
185 {
186         guint i;
187
188         if (charset_title)
189                 for (i=0; i<CHARSET_TRANS_ARRAY_LEN; i++)
190                         if ( strcasecmp(_(charset_title),_(charset_trans_array[i].charset_title)) == 0 )
191                                 return charset_trans_array[i].charset_name;
192         return "";
193 }
194
195
196 /*
197  * Return charset_title from charset_name
198  */
199 gchar *Charset_Get_Title_From_Name (gchar *charset_name)
200 {
201         guint i;
202
203         if (charset_name)
204                 for (i=0; i<CHARSET_TRANS_ARRAY_LEN; i++)
205                         if ( strcasecmp(charset_name,charset_trans_array[i].charset_name) == 0 )
206                                 return _(charset_trans_array[i].charset_title);
207         return "";
208 }