evry-files: refactor + comments. still looking for the segv discomfitor found

SVN revision: 53394
This commit is contained in:
Hannes Janetzek 2010-10-14 11:46:56 +00:00
parent 6ca862968e
commit a751cbca6d
1 changed files with 85 additions and 91 deletions

View File

@ -177,10 +177,8 @@ _scan_func(Ecore_Thread *thread __UNUSED__, void *data)
char buf[4096];
Eina_Bool is_dir;
if (!d->directory)
if (!(d->dirp = opendir(d->directory)))
return;
d->dirp = opendir(d->directory);
if (!d->dirp) return;
while ((dp = readdir(d->dirp)))
{
@ -332,25 +330,70 @@ _scan_cancel_func(void *data)
else
{
EINA_LIST_FREE(d->files, file)
{
if (file->path)
eina_stringshare_del(file->path);
if (EVRY_ITEM(file)->label)
eina_stringshare_del(EVRY_ITEM(file)->label);
if (EVRY_ITEM(file)->detail)
eina_stringshare_del(EVRY_ITEM(file)->detail);
free(file);
}
EVRY_ITEM_FREE(file);
}
free(d->directory);
d->directory = NULL;
E_FREE(d);
p->thread = NULL;
if (p->wait_finish)
E_FREE(p);
else
p->thread = NULL;
free(d->directory);
E_FREE(d);
}
static void
_cache_mime_get(History_Types *ht, Evry_Item_File *file)
{
History_Entry *he;
History_Item *hi;
Eina_List *l;
if (he = eina_hash_find(ht->types, file->path))
{
EINA_LIST_FOREACH(he->items, l, hi)
{
if (!hi->data)
continue;
if (!file->mime)
file->mime = eina_stringshare_ref(hi->data);
hi->transient = 0;
EVRY_ITEM(file)->hi = hi;
break;
}
}
}
static void
_cache_dir_add(Eina_List *files)
{
Eina_List *l;
Evry_Item *item;
History_Item *hi;
int cnt = 0;
EINA_LIST_REVERSE_FOREACH(files, l, item)
{
GET_FILE(file, item);
if (!(item->hi) &&
(hi = evry->history_item_add(item, NULL, NULL)))
{
hi->last_used = SIX_DAYS_AGO;
hi->usage = MIN_USAGE * (double) cnt++;
hi->data = eina_stringshare_ref(file->mime);
item->hi = hi;
}
else if (item->hi && (item->hi->count == 1) &&
(item->hi->last_used < SIX_DAYS_AGO))
{
item->hi->last_used = SIX_DAYS_AGO;
item->hi->usage = MIN_USAGE * (double) cnt++;
}
}
}
static void
@ -360,16 +403,13 @@ _scan_end_func(void *data)
Plugin *p = d->plugin;
Evry_Item *item;
char *filename, *path, *mime;
Eina_List *l, *ll, *lll;
History_Item *hi;
History_Entry *he;
Eina_List *l, *ll;
History_Types *ht = NULL;
int cnt = 0;
if (_conf->cache_dirs)
ht = evry->history_types_get(EVRY_TYPE_FILE);
if (!d->run_cnt)
if (!d->run_cnt) /* _scan_func finished */
{
EINA_LIST_FOREACH_SAFE(d->files, l, ll, item)
{
@ -387,23 +427,8 @@ _scan_end_func(void *data)
file->mime = eina_stringshare_ref(_mime_dir);
/* check if we can grab the mimetype from history */
if ((_conf->cache_dirs && ht) &&
(he = eina_hash_find(ht->types, file->path)))
{
EINA_LIST_FOREACH(he->items, lll, hi)
{
if (!hi->data)
continue;
if (!file->mime)
file->mime = eina_stringshare_ref(hi->data);
hi->transient = 0;
item->hi = hi;
break;
}
}
if (ht) _cache_mime_get(ht, file);
if (file->mime)
{
item->context = eina_stringshare_ref(file->mime);
@ -427,21 +452,11 @@ _scan_end_func(void *data)
E_FREE(path);
}
/* sort files by name for mimetypes scan */
if (d->files)
{
d->run_cnt++;
d->files = eina_list_sort(d->files, -1, _cb_sort);
p->thread = ecore_thread_run(_scan_mime_func,
_scan_end_func,
_scan_cancel_func, d);
return;
}
else
{
p->files = eina_list_sort(p->files, -1, _cb_sort);
}
d->files = eina_list_sort(d->files, -1, _cb_sort);
}
else
else /* _scan_mime_func finished */
{
EINA_LIST_FREE(d->files, item)
{
@ -454,52 +469,30 @@ _scan_end_func(void *data)
p->files = eina_list_append(p->files, file);
}
if (d->files && d->run_cnt < 100)
{
d->run_cnt++;
p->thread = ecore_thread_run(_scan_mime_func,
_scan_end_func,
_scan_cancel_func, d);
}
else
{
EINA_LIST_FREE(d->files, item)
EVRY_ITEM_FREE(item);
}
}
if (!d->files)
if (d->files) /* scan mimetypes */
{
if (!(p->command == CMD_SHOW_HIDDEN) && _conf->cache_dirs)
{
EINA_LIST_REVERSE_FOREACH(p->files, l, item)
{
GET_FILE(file, item);
if (!(item->hi) &&
(hi = evry->history_item_add(item, NULL, NULL)))
{
hi->last_used = SIX_DAYS_AGO;
hi->usage = MIN_USAGE * (double) cnt++;
hi->data = eina_stringshare_ref(file->mime);
item->hi = hi;
}
else if (item->hi && (item->hi->count == 1) &&
(item->hi->last_used < SIX_DAYS_AGO))
{
item->hi->last_used = SIX_DAYS_AGO;
item->hi->usage = MIN_USAGE * (double) cnt++;
}
}
}
d->run_cnt++;
p->thread = ecore_thread_run(_scan_mime_func,
_scan_end_func,
_scan_cancel_func, d);
/* wait for first mime scan to finish */
if (d->run_cnt == 1) return;
}
else /* finished all file/mime scan */
{
free(d->directory);
d->directory = NULL;
E_FREE(d);
p->thread = NULL;
if (_conf->cache_dirs && !(p->command == CMD_SHOW_HIDDEN))
_cache_dir_add(p->files);
}
p->files = eina_list_sort(p->files, -1, _cb_sort);
_append_files(p);
EVRY_PLUGIN_UPDATE(p, EVRY_UPDATE_ADD);
@ -566,7 +559,8 @@ _read_directory(Plugin *p)
Data *d = E_NEW(Data, 1);
d->plugin = p;
d->directory = strdup(p->directory);
d->run_cnt = 0;
p->thread = ecore_thread_run(_scan_func, _scan_end_func, _scan_cancel_func, d);
if (p->dir_mon)