summaryrefslogtreecommitdiff
path: root/apps/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/tree.c')
-rw-r--r--apps/tree.c168
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 */
65static 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 */
65static int max_files_in_dir; 97static 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) {