static void test_amend() { extern int test_symtab(void); extern int test_cmd_fn(void); extern int test_permissions(void); int ret; LOGD("Testing symtab...\n"); ret = test_symtab(); LOGD(" returned %d\n", ret); LOGD("Testing cmd_fn...\n"); ret = test_cmd_fn(); LOGD(" returned %d\n", ret); LOGD("Testing permissions...\n"); ret = test_permissions(); LOGD(" returned %d\n", ret); }
static void frontend_android_get_environment_settings(int *argc, char *argv[], void *data, void *params_data) { int32_t major, minor, rel; int perms = 0; char device_model[PROP_VALUE_MAX] = {0}; char device_id[PROP_VALUE_MAX] = {0}; struct rarch_main_wrap *args = NULL; JNIEnv *env = NULL; jobject obj = NULL; jstring jstr = NULL; struct android_app *android_app = (struct android_app*)data; char buf[PATH_MAX_LENGTH] = {0}; if (!android_app) return; env = jni_thread_getenv(); if (!env) return; args = (struct rarch_main_wrap*)params_data; if (args) { args->touched = true; args->no_content = false; args->verbose = false; args->sram_path = NULL; args->state_path = NULL; } frontend_android_get_version(&major, &minor, &rel); RARCH_LOG("Android OS version (major : %d, minor : %d, rel : %d)\n", major, minor, rel); CALL_OBJ_METHOD(env, obj, android_app->activity->clazz, android_app->getIntent); RARCH_LOG("Checking arguments passed from intent ...\n"); /* Config file. */ CALL_OBJ_METHOD_PARAM(env, jstr, obj, android_app->getStringExtra, (*env)->NewStringUTF(env, "CONFIGFILE")); if (android_app->getStringExtra && jstr) { static char config_path[PATH_MAX_LENGTH] = {0}; const char *argv = NULL; argv = (*env)->GetStringUTFChars(env, jstr, 0); if (argv && *argv) strlcpy(config_path, argv, sizeof(config_path)); (*env)->ReleaseStringUTFChars(env, jstr, argv); RARCH_LOG("Config file: [%s].\n", config_path); if (args && *config_path) args->config_path = config_path; } /* Current IME. */ CALL_OBJ_METHOD_PARAM(env, jstr, obj, android_app->getStringExtra, (*env)->NewStringUTF(env, "IME")); if (android_app->getStringExtra && jstr) { const char *argv = (*env)->GetStringUTFChars(env, jstr, 0); strlcpy(android_app->current_ime, argv, sizeof(android_app->current_ime)); (*env)->ReleaseStringUTFChars(env, jstr, argv); RARCH_LOG("Current IME: [%s].\n", android_app->current_ime); } CALL_OBJ_METHOD_PARAM(env, jstr, obj, android_app->getStringExtra, (*env)->NewStringUTF(env, "USED")); if (android_app->getStringExtra && jstr) { const char *argv = (*env)->GetStringUTFChars(env, jstr, 0); bool used = (!strcmp(argv, "false")) ? false : true; (*env)->ReleaseStringUTFChars(env, jstr, argv); RARCH_LOG("USED: [%s].\n", used ? "true" : "false"); } /* LIBRETRO. */ CALL_OBJ_METHOD_PARAM(env, jstr, obj, android_app->getStringExtra, (*env)->NewStringUTF(env, "LIBRETRO")); if (android_app->getStringExtra && jstr) { static char core_path[PATH_MAX_LENGTH]; const char *argv = NULL; *core_path = '\0'; argv = (*env)->GetStringUTFChars(env, jstr, 0); if (argv && *argv) strlcpy(core_path, argv, sizeof(core_path)); (*env)->ReleaseStringUTFChars(env, jstr, argv); RARCH_LOG("Libretro path: [%s]\n", core_path); if (args && *core_path) args->libretro_path = core_path; } /* Content. */ CALL_OBJ_METHOD_PARAM(env, jstr, obj, android_app->getStringExtra, (*env)->NewStringUTF(env, "ROM")); if (android_app->getStringExtra && jstr) { static char path[PATH_MAX_LENGTH]; const char *argv = NULL; *path = '\0'; argv = (*env)->GetStringUTFChars(env, jstr, 0); if (argv && *argv) strlcpy(path, argv, sizeof(path)); (*env)->ReleaseStringUTFChars(env, jstr, argv); if (*path) { RARCH_LOG("Auto-start game %s.\n", path); if (args && *path) args->content_path = path; } } /* External Storage */ CALL_OBJ_METHOD_PARAM(env, jstr, obj, android_app->getStringExtra, (*env)->NewStringUTF(env, "SDCARD")); if (android_app->getStringExtra && jstr) { const char *argv = NULL; *sdcard_dir = '\0'; argv = (*env)->GetStringUTFChars(env, jstr, 0); if (argv && *argv) strlcpy(sdcard_dir, argv, sizeof(sdcard_dir)); (*env)->ReleaseStringUTFChars(env, jstr, argv); if (*sdcard_dir) { RARCH_LOG("External storage location [%s]\n", sdcard_dir); /* TODO base dir handler */ } } /* Screenshots */ CALL_OBJ_METHOD_PARAM(env, jstr, obj, android_app->getStringExtra, (*env)->NewStringUTF(env, "SCREENSHOTS")); if (android_app->getStringExtra && jstr) { const char *argv = NULL; *screenshot_dir = '\0'; argv = (*env)->GetStringUTFChars(env, jstr, 0); if (argv && *argv) strlcpy(screenshot_dir, argv, sizeof(screenshot_dir)); (*env)->ReleaseStringUTFChars(env, jstr, argv); if (*screenshot_dir) { RARCH_LOG("Picture folder location [%s]\n", screenshot_dir); /* TODO: screenshot handler */ } } /* Downloads */ CALL_OBJ_METHOD_PARAM(env, jstr, obj, android_app->getStringExtra, (*env)->NewStringUTF(env, "DOWNLOADS")); if (android_app->getStringExtra && jstr) { const char *argv = NULL; *downloads_dir = '\0'; argv = (*env)->GetStringUTFChars(env, jstr, 0); if (argv && *argv) strlcpy(downloads_dir, argv, sizeof(downloads_dir)); (*env)->ReleaseStringUTFChars(env, jstr, argv); if (*downloads_dir) { RARCH_LOG("Download folder location [%s].\n", downloads_dir); /* TODO: downloads handler */ } } CALL_OBJ_METHOD_PARAM(env, jstr, obj, android_app->getStringExtra, (*env)->NewStringUTF(env, "APK")); if (android_app->getStringExtra && jstr) { const char *argv = NULL; *apk_path = '\0'; argv = (*env)->GetStringUTFChars(env, jstr, 0); if (argv && *argv) strlcpy(apk_path, argv, sizeof(apk_path)); (*env)->ReleaseStringUTFChars(env, jstr, argv); if (*apk_path) { RARCH_LOG("APK location [%s].\n", apk_path); } } CALL_OBJ_METHOD_PARAM(env, jstr, obj, android_app->getStringExtra, (*env)->NewStringUTF(env, "EXTERNAL")); if (android_app->getStringExtra && jstr) { const char *argv = NULL; *ext_dir = '\0'; argv = (*env)->GetStringUTFChars(env, jstr, 0); if (argv && *argv) strlcpy(ext_dir, argv, sizeof(ext_dir)); (*env)->ReleaseStringUTFChars(env, jstr, argv); if (*ext_dir) { RARCH_LOG("External files location [%s]\n", ext_dir); } } /* Content. */ CALL_OBJ_METHOD_PARAM(env, jstr, obj, android_app->getStringExtra, (*env)->NewStringUTF(env, "DATADIR")); if (android_app->getStringExtra && jstr) { const char *argv = NULL; *app_dir = '\0'; argv = (*env)->GetStringUTFChars(env, jstr, 0); if (argv && *argv) strlcpy(app_dir, argv, sizeof(app_dir)); (*env)->ReleaseStringUTFChars(env, jstr, argv); //set paths depending on the ability to write to sdcard_dir if(*sdcard_dir) { if(test_permissions(sdcard_dir)) perms = SDCARD_ROOT_WRITABLE; } else if(*ext_dir) { if(test_permissions(ext_dir)) perms = SDCARD_EXT_DIR_WRITABLE; } else perms = SDCARD_NOT_WRITABLE; RARCH_LOG("SD permissions: %d",perms); if (*app_dir) { RARCH_LOG("Application location: [%s].\n", app_dir); if (args && *app_dir) { fill_pathname_join(g_defaults.dir.assets, app_dir, "assets", sizeof(g_defaults.dir.assets)); fill_pathname_join(g_defaults.dir.extraction, app_dir, "tmp", sizeof(g_defaults.dir.extraction)); fill_pathname_join(g_defaults.dir.shader, app_dir, "shaders", sizeof(g_defaults.dir.shader)); fill_pathname_join(g_defaults.dir.overlay, app_dir, "overlays", sizeof(g_defaults.dir.overlay)); fill_pathname_join(g_defaults.dir.core, app_dir, "cores", sizeof(g_defaults.dir.core)); fill_pathname_join(g_defaults.dir.core_info, app_dir, "info", sizeof(g_defaults.dir.core_info)); fill_pathname_join(g_defaults.dir.autoconfig, app_dir, "autoconfig", sizeof(g_defaults.dir.autoconfig)); fill_pathname_join(g_defaults.dir.audio_filter, app_dir, "audio_filters", sizeof(g_defaults.dir.audio_filter)); fill_pathname_join(g_defaults.dir.video_filter, app_dir, "video_filters", sizeof(g_defaults.dir.video_filter)); strlcpy(g_defaults.dir.content_history, app_dir, sizeof(g_defaults.dir.content_history)); fill_pathname_join(g_defaults.dir.database, app_dir, "database/rdb", sizeof(g_defaults.dir.database)); fill_pathname_join(g_defaults.dir.cursor, app_dir, "database/cursors", sizeof(g_defaults.dir.cursor)); fill_pathname_join(g_defaults.dir.cheats, app_dir, "cheats", sizeof(g_defaults.dir.cheats)); fill_pathname_join(g_defaults.dir.playlist, app_dir, "playlists", sizeof(g_defaults.dir.playlist)); fill_pathname_join(g_defaults.dir.remap, app_dir, "remaps", sizeof(g_defaults.dir.remap)); fill_pathname_join(g_defaults.dir.wallpapers, app_dir, "wallpapers", sizeof(g_defaults.dir.wallpapers)); if(*downloads_dir && test_permissions(downloads_dir)) { fill_pathname_join(g_defaults.dir.core_assets, downloads_dir, "", sizeof(g_defaults.dir.core_assets)); } else { fill_pathname_join(g_defaults.dir.core_assets, app_dir, "downloads", sizeof(g_defaults.dir.core_assets)); path_mkdir(g_defaults.dir.core_assets); } RARCH_LOG("Default download folder: [%s]", g_defaults.dir.core_assets); if(*screenshot_dir && test_permissions(screenshot_dir)) { fill_pathname_join(g_defaults.dir.screenshot, screenshot_dir, "", sizeof(g_defaults.dir.screenshot)); } else { fill_pathname_join(g_defaults.dir.screenshot, app_dir, "screenshots", sizeof(g_defaults.dir.screenshot)); path_mkdir(g_defaults.dir.screenshot); } RARCH_LOG("Default screenshot folder: [%s]", g_defaults.dir.screenshot); switch (perms) { case SDCARD_EXT_DIR_WRITABLE: fill_pathname_join(g_defaults.dir.sram, ext_dir, "saves", sizeof(g_defaults.dir.sram)); path_mkdir(g_defaults.dir.sram); fill_pathname_join(g_defaults.dir.savestate, ext_dir, "states", sizeof(g_defaults.dir.savestate)); path_mkdir(g_defaults.dir.savestate); fill_pathname_join(g_defaults.dir.system, ext_dir, "system", sizeof(g_defaults.dir.system)); path_mkdir(g_defaults.dir.system); break; case SDCARD_NOT_WRITABLE: fill_pathname_join(g_defaults.dir.sram, app_dir, "saves", sizeof(g_defaults.dir.sram)); path_mkdir(g_defaults.dir.sram); fill_pathname_join(g_defaults.dir.savestate, app_dir, "states", sizeof(g_defaults.dir.savestate)); path_mkdir(g_defaults.dir.savestate); fill_pathname_join(g_defaults.dir.system, app_dir, "system", sizeof(g_defaults.dir.system)); path_mkdir(g_defaults.dir.system); break; case SDCARD_ROOT_WRITABLE: default: break; } /* create save and system directories in the internal dir too */ fill_pathname_join(buf, app_dir, "saves", sizeof(buf)); path_mkdir(buf); fill_pathname_join(buf, app_dir, "states", sizeof(buf)); path_mkdir(buf); fill_pathname_join(buf, app_dir, "system", sizeof(buf)); path_mkdir(buf); /* create save and system directories in the internal sd too */ fill_pathname_join(buf, ext_dir, "saves", sizeof(buf)); path_mkdir(buf); fill_pathname_join(buf, ext_dir, "states", sizeof(buf)); path_mkdir(buf); fill_pathname_join(buf, ext_dir, "system", sizeof(buf)); path_mkdir(buf); RARCH_LOG("Default savefile folder: [%s]", g_defaults.dir.sram); RARCH_LOG("Default savestate folder: [%s]", g_defaults.dir.savestate); RARCH_LOG("Default system folder: [%s]", g_defaults.dir.system); } } } frontend_android_get_name(device_model, sizeof(device_model)); system_property_get("ro.product.id", device_id); g_defaults.settings.video_threaded_enable = true; /* Set automatic default values per device */ if (device_is_xperia_play(device_model)) { g_defaults.settings.out_latency = 128; g_defaults.settings.video_refresh_rate = 59.19132938771038; g_defaults.settings.video_threaded_enable = false; } else if (!strcmp(device_model, "GAMEMID_BT")) g_defaults.settings.out_latency = 160; else if (!strcmp(device_model, "SHIELD")) g_defaults.settings.video_refresh_rate = 60.0; else if (!strcmp(device_model, "JSS15J")) g_defaults.settings.video_refresh_rate = 59.65; #if 0 /* Explicitly disable input overlay by default * for gamepad-like/console devices. */ if (device_is_game_console(device_model)) g_defaults.settings.input_overlay_enable = false; #endif }