mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-13 18:17:39 -04:00
Cleanup tree.c cache handling a bit.
* Rename stuff to not re-use the term dircache * Move cache to own struct * Encapsulate retrieving entries a bit git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30242 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
fa5cf8edea
commit
98096970e0
9 changed files with 74 additions and 69 deletions
|
@ -60,13 +60,13 @@ int ft_build_playlist(struct tree_context* c, int start_index)
|
|||
int i;
|
||||
int start=start_index;
|
||||
|
||||
struct entry *dircache = c->dircache;
|
||||
struct entry *entries = c->cache.entries;
|
||||
|
||||
for(i = 0;i < c->filesindir;i++)
|
||||
{
|
||||
if((dircache[i].attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO)
|
||||
if((entries[i].attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO)
|
||||
{
|
||||
if (playlist_add(dircache[i].name) < 0)
|
||||
if (playlist_add(entries[i].name) < 0)
|
||||
break;
|
||||
}
|
||||
else
|
||||
|
@ -122,12 +122,12 @@ bool ft_play_playlist(char* pathname, char* dirname, char* filename)
|
|||
return false;
|
||||
}
|
||||
|
||||
/* walk a directory and check all dircache entries if a .talk file exists */
|
||||
/* walk a directory and check all entries if a .talk file exists */
|
||||
static void check_file_thumbnails(struct tree_context* c)
|
||||
{
|
||||
int i;
|
||||
struct dirent *entry;
|
||||
struct entry* dircache = c->dircache;
|
||||
struct entry* entries = c->cache.entries;
|
||||
DIR *dir;
|
||||
|
||||
dir = opendir(c->currdir);
|
||||
|
@ -136,18 +136,18 @@ static void check_file_thumbnails(struct tree_context* c)
|
|||
/* mark all files as non talking, except the .talk ones */
|
||||
for (i=0; i < c->filesindir; i++)
|
||||
{
|
||||
if (dircache[i].attr & ATTR_DIRECTORY)
|
||||
if (entries[i].attr & ATTR_DIRECTORY)
|
||||
continue; /* we're not touching directories */
|
||||
|
||||
if (strcasecmp(file_thumbnail_ext,
|
||||
&dircache[i].name[strlen(dircache[i].name)
|
||||
&entries[i].name[strlen(entries[i].name)
|
||||
- strlen(file_thumbnail_ext)]))
|
||||
{ /* no .talk file */
|
||||
dircache[i].attr &= ~FILE_ATTR_THUMBNAIL; /* clear */
|
||||
entries[i].attr &= ~FILE_ATTR_THUMBNAIL; /* clear */
|
||||
}
|
||||
else
|
||||
{ /* .talk file, we later let them speak themselves */
|
||||
dircache[i].attr |= FILE_ATTR_THUMBNAIL; /* set */
|
||||
entries[i].attr |= FILE_ATTR_THUMBNAIL; /* set */
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -170,9 +170,9 @@ static void check_file_thumbnails(struct tree_context* c)
|
|||
/* search corresponding file in dir cache */
|
||||
for (i=0; i < c->filesindir; i++)
|
||||
{
|
||||
if (!strcasecmp(dircache[i].name, (char *)entry->d_name))
|
||||
if (!strcasecmp(entries[i].name, (char *)entry->d_name))
|
||||
{ /* match */
|
||||
dircache[i].attr |= FILE_ATTR_THUMBNAIL; /* set the flag */
|
||||
entries[i].attr |= FILE_ATTR_THUMBNAIL; /* set the flag */
|
||||
break; /* exit search loop, because we found it */
|
||||
}
|
||||
}
|
||||
|
@ -265,7 +265,7 @@ static int compare(const void* p1, const void* p2)
|
|||
return 0; /* never reached */
|
||||
}
|
||||
|
||||
/* load and sort directory into dircache. returns NULL on failure. */
|
||||
/* load and sort directory into the tree's cache. returns NULL on failure. */
|
||||
int ft_load(struct tree_context* c, const char* tempdir)
|
||||
{
|
||||
int files_in_dir = 0;
|
||||
|
@ -290,8 +290,8 @@ int ft_load(struct tree_context* c, const char* tempdir)
|
|||
while ((entry = readdir(dir))) {
|
||||
int len;
|
||||
struct dirinfo info;
|
||||
struct entry* dptr =
|
||||
(struct entry*)(c->dircache + files_in_dir * sizeof(struct entry));
|
||||
struct entry* table = c->cache.entries;
|
||||
struct entry* dptr = &table[files_in_dir];
|
||||
if (!entry)
|
||||
break;
|
||||
|
||||
|
@ -360,8 +360,8 @@ int ft_load(struct tree_context* c, const char* tempdir)
|
|||
continue;
|
||||
}
|
||||
|
||||
if ((len > c->name_buffer_size - name_buffer_used - 1) ||
|
||||
(files_in_dir >= c->dircache_count)) {
|
||||
if ((len > c->cache.name_buffer_size - name_buffer_used - 1) ||
|
||||
(files_in_dir >= c->cache.max_entries)) {
|
||||
/* Tell the world that we ran out of buffer space */
|
||||
c->dirfull = true;
|
||||
break;
|
||||
|
@ -369,7 +369,7 @@ int ft_load(struct tree_context* c, const char* tempdir)
|
|||
|
||||
++files_in_dir;
|
||||
|
||||
dptr->name = &c->name_buffer[name_buffer_used];
|
||||
dptr->name = &c->cache.name_buffer[name_buffer_used];
|
||||
dptr->time_write =
|
||||
(long)info.wrtdate<<16 |
|
||||
(long)info.wrttime; /* in one # */
|
||||
|
@ -384,7 +384,7 @@ int ft_load(struct tree_context* c, const char* tempdir)
|
|||
closedir(dir);
|
||||
|
||||
compare_sort_dir = c->sort_dir;
|
||||
qsort(c->dircache, files_in_dir, sizeof(struct entry), compare);
|
||||
qsort(c->cache.entries, files_in_dir, sizeof(struct entry), compare);
|
||||
|
||||
/* If thumbnail talking is enabled, make an extra run to mark files with
|
||||
associated thumbnails, so we don't do unsuccessful spinups later. */
|
||||
|
@ -424,8 +424,8 @@ int ft_enter(struct tree_context* c)
|
|||
{
|
||||
int rc = GO_TO_PREVIOUS;
|
||||
char buf[MAX_PATH];
|
||||
struct entry *dircache = c->dircache;
|
||||
struct entry* file = &dircache[c->selected_item];
|
||||
struct entry* table = c->cache.entries;
|
||||
struct entry *file = &table[c->selected_item];
|
||||
|
||||
if (c->currdir[1])
|
||||
snprintf(buf,sizeof(buf),"%s/%s",c->currdir, file->name);
|
||||
|
|
|
@ -1537,7 +1537,7 @@ static int get_next_dir(char *dir, bool is_forward, bool recursion)
|
|||
break;
|
||||
}
|
||||
|
||||
files = (struct entry*) tc->dircache;
|
||||
files = tc->cache.entries;
|
||||
num_files = tc->filesindir;
|
||||
|
||||
for (i=0; i<num_files; i++)
|
||||
|
@ -1615,7 +1615,7 @@ static int check_subdir_for_music(char *dir, const char *subdir, bool recurse)
|
|||
return -2;
|
||||
}
|
||||
|
||||
files = (struct entry*) tc->dircache;
|
||||
files = tc->cache.entries;
|
||||
num_files = tc->filesindir;
|
||||
|
||||
for (i=0; i<num_files; i++)
|
||||
|
@ -3568,7 +3568,7 @@ int playlist_directory_tracksearch(const char* dirname, bool recurse,
|
|||
return -1;
|
||||
}
|
||||
|
||||
files = (struct entry*) tc->dircache;
|
||||
files = tc->cache.entries;
|
||||
num_files = tc->filesindir;
|
||||
|
||||
/* we've overwritten the dircache so tree browser will need to be
|
||||
|
@ -3603,7 +3603,7 @@ int playlist_directory_tracksearch(const char* dirname, bool recurse,
|
|||
break;
|
||||
}
|
||||
|
||||
files = (struct entry*) tc->dircache;
|
||||
files = tc->cache.entries;
|
||||
num_files = tc->filesindir;
|
||||
if (!num_files)
|
||||
{
|
||||
|
|
|
@ -136,7 +136,7 @@ static enum image_type image_type = IMAGE_UNKNOWN;
|
|||
static void get_pic_list(void)
|
||||
{
|
||||
struct tree_context *tree = rb->tree_get_context();
|
||||
struct entry *dircache = tree->dircache;
|
||||
struct entry *dircache = tree->cache.entries;
|
||||
int i;
|
||||
char *pname;
|
||||
|
||||
|
|
|
@ -185,7 +185,7 @@ bool mod_ext(const char ext[])
|
|||
void get_mod_list(void)
|
||||
{
|
||||
struct tree_context *tree = rb->tree_get_context();
|
||||
struct entry *dircache = tree->dircache;
|
||||
struct entry *dircache = tree->cache.entries;
|
||||
int i;
|
||||
char *pname;
|
||||
|
||||
|
|
|
@ -1876,7 +1876,7 @@ static bool is_videofile(const char* file)
|
|||
static bool get_videofile(int direction, char* videofile, size_t bufsize)
|
||||
{
|
||||
struct tree_context *tree = rb->tree_get_context();
|
||||
struct entry *dircache = tree->dircache;
|
||||
struct entry *dircache = tree->cache.entries;
|
||||
int i, step, end, found = 0;
|
||||
char *videoname = rb->strrchr(videofile, '/') + 1;
|
||||
size_t rest = bufsize - (videoname - videofile) - 1;
|
||||
|
|
|
@ -948,7 +948,7 @@ static bool browse_fonts( char *dst, int dst_size )
|
|||
|
||||
tree = rb->tree_get_context();
|
||||
backup = *tree;
|
||||
dc = tree->dircache;
|
||||
dc = tree->cache.entries;
|
||||
a = backup.currdir+rb->strlen(backup.currdir)-1;
|
||||
if( *a != '/' )
|
||||
{
|
||||
|
|
|
@ -1175,7 +1175,7 @@ static int format_str(struct tagcache_search *tcs, struct display_format *fmt,
|
|||
static int retrieve_entries(struct tree_context *c, int offset, bool init)
|
||||
{
|
||||
struct tagcache_search tcs;
|
||||
struct tagentry *dptr = (struct tagentry *)c->dircache;
|
||||
struct tagentry *dptr = c->cache.entries;
|
||||
struct display_format *fmt;
|
||||
int i;
|
||||
int namebufused = 0;
|
||||
|
@ -1339,13 +1339,13 @@ static int retrieve_entries(struct tree_context *c, int offset, bool init)
|
|||
}
|
||||
}
|
||||
|
||||
dptr->name = &c->name_buffer[namebufused];
|
||||
dptr->name = &c->cache.name_buffer[namebufused];
|
||||
if (fmt)
|
||||
namebufused += strlen(buf)+1;
|
||||
else
|
||||
namebufused += tcs.result_len;
|
||||
|
||||
if (namebufused >= c->name_buffer_size)
|
||||
if (namebufused >= c->cache.name_buffer_size)
|
||||
{
|
||||
logf("chunk mode #2: %d", current_entry_count);
|
||||
c->dirfull = true;
|
||||
|
@ -1363,7 +1363,7 @@ static int retrieve_entries(struct tree_context *c, int offset, bool init)
|
|||
dptr++;
|
||||
current_entry_count++;
|
||||
|
||||
if (current_entry_count >= c->dircache_count)
|
||||
if (current_entry_count >= c->cache.max_entries)
|
||||
{
|
||||
logf("chunk mode #3: %d", current_entry_count);
|
||||
c->dirfull = true;
|
||||
|
@ -1382,9 +1382,12 @@ static int retrieve_entries(struct tree_context *c, int offset, bool init)
|
|||
}
|
||||
|
||||
if (sort)
|
||||
qsort(c->dircache + special_entry_count * c->dentry_size,
|
||||
{
|
||||
int entry_size = sizeof(struct tagentry);
|
||||
qsort(c->cache.entries + special_entry_count * entry_size,
|
||||
current_entry_count - special_entry_count,
|
||||
c->dentry_size, compare);
|
||||
entry_size, compare);
|
||||
}
|
||||
|
||||
if (!init)
|
||||
{
|
||||
|
@ -1416,7 +1419,7 @@ static int retrieve_entries(struct tree_context *c, int offset, bool init)
|
|||
|
||||
if (strip)
|
||||
{
|
||||
dptr = c->dircache;
|
||||
dptr = c->cache.entries;
|
||||
for (i = 0; i < total_count; i++, dptr++)
|
||||
{
|
||||
int len = strlen(dptr->name);
|
||||
|
@ -1434,7 +1437,7 @@ static int retrieve_entries(struct tree_context *c, int offset, bool init)
|
|||
|
||||
static int load_root(struct tree_context *c)
|
||||
{
|
||||
struct tagentry *dptr = (struct tagentry *)c->dircache;
|
||||
struct tagentry *dptr = c->cache.entries;
|
||||
int i;
|
||||
|
||||
tc = c;
|
||||
|
@ -1476,7 +1479,6 @@ int tagtree_load(struct tree_context* c)
|
|||
int count;
|
||||
int table = c->currtable;
|
||||
|
||||
c->dentry_size = sizeof(struct tagentry);
|
||||
c->dirsindir = 0;
|
||||
|
||||
if (!table)
|
||||
|
@ -1870,7 +1872,7 @@ static int tagtree_play_folder(struct tree_context* c)
|
|||
|
||||
struct tagentry* tagtree_get_entry(struct tree_context *c, int id)
|
||||
{
|
||||
struct tagentry *entry = (struct tagentry *)c->dircache;
|
||||
struct tagentry *entry = (struct tagentry *)c->cache.entries;
|
||||
int realid = id - current_offset;
|
||||
|
||||
/* Load the next chunk if necessary. */
|
||||
|
|
45
apps/tree.c
45
apps/tree.c
|
@ -104,6 +104,12 @@ static int ft_play_dirname(char* name);
|
|||
static void ft_play_filename(char *dir, char *file);
|
||||
static void say_filetype(int attr);
|
||||
|
||||
static struct entry* get_entry_at(struct tree_context *t, int index)
|
||||
{
|
||||
struct entry* entries = t->cache.entries;
|
||||
return &entries[index];
|
||||
}
|
||||
|
||||
static const char* tree_get_filename(int selected_item, void *data,
|
||||
char *buffer, size_t buffer_len)
|
||||
{
|
||||
|
@ -121,8 +127,7 @@ static const char* tree_get_filename(int selected_item, void *data,
|
|||
else
|
||||
#endif
|
||||
{
|
||||
struct entry* dc = local_tc->dircache;
|
||||
struct entry* e = &dc[selected_item];
|
||||
struct entry* e = get_entry_at(local_tc, selected_item);
|
||||
name = e->name;
|
||||
attr = e->attr;
|
||||
}
|
||||
|
@ -164,8 +169,7 @@ static int tree_get_filecolor(int selected_item, void * data)
|
|||
if (*tc.dirfilter == SHOW_ID3DB)
|
||||
return -1;
|
||||
struct tree_context * local_tc=(struct tree_context *)data;
|
||||
struct entry* dc = local_tc->dircache;
|
||||
struct entry* e = &dc[selected_item];
|
||||
struct entry* e = get_entry_at(local_tc, selected_item);
|
||||
return filetype_get_color(e->name, e->attr);
|
||||
}
|
||||
#endif
|
||||
|
@ -181,8 +185,7 @@ static enum themable_icons tree_get_fileicon(int selected_item, void * data)
|
|||
else
|
||||
#endif
|
||||
{
|
||||
struct entry* dc = local_tc->dircache;
|
||||
struct entry* e = &dc[selected_item];
|
||||
struct entry* e = get_entry_at(local_tc, selected_item);
|
||||
return filetype_get_icon(e->attr);
|
||||
}
|
||||
}
|
||||
|
@ -203,8 +206,7 @@ static int tree_voice_cb(int selected_item, void * data)
|
|||
else
|
||||
#endif
|
||||
{
|
||||
struct entry* dc = local_tc->dircache;
|
||||
struct entry* e = &dc[selected_item];
|
||||
struct entry* e = get_entry_at(local_tc, selected_item);
|
||||
name = e->name;
|
||||
attr = e->attr;
|
||||
}
|
||||
|
@ -322,12 +324,12 @@ struct tree_context* tree_get_context(void)
|
|||
static int tree_get_file_position(char * filename)
|
||||
{
|
||||
int i;
|
||||
struct entry* e;
|
||||
|
||||
/* use lastfile to determine the selected item (default=0) */
|
||||
for (i=0; i < tc.filesindir; i++)
|
||||
{
|
||||
struct entry* dc = tc.dircache;
|
||||
struct entry* e = &dc[i];
|
||||
e = get_entry_at(&tc, i);
|
||||
if (!strcasecmp(e->name, filename))
|
||||
return(i);
|
||||
}
|
||||
|
@ -529,8 +531,7 @@ char* get_current_file(char* buffer, size_t buffer_len)
|
|||
return NULL;
|
||||
#endif
|
||||
|
||||
struct entry* dc = tc.dircache;
|
||||
struct entry* e = &dc[tc.selected_item];
|
||||
struct entry* e = get_entry_at(&tc, tc.selected_item);
|
||||
if (getcwd(buffer, buffer_len))
|
||||
{
|
||||
if (tc.dirlength)
|
||||
|
@ -649,7 +650,7 @@ static int dirbrowse(void)
|
|||
|
||||
gui_synclist_draw(&tree_lists);
|
||||
while(1) {
|
||||
struct entry *dircache = tc.dircache;
|
||||
struct entry *entries = tc.cache.entries;
|
||||
bool restore = false;
|
||||
if (tc.dirlevel < 0)
|
||||
tc.dirlevel = 0; /* shouldnt be needed.. this code needs work! */
|
||||
|
@ -666,7 +667,7 @@ static int dirbrowse(void)
|
|||
break;
|
||||
|
||||
if ((tc.browse->flags & BROWSE_SELECTONLY) &&
|
||||
!(dircache[tc.selected_item].attr & ATTR_DIRECTORY))
|
||||
!(entries[tc.selected_item].attr & ATTR_DIRECTORY))
|
||||
{
|
||||
tc.browse->flags |= BROWSE_SELECTED;
|
||||
get_current_file(tc.browse->buf, tc.browse->bufsize);
|
||||
|
@ -791,15 +792,15 @@ static int dirbrowse(void)
|
|||
else
|
||||
#endif
|
||||
{
|
||||
attr = dircache[tc.selected_item].attr;
|
||||
attr = entries[tc.selected_item].attr;
|
||||
|
||||
if (currdir[1]) /* Not in / */
|
||||
snprintf(buf, sizeof buf, "%s/%s",
|
||||
currdir,
|
||||
dircache[tc.selected_item].name);
|
||||
entries[tc.selected_item].name);
|
||||
else /* In / */
|
||||
snprintf(buf, sizeof buf, "/%s",
|
||||
dircache[tc.selected_item].name);
|
||||
entries[tc.selected_item].name);
|
||||
}
|
||||
onplay_result = onplay(buf, attr, curr_context, hotkey);
|
||||
}
|
||||
|
@ -1001,17 +1002,17 @@ int rockbox_browse(struct browse_context *browse)
|
|||
void tree_mem_init(void)
|
||||
{
|
||||
/* initialize tree context struct */
|
||||
struct tree_cache* cache = &tc.cache;
|
||||
memset(&tc, 0, sizeof(tc));
|
||||
tc.dirfilter = &global_settings.dirfilter;
|
||||
tc.sort_dir = global_settings.sort_dir;
|
||||
|
||||
tc.name_buffer_size = AVERAGE_FILENAME_LENGTH *
|
||||
cache->name_buffer_size = AVERAGE_FILENAME_LENGTH *
|
||||
global_settings.max_files_in_dir;
|
||||
tc.name_buffer = buffer_alloc(tc.name_buffer_size);
|
||||
cache->name_buffer = buffer_alloc(cache->name_buffer_size);
|
||||
|
||||
tc.dircache_count = global_settings.max_files_in_dir;
|
||||
tc.dircache = buffer_alloc(global_settings.max_files_in_dir *
|
||||
sizeof(struct entry));
|
||||
cache->max_entries = global_settings.max_files_in_dir;
|
||||
cache->entries = buffer_alloc(cache->max_entries*(sizeof(cache->entries)));
|
||||
tree_get_filetypes(&filetypes, &filetypes_count);
|
||||
}
|
||||
|
||||
|
|
18
apps/tree.h
18
apps/tree.h
|
@ -38,6 +38,15 @@ struct entry {
|
|||
#define BROWSE_SELECTED 0x0100 /* this bit is set if user selected item */
|
||||
|
||||
struct tree_context;
|
||||
struct tree_cache {
|
||||
/* A big buffer with plenty of entry structs,
|
||||
* contains all files and dirs in the current
|
||||
* dir (with filters applied) */
|
||||
void* entries;
|
||||
char* name_buffer;
|
||||
int max_entries; /* Max entries in the cache */
|
||||
int name_buffer_size; /* in bytes */
|
||||
};
|
||||
|
||||
struct browse_context {
|
||||
int dirfilter;
|
||||
|
@ -80,14 +89,7 @@ struct tree_context {
|
|||
int currtable; /* db use */
|
||||
int currextra; /* db use */
|
||||
#endif
|
||||
/* A big buffer with plenty of entry structs,
|
||||
* contains all files and dirs in the current
|
||||
* dir (with filters applied) */
|
||||
void* dircache;
|
||||
int dircache_count; /* Number of entries in dircache */
|
||||
char* name_buffer;
|
||||
int name_buffer_size;
|
||||
int dentry_size;
|
||||
struct tree_cache cache;
|
||||
bool dirfull;
|
||||
int sort_dir; /* directory sort order */
|
||||
struct browse_context *browse;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue