~woodrow-shen/totem/mybranch

« back to all changes in this revision

Viewing changes to src/totem-subtitle-encoding.c

Tags: 2.24.3-3
* totem-mozilla.docs: ship README.browser-plugin which explains how to 
  disable the plugin for some MIME types.
* rules: remove the hack that only let totem-xine support VCDs and 
  DVDs, now that GStreamer supports them. Closes: #370789.
* 01_fake_keypresses.patch: new patch. Completely disable the broken 
  XTEST code that generates fake keypresses. Closes: #500330.
* 90_autotools.patch: regenerated.
* Build-depend on nautilus 2.22 to be sure to build the extension for 
  the correct version.
* totem-xine depends on libxine1-x.
* Standards version is 3.8.1.
* Upload to unstable.
* 04_tracker_build.patch: new patch, stolen upstream. Fix build with 
  latest tracker version.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
 *
4
4
 * encoding list copied from gnome-terminal/encoding.c
5
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.
 
6
 * This program is free software; you can redistribute it and/or
 
7
 * modify it under the terms of the GNU Lesser General Public
 
8
 * License as published by the Free Software Foundation; either
 
9
 * version 2.1 of the License, or (at your option) any later version.
10
10
 *
11
11
 * This program is distributed in the hope that it will be useful,
12
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.
 
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
14
 * Lesser General Public License for more details.
15
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.
 
16
 * You should have received a copy of the GNU Lesser General Public
 
17
 * License along with this library; if not, write to the Free Software
 
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
19
19
 *
20
20
 * The Totem project hereby grant permission for non-gpl compatible GStreamer
21
21
 * plugins to be used and distributed together with GStreamer and Totem. This
146
146
typedef struct
147
147
{
148
148
  int index;
149
 
  gboolean valid;
150
149
  char *charset;
151
150
  char *name;
152
151
} SubtitleEncoding;
154
153
 
155
154
static SubtitleEncoding encodings[] = {
156
155
 
157
 
  {SUBTITLE_ENCODING_CURRENT_LOCALE, TRUE,
 
156
  {SUBTITLE_ENCODING_CURRENT_LOCALE,
158
157
      NULL, N_("Current Locale")},
159
158
 
160
 
  {SUBTITLE_ENCODING_ISO_8859_6, FALSE,
 
159
  {SUBTITLE_ENCODING_ISO_8859_6,
161
160
      "ISO-8859-6", N_("Arabic")},
162
 
  {SUBTITLE_ENCODING_IBM_864, FALSE,
 
161
  {SUBTITLE_ENCODING_IBM_864,
163
162
      "IBM864", N_("Arabic")},
164
 
  {SUBTITLE_ENCODING_MAC_ARABIC, FALSE,
 
163
  {SUBTITLE_ENCODING_MAC_ARABIC,
165
164
      "MAC_ARABIC", N_("Arabic")},
166
 
  {SUBTITLE_ENCODING_WINDOWS_1256, FALSE,
 
165
  {SUBTITLE_ENCODING_WINDOWS_1256,
167
166
      "WINDOWS-1256", N_("Arabic")},
168
167
 
169
 
  {SUBTITLE_ENCODING_ARMSCII_8, FALSE,
 
168
  {SUBTITLE_ENCODING_ARMSCII_8,
170
169
      "ARMSCII-8", N_("Armenian")},
171
170
 
172
 
  {SUBTITLE_ENCODING_ISO_8859_4, FALSE,
 
171
  {SUBTITLE_ENCODING_ISO_8859_4,
173
172
      "ISO-8859-4", N_("Baltic")},
174
 
  {SUBTITLE_ENCODING_ISO_8859_13, FALSE,
 
173
  {SUBTITLE_ENCODING_ISO_8859_13,
175
174
      "ISO-8859-13", N_("Baltic")},
176
 
  {SUBTITLE_ENCODING_WINDOWS_1257, FALSE,
 
175
  {SUBTITLE_ENCODING_WINDOWS_1257,
177
176
      "WINDOWS-1257", N_("Baltic")},
178
177
 
179
 
  {SUBTITLE_ENCODING_ISO_8859_14, FALSE,
 
178
  {SUBTITLE_ENCODING_ISO_8859_14,
180
179
      "ISO-8859-14", N_("Celtic")},
181
180
 
182
 
  {SUBTITLE_ENCODING_ISO_8859_2, FALSE,
 
181
  {SUBTITLE_ENCODING_ISO_8859_2,
183
182
      "ISO-8859-2", N_("Central European")},
184
 
  {SUBTITLE_ENCODING_IBM_852, FALSE,
 
183
  {SUBTITLE_ENCODING_IBM_852,
185
184
      "IBM852", N_("Central European")},
186
 
  {SUBTITLE_ENCODING_MAC_CE, FALSE,
 
185
  {SUBTITLE_ENCODING_MAC_CE,
187
186
      "MAC_CE", N_("Central European")},
188
 
  {SUBTITLE_ENCODING_WINDOWS_1250, FALSE,
 
187
  {SUBTITLE_ENCODING_WINDOWS_1250,
189
188
      "WINDOWS-1250", N_("Central European")},
190
189
 
191
 
  {SUBTITLE_ENCODING_GB18030, FALSE,
 
190
  {SUBTITLE_ENCODING_GB18030,
192
191
      "GB18030", N_("Chinese Simplified")},
193
 
  {SUBTITLE_ENCODING_GB2312, FALSE,
 
192
  {SUBTITLE_ENCODING_GB2312,
194
193
      "GB2312", N_("Chinese Simplified")},
195
 
  {SUBTITLE_ENCODING_GBK, FALSE,
 
194
  {SUBTITLE_ENCODING_GBK,
196
195
      "GBK", N_("Chinese Simplified")},
197
 
  {SUBTITLE_ENCODING_HZ, FALSE,
 
196
  {SUBTITLE_ENCODING_HZ,
198
197
      "HZ", N_("Chinese Simplified")},
199
198
 
200
 
  {SUBTITLE_ENCODING_BIG5, FALSE,
 
199
  {SUBTITLE_ENCODING_BIG5,
201
200
      "BIG5", N_("Chinese Traditional")},
202
 
  {SUBTITLE_ENCODING_BIG5_HKSCS, FALSE,
 
201
  {SUBTITLE_ENCODING_BIG5_HKSCS,
203
202
      "BIG5-HKSCS", N_("Chinese Traditional")},
204
 
  {SUBTITLE_ENCODING_EUC_TW, FALSE,
 
203
  {SUBTITLE_ENCODING_EUC_TW,
205
204
      "EUC-TW", N_("Chinese Traditional")},
206
205
 
207
 
  {SUBTITLE_ENCODING_MAC_CROATIAN, FALSE,
 
206
  {SUBTITLE_ENCODING_MAC_CROATIAN,
208
207
      "MAC_CROATIAN", N_("Croatian")},
209
208
 
210
 
  {SUBTITLE_ENCODING_ISO_8859_5, FALSE,
 
209
  {SUBTITLE_ENCODING_ISO_8859_5,
211
210
      "ISO-8859-5", N_("Cyrillic")},
212
 
  {SUBTITLE_ENCODING_IBM_855, FALSE,
 
211
  {SUBTITLE_ENCODING_IBM_855,
213
212
      "IBM855", N_("Cyrillic")},
214
 
  {SUBTITLE_ENCODING_ISO_IR_111, FALSE,
 
213
  {SUBTITLE_ENCODING_ISO_IR_111,
215
214
      "ISO-IR-111", N_("Cyrillic")},
216
 
  {SUBTITLE_ENCODING_KOI8_R, FALSE,
 
215
  {SUBTITLE_ENCODING_KOI8_R,
217
216
      "KOI8-R", N_("Cyrillic")},
218
 
  {SUBTITLE_ENCODING_MAC_CYRILLIC, FALSE,
 
217
  {SUBTITLE_ENCODING_MAC_CYRILLIC,
219
218
      "MAC-CYRILLIC", N_("Cyrillic")},
220
 
  {SUBTITLE_ENCODING_WINDOWS_1251, FALSE,
 
219
  {SUBTITLE_ENCODING_WINDOWS_1251,
221
220
      "WINDOWS-1251", N_("Cyrillic")},
222
221
 
223
 
  {SUBTITLE_ENCODING_CP_866, FALSE,
 
222
  {SUBTITLE_ENCODING_CP_866,
224
223
      "CP866", N_("Cyrillic/Russian")},
225
224
 
226
 
  {SUBTITLE_ENCODING_MAC_UKRAINIAN, FALSE,
 
225
  {SUBTITLE_ENCODING_MAC_UKRAINIAN,
227
226
      "MAC_UKRAINIAN", N_("Cyrillic/Ukrainian")},
228
 
  {SUBTITLE_ENCODING_KOI8_U, FALSE,
 
227
  {SUBTITLE_ENCODING_KOI8_U,
229
228
      "KOI8-U", N_("Cyrillic/Ukrainian")},
230
229
 
231
 
  {SUBTITLE_ENCODING_GEOSTD8, FALSE,
 
230
  {SUBTITLE_ENCODING_GEOSTD8,
232
231
      "GEORGIAN-PS", N_("Georgian")},
233
232
 
234
 
  {SUBTITLE_ENCODING_ISO_8859_7, FALSE,
 
233
  {SUBTITLE_ENCODING_ISO_8859_7,
235
234
      "ISO-8859-7", N_("Greek")},
236
 
  {SUBTITLE_ENCODING_MAC_GREEK, FALSE,
 
235
  {SUBTITLE_ENCODING_MAC_GREEK,
237
236
      "MAC_GREEK", N_("Greek")},
238
 
  {SUBTITLE_ENCODING_WINDOWS_1253, FALSE,
 
237
  {SUBTITLE_ENCODING_WINDOWS_1253,
239
238
      "WINDOWS-1253", N_("Greek")},
240
239
 
241
 
  {SUBTITLE_ENCODING_MAC_GUJARATI, FALSE,
 
240
  {SUBTITLE_ENCODING_MAC_GUJARATI,
242
241
      "MAC_GUJARATI", N_("Gujarati")},
243
242
 
244
 
  {SUBTITLE_ENCODING_MAC_GURMUKHI, FALSE,
 
243
  {SUBTITLE_ENCODING_MAC_GURMUKHI,
245
244
      "MAC_GURMUKHI", N_("Gurmukhi")},
246
245
 
247
 
  {SUBTITLE_ENCODING_ISO_8859_8_I, FALSE,
 
246
  {SUBTITLE_ENCODING_ISO_8859_8_I,
248
247
      "ISO-8859-8-I", N_("Hebrew")},
249
 
  {SUBTITLE_ENCODING_IBM_862, FALSE,
 
248
  {SUBTITLE_ENCODING_IBM_862,
250
249
      "IBM862", N_("Hebrew")},
251
 
  {SUBTITLE_ENCODING_MAC_HEBREW, FALSE,
 
250
  {SUBTITLE_ENCODING_MAC_HEBREW,
252
251
      "MAC_HEBREW", N_("Hebrew")},
253
 
  {SUBTITLE_ENCODING_WINDOWS_1255, FALSE,
 
252
  {SUBTITLE_ENCODING_WINDOWS_1255,
254
253
      "WINDOWS-1255", N_("Hebrew")},
255
254
 
256
 
  {SUBTITLE_ENCODING_ISO_8859_8, FALSE,
 
255
  {SUBTITLE_ENCODING_ISO_8859_8,
257
256
      "ISO-8859-8", N_("Hebrew Visual")},
258
257
 
259
 
  {SUBTITLE_ENCODING_MAC_DEVANAGARI, FALSE,
 
258
  {SUBTITLE_ENCODING_MAC_DEVANAGARI,
260
259
      "MAC_DEVANAGARI", N_("Hindi")},
261
260
 
262
 
  {SUBTITLE_ENCODING_MAC_ICELANDIC, FALSE,
 
261
  {SUBTITLE_ENCODING_MAC_ICELANDIC,
263
262
      "MAC_ICELANDIC", N_("Icelandic")},
264
263
 
265
 
  {SUBTITLE_ENCODING_EUC_JP, FALSE,
 
264
  {SUBTITLE_ENCODING_EUC_JP,
266
265
      "EUC-JP", N_("Japanese")},
267
 
  {SUBTITLE_ENCODING_ISO_2022_JP, FALSE,
 
266
  {SUBTITLE_ENCODING_ISO_2022_JP,
268
267
      "ISO2022JP", N_("Japanese")},
269
 
  {SUBTITLE_ENCODING_SHIFT_JIS, FALSE,
 
268
  {SUBTITLE_ENCODING_SHIFT_JIS,
270
269
      "SHIFT-JIS", N_("Japanese")},
271
270
 
272
 
  {SUBTITLE_ENCODING_EUC_KR, FALSE,
 
271
  {SUBTITLE_ENCODING_EUC_KR,
273
272
      "EUC-KR", N_("Korean")},
274
 
  {SUBTITLE_ENCODING_ISO_2022_KR, FALSE,
 
273
  {SUBTITLE_ENCODING_ISO_2022_KR,
275
274
      "ISO2022KR", N_("Korean")},
276
 
  {SUBTITLE_ENCODING_JOHAB, FALSE,
 
275
  {SUBTITLE_ENCODING_JOHAB,
277
276
      "JOHAB", N_("Korean")},
278
 
  {SUBTITLE_ENCODING_UHC, FALSE,
 
277
  {SUBTITLE_ENCODING_UHC,
279
278
      "UHC", N_("Korean")},
280
279
 
281
 
  {SUBTITLE_ENCODING_ISO_8859_10, FALSE,
 
280
  {SUBTITLE_ENCODING_ISO_8859_10,
282
281
      "ISO-8859-10", N_("Nordic")},
283
282
 
284
 
  {SUBTITLE_ENCODING_MAC_FARSI, FALSE,
 
283
  {SUBTITLE_ENCODING_MAC_FARSI,
285
284
      "MAC_FARSI", N_("Persian")},
286
285
 
287
 
  {SUBTITLE_ENCODING_ISO_8859_16, FALSE,
 
286
  {SUBTITLE_ENCODING_ISO_8859_16,
288
287
      "ISO-8859-16", N_("Romanian")},
289
 
  {SUBTITLE_ENCODING_MAC_ROMANIAN, FALSE,
 
288
  {SUBTITLE_ENCODING_MAC_ROMANIAN,
290
289
      "MAC_ROMANIAN", N_("Romanian")},
291
290
 
292
 
  {SUBTITLE_ENCODING_ISO_8859_3, FALSE,
 
291
  {SUBTITLE_ENCODING_ISO_8859_3,
293
292
      "ISO-8859-3", N_("South European")},
294
293
 
295
 
  {SUBTITLE_ENCODING_TIS_620, FALSE,
 
294
  {SUBTITLE_ENCODING_TIS_620,
296
295
      "TIS-620", N_("Thai")},
297
296
 
298
 
  {SUBTITLE_ENCODING_ISO_8859_9, FALSE,
 
297
  {SUBTITLE_ENCODING_ISO_8859_9,
299
298
      "ISO-8859-9", N_("Turkish")},
300
 
  {SUBTITLE_ENCODING_IBM_857, FALSE,
 
299
  {SUBTITLE_ENCODING_IBM_857,
301
300
      "IBM857", N_("Turkish")},
302
 
  {SUBTITLE_ENCODING_MAC_TURKISH, FALSE,
 
301
  {SUBTITLE_ENCODING_MAC_TURKISH,
303
302
      "MAC_TURKISH", N_("Turkish")},
304
 
  {SUBTITLE_ENCODING_WINDOWS_1254, FALSE,
 
303
  {SUBTITLE_ENCODING_WINDOWS_1254,
305
304
      "WINDOWS-1254", N_("Turkish")},
306
305
 
307
 
  {SUBTITLE_ENCODING_UTF_7, FALSE,
 
306
  {SUBTITLE_ENCODING_UTF_7,
308
307
      "UTF-7", N_("Unicode")},
309
 
  {SUBTITLE_ENCODING_UTF_8, FALSE,
 
308
  {SUBTITLE_ENCODING_UTF_8,
310
309
      "UTF-8", N_("Unicode")},
311
 
  {SUBTITLE_ENCODING_UTF_16, FALSE,
 
310
  {SUBTITLE_ENCODING_UTF_16,
312
311
      "UTF-16", N_("Unicode")},
313
 
  {SUBTITLE_ENCODING_UCS_2, FALSE,
 
312
  {SUBTITLE_ENCODING_UCS_2,
314
313
      "UCS-2", N_("Unicode")},
315
 
  {SUBTITLE_ENCODING_UCS_4, FALSE,
 
314
  {SUBTITLE_ENCODING_UCS_4,
316
315
      "UCS-4", N_("Unicode")},
317
316
 
318
 
  {SUBTITLE_ENCODING_ISO_8859_1, FALSE,
 
317
  {SUBTITLE_ENCODING_ISO_8859_1,
319
318
      "ISO-8859-1", N_("Western")},
320
 
  {SUBTITLE_ENCODING_ISO_8859_15, FALSE,
 
319
  {SUBTITLE_ENCODING_ISO_8859_15,
321
320
      "ISO-8859-15", N_("Western")},
322
 
  {SUBTITLE_ENCODING_IBM_850, FALSE,
 
321
  {SUBTITLE_ENCODING_IBM_850,
323
322
      "IBM850", N_("Western")},
324
 
  {SUBTITLE_ENCODING_MAC_ROMAN, FALSE,
 
323
  {SUBTITLE_ENCODING_MAC_ROMAN,
325
324
      "MAC_ROMAN", N_("Western")},
326
 
  {SUBTITLE_ENCODING_WINDOWS_1252, FALSE,
 
325
  {SUBTITLE_ENCODING_WINDOWS_1252,
327
326
      "WINDOWS-1252", N_("Western")},
328
327
 
329
 
  {SUBTITLE_ENCODING_TCVN, FALSE,
 
328
  {SUBTITLE_ENCODING_TCVN,
330
329
      "TCVN", N_("Vietnamese")},
331
 
  {SUBTITLE_ENCODING_VISCII, FALSE,
 
330
  {SUBTITLE_ENCODING_VISCII,
332
331
      "VISCII", N_("Vietnamese")},
333
 
  {SUBTITLE_ENCODING_WINDOWS_1258, FALSE,
 
332
  {SUBTITLE_ENCODING_WINDOWS_1258,
334
333
      "WINDOWS-1258", N_("Vietnamese")}
335
334
};
336
335
 
357
356
static void
358
357
subtitle_encoding_init (void)
359
358
{
360
 
  int i;
361
 
  gsize bytes_read, bytes_written;
362
 
  gchar *converted;
363
 
  gchar ascii_sample[96];
 
359
  guint i;
364
360
 
365
361
  g_get_charset ((const char **)
366
362
      &encodings[SUBTITLE_ENCODING_CURRENT_LOCALE].charset);
367
363
 
368
364
  g_assert (G_N_ELEMENTS (encodings) == SUBTITLE_ENCODING_LAST);
369
365
 
370
 
  /* Initialize the sample text with all of the printing ASCII characters
371
 
   * from space (32) to the tilde (126), 95 in all. */
372
 
  for (i = 0; i < (int) sizeof (ascii_sample); i++)
373
 
    ascii_sample[i] = i + 32;
374
 
 
375
 
  ascii_sample[sizeof (ascii_sample) - 1] = '\0';
376
 
 
377
 
  i = 0;
378
 
  while (i < SUBTITLE_ENCODING_LAST) {
379
 
    bytes_read = 0;
380
 
    bytes_written = 0;
381
 
 
382
 
    g_assert (encodings[i].index == i);
383
 
 
 
366
  for (i = 0; i < SUBTITLE_ENCODING_LAST; i++) {
384
367
    /* Translate the names */
385
368
    encodings[i].name = _(encodings[i].name);
386
 
 
387
 
    /* Test that the encoding is a proper superset of ASCII (which naive
388
 
     * apps are going to use anyway) by attempting to validate the text
389
 
     * using the current encoding.  This also flushes out any encodings
390
 
     * which the underlying GIConv implementation can't support.
391
 
     */
392
 
    converted = g_convert (ascii_sample, sizeof (ascii_sample) - 1,
393
 
        encodings[i].charset, encodings[i].charset,
394
 
        &bytes_read, &bytes_written, NULL);
395
 
 
396
 
    /* The encoding is only valid if ASCII passes through cleanly. */
397
 
    if (i == SUBTITLE_ENCODING_CURRENT_LOCALE)
398
 
      encodings[i].valid = TRUE;
399
 
    else
400
 
      encodings[i].valid =
401
 
          (bytes_read == (sizeof (ascii_sample) - 1)) &&
402
 
          (converted != NULL) && (strcmp (converted, ascii_sample) == 0);
403
 
 
404
 
#ifdef DEBUG_ENCODINGS
405
 
    if (!encodings[i].valid) {
406
 
      g_print ("Rejecting encoding %s as invalid:\n", encodings[i].charset);
407
 
      g_print (" input  \"%s\"\n", ascii_sample);
408
 
      g_print (" output \"%s\"\n\n", converted ? converted : "(null)");
409
 
    }
410
 
#endif
411
 
 
412
 
    /* Discard the converted string. */
413
 
    g_free (converted);
414
 
 
415
 
    ++i;
416
369
  }
417
370
}
418
371
 
437
390
    e = &encodings[SUBTITLE_ENCODING_CURRENT_LOCALE];
438
391
  else if (index < SUBTITLE_ENCODING_CURRENT_LOCALE)
439
392
    e = &encodings[SUBTITLE_ENCODING_CURRENT_LOCALE];
440
 
  else if (!encodings[index].valid)
441
 
    e = &encodings[SUBTITLE_ENCODING_CURRENT_LOCALE];
442
393
  else
443
394
    e = &encodings[index];
444
395
  return e->charset;
491
442
  store = gtk_tree_store_new (2, G_TYPE_INT, G_TYPE_STRING);
492
443
 
493
444
  for (i = 0; i < SUBTITLE_ENCODING_LAST; i++) {
494
 
    if (encodings[i].valid) {
495
 
      if (strcmp (lastlang, encodings[i].name)) {
496
 
        lastlang = encodings[i].name;
497
 
        gtk_tree_store_append (store, &iter, NULL);
498
 
        gtk_tree_store_set (store, &iter, INDEX_COL,
499
 
            -1, NAME_COL, lastlang, -1);
500
 
      }
501
 
      label = g_strdup_printf("%s (%s)", lastlang, encodings[i].charset);
502
 
      gtk_tree_store_append (store, &iter2, &iter);
503
 
      gtk_tree_store_set (store, &iter2, INDEX_COL,
504
 
          encodings[i].index, NAME_COL, label, -1);
505
 
      g_free(label);
 
445
    if (strcmp (lastlang, encodings[i].name)) {
 
446
      lastlang = encodings[i].name;
 
447
      gtk_tree_store_append (store, &iter, NULL);
 
448
      gtk_tree_store_set (store, &iter, INDEX_COL,
 
449
          -1, NAME_COL, lastlang, -1);
506
450
    }
 
451
    label = g_strdup_printf("%s (%s)", lastlang, encodings[i].charset);
 
452
    gtk_tree_store_append (store, &iter2, &iter);
 
453
    gtk_tree_store_set (store, &iter2, INDEX_COL,
 
454
        encodings[i].index, NAME_COL, label, -1);
 
455
    g_free(label);
507
456
  }
508
457
  gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (store),
509
458
      compare, NULL, NULL);