From 9188cc1a730f663600211e5090933028e23f7c18 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Sun, 13 Jan 2019 18:13:21 +0100 Subject: [PATCH] (UWP) Add broadFileSystemAccess support --- frontend/drivers/platform_uwp.c | 39 ++++++++++++++----- intl/msg_hash_us.c | 5 +++ intl/msg_hash_us.h | 8 ++++ menu/cbs/menu_cbs_ok.c | 18 +++++++++ menu/cbs/menu_cbs_sublabel.c | 4 ++ msg_hash.h | 2 + .../Package.appxmanifest | 3 +- uwp/uwp_func.h | 2 + uwp/uwp_main.cpp | 5 +++ 9 files changed, 76 insertions(+), 10 deletions(-) diff --git a/frontend/drivers/platform_uwp.c b/frontend/drivers/platform_uwp.c index b6fa41002c..dfbc113928 100644 --- a/frontend/drivers/platform_uwp.c +++ b/frontend/drivers/platform_uwp.c @@ -271,18 +271,39 @@ static int frontend_uwp_parse_drive_list(void *data, bool load_content) enum msg_hash_enums enum_idx = load_content ? MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR : MSG_UNKNOWN; - /* TODO (krzys_h): UWP storage sandboxing */ - char *home_dir = (char*)malloc( - PATH_MAX_LENGTH * sizeof(char)); + char drive[] = " :\\"; + char *home_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + bool have_any_drives = false; - fill_pathname_home_dir(home_dir, - PATH_MAX_LENGTH * sizeof(char)); + fill_pathname_home_dir(home_dir, PATH_MAX_LENGTH * sizeof(char)); + + for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++) + { + if (path_is_valid(drive)) + { + menu_entries_append_enum(list, + drive, + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + have_any_drives = true; + } + } menu_entries_append_enum(list, - home_dir, - msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), - enum_idx, - FILE_TYPE_DIRECTORY, 0, 0); + home_dir, + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + + if (!have_any_drives && string_is_equal(uwp_device_family, "Windows.Desktop")) + { + menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FILE_BROWSER_OPEN_UWP_PERMISSIONS), + msg_hash_to_str(MENU_ENUM_LABEL_FILE_BROWSER_OPEN_UWP_PERMISSIONS), + MENU_ENUM_LABEL_FILE_BROWSER_OPEN_UWP_PERMISSIONS, + MENU_SETTING_ACTION, 0, 0); + } free(home_dir); #endif diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 6f46d28063..b273e76090 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -390,6 +390,11 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Go back to the parent directory."); break; + case MENU_ENUM_LABEL_FILE_BROWSER_OPEN_UWP_PERMISSIONS: + snprintf(s, len, + "Open Windows permission settings to enable \n" + "the broadFileSystemAccess capability."); + break; case MENU_ENUM_LABEL_FILE_BROWSER_SHADER_PRESET: snprintf(s, len, "Shader preset file."); diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 0615dca690..6fc52c51ca 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2044,6 +2044,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY, "Parent directory" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FILE_BROWSER_OPEN_UWP_PERMISSIONS, + "Enable external file access" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FILE_BROWSER_OPEN_UWP_PERMISSIONS, + "Open Windows file access permissions settings" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO, "Pause when menu activated" diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 55f1a1bc66..22a3358bc7 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -79,6 +79,10 @@ #include "../../record/record_driver.h" +#ifdef __WINRT__ +#include "../../uwp/uwp_func.h" +#endif + enum { ACTION_OK_LOAD_PRESET = 0, @@ -3965,6 +3969,17 @@ default_action_ok_func(action_ok_push_accounts_youtube_list, ACTION_OK_DL_ACCOUN default_action_ok_func(action_ok_push_accounts_twitch_list, ACTION_OK_DL_ACCOUNTS_TWITCH_LIST) default_action_ok_func(action_ok_open_archive, ACTION_OK_DL_OPEN_ARCHIVE) +static int action_ok_open_uwp_permission_settings(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ +#ifdef __WINRT__ + uwp_open_broadfilesystemaccess_settings(); +#else + retro_assert(false); +#endif + return 0; +} + static int action_ok_shader_pass(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -5465,6 +5480,9 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_MENU_FILE_BROWSER_SETTINGS: BIND_ACTION_OK(cbs, action_ok_menu_file_browser_list); break; + case MENU_ENUM_LABEL_FILE_BROWSER_OPEN_UWP_PERMISSIONS: + BIND_ACTION_OK(cbs, action_ok_open_uwp_permission_settings); + break; case MENU_ENUM_LABEL_RETRO_ACHIEVEMENTS_SETTINGS: BIND_ACTION_OK(cbs, action_ok_retro_achievements_list); break; diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 1bd69f3765..8d0c9d76e7 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -334,6 +334,7 @@ default_sublabel_macro(action_bind_sublabel_goto_images, default_sublabel_macro(action_bind_sublabel_goto_music, MENU_ENUM_SUBLABEL_GOTO_MUSIC) default_sublabel_macro(action_bind_sublabel_goto_video, MENU_ENUM_SUBLABEL_GOTO_VIDEO) default_sublabel_macro(action_bind_sublabel_menu_filebrowser_settings, MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS) +default_sublabel_macro(action_bind_sublabel_menu_filebrowser_open_uwp_permissions, MENU_ENUM_SUBLABEL_FILE_BROWSER_OPEN_UWP_PERMISSIONS) default_sublabel_macro(action_bind_sublabel_auto_remaps_enable, MENU_ENUM_SUBLABEL_AUTO_REMAPS_ENABLE) default_sublabel_macro(action_bind_sublabel_auto_overrides_enable, MENU_ENUM_SUBLABEL_AUTO_OVERRIDES_ENABLE) default_sublabel_macro(action_bind_sublabel_game_specific_options, MENU_ENUM_SUBLABEL_GAME_SPECIFIC_OPTIONS) @@ -1379,6 +1380,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_MENU_FILE_BROWSER_SETTINGS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_filebrowser_settings); break; + case MENU_ENUM_LABEL_FILE_BROWSER_OPEN_UWP_PERMISSIONS: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_filebrowser_open_uwp_permissions); + break; case MENU_ENUM_LABEL_ADD_TO_FAVORITES: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_add_to_favorites); break; diff --git a/msg_hash.h b/msg_hash.h index a1226afcd2..c6501869d3 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -823,6 +823,8 @@ enum msg_hash_enums MENU_LABEL(PARENT_DIRECTORY), + MENU_LABEL(FILE_BROWSER_OPEN_UWP_PERMISSIONS), + MENU_ENUM_LABEL_CONTENT_ACTIONS, /* Menu settings */ diff --git a/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Package.appxmanifest b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Package.appxmanifest index e1d4376bbd..1d99be534b 100644 --- a/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Package.appxmanifest +++ b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Package.appxmanifest @@ -1,5 +1,5 @@ - + @@ -25,5 +25,6 @@ + diff --git a/uwp/uwp_func.h b/uwp/uwp_func.h index ecab3b8a03..65e663d3de 100644 --- a/uwp/uwp_func.h +++ b/uwp/uwp_func.h @@ -26,6 +26,8 @@ extern char uwp_dir_install[PATH_MAX_LENGTH]; extern char uwp_dir_data[PATH_MAX_LENGTH]; extern char uwp_device_family[128]; +void uwp_open_broadfilesystemaccess_settings(void); + void* uwp_get_corewindow(void); void uwp_input_next_frame(void); diff --git a/uwp/uwp_main.cpp b/uwp/uwp_main.cpp index bc1c9b5e13..30b2b8b5a2 100644 --- a/uwp/uwp_main.cpp +++ b/uwp/uwp_main.cpp @@ -627,4 +627,9 @@ extern "C" { return 0; } + + void uwp_open_broadfilesystemaccess_settings(void) + { + Windows::System::Launcher::LaunchUriAsync(ref new Uri("ms-settings:privacy-broadfilesystemaccess")); + } }