(PS3) Will no longer crash program if a directory can not be

loaded in the filebrowser (for whatever reason)
This commit is contained in:
Twinaphex 2012-08-01 17:22:10 +02:00
parent 931aa7de89
commit 0f1e673b2e
5 changed files with 91 additions and 27 deletions

View File

@ -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;
}

View File

@ -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_ */

View File

@ -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;

View File

@ -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,

View File

@ -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)