Now we can have up to 400 files in a directory

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1761 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Linus Nielsen Feltzing 2002-08-15 12:28:52 +00:00
parent 62625737a4
commit 5917e8157a
4 changed files with 82 additions and 46 deletions

27
apps/applimits.h Normal file
View file

@ -0,0 +1,27 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2002 Linus Nielsen Feltzing
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef _APPLIMITS_H_
#define _APPLIMITS_H_
#define MAX_FILES_IN_DIR 400
#define AVERAGE_FILENAME_LENGTH 40
#define MAX_DIR_LEVELS 10
#define MAX_PLAYLIST_SIZE 10000
#endif

View file

@ -29,6 +29,7 @@
#include "kernel.h"
#include "settings.h"
#include "status.h"
#include "applimits.h"
#ifdef HAVE_LCD_BITMAP
#define LINE_Y (global_settings.statusbar&&statusbar_enabled?1:0) /* Y position the entry-list starts at */
@ -38,7 +39,7 @@
playlist_info_t playlist;
#define PLAYLIST_BUFFER_SIZE (MAX_PATH*200)
#define PLAYLIST_BUFFER_SIZE (AVERAGE_FILENAME_LENGTH*MAX_FILES_IN_DIR)
unsigned char playlist_buffer[PLAYLIST_BUFFER_SIZE];
static int playlist_end_pos = 0;
@ -293,8 +294,8 @@ void add_indices_to_playlist(void)
close(fd);
lcd_clear_display();
lcd_puts(0,0,"10000 file");
lcd_puts(0,1,"limit reached");
lcd_puts(0,0,"Playlist");
lcd_puts(0,1,"buffer full");
lcd_update();
sleep(HZ*2);
lcd_clear_display();

View file

