mirror of
https://github.com/libretro/RetroArch
synced 2025-02-21 18:40:09 +00:00
(PS3) Will no longer crash program if a directory can not be
loaded in the filebrowser (for whatever reason)
This commit is contained in:
parent
931aa7de89
commit
0f1e673b2e
@ -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;
|
||||
}
|
||||
|
@ -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_ */
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user