From 70df5446d3f0bc203363ad74e737fd772e8e9c2c Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 4 Nov 2020 20:59:39 +0100 Subject: Android: Make the handling of SAF open modes more robust --- Source/Android/jni/AndroidCommon/AndroidCommon.cpp | 39 +++++++++++++++------- 1 file changed, 27 insertions(+), 12 deletions(-) (limited to 'Source/Android/jni/AndroidCommon/AndroidCommon.cpp') diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index 73405b6d8e..344e34c7b6 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -10,6 +10,7 @@ #include +#include "Common/Assert.h" #include "Common/StringUtil.h" #include "jni/AndroidCommon/IDCache.h" @@ -42,21 +43,35 @@ std::vector JStringArrayToVector(JNIEnv* env, jobjectArray array) return result; } -int OpenAndroidContent(const std::string& uri, const std::string& mode) +bool IsPathAndroidContent(const std::string& uri) { - JNIEnv* env = IDCache::GetEnvForThread(); - const jint fd = env->CallStaticIntMethod(IDCache::GetContentHandlerClass(), - IDCache::GetContentHandlerOpenFd(), ToJString(env, uri), - ToJString(env, mode)); + return StringBeginsWith(uri, "content://"); +} + +std::string OpenModeToAndroid(std::string mode) +{ + // The 'b' specifier is not supported. Since we're on POSIX, it's fine to just skip it. + if (!mode.empty() && mode.back() == 'b') + mode.pop_back(); - // We can get an IllegalArgumentException when passing an invalid mode - if (env->ExceptionCheck()) - { - env->ExceptionDescribe(); - abort(); - } + if (mode == "r+") + mode = "rw"; + else if (mode == "w+") + mode = "rwt"; + else if (mode == "a+") + mode = "rwa"; + else if (mode == "a") + mode = "wa"; - return fd; + return mode; +} + +int OpenAndroidContent(const std::string& uri, const std::string& mode) +{ + JNIEnv* env = IDCache::GetEnvForThread(); + return env->CallStaticIntMethod(IDCache::GetContentHandlerClass(), + IDCache::GetContentHandlerOpenFd(), ToJString(env, uri), + ToJString(env, mode)); } bool DeleteAndroidContent(const std::string& uri) -- cgit v1.2.3