diff options
| author | JosJuice <josjuice@gmail.com> | 2020-12-30 11:10:35 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-30 11:10:35 +0100 |
| commit | c1d041b8886e60400721b827dcf2eb7cce45eceb (patch) | |
| tree | 97cb04428e3338c03e9a82db27fc411e2c2243de /Source/Android/jni/AndroidCommon/AndroidCommon.cpp | |
| parent | 8a3b14d7dca147232a87b51cef12840656292171 (diff) | |
| parent | d78277c063d43e3234fe80a38d272500f3dfce3a (diff) | |
Merge pull request #9318 from JosJuice/android-saf-games
Android: Use storage access framework for game list
Diffstat (limited to 'Source/Android/jni/AndroidCommon/AndroidCommon.cpp')
| -rw-r--r-- | Source/Android/jni/AndroidCommon/AndroidCommon.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index 310db6b1f7..b5a5a7faaa 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -4,6 +4,7 @@ #include "jni/AndroidCommon/AndroidCommon.h" +#include <ios> #include <string> #include <string_view> #include <vector> @@ -43,6 +44,14 @@ std::vector<std::string> JStringArrayToVector(JNIEnv* env, jobjectArray array) return result; } +jobjectArray JStringArrayFromVector(JNIEnv* env, std::vector<std::string> vector) +{ + jobjectArray result = env->NewObjectArray(vector.size(), IDCache::GetStringClass(), nullptr); + for (jsize i = 0; i < vector.size(); ++i) + env->SetObjectArrayElement(result, i, ToJString(env, vector[i])); + return result; +} + bool IsPathAndroidContent(const std::string& uri) { return StringBeginsWith(uri, "content://"); @@ -66,6 +75,28 @@ std::string OpenModeToAndroid(std::string mode) return mode; } +std::string OpenModeToAndroid(std::ios_base::openmode mode) +{ + std::string result; + + if (mode & std::ios_base::in) + result += 'r'; + + if (mode & (std::ios_base::out | std::ios_base::app)) + result += 'w'; + + if (mode & std::ios_base::app) + result += 'a'; + + constexpr std::ios_base::openmode t = std::ios_base::in | std::ios_base::trunc; + if ((mode & t) == t) + result += 't'; + + // The 'b' specifier is not supported. Since we're on POSIX, it's fine to just skip it. + + return result; +} + int OpenAndroidContent(const std::string& uri, const std::string& mode) { JNIEnv* env = IDCache::GetEnvForThread(); @@ -81,6 +112,43 @@ bool DeleteAndroidContent(const std::string& uri) IDCache::GetContentHandlerDelete(), ToJString(env, uri)); } +jlong GetAndroidContentSizeAndIsDirectory(const std::string& uri) +{ + JNIEnv* env = IDCache::GetEnvForThread(); + return env->CallStaticLongMethod(IDCache::GetContentHandlerClass(), + IDCache::GetContentHandlerGetSizeAndIsDirectory(), + ToJString(env, uri)); +} + +std::string GetAndroidContentDisplayName(const std::string& uri) +{ + JNIEnv* env = IDCache::GetEnvForThread(); + jobject display_name = + env->CallStaticObjectMethod(IDCache::GetContentHandlerClass(), + IDCache::GetContentHandlerGetDisplayName(), ToJString(env, uri)); + return display_name ? GetJString(env, reinterpret_cast<jstring>(display_name)) : ""; +} + +std::vector<std::string> GetAndroidContentChildNames(const std::string& uri) +{ + JNIEnv* env = IDCache::GetEnvForThread(); + jobject children = env->CallStaticObjectMethod(IDCache::GetContentHandlerClass(), + IDCache::GetContentHandlerGetChildNames(), + ToJString(env, uri), false); + return JStringArrayToVector(env, reinterpret_cast<jobjectArray>(children)); +} + +std::vector<std::string> DoFileSearchAndroidContent(const std::string& directory, + const std::vector<std::string>& extensions, + bool recursive) +{ + JNIEnv* env = IDCache::GetEnvForThread(); + jobject result = env->CallStaticObjectMethod( + IDCache::GetContentHandlerClass(), IDCache::GetContentHandlerDoFileSearch(), + ToJString(env, directory), JStringArrayFromVector(env, extensions), recursive); + return JStringArrayToVector(env, reinterpret_cast<jobjectArray>(result)); +} + int GetNetworkIpAddress() { JNIEnv* env = IDCache::GetEnvForThread(); |
