Ephoto: Fix some warnings and potential crashes. Improve safety checking.

This commit is contained in:
Stephen okra Houston 2016-08-15 17:21:04 -05:00
parent 994bda6688
commit 2ab25bb5ba
6 changed files with 138 additions and 74 deletions

View File

@ -301,6 +301,7 @@ struct _Ephoto
Ephoto_State state, prev_state;
Ephoto_Config *config;
Ephoto_Sort sort;
};
struct _Ephoto_Entry

View File

@ -708,7 +708,8 @@ _ephoto_directory_view_add(Ephoto_Directory_Browser *db)
static void
_todo_items_free(Ephoto_Directory_Browser *db)
{
eina_list_free(db->todo_items);
if (eina_list_count(db->todo_items))
eina_list_free(db->todo_items);
db->todo_items = NULL;
}

View File

@ -655,7 +655,8 @@ _move_files(Ephoto *ephoto, Eina_List *files,
evas_object_show(popup);
ephoto->file_pos = eina_list_clone(files);
eina_list_free(files);
if (eina_list_count(files))
eina_list_free(files);
ephoto->file_thread = ecore_thread_run(_move_thread_cb,
_thread_end_cb, _thread_end_cb, popup);
}
@ -727,7 +728,8 @@ _copy_files(Ephoto *ephoto, Eina_List *files,
evas_object_show(popup);
ephoto->file_pos = eina_list_clone(files);
eina_list_free(files);
if (eina_list_count(files))
eina_list_free(files);
ephoto->file_thread = ecore_thread_run(_copy_thread_cb,
_thread_end_cb, NULL, popup);
}
@ -813,7 +815,8 @@ _delete_files(Ephoto *ephoto, Eina_List *files)
evas_object_show(popup);
ephoto->file_pos = eina_list_clone(files);
eina_list_free(files);
if (eina_list_count(files))
eina_list_free(files);
ephoto->file_thread = ecore_thread_run(_delete_thread_cb,
_thread_end_cb, NULL, popup);
}
@ -941,7 +944,8 @@ _empty_trash(Ephoto *ephoto, Eina_List *files)
evas_object_show(popup);
ephoto->file_pos = eina_list_clone(files);
eina_list_free(files);
if (eina_list_count(files))
eina_list_free(files);
ephoto->file_thread = ecore_thread_run(_empty_trash_thread_cb,
_thread_end_cb, NULL, popup);
}

View File