@ -22,10 +22,10 @@
#include <stdbool.h>
#include "file.h"
#include "applimits.h"
/* playlist data */
#define MAX_PLAYLIST_SIZE 10000
typedef struct
{
char filename[MAX_PATH]; /* path name of m3u playlist on disk */

View file

@ -22,6 +22,7 @@
#include <stdlib.h>
#include <stdbool.h>
#include "applimits.h"
#include "dir.h"
#include "file.h"
#include "lcd.h"
@ -47,17 +48,16 @@
#include "ajf.h"
#endif
#define MAX_FILES_IN_DIR 200
#define TREE_MAX_FILENAMELEN MAX_PATH
#define MAX_DIR_LEVELS 10
#define NAME_BUFFER_SIZE (AVERAGE_FILENAME_LENGTH * MAX_FILES_IN_DIR)
char name_buffer[NAME_BUFFER_SIZE];
int name_buffer_length;
struct entry {
char attr; /* FAT attributes */
char name[TREE_MAX_FILENAMELEN];
short attr; /* FAT attributes */
char *name;
};
static struct entry dircache[MAX_FILES_IN_DIR];
static struct entry* dircacheptr[MAX_FILES_IN_DIR];
static int filesindir;
static char lastdir[MAX_PATH] = {0};
@ -122,10 +122,10 @@ static int build_playlist(int start_index)
for(i = 0;i < filesindir;i++)
{
if(dircacheptr[i]->attr & TREE_ATTR_MP3)
if(dircache[i].attr & TREE_ATTR_MP3)
{
DEBUGF("Adding %s\n", dircacheptr[i]->name);
playlist_add(dircacheptr[i]->name);
DEBUGF("Adding %s\n", dircache[i].name);
playlist_add(dircache[i].name);
}
else
{
@ -140,14 +140,14 @@ static int build_playlist(int start_index)
static int compare(const void* p1, const void* p2)
{
struct entry* e1 = *(struct entry**)p1;
struct entry* e2 = *(struct entry**)p2;
struct entry* e1 = (struct entry*)p1;
struct entry* e2 = (struct entry*)p2;
if (( e1->attr & ATTR_DIRECTORY ) == ( e2->attr & ATTR_DIRECTORY ))
if (global_settings.sort_case)
return strncmp(e1->name, e2->name, TREE_MAX_FILENAMELEN);
return strncmp(e1->name, e2->name, MAX_PATH);
else
return strncasecmp(e1->name, e2->name, TREE_MAX_FILENAMELEN);
return strncasecmp(e1->name, e2->name, MAX_PATH);
else
return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY );
}
@ -160,6 +160,7 @@ static int showdir(char *path, int start)
#endif
int i;
int tree_max_on_screen;
bool dir_buffer_full;
#ifdef LOADABLE_FONTS
int fh;
unsigned char *font = lcd_getcurrentldfont();
@ -177,7 +178,9 @@ static int showdir(char *path, int start)
if(!dir)
return -1; /* not a directory */
memset(dircacheptr,0,sizeof(dircacheptr));
name_buffer_length = 0;
dir_buffer_full = false;
for ( i=0; i<MAX_FILES_IN_DIR; i++ ) {
int len;
struct dirent *entry = readdir(dir);
@ -212,23 +215,28 @@ static int showdir(char *path, int start)
continue;
}
strncpy(dptr->name,entry->d_name,TREE_MAX_FILENAMELEN);
dptr->name[TREE_MAX_FILENAMELEN-1]=0;
dircacheptr[i] = dptr;
if(len > NAME_BUFFER_SIZE - name_buffer_length - 1) {
/* Tell the world that we ran out of buffer space */
dir_buffer_full = true;
break;
}
dptr->name = &name_buffer[name_buffer_length];
strcpy(dptr->name,entry->d_name);
name_buffer_length += len + 1;
}
filesindir = i;
closedir(dir);
strncpy(lastdir,path,sizeof(lastdir));
lastdir[sizeof(lastdir)-1] = 0;
qsort(dircacheptr,filesindir,sizeof(struct entry*),compare);
qsort(dircache,filesindir,sizeof(struct entry),compare);
if ( filesindir == MAX_FILES_IN_DIR ) {
if ( dir_buffer_full || filesindir == MAX_FILES_IN_DIR ) {
#ifdef HAVE_NEW_CHARCELL_LCD
lcd_double_height(false);
#endif
lcd_clear_display();
lcd_puts(0,0,"200 file");
lcd_puts(0,1,"limit reached");
lcd_puts(0,0,"Dir buffer");
lcd_puts(0,1,"is full!");
lcd_update();
sleep(HZ*2);
lcd_clear_display();
@ -251,13 +259,13 @@ static int showdir(char *path, int start)
if ( i >= filesindir )
break;
len = strlen(dircacheptr[i]->name);
len = strlen(dircache[i].name);
#ifdef HAVE_LCD_BITMAP
if ( dircacheptr[i]->attr & ATTR_DIRECTORY )
if ( dircache[i].attr & ATTR_DIRECTORY )
icon_type = Folder;
else {
if ( dircacheptr[i]->attr & TREE_ATTR_M3U )
if ( dircache[i].attr & TREE_ATTR_M3U )
icon_type = Playlist;
else
icon_type = File;
@ -269,15 +277,15 @@ static int showdir(char *path, int start)
/* if MP3 filter is on, cut off the extension */
if (global_settings.mp3filter &&
(dircacheptr[i]->attr & (TREE_ATTR_M3U|TREE_ATTR_MP3)))
(dircache[i].attr & (TREE_ATTR_M3U|TREE_ATTR_MP3)))
{
char temp = dircacheptr[i]->name[len-4];
dircacheptr[i]->name[len-4] = 0;
lcd_puts(LINE_X, LINE_Y+i-start, dircacheptr[i]->name);
dircacheptr[i]->name[len-4] = temp;
char temp = dircache[i].name[len-4];
dircache[i].name[len-4] = 0;
lcd_puts(LINE_X, LINE_Y+i-start, dircache[i].name);
dircache[i].name[len-4] = temp;
}
else
lcd_puts(LINE_X, LINE_Y+i-start, dircacheptr[i]->name);
lcd_puts(LINE_X, LINE_Y+i-start, dircache[i].name);
}
status_draw();
@ -359,13 +367,13 @@ bool dirbrowse(char *root)
break;
if ((currdir[0]=='/') && (currdir[1]==0)) {
snprintf(buf,sizeof(buf),"%s%s",currdir,
dircacheptr[dircursor+start]->name);
dircache[dircursor+start].name);
} else {
snprintf(buf,sizeof(buf),"%s/%s",currdir,
dircacheptr[dircursor+start]->name);
dircache[dircursor+start].name);
}
if (dircacheptr[dircursor+start]->attr & ATTR_DIRECTORY) {
if (dircache[dircursor+start].attr & ATTR_DIRECTORY) {
memcpy(currdir,buf,sizeof(currdir));
if ( dirlevel < MAX_DIR_LEVELS ) {
dirpos[dirlevel] = start;
@ -376,10 +384,10 @@ bool dirbrowse(char *root)
start=0;
} else {
lcd_stop_scroll();
if(dircacheptr[dircursor+start]->attr & TREE_ATTR_M3U )
if(dircache[dircursor+start].attr & TREE_ATTR_M3U )
{
play_list(currdir,
dircacheptr[dircursor+start]->name, 0);
dircache[dircursor+start].name, 0);
}
else {
start_index = build_playlist(dircursor+start);
@ -568,19 +576,19 @@ bool dirbrowse(char *root)
lasti=i;
lcd_stop_scroll();
if (global_settings.mp3filter &&
(dircacheptr[i]->attr &
(dircache[i].attr &
(TREE_ATTR_M3U|TREE_ATTR_MP3)))
{
int len = strlen(dircacheptr[i]->name);
char temp = dircacheptr[i]->name[len-4];
dircacheptr[i]->name[len-4] = 0;
int len = strlen(dircache[i].name);
char temp = dircache[i].name[len-4];
dircache[i].name[len-4] = 0;
lcd_puts_scroll(LINE_X, LINE_Y+dircursor,
dircacheptr[i]->name);
dircacheptr[i]->name[len-4] = temp;
dircache[i].name);
dircache[i].name[len-4] = temp;
}
else
lcd_puts_scroll(LINE_X, LINE_Y+dircursor,
dircacheptr[i]->name);
dircache[i].name);
}
}
status_draw();