diff options
Diffstat (limited to 'apps/tree.c')
-rw-r--r-- | apps/tree.c | 168 |
1 files changed, 78 insertions, 90 deletions
diff --git a/apps/tree.c b/apps/tree.c index a71db78968..25f4434ef5 100644 --- a/apps/tree.c +++ b/apps/tree.c | |||
@@ -61,6 +61,38 @@ | |||
61 | #define BOOTFILE "archos.mod" | 61 | #define BOOTFILE "archos.mod" |
62 | #endif | 62 | #endif |
63 | 63 | ||
64 | /* a table for the know file types */ | ||
65 | static struct | ||
66 | { | ||
67 | char* extension; /* extension for which the file type is recognized */ | ||
68 | int tree_attr; /* which identifier */ | ||
69 | int icon; /* the icon which shall be used for it, -1 if unknown */ | ||
70 | /* To have it extendable, there could be more useful stuff in here, | ||
71 | like handler functions, plugin name, etc. */ | ||
72 | } filetypes[] = { | ||
73 | { ".mp3", TREE_ATTR_MPA, File }, | ||
74 | { ".mp2", TREE_ATTR_MPA, File }, | ||
75 | { ".mpa", TREE_ATTR_MPA, File }, | ||
76 | { ".m3u", TREE_ATTR_M3U, Playlist }, | ||
77 | { ".cfg", TREE_ATTR_CFG, Config }, | ||
78 | { ".wps", TREE_ATTR_WPS, Wps, }, | ||
79 | { ".txt", TREE_ATTR_TXT, Text }, | ||
80 | { ".lng", TREE_ATTR_LNG, Language }, | ||
81 | { ".rock",TREE_ATTR_ROCK,Plugin }, | ||
82 | #ifdef HAVE_LCD_BITMAP | ||
83 | { ".fnt", TREE_ATTR_FONT,Font }, | ||
84 | { ".ch8", TREE_ATTR_CH8, -1 }, | ||
85 | #endif | ||
86 | #ifndef SIMULATOR | ||
87 | #ifdef ARCHOS_RECORDER | ||
88 | { ".ucl", TREE_ATTR_UCL, Flashfile}, | ||
89 | { ".ajz", TREE_ATTR_MOD, Mod_Ajz }, | ||
90 | #else | ||
91 | { ".mod", TREE_ATTR_MOD, Mod_Ajz }, | ||
92 | #endif | ||
93 | #endif /* #ifndef SIMULATOR */ | ||
94 | }; | ||
95 | |||
64 | /* Boot value of global_settings.max_files_in_dir */ | 96 | /* Boot value of global_settings.max_files_in_dir */ |
65 | static int max_files_in_dir; | 97 | static int max_files_in_dir; |
66 | 98 | ||
@@ -284,38 +316,20 @@ struct entry* load_and_sort_directory(char *dirname, int *dirfilter, | |||
284 | 316 | ||
285 | dptr->attr = entry->attribute; | 317 | dptr->attr = entry->attribute; |
286 | 318 | ||
287 | /* mark mp? and m3u files as such */ | 319 | /* check for known file types */ |
288 | if ( !(dptr->attr & ATTR_DIRECTORY) && (len > 4) ) { | 320 | if ( !(dptr->attr & ATTR_DIRECTORY) && (len > 4) ) |
289 | if (!strcasecmp(&entry->d_name[len-4], ".mp3") || | 321 | { |
290 | (!strcasecmp(&entry->d_name[len-4], ".mp2")) || | 322 | unsigned j; |
291 | (!strcasecmp(&entry->d_name[len-4], ".mpa"))) | 323 | for (j=0; j<sizeof(filetypes)/sizeof(*filetypes); j++) |
292 | dptr->attr |= TREE_ATTR_MPA; | 324 | { |
293 | else if (!strcasecmp(&entry->d_name[len-4], ".m3u")) | 325 | if (!strcasecmp( |
294 | dptr->attr |= TREE_ATTR_M3U; | 326 | &entry->d_name[len-strlen(filetypes[j].extension)], |
295 | else if (!strcasecmp(&entry->d_name[len-4], ".cfg")) | 327 | filetypes[j].extension)) |
296 | dptr->attr |= TREE_ATTR_CFG; | 328 | { |
297 | else if (!strcasecmp(&entry->d_name[len-4], ".wps")) | 329 | dptr->attr |= filetypes[j].tree_attr; |
298 | dptr->attr |= TREE_ATTR_WPS; | 330 | break; |
299 | else if (!strcasecmp(&entry->d_name[len-4], ".txt")) | 331 | } |
300 | dptr->attr |= TREE_ATTR_TXT; | 332 | } |
301 | else if (!strcasecmp(&entry->d_name[len-4], ".lng")) | ||
302 | dptr->attr |= TREE_ATTR_LNG; | ||
303 | #ifdef HAVE_RECORDER_KEYPAD | ||
304 | else if (!strcasecmp(&entry->d_name[len-4], ".fnt")) | ||
305 | dptr->attr |= TREE_ATTR_FONT; | ||
306 | else if (!strcasecmp(&entry->d_name[len-4], ".ajz")) | ||
307 | #else | ||
308 | else if (!strcasecmp(&entry->d_name[len-4], ".mod")) | ||
309 | #endif | ||
310 | dptr->attr |= TREE_ATTR_MOD; | ||
311 | else if (!strcasecmp(&entry->d_name[len-5], ".rock")) | ||
312 | dptr->attr |= TREE_ATTR_ROCK; | ||
313 | else if (!strcasecmp(&entry->d_name[len-4], ".ucl")) | ||
314 | dptr->attr |= TREE_ATTR_UCL; | ||
315 | #ifdef HAVE_LCD_BITMAP | ||
316 | else if (!strcasecmp(&entry->d_name[len-4], ".ch8")) | ||
317 | dptr->attr |= TREE_ATTR_CH8; | ||
318 | #endif | ||
319 | } | 333 | } |
320 | 334 | ||
321 | /* memorize/compare details about the boot file */ | 335 | /* memorize/compare details about the boot file */ |
@@ -330,17 +344,19 @@ struct entry* load_and_sort_directory(char *dirname, int *dirfilter, | |||
330 | } | 344 | } |
331 | 345 | ||
332 | /* filter out non-visible files */ | 346 | /* filter out non-visible files */ |
333 | if ((*dirfilter == SHOW_PLAYLIST && | 347 | if (!(dptr->attr & ATTR_DIRECTORY) && ( |
334 | !(dptr->attr & (ATTR_DIRECTORY|TREE_ATTR_M3U))) || | 348 | (*dirfilter == SHOW_PLAYLIST && |
335 | (*dirfilter == SHOW_MUSIC && | 349 | (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_M3U) || |
336 | !(dptr->attr & (ATTR_DIRECTORY|TREE_ATTR_MPA|TREE_ATTR_M3U))) || | 350 | ((*dirfilter == SHOW_MUSIC && |
351 | (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_MPA) && | ||
352 | (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_M3U) || | ||
337 | (*dirfilter == SHOW_SUPPORTED && !(dptr->attr & TREE_ATTR_MASK)) || | 353 | (*dirfilter == SHOW_SUPPORTED && !(dptr->attr & TREE_ATTR_MASK)) || |
338 | (*dirfilter == SHOW_WPS && !(dptr->attr & TREE_ATTR_WPS)) || | 354 | (*dirfilter == SHOW_WPS && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_WPS) || |
339 | (*dirfilter == SHOW_CFG && !(dptr->attr & TREE_ATTR_CFG)) || | 355 | (*dirfilter == SHOW_CFG && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_CFG) || |
340 | (*dirfilter == SHOW_LNG && !(dptr->attr & TREE_ATTR_LNG)) || | 356 | (*dirfilter == SHOW_LNG && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_LNG) || |
341 | (*dirfilter == SHOW_MOD && !(dptr->attr & TREE_ATTR_MOD)) || | 357 | (*dirfilter == SHOW_MOD && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_MOD) || |
342 | (*dirfilter == SHOW_FONT && !(dptr->attr & TREE_ATTR_FONT)) || | 358 | (*dirfilter == SHOW_FONT && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_FONT) || |
343 | (*dirfilter == SHOW_PLUGINS && !(dptr->attr & TREE_ATTR_ROCK))) | 359 | (*dirfilter == SHOW_PLUGINS && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_ROCK))) |
344 | { | 360 | { |
345 | i--; | 361 | i--; |
346 | continue; | 362 | continue; |
@@ -459,66 +475,38 @@ static int showdir(char *path, int start, int *dirfilter) | |||
459 | 475 | ||
460 | for ( i=start; i < start+tree_max_on_screen; i++ ) { | 476 | for ( i=start; i < start+tree_max_on_screen; i++ ) { |
461 | int len; | 477 | int len; |
478 | unsigned j; | ||
462 | 479 | ||
463 | if ( i >= filesindir ) | 480 | if ( i >= filesindir ) |
464 | break; | 481 | break; |
465 | 482 | ||
466 | len = strlen(dircache[i].name); | 483 | len = strlen(dircache[i].name); |
467 | 484 | ||
468 | switch ( dircache[i].attr & TREE_ATTR_MASK ) { | 485 | if (dircache[i].attr & ATTR_DIRECTORY) |
469 | case ATTR_DIRECTORY: | 486 | { |
470 | icon_type = Folder; | 487 | icon_type = Folder; |
471 | break; | 488 | } |
472 | 489 | else | |
473 | case TREE_ATTR_M3U: | 490 | { |
474 | icon_type = Playlist; | 491 | /* search which icon to use */ |
475 | break; | 492 | icon_type = -1; /* default to none */ |
476 | 493 | for (j=0; j<sizeof(filetypes)/sizeof(*filetypes); j++) | |
477 | case TREE_ATTR_MPA: | 494 | { |
478 | icon_type = File; | 495 | if ((dircache[i].attr & TREE_ATTR_MASK) == filetypes[j].tree_attr) |
479 | break; | 496 | { |
480 | 497 | icon_type = filetypes[j].icon; | |
481 | case TREE_ATTR_WPS: | 498 | break; |
482 | icon_type = Wps; | 499 | } |
483 | break; | 500 | } |
484 | |||
485 | case TREE_ATTR_CFG: | ||
486 | icon_type = Config; | ||
487 | break; | ||
488 | |||
489 | case TREE_ATTR_TXT: | ||
490 | icon_type = Text; | ||
491 | break; | ||
492 | |||
493 | case TREE_ATTR_LNG: | ||
494 | icon_type = Language; | ||
495 | break; | ||
496 | |||
497 | case TREE_ATTR_MOD: | ||
498 | icon_type = Mod_Ajz; | ||
499 | break; | ||
500 | |||
501 | #ifdef HAVE_LCD_BITMAP | ||
502 | case TREE_ATTR_UCL: | ||
503 | icon_type = Flashfile; | ||
504 | break; | ||
505 | #endif | ||
506 | |||
507 | case TREE_ATTR_ROCK: | ||
508 | icon_type = Plugin; | ||
509 | break; | ||
510 | 501 | ||
511 | #ifdef HAVE_LCD_BITMAP | 502 | if (icon_type == -1) |
512 | case TREE_ATTR_FONT: | 503 | { |
513 | icon_type = Font; | ||
514 | break; | ||
515 | #endif | ||
516 | default: | ||
517 | #ifdef HAVE_LCD_BITMAP | 504 | #ifdef HAVE_LCD_BITMAP |
518 | icon_type = 0; | 505 | icon_type = 0; |
519 | #else | 506 | #else |
520 | icon_type = Unknown; | 507 | icon_type = Unknown; |
521 | #endif | 508 | #endif |
509 | } | ||
522 | } | 510 | } |
523 | 511 | ||
524 | if (icon_type && global_settings.show_icons) { | 512 | if (icon_type && global_settings.show_icons) { |