@ -207,7 +207,7 @@ _win_free(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
if (ephoto->file_thread)
ecore_thread_cancel(ephoto->file_thread);
if (ephoto->file_pos)
if (eina_list_count(ephoto->file_pos))
eina_list_free(ephoto->file_pos);
if (ephoto->upload_handlers)
EINA_LIST_FREE(ephoto->upload_handlers, handler)
@ -419,6 +419,8 @@ ephoto_window_add(const char *path)
ephoto->hover_blocking = EINA_FALSE;
ephoto->folders_toggle = EINA_TRUE;
ephoto->editor_blocking = EINA_FALSE;
ephoto->entries = NULL;
ephoto->sort = EPHOTO_SORT_ALPHABETICAL_ASCENDING;
ephoto->win = elm_win_util_standard_add("ephoto", "Ephoto");
if (!ephoto->win)
{
@ -695,8 +697,36 @@ int
ephoto_entries_cmp(const void *pa, const void *pb)
{
const Ephoto_Entry *a = pa, *b = pb;
int i = 0;
long long moda, modb;
return strcoll(a->basename, b->basename);
i = strcasecmp(a->basename, b->basename);
moda = ecore_file_mod_time(a->path);
modb = ecore_file_mod_time(b->path);
switch (a->ephoto->sort)
{
case EPHOTO_SORT_ALPHABETICAL_ASCENDING:
return i;
case EPHOTO_SORT_ALPHABETICAL_DESCENDING:
return i * -1;
case EPHOTO_SORT_MODTIME_ASCENDING:
if (moda < modb)
return -1;
else if (moda > modb)
return 1;
else
return i;
case EPHOTO_SORT_MODTIME_DESCENDING:
if (moda < modb)
return 1;
else if (moda > modb)
return -1;
else
return i * -1;
default:
return i;
}
return i;
}
static void
@ -800,6 +830,7 @@ _ephoto_populate_entries(Ephoto_Dir_Data *ed)
ephoto_entry_free(entry->ephoto, entry);
else if (!ed->dirs_only)
ephoto_entries_free(ed->ephoto);
ed->ephoto->entries = NULL;
ed->ephoto->ls =
eio_file_stat_ls(ed->ephoto->config->directory, _ephoto_populate_filter,
@ -1185,5 +1216,7 @@ ephoto_entries_free(Ephoto *ephoto)
{
Ephoto_Entry *entry;
EINA_LIST_FREE(ephoto->entries, entry) ephoto_entry_free(ephoto, entry);
EINA_LIST_FREE(ephoto->entries, entry)
ephoto_entry_free(ephoto, entry);
ephoto->entries = NULL;
}

View File

@ -72,6 +72,7 @@ static void _ephoto_main_back(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED);
static void _ephoto_main_del(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
static void _next_entry(Ephoto_Single_Browser *sb);
/*Common*/
static const char *
@ -297,7 +298,13 @@ _monitor_cb(void *data, int type,
if (type == EIO_MONITOR_FILE_MODIFIED)
{
if (!ecore_file_exists(sb->entry->path))
ephoto_entry_free(sb->ephoto, sb->entry);
{
if (eina_list_count(sb->entries) > 1)
_next_entry(sb);
else
_ephoto_main_back(sb, NULL, NULL);
ephoto_entry_free(sb->ephoto, sb->entry);
}
else
{
Evas_Object *tmp;
@ -1466,19 +1473,6 @@ _viewer_add(Evas_Object *parent, const char *path, Ephoto_Single_Browser *sb)
}
/*Single Browser Populating Functions*/
static void
_entry_free(void *data, const Ephoto_Entry *entry)
{
Ephoto_Single_Browser *sb = data;
if (entry == sb->entry)
{
if (eina_list_count(sb->entries) <= 1)
evas_object_smart_callback_call(sb->main, "back", NULL);
else
_next_entry(sb);
}
}
static Eina_Bool
_ephoto_single_populate_end(void *data, int type EINA_UNUSED,
@ -1995,9 +1989,8 @@ _ephoto_main_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
Eina_File_Direct_Info *info;
Ephoto_History *eh;
EINA_LIST_FREE(sb->handlers, handler) ecore_event_handler_del(handler);
if (sb->entry)
ephoto_entry_free_listener_del(sb->entry, _entry_free, sb);
EINA_LIST_FREE(sb->handlers, handler)
ecore_event_handler_del(handler);
if (sb->pending_path)
eina_stringshare_del(sb->pending_path);
if (sb->edit_main)
@ -2066,7 +2059,6 @@ ephoto_single_browser_entry_set(Evas_Object *obj, Ephoto_Entry *entry)
dir = ecore_file_dir_get(sb->entry->path);
if (!eina_streq(sb->ephoto->config->directory, dir))
{
ephoto_entry_free_listener_del(sb->entry, _entry_free, sb);
sb->entry = entry;
}
free(dir);
@ -2074,7 +2066,6 @@ ephoto_single_browser_entry_set(Evas_Object *obj, Ephoto_Entry *entry)
if (entry)
{
sb->entry = entry;
ephoto_entry_free_listener_add(entry, _entry_free, sb);
}
_ephoto_single_browser_recalc(sb);
if (sb->edited_image_data)

View File

@ -145,7 +145,8 @@ _dnd_drag_done(void *data EINA_UNUSED, Evas_Object *obj,
ecore_timer_del(_5s_timeout);
_5s_timeout = NULL;
}
eina_list_free(data);
if (eina_list_count(data))
eina_list_free(data);
elm_object_cursor_unset(tb->main);
tb->dragging = 0;
return;
@ -397,6 +398,7 @@ _sort_alpha_asc(void *data, Evas_Object *obj,
Evas_Object *ic;
tb->sort = EPHOTO_SORT_ALPHABETICAL_ASCENDING;
tb->ephoto->sort = tb->sort;
tb->thumbs_only = 1;
tb->dirs_only = 0;
ic = elm_icon_add(obj);
@ -415,6 +417,7 @@ _sort_alpha_desc(void *data, Evas_Object *obj EINA_UNUSED,
Evas_Object *ic;
tb->sort = EPHOTO_SORT_ALPHABETICAL_DESCENDING;
tb->ephoto->sort = tb->sort;
tb->thumbs_only = 1;
tb->dirs_only = 0;
ic = elm_icon_add(obj);
@ -433,6 +436,7 @@ _sort_mod_asc(void *data, Evas_Object *obj EINA_UNUSED,
Evas_Object *ic;
tb->sort = EPHOTO_SORT_MODTIME_ASCENDING;
tb->ephoto->sort = tb->sort;
tb->thumbs_only = 1;
tb->dirs_only = 0;
ic = elm_icon_add(obj);
@ -451,6 +455,7 @@ _sort_mod_desc(void *data, Evas_Object *obj EINA_UNUSED,
Evas_Object *ic;
tb->sort = EPHOTO_SORT_MODTIME_DESCENDING;
tb->ephoto->sort = tb->sort;
tb->thumbs_only = 1;
tb->dirs_only = 0;
ic = elm_icon_add(obj);
@ -471,6 +476,8 @@ _similarity_items_process(void *data)
if ((tb->animator.processed == tb->animator.count))
{
Evas_Object *popup = evas_object_data_get(tb->grid, "popup");
Eina_List *similar = NULL;
Elm_Object_Item *it;
if (tb->animator.count == 0)
return EINA_TRUE;
@ -481,6 +488,30 @@ _similarity_items_process(void *data)
evas_object_del(popup);
evas_object_data_del(popup, "popup");
}
it = elm_gengrid_first_item_get(tb->grid);
while(it)
{
Ephoto_Entry *e = elm_object_item_data_get(it);
similar = eina_list_append(similar, e);
it = elm_gengrid_item_next_get(it);
}
if (tb->searching)
{
if (eina_list_count(tb->searchentries))
eina_list_free(tb->searchentries);
tb->searchentries = eina_list_clone(similar);
}
else
{
if (eina_list_count(tb->entries))
eina_list_free(tb->entries);
if (eina_list_count(tb->ephoto->entries))
eina_list_free(tb->ephoto->entries);
tb->entries = eina_list_clone(similar);
tb->ephoto->entries = eina_list_clone(similar);
}
if (eina_list_count(similar))
eina_list_free(similar);
return EINA_FALSE;
}
tb->animator.todo_items = NULL;
@ -520,8 +551,8 @@ _sort_similarity(void *data, Evas_Object *obj EINA_UNUSED,
tb->sort = EPHOTO_SORT_SIMILARITY;
tb->thumbs_only = 1;
tb->dirs_only = 0;
ic = elm_icon_add(obj);
ic = elm_icon_add(obj);
elm_icon_standard_set(ic, "view-sort-ascending");
elm_object_part_content_set(obj, "icon", ic);
evas_object_show(ic);
@ -603,7 +634,7 @@ _view_single(void *data, Evas_Object *obj EINA_UNUSED,
eina_list_clone(elm_gengrid_selected_items_get(tb->grid));
if (eina_list_count(selected) <= 1 && tb->searchentries)
{
if (tb->ephoto->selentries)
if (eina_list_count(tb->ephoto->selentries))
eina_list_free(tb->ephoto->selentries);
tb->ephoto->selentries = NULL;
tb->ephoto->searchentries =
@ -620,9 +651,9 @@ _view_single(void *data, Evas_Object *obj EINA_UNUSED,
}
else
{
if (tb->ephoto->selentries)
if (eina_list_count(tb->ephoto->selentries))
eina_list_free(tb->ephoto->selentries);
if (tb->ephoto->searchentries)
if (eina_list_count(tb->ephoto->searchentries))
eina_list_free(tb->ephoto->searchentries);
tb->ephoto->selentries = NULL;
tb->ephoto->searchentries = NULL;
@ -692,7 +723,8 @@ _grid_menu_cut_cb(void *data, Evas_Object *obj EINA_UNUSED,
file = elm_object_item_data_get(item);
tb->cut_items = eina_list_append(tb->cut_items, strdup(file->path));
}
eina_list_free(selection);
if (eina_list_count(selection))
eina_list_free(selection);
}
static void
@ -709,12 +741,12 @@ _grid_menu_copy_cb(void *data, Evas_Object *obj EINA_UNUSED,
if (eina_list_count(selection) <= 0)
return;
if (tb->cut_items)
if (eina_list_count(tb->cut_items))
{
eina_list_free(tb->cut_items);
tb->cut_items = NULL;
}
if (tb->copy_items)
if (eina_list_count(tb->copy_items))
{
eina_list_free(tb->copy_items);
tb->copy_items = NULL;
@ -724,7 +756,8 @@ _grid_menu_copy_cb(void *data, Evas_Object *obj EINA_UNUSED,
file = elm_object_item_data_get(item);
tb->copy_items = eina_list_append(tb->copy_items, strdup(file->path));
}
eina_list_free(selection);
if (eina_list_count(selection))
eina_list_free(selection);
}
static void
@ -733,14 +766,14 @@ _grid_menu_paste_cb(void *data, Evas_Object *obj EINA_UNUSED,
{
Ephoto_Thumb_Browser *tb = data;
if (eina_list_count(tb->cut_items) > 0)
if (eina_list_count(tb->cut_items))
{
ephoto_file_paste(tb->ephoto, eina_list_clone(tb->cut_items), EINA_FALSE,
tb->ephoto->config->directory);
eina_list_free(tb->cut_items);
tb->cut_items = NULL;
}
else if (eina_list_count(tb->copy_items) > 0)
else if (eina_list_count(tb->copy_items))
{
ephoto_file_paste(tb->ephoto, eina_list_clone(tb->copy_items), EINA_TRUE,
tb->ephoto->config->directory);
@ -783,7 +816,8 @@ _grid_menu_delete_cb(void *data, Evas_Object *obj EINA_UNUSED,
paths = eina_list_append(paths, strdup(file->path));
}
ephoto_file_delete(tb->ephoto, paths, EINA_FILE_REG);
eina_list_free(selection);
if (eina_list_count(selection))
eina_list_free(selection);
}
static void
@ -860,15 +894,13 @@ _grid_mouse_up_cb(void *data, Evas *e EINA_UNUSED,
if (clear_selection)
{
Eina_List *sel = eina_list_clone(selected);
Eina_List *node;
Elm_Object_Item *it;
if (eina_list_count(sel) > 0)
{
EINA_LIST_FOREACH(sel, node, it)
EINA_LIST_FREE(sel, it)
{
elm_gengrid_item_selected_set(it, EINA_FALSE);
}
eina_list_free(sel);
}
}
if (info->button != 3)
@ -993,7 +1025,7 @@ _ephoto_thumb_activated(void *data, Evas_Object *obj EINA_UNUSED,
eina_list_clone(elm_gengrid_selected_items_get(tb->grid));
if (eina_list_count(selected) <= 1 && tb->searchentries)
{
if (tb->ephoto->selentries)
if (eina_list_count(tb->ephoto->selentries))
eina_list_free(tb->ephoto->selentries);
tb->ephoto->selentries = NULL;
tb->ephoto->searchentries = eina_list_clone(tb->searchentries);
@ -1009,15 +1041,15 @@ _ephoto_thumb_activated(void *data, Evas_Object *obj EINA_UNUSED,
}
else
{
if (tb->ephoto->selentries)
if (eina_list_count(tb->ephoto->selentries))
eina_list_free(tb->ephoto->selentries);
if (tb->ephoto->searchentries)
if (eina_list_count(tb->ephoto->searchentries))
eina_list_free(tb->ephoto->searchentries);
tb->ephoto->selentries = NULL;
tb->ephoto->searchentries = NULL;
}
evas_object_smart_callback_call(tb->main, "view", e);
if (selected)
if (eina_list_count(selected))
eina_list_free(selected);
}
@ -1118,7 +1150,7 @@ _ephoto_thumb_search_go(void *data, Evas_Object *obj EINA_UNUSED,
if (tb->original_grid)
{
elm_gengrid_clear(tb->grid);
ephoto_thumb_browser_clear(tb->ephoto);
elm_box_unpack(tb->gridbox, tb->grid);
evas_object_del(tb->grid);
tb->grid = tb->original_grid;
@ -1127,11 +1159,10 @@ _ephoto_thumb_search_go(void *data, Evas_Object *obj EINA_UNUSED,
next = elm_gengrid_first_item_get(tb->grid);
}
snprintf(pattern, PATH_MAX, "*%s*", search_text);
EINA_LIST_FOREACH(sel, l, o)
EINA_LIST_FREE(sel, o)
{
elm_gengrid_item_selected_set(o, EINA_FALSE);
}
eina_list_free(sel);
found = elm_gengrid_search_by_text_item_get(tb->grid, next, NULL, pattern,
ELM_GLOB_MATCH_NOCASE);
while (found)
@ -1168,8 +1199,8 @@ _ephoto_thumb_search_go(void *data, Evas_Object *obj EINA_UNUSED,
evas_object_show(tb->grid);
elm_table_pack(tb->table, tb->gridbox, 0, 0, 5, 1);
if (tb->searchentries)
eina_list_free(tb->searchentries);
if (eina_list_count(tb->searchentries))
eina_list_free(tb->searchentries);
tb->searchentries = NULL;
if (results)
{
@ -1217,7 +1248,8 @@ _ephoto_thumb_search_go(void *data, Evas_Object *obj EINA_UNUSED,
}
tb->entries = tb->searchentries;
ephoto_thumb_browser_update_info_label(tb->ephoto);
eina_list_free(results);
if (eina_list_count(results))
eina_list_free(results);
}
else
{
@ -1240,15 +1272,15 @@ _ephoto_thumb_search_cancel(void *data, Evas_Object *obj EINA_UNUSED,
Ephoto_Thumb_Browser *tb = evas_object_data_get(search, "thumb_browser");
tb->entries = tb->ephoto->entries;
if (tb->ephoto->searchentries)
if (eina_list_count(tb->ephoto->searchentries))
eina_list_free(tb->ephoto->searchentries);
if (tb->searchentries)
if (eina_list_count(tb->searchentries))
eina_list_free(tb->searchentries);
tb->ephoto->searchentries = NULL;
tb->searchentries = NULL;
if (tb->original_grid)
{
elm_gengrid_clear(tb->grid);
ephoto_thumb_browser_clear(tb->ephoto);
elm_box_unpack(tb->gridbox, tb->grid);
evas_object_del(tb->grid);
tb->grid = tb->original_grid;
@ -1382,7 +1414,8 @@ _ephoto_thumb_view_add(Ephoto_Thumb_Browser *tb)
static void
_todo_items_free(Ephoto_Thumb_Browser *tb)
{
eina_list_free(tb->todo_items);
if (eina_list_count(tb->todo_items))
eina_list_free(tb->todo_items);
tb->todo_items = NULL;
}
@ -1472,12 +1505,12 @@ _ephoto_thumb_populate_start(void *data, int type EINA_UNUSED,
elm_object_item_disabled_set(tb->similarity, EINA_TRUE);
tb->animator.processed = 0;
tb->animator.count = 0;
if (tb->ephoto->selentries)
if (eina_list_count(tb->ephoto->selentries))
eina_list_free(tb->ephoto->selentries);
if (tb->searching)
_ephoto_thumb_search_cancel(tb->search, NULL, NULL);
_todo_items_free(tb);
elm_gengrid_clear(tb->grid);
ephoto_thumb_browser_clear(tb->ephoto);
tb->totimages = 0;
tb->totsize = 0;
@ -1598,7 +1631,7 @@ ephoto_thumb_browser_slideshow(Evas_Object *obj)
eina_list_clone(elm_gengrid_selected_items_get(tb->grid));
if (eina_list_count(selected) <= 1 && tb->searchentries)
{
if (tb->ephoto->selentries)
if (eina_list_count(tb->ephoto->selentries))
eina_list_free(tb->ephoto->selentries);
tb->ephoto->selentries = NULL;
tb->ephoto->searchentries = eina_list_clone(tb->searchentries);
@ -1613,15 +1646,15 @@ ephoto_thumb_browser_slideshow(Evas_Object *obj)
}
else
{
if (tb->ephoto->selentries)
if (eina_list_count(tb->ephoto->selentries))
eina_list_free(tb->ephoto->selentries);
if (tb->ephoto->searchentries)
if (eina_list_count(tb->ephoto->searchentries))
eina_list_free(tb->ephoto->searchentries);
tb->ephoto->selentries = NULL;
tb->ephoto->searchentries = NULL;
}
evas_object_smart_callback_call(tb->main, "slideshow", entry);
if (selected)
if (eina_list_count(selected))
eina_list_free(selected);
}
@ -1743,7 +1776,7 @@ _ephoto_main_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNU
entry = eina_list_nth(tb->entries, 0);
if (eina_list_count(selected) <= 1 && tb->searchentries)
{
if (tb->ephoto->selentries)
if (eina_list_count(tb->ephoto->selentries))
eina_list_free(tb->ephoto->selentries);
tb->ephoto->selentries = NULL;
tb->ephoto->searchentries = eina_list_clone(tb->searchentries);
@ -1759,9 +1792,9 @@ _ephoto_main_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNU
}
else
{
if (tb->ephoto->selentries)
if (eina_list_count(tb->ephoto->selentries))
eina_list_free(tb->ephoto->selentries);
if (tb->ephoto->searchentries)
if (eina_list_count(tb->ephoto->searchentries))
eina_list_free(tb->ephoto->searchentries);
tb->ephoto->selentries = NULL;
tb->ephoto->searchentries = NULL;
@ -1804,7 +1837,7 @@ _ephoto_main_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNU
{
_ephoto_thumb_search_go(tb->search, NULL, NULL);
}
if (selected)
if (eina_list_count(selected))
eina_list_free(selected);
}
@ -1846,15 +1879,15 @@ _ephoto_main_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
eio_file_cancel(tb->ls);
return;
}
if (tb->cut_items)
if (eina_list_count(tb->cut_items))
eina_list_free(tb->cut_items);
else if (tb->copy_items)
else if (eina_list_count(tb->copy_items))
eina_list_free(tb->copy_items);
if (tb->ephoto->selentries)
if (eina_list_count(tb->ephoto->selentries))
eina_list_free(tb->ephoto->selentries);
if (tb->ephoto->searchentries)
if (eina_list_count(tb->ephoto->searchentries))
eina_list_free(tb->ephoto->searchentries);
if (tb->searchentries)
if (eina_list_count(tb->searchentries))
eina_list_free(tb->searchentries);
free(tb);
}
@ -1895,13 +1928,13 @@ ephoto_thumb_browser_paste(Ephoto *ephoto, Elm_Object_Item *item)
else
path = tb->ephoto->config->directory;
if (eina_list_count(tb->cut_items) > 0)
if (eina_list_count(tb->cut_items))
{
ephoto_file_paste(tb->ephoto, eina_list_clone(tb->cut_items), EINA_FALSE, path);
eina_list_free(tb->cut_items);
tb->cut_items = NULL;
}
else if (eina_list_count(tb->copy_items) > 0)
else if (eina_list_count(tb->copy_items))
{
ephoto_file_paste(tb->ephoto, eina_list_clone(tb->copy_items), EINA_TRUE, path);
eina_list_free(tb->copy_items);
@ -2109,6 +2142,7 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent)
tb->cut_items = NULL;
tb->copy_items = NULL;
tb->last_sel = NULL;
tb->entries = NULL;
tb->sort = EPHOTO_SORT_ALPHABETICAL_ASCENDING;
tb->main = box;