diff options
| author | Pierre Bourdon <delroth@gmail.com> | 2023-03-18 18:20:17 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-18 18:20:17 +0100 |
| commit | 04915d674900e1bb837a4cf477e65cc8a8879678 (patch) | |
| tree | 0c7e7a80d9a956fb7fe54c189b821f9592e9c0e4 /Source/Android/jni/AndroidCommon/AndroidCommon.cpp | |
| parent | 49b495f756022e25ebb3b7b40e769b7b44f19a82 (diff) | |
| parent | 8e363c099506913f2add4fef9b60c51587052623 (diff) | |
Merge pull request #11670 from JosJuice/android-open-mode
Android: Translate C++ "w" to ParcelFileDescriptor "wt"
Diffstat (limited to 'Source/Android/jni/AndroidCommon/AndroidCommon.cpp')
| -rw-r--r-- | Source/Android/jni/AndroidCommon/AndroidCommon.cpp | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index 00526cc0be..25ec479790 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -12,6 +12,7 @@ #include <jni.h> #include "Common/Assert.h" +#include "Common/Logging/Log.h" #include "Common/StringUtil.h" #include "jni/AndroidCommon/IDCache.h" @@ -63,38 +64,50 @@ std::string OpenModeToAndroid(std::string mode) // The 'b' specifier is not supported by Android. Since we're on POSIX, it's fine to just skip it. mode.erase(std::remove(mode.begin(), mode.end(), 'b')); - if (mode == "r+") - mode = "rw"; + if (mode == "r") + return "r"; + else if (mode == "w") + return "wt"; + else if (mode == "a") + return "wa"; + else if (mode == "r+") + return "rw"; else if (mode == "w+") - mode = "rwt"; + return "rwt"; else if (mode == "a+") - mode = "rwa"; - else if (mode == "a") - mode = "wa"; + return "rwa"; - return mode; + ERROR_LOG_FMT(COMMON, "OpenModeToAndroid(std::string): Unsupported open mode: {}", mode); + return ""; } 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 by Android. Since we're on POSIX, it's fine to just skip it. + mode &= ~std::ios_base::binary; - return result; + switch (mode) + { + case std::ios_base::in: + return "r"; + case std::ios_base::out: + case std::ios_base::out | std::ios_base::trunc: + return "wt"; + case std::ios_base::app: + case std::ios_base::out | std::ios_base::app: + return "wa"; + case std::ios_base::in | std::ios_base::out: + return "rw"; + case std::ios_base::in | std::ios_base::out | std::ios_base::trunc: + return "rwt"; + case std::ios_base::in | std::ios_base::app: + case std::ios_base::in | std::ios_base::out | std::ios_base::app: + return "rwa"; + default: + ERROR_LOG_FMT(COMMON, + "OpenModeToAndroid(std::ios_base::openmode): Unsupported open mode: {:#x}", mode); + return ""; + } } int OpenAndroidContent(std::string_view uri, std::string_view mode) |
