diff --git a/console/fileio/file_browser.c b/console/fileio/file_browser.c index 577590d595..0651456633 100644 --- a/console/fileio/file_browser.c +++ b/console/fileio/file_browser.c @@ -16,25 +16,41 @@ #include "file_browser.h" -static void filebrowser_parse_directory(filebrowser_t * filebrowser, +static bool filebrowser_parse_directory(filebrowser_t * filebrowser, unsigned stack_size, const char * path, const char * extensions) { - strlcpy(filebrowser->dir[filebrowser->directory_stack_size], path, - sizeof(filebrowser->dir[filebrowser->directory_stack_size])); + struct string_list *list = dir_list_new(path, extensions, true); - filebrowser->current_dir.list = dir_list_new(path, extensions, true); - filebrowser->current_dir.ptr = 0; + if(list != NULL) + { + strlcpy(filebrowser->dir[stack_size], path, + sizeof(filebrowser->dir[stack_size])); - dir_list_sort(filebrowser->current_dir.list, true); + filebrowser->current_dir.list = list; + filebrowser->current_dir.ptr = 0; + + dir_list_sort(filebrowser->current_dir.list, true); + + return true; + } + else + return false; } -static void filebrowser_new(filebrowser_t * filebrowser, const char * start_dir, +static bool filebrowser_new(filebrowser_t * filebrowser, const char * start_dir, const char * extensions) { - filebrowser->directory_stack_size = 0; - strlcpy(filebrowser->extensions, extensions, sizeof(filebrowser->extensions)); + bool ret = true; - filebrowser_parse_directory(filebrowser, start_dir, extensions); + ret = filebrowser_parse_directory(filebrowser, 0, start_dir, extensions); + + if(ret) + { + filebrowser->directory_stack_size = 0; + strlcpy(filebrowser->extensions, extensions, sizeof(filebrowser->extensions)); + } + + return ret; } void filebrowser_set_root(filebrowser_t *filebrowser, const char *root_dir) @@ -57,23 +73,45 @@ void filebrowser_free(filebrowser_t * filebrowser) filebrowser->current_dir.ptr = 0; } -static void filebrowser_push_directory(filebrowser_t * filebrowser, const char * path, +static bool filebrowser_push_directory(filebrowser_t * filebrowser, const char * path, bool with_extension) { - filebrowser->directory_stack_size++; + bool ret = true; + char extensions[256]; + unsigned push_dir; + + push_dir = filebrowser->directory_stack_size + 1; + if(with_extension) - filebrowser_parse_directory(filebrowser, path, filebrowser->extensions); + snprintf(extensions, sizeof(extensions), filebrowser->extensions); else - filebrowser_parse_directory(filebrowser, path, "empty"); + snprintf(extensions, sizeof(extensions), "empty"); + + ret = filebrowser_parse_directory(filebrowser, push_dir, path, extensions); + + if(ret) + filebrowser->directory_stack_size = push_dir; + + return ret; } -static void filebrowser_pop_directory (filebrowser_t * filebrowser) +static bool filebrowser_pop_directory (filebrowser_t * filebrowser) { - if (filebrowser->directory_stack_size > 0) - filebrowser->directory_stack_size--; + bool ret = true; + unsigned pop_dir; - filebrowser_parse_directory(filebrowser, filebrowser->dir[filebrowser->directory_stack_size], + if (filebrowser->directory_stack_size > 0) + pop_dir = filebrowser->directory_stack_size - 1; + else + pop_dir = filebrowser->directory_stack_size; + + ret = filebrowser_parse_directory(filebrowser, pop_dir, filebrowser->dir[pop_dir], filebrowser->extensions); + + if(ret) + filebrowser->directory_stack_size = pop_dir; + + return ret; } const char * filebrowser_get_current_dir (filebrowser_t *filebrowser) @@ -115,8 +153,9 @@ static void filebrowser_set_current_decrement (filebrowser_t *filebrowser, bool filebrowser->current_dir.ptr = filebrowser->current_dir.list->size - 1; } -void filebrowser_iterate(filebrowser_t *filebrowser, filebrowser_action_t action) +bool filebrowser_iterate(filebrowser_t *filebrowser, filebrowser_action_t action) { + static bool ret = true; unsigned entries_to_scroll = 19; switch(action) @@ -160,16 +199,18 @@ void filebrowser_iterate(filebrowser_t *filebrowser, filebrowser_action_t action filebrowser->current_dir.ptr = 0; break; case FILEBROWSER_ACTION_OK: - filebrowser_push_directory(filebrowser, filebrowser_get_current_path(filebrowser), true); + ret = filebrowser_push_directory(filebrowser, filebrowser_get_current_path(filebrowser), true); break; case FILEBROWSER_ACTION_CANCEL: - filebrowser_pop_directory(filebrowser); + ret = filebrowser_pop_directory(filebrowser); break; case FILEBROWSER_ACTION_RESET: - filebrowser_new(filebrowser, filebrowser->root_dir, filebrowser->extensions); + ret = filebrowser_new(filebrowser, filebrowser->root_dir, filebrowser->extensions); break; case FILEBROWSER_ACTION_NOOP: default: break; } + + return ret; } diff --git a/console/fileio/file_browser.h b/console/fileio/file_browser.h index d0be3804e2..e4c4dcb05f 100644 --- a/console/fileio/file_browser.h +++ b/console/fileio/file_browser.h @@ -59,6 +59,6 @@ void filebrowser_set_root(filebrowser_t *filebrowser, const char *root_dir); void filebrowser_set_root_and_ext(filebrowser_t *browser, const char *ext, const char *root_dir); void filebrowser_free(filebrowser_t *filebrowser); void filebrowser_set_current_at (filebrowser_t *filebrowser, size_t pos); -void filebrowser_iterate(filebrowser_t *filebrowser, filebrowser_action_t action); +bool filebrowser_iterate(filebrowser_t *filebrowser, filebrowser_action_t action); #endif /* FILEBROWSER_H_ */ diff --git a/console/rarch_console_settings.c b/console/rarch_console_settings.c index f41e39ca3a..47dc563de7 100644 --- a/console/rarch_console_settings.c +++ b/console/rarch_console_settings.c @@ -244,6 +244,9 @@ void rarch_settings_msg(unsigned setting, unsigned delay) fill_pathname_base(tmp, g_console.rom_path, sizeof(tmp)); snprintf(str, sizeof(str), "INFO - Loading %s...", tmp); break; + case S_MSG_DIR_LOADING_ERROR: + snprintf(str, sizeof(str), "ERROR - Failed to open selected directory."); + break; case S_MSG_ROM_LOADING_ERROR: snprintf(str, sizeof(str), "ERROR - An error occurred during ROM loading."); break; diff --git a/console/rarch_console_settings.h b/console/rarch_console_settings.h index fa0affb200..1ca1e3bdd0 100644 --- a/console/rarch_console_settings.h +++ b/console/rarch_console_settings.h @@ -81,6 +81,7 @@ enum S_MSG_CHANGE_CONTROLS, S_MSG_EXTRACTED_ZIPFILE, S_MSG_LOADING_ROM, + S_MSG_DIR_LOADING_ERROR, S_MSG_ROM_LOADING_ERROR, S_MSG_NOT_IMPLEMENTED, S_MSG_RESIZE_SCREEN, diff --git a/ps3/frontend/menu.c b/ps3/frontend/menu.c index c3e6001827..4cef6f0460 100644 --- a/ps3/frontend/menu.c +++ b/ps3/frontend/menu.c @@ -613,6 +613,7 @@ static uint64_t old_state = 0; static void browser_update(filebrowser_t * b, uint64_t input, const char *extensions) { + bool ret = true; filebrowser_action_t action = FILEBROWSER_ACTION_NOOP; if (input & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) @@ -641,7 +642,10 @@ static void browser_update(filebrowser_t * b, uint64_t input, const char *extens } if(action != FILEBROWSER_ACTION_NOOP) - filebrowser_iterate(b, action); + ret = filebrowser_iterate(b, action); + + if(!ret) + rarch_settings_msg(S_MSG_DIR_LOADING_ERROR, S_DELAY_180); } static void browser_render(filebrowser_t * b, float current_x, float current_y, float y_spacing) @@ -697,6 +701,8 @@ static void select_file(item *items, menu *current_menu, uint64_t input) char extensions[256], object[256], comment[256], comment_two[256], path[PATH_MAX]; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; + bool ret = true; + float x_position = 0.09f; float comment_y_position = 0.83f; float comment_two_y_position = 0.91f; @@ -737,7 +743,7 @@ static void select_file(item *items, menu *current_menu, uint64_t input) { bool is_dir = filebrowser_get_current_path_isdir(&tmpBrowser); if(is_dir) - filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_OK); + ret = filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_OK); else { snprintf(path, sizeof(path), filebrowser_get_current_path(&tmpBrowser)); @@ -783,6 +789,9 @@ static void select_file(item *items, menu *current_menu, uint64_t input) menu_stack_decrement(); } + + if(!ret) + rarch_settings_msg(S_MSG_DIR_LOADING_ERROR, S_DELAY_180); } else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_X)) menu_stack_decrement(); @@ -798,6 +807,7 @@ static void select_file(item *items, menu *current_menu, uint64_t input) static void select_directory(item *items, menu *current_menu, uint64_t input) { char path[1024]; + bool ret = true; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; float x_position = 0.09f; @@ -854,9 +864,12 @@ static void select_directory(item *items, menu *current_menu, uint64_t input) else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) { if(is_dir) - filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_OK); + ret = filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_OK); } + if(!ret) + rarch_settings_msg(S_MSG_DIR_LOADING_ERROR, S_DELAY_180); + display_menubar(current_menu); render_msg_place_func(x_position, 0.93f, font_size, YELLOW, "X - Enter dir /\\ - return to settings START - Reset Startdir"); @@ -1628,11 +1641,13 @@ static void select_setting(item *items, menu *current_menu, uint64_t input) static void menu_romselect_iterate(filebrowser_t *filebrowser, item *items, menu_romselect_action_t action) { + bool ret = true; + switch(action) { case MENU_ROMSELECT_ACTION_OK: if(filebrowser_get_current_path_isdir(filebrowser)) - filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK); + ret = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK); else rarch_console_load_game_wrap(filebrowser_get_current_path(filebrowser), g_console.zip_extract_mode, S_DELAY_45); break; @@ -1642,6 +1657,10 @@ static void menu_romselect_iterate(filebrowser_t *filebrowser, item *items, menu default: break; } + + if(!ret) + rarch_settings_msg(S_MSG_DIR_LOADING_ERROR, S_DELAY_180); + } static void select_rom(item *items, menu *current_menu, uint64_t input)