diff options
| author | Magnus Holmgren <magnushol@gmail.com> | 2006-11-29 19:22:44 +0000 |
|---|---|---|
| committer | Magnus Holmgren <magnushol@gmail.com> | 2006-11-29 19:22:44 +0000 |
| commit | a515b10d47218cf2cc4c79865ff2a34aea7ec3bc (patch) | |
| tree | ceb7ce6a713ce8c9bf67fe0de48a62748aa12585 /apps | |
| parent | 6ae46065b40691d5571252aeeb2ec5475e2f5e4c (diff) | |
| download | rockbox-a515b10d47218cf2cc4c79865ff2a34aea7ec3bc.zip rockbox-a515b10d47218cf2cc4c79865ff2a34aea7ec3bc.tar.gz rockbox-a515b10d47218cf2cc4c79865ff2a34aea7ec3bc.tar.bz2 rockbox-a515b10d47218cf2cc4c79865ff2a34aea7ec3bc.tar.xz | |
Read .m3u playlist files using the default code page (unless they start with a BOM) rather than UTF-8. Change default playlist suffix to .m3u8 (playlists are always saved using UTF-8).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11626 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
| -rw-r--r-- | apps/playlist.c | 42 | ||||
| -rw-r--r-- | apps/playlist.h | 3 | ||||
| -rw-r--r-- | apps/playlist_menu.c | 4 |
3 files changed, 45 insertions, 4 deletions
diff --git a/apps/playlist.c b/apps/playlist.c index 23d79a6..4a3c37d 100644 --- a/apps/playlist.c +++ b/apps/playlist.c @@ -68,6 +68,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <ctype.h> #include "playlist.h" #include "file.h" #include "action.h" @@ -97,6 +98,7 @@ #include "lang.h" #include "talk.h" #include "splash.h" +#include "rbunicode.h" #define PLAYLIST_CONTROL_FILE ROCKBOX_DIR "/.playlist_control" #define PLAYLIST_CONTROL_FILE_VERSION 2 @@ -202,6 +204,7 @@ static const char playlist_thread_name[] = "playlist cachectrl"; static void empty_playlist(struct playlist_info* playlist, bool resume) { playlist->filename[0] = '\0'; + playlist->utf8 = true; if(playlist->fd >= 0) /* If there is an already open playlist, close it. */ @@ -437,6 +440,10 @@ static void update_playlist_filename(struct playlist_info* playlist, { char *sep=""; int dirlen = strlen(dir); + int filelen = strlen(file); + + /* Default to utf8 unless explicitly told otherwise. */ + playlist->utf8 = !(filelen > 4 && strcasecmp(&file[filelen - 4], ".m3u") == 0); /* If the dir does not end in trailing slash, we use a separator. Otherwise we don't. */ @@ -509,6 +516,7 @@ static int add_indices_to_playlist(struct playlist_info* playlist, nread -= 3; p += 3; i += 3; + playlist->utf8 = true; /* Override any earlier indication. */ } for(count=0; count < nread; count++,p++) { @@ -1267,7 +1275,38 @@ static int get_filename(struct playlist_info* playlist, int index, int seek, if (lseek(fd, seek, SEEK_SET) != seek) max = -1; else - max = read(fd, tmp_buf, buf_length); + { + max = read(fd, tmp_buf, MIN((size_t) buf_length, sizeof(tmp_buf))); + + if ((max > 0) && !playlist->utf8) + { + char* end; + int i = 0; + + /* Locate EOL. */ + while ((tmp_buf[i] != '\n') && (tmp_buf[i] != '\r') + && (i < max)) + { + i++; + } + + /* Now work back killing white space. */ + while ((i > 0) && isspace(tmp_buf[i - 1])) + { + i--; + } + + /* Borrow dir_buf a little... */ + /* TODO: iso_decode can overflow dir_buf; it really + * should take a dest size argument. + */ + end = iso_decode(tmp_buf, dir_buf, -1, i); + *end = 0; + strncpy(tmp_buf, dir_buf, sizeof(tmp_buf)); + tmp_buf[sizeof(tmp_buf) - 1] = 0; + max = strlen(tmp_buf); + } + } } mutex_unlock(&playlist->control_mutex); @@ -2697,6 +2736,7 @@ int playlist_set_current(struct playlist_info* playlist) strncpy(current_playlist.filename, playlist->filename, sizeof(current_playlist.filename)); + current_playlist.utf8 = playlist->utf8; current_playlist.fd = playlist->fd; close(playlist->control_fd); diff --git a/apps/playlist.h b/apps/playlist.h index 4ad7587..3270bc5 100644 --- a/apps/playlist.h +++ b/apps/playlist.h @@ -30,7 +30,7 @@ #define PLAYLIST_ATTR_SKIPPED 0x04 #define PLAYLIST_MAX_CACHE 16 -#define DEFAULT_DYNAMIC_PLAYLIST_NAME "/dynamic.m3u" +#define DEFAULT_DYNAMIC_PLAYLIST_NAME "/dynamic.m3u8" enum playlist_command { PLAYLIST_COMMAND_PLAYLIST, @@ -69,6 +69,7 @@ struct playlist_info bool current; /* current playing playlist */ char filename[MAX_PATH]; /* path name of m3u playlist on disk */ char control_filename[MAX_PATH]; /* full path of control file */ + bool utf8; /* playlist is in .m3u8 format */ int fd; /* descriptor of the open playlist file */ int control_fd; /* descriptor of the open control file */ bool control_created; /* has control file been created? */ diff --git a/apps/playlist_menu.c b/apps/playlist_menu.c index e237221..5e73621 100644 --- a/apps/playlist_menu.c +++ b/apps/playlist_menu.c @@ -85,8 +85,8 @@ int save_playlist_screen(struct playlist_info* playlist) filename = playlist_get_name(playlist, temp, sizeof(temp)); - if (!filename || (len=strlen(filename)) <= 4 || - strcasecmp(&filename[len-4], ".m3u")) + if (!filename || (len=strlen(filename)) <= 5 || + strcasecmp(&filename[len-5], ".m3u8")) strcpy(filename, DEFAULT_DYNAMIC_PLAYLIST_NAME); if (!kbd_input(filename, sizeof(temp))) |