1
0
Fork 0
forked from len0rd/rockbox

table-driven internal handling of file types, so we can have many of them

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4115 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jörg Hohensohn 2003-12-07 16:57:43 +00:00
parent 7b7fc1e95f
commit 8b813d0b99
4 changed files with 97 additions and 109 deletions

View file

@ -59,7 +59,7 @@ static bool add_to_playlist(int position, bool queue)
if (new_playlist)
playlist_create(NULL, NULL);
if (selected_file_attr & TREE_ATTR_MPA)
if ((selected_file_attr & TREE_ATTR_MASK) == TREE_ATTR_MPA)
playlist_insert_track(selected_file, position, queue);
else if (selected_file_attr & ATTR_DIRECTORY)
{
@ -101,7 +101,7 @@ static bool add_to_playlist(int position, bool queue)
playlist_insert_directory(selected_file, position, queue, recurse);
}
else if (selected_file_attr & TREE_ATTR_M3U)
else if ((selected_file_attr & TREE_ATTR_MASK) == TREE_ATTR_M3U)
playlist_insert_playlist(selected_file, position, queue);
if (new_playlist && (playlist_amount() > 0))
@ -158,7 +158,7 @@ static bool playlist_options(void)
args[i].queue = true;
i++;
}
else if ((selected_file_attr & TREE_ATTR_MPA) ||
else if (((selected_file_attr & TREE_ATTR_MASK) == TREE_ATTR_MPA) ||
(selected_file_attr & ATTR_DIRECTORY))
{
menu[i].desc = str(LANG_INSERT);
@ -489,8 +489,8 @@ int onplay(char* file, int attr)
selected_file = file;
selected_file_attr = attr;
if ((attr & TREE_ATTR_MPA) || (attr & ATTR_DIRECTORY) ||
((attr & TREE_ATTR_M3U) && (mpeg_status() & MPEG_STATUS_PLAY)))
if (((attr & TREE_ATTR_MASK) == TREE_ATTR_MPA) || (attr & ATTR_DIRECTORY) ||
(((attr & TREE_ATTR_MASK) == TREE_ATTR_M3U) && (mpeg_status() & MPEG_STATUS_PLAY)))
{
menu[i].desc = str(LANG_PLAYINDICES_PLAYLIST);
menu[i].function = playlist_options;
@ -508,7 +508,7 @@ int onplay(char* file, int attr)
i++;
}
if (attr & TREE_ATTR_MPA)
if ((attr & TREE_ATTR_MASK) == TREE_ATTR_MPA)
{
menu[i].desc = str(LANG_VBRFIX);
menu[i].function = vbr_fix;

View file

@ -468,7 +468,7 @@ static int add_directory_to_playlist(char *dirname, int *position, bool queue,
else
continue;
}
else if (files[i].attr & TREE_ATTR_MPA)
else if ((files[i].attr & TREE_ATTR_MASK) == TREE_ATTR_MPA)
{
int insert_pos;

View file

@ -61,6 +61,38 @@
#define BOOTFILE "archos.mod"
#endif
/* a table for the know file types */
static struct
{
char* extension; /* extension for which the file type is recognized */
int tree_attr; /* which identifier */
int icon; /* the icon which shall be used for it, -1 if unknown */
/* To have it extendable, there could be more useful stuff in here,
like handler functions, plugin name, etc. */
} filetypes[] = {
{ ".mp3", TREE_ATTR_MPA, File },
{ ".mp2", TREE_ATTR_MPA, File },
{ ".mpa", TREE_ATTR_MPA, File },
{ ".m3u", TREE_ATTR_M3U, Playlist },
{ ".cfg", TREE_ATTR_CFG, Config },
{ ".wps", TREE_ATTR_WPS, Wps, },
{ ".txt", TREE_ATTR_TXT, Text },
{ ".lng", TREE_ATTR_LNG, Language },
{ ".rock",TREE_ATTR_ROCK,Plugin },
#ifdef HAVE_LCD_BITMAP
{ ".fnt", TREE_ATTR_FONT,Font },
{ ".ch8", TREE_ATTR_CH8, -1 },
#endif
#ifndef SIMULATOR
#ifdef ARCHOS_RECORDER
{ ".ucl", TREE_ATTR_UCL, Flashfile},
{ ".ajz", TREE_ATTR_MOD, Mod_Ajz },
#else
{ ".mod", TREE_ATTR_MOD, Mod_Ajz },
#endif
#endif /* #ifndef SIMULATOR */
};
/* Boot value of global_settings.max_files_in_dir */
static int max_files_in_dir;
@ -284,38 +316,20 @@ struct entry* load_and_sort_directory(char *dirname, int *dirfilter,
dptr->attr = entry->attribute;
/* mark mp? and m3u files as such */
if ( !(dptr->attr & ATTR_DIRECTORY) && (len > 4) ) {
if (!strcasecmp(&entry->d_name[len-4], ".mp3") ||
(!strcasecmp(&entry->d_name[len-4], ".mp2")) ||
(!strcasecmp(&entry->d_name[len-4], ".mpa")))
dptr->attr |= TREE_ATTR_MPA;
else if (!strcasecmp(&entry->d_name[len-4], ".m3u"))
dptr->attr |= TREE_ATTR_M3U;
else if (!strcasecmp(&entry->d_name[len-4], ".cfg"))
dptr->attr |= TREE_ATTR_CFG;
else if (!strcasecmp(&entry->d_name[len-4], ".wps"))
dptr->attr |= TREE_ATTR_WPS;
else if (!strcasecmp(&entry->d_name[len-4], ".txt"))
dptr->attr |= TREE_ATTR_TXT;
else if (!strcasecmp(&entry->d_name[len-4], ".lng"))
dptr->attr |= TREE_ATTR_LNG;
#ifdef HAVE_RECORDER_KEYPAD
else if (!strcasecmp(&entry->d_name[len-4], ".fnt"))
dptr->attr |= TREE_ATTR_FONT;
else if (!strcasecmp(&entry->d_name[len-4], ".ajz"))
#else
else if (!strcasecmp(&entry->d_name[len-4], ".mod"))
#endif
dptr->attr |= TREE_ATTR_MOD;
else if (!strcasecmp(&entry->d_name[len-5], ".rock"))
dptr->attr |= TREE_ATTR_ROCK;
else if (!strcasecmp(&entry->d_name[len-4], ".ucl"))
dptr->attr |= TREE_ATTR_UCL;
#ifdef HAVE_LCD_BITMAP
else if (!strcasecmp(&entry->d_name[len-4], ".ch8"))
dptr->attr |= TREE_ATTR_CH8;
#endif
/* check for known file types */
if ( !(dptr->attr & ATTR_DIRECTORY) && (len > 4) )
{
unsigned j;
for (j=0; j<sizeof(filetypes)/sizeof(*filetypes); j++)
{
if (!strcasecmp(
&entry->d_name[len-strlen(filetypes[j].extension)],
filetypes[j].extension))
{
dptr->attr |= filetypes[j].tree_attr;
break;
}
}
}
/* memorize/compare details about the boot file */
@ -330,17 +344,19 @@ struct entry* load_and_sort_directory(char *dirname, int *dirfilter,
}
/* filter out non-visible files */
if ((*dirfilter == SHOW_PLAYLIST &&
!(dptr->attr & (ATTR_DIRECTORY|TREE_ATTR_M3U))) ||
(*dirfilter == SHOW_MUSIC &&
!(dptr->attr & (ATTR_DIRECTORY|TREE_ATTR_MPA|TREE_ATTR_M3U))) ||
if (!(dptr->attr & ATTR_DIRECTORY) && (
(*dirfilter == SHOW_PLAYLIST &&
(dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_M3U) ||
((*dirfilter == SHOW_MUSIC &&
(dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_MPA) &&
(dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_M3U) ||
(*dirfilter == SHOW_SUPPORTED && !(dptr->attr & TREE_ATTR_MASK)) ||
(*dirfilter == SHOW_WPS && !(dptr->attr & TREE_ATTR_WPS)) ||
(*dirfilter == SHOW_CFG && !(dptr->attr & TREE_ATTR_CFG)) ||
(*dirfilter == SHOW_LNG && !(dptr->attr & TREE_ATTR_LNG)) ||
(*dirfilter == SHOW_MOD && !(dptr->attr & TREE_ATTR_MOD)) ||
(*dirfilter == SHOW_FONT && !(dptr->attr & TREE_ATTR_FONT)) ||
(*dirfilter == SHOW_PLUGINS && !(dptr->attr & TREE_ATTR_ROCK)))
(*dirfilter == SHOW_WPS && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_WPS) ||
(*dirfilter == SHOW_CFG && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_CFG) ||
(*dirfilter == SHOW_LNG && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_LNG) ||
(*dirfilter == SHOW_MOD && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_MOD) ||
(*dirfilter == SHOW_FONT && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_FONT) ||
(*dirfilter == SHOW_PLUGINS && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_ROCK)))
{
i--;
continue;
@ -459,66 +475,38 @@ static int showdir(char *path, int start, int *dirfilter)
for ( i=start; i < start+tree_max_on_screen; i++ ) {
int len;
unsigned j;
if ( i >= filesindir )
break;
len = strlen(dircache[i].name);
switch ( dircache[i].attr & TREE_ATTR_MASK ) {
case ATTR_DIRECTORY:
icon_type = Folder;
break;
if (dircache[i].attr & ATTR_DIRECTORY)
{
icon_type = Folder;
}
else
{
/* search which icon to use */
icon_type = -1; /* default to none */
for (j=0; j<sizeof(filetypes)/sizeof(*filetypes); j++)
{
if ((dircache[i].attr & TREE_ATTR_MASK) == filetypes[j].tree_attr)
{
icon_type = filetypes[j].icon;
break;
}
}
case TREE_ATTR_M3U:
icon_type = Playlist;
break;
case TREE_ATTR_MPA:
icon_type = File;
break;
case TREE_ATTR_WPS:
icon_type = Wps;
break;
case TREE_ATTR_CFG:
icon_type = Config;
break;
case TREE_ATTR_TXT:
icon_type = Text;
break;
case TREE_ATTR_LNG:
icon_type = Language;
break;
case TREE_ATTR_MOD:
icon_type = Mod_Ajz;
break;
#ifdef HAVE_LCD_BITMAP
case TREE_ATTR_UCL:
icon_type = Flashfile;
break;
#endif
case TREE_ATTR_ROCK:
icon_type = Plugin;
break;
#ifdef HAVE_LCD_BITMAP
case TREE_ATTR_FONT:
icon_type = Font;
break;
#endif
default:
if (icon_type == -1)
{
#ifdef HAVE_LCD_BITMAP
icon_type = 0;
#else
icon_type = Unknown;
#endif
}
}
if (icon_type && global_settings.show_icons) {

View file

@ -27,18 +27,18 @@ struct entry {
};
/* using attribute not used by FAT */
#define TREE_ATTR_MPA 0x40 /* mpeg audio file */
#define TREE_ATTR_M3U 0x80 /* playlist */
#define TREE_ATTR_WPS 0x100 /* wps config file */
#define TREE_ATTR_MOD 0x200 /* firmware file */
#define TREE_ATTR_CFG 0x400 /* config file */
#define TREE_ATTR_TXT 0x500 /* text file */
#define TREE_ATTR_FONT 0x800 /* font file */
#define TREE_ATTR_LNG 0x1000 /* binary lang file */
#define TREE_ATTR_ROCK 0x2000 /* binary rockbox plugin */
#define TREE_ATTR_UCL 0x4000 /* rockbox flash image */
#define TREE_ATTR_CH8 0x8000 /* chip-8 game */
#define TREE_ATTR_MASK 0xffd0 /* which bits tree.c uses (above + DIR) */
#define TREE_ATTR_MPA 0x0100 /* mpeg audio file */
#define TREE_ATTR_M3U 0x0200 /* playlist */
#define TREE_ATTR_WPS 0x0300 /* wps config file */
#define TREE_ATTR_MOD 0x0400 /* firmware file */
#define TREE_ATTR_CFG 0x0500 /* config file */
#define TREE_ATTR_TXT 0x0600 /* text file */
#define TREE_ATTR_FONT 0x0700 /* font file */
#define TREE_ATTR_LNG 0x0800 /* binary lang file */
#define TREE_ATTR_ROCK 0x0900 /* binary rockbox plugin */
#define TREE_ATTR_UCL 0x0A00 /* rockbox flash image */
#define TREE_ATTR_CH8 0x0B00 /* chip-8 game */
#define TREE_ATTR_MASK 0xFFC0 /* which bits tree.c uses (above) */
void tree_init(void);
void browse_root(void);