summaryrefslogtreecommitdiff
path: root/platform/android/file_access_filesystem_jandroid.cpp
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <remi@verschelde.fr>2022-07-26 18:17:03 +0200
committerGitHub <noreply@github.com>2022-07-26 18:17:03 +0200
commit835da447dabb552a5d558b40d2df3c3c426f3498 (patch)
tree7728150cdcebaa93d21ef92a7818717280ddfea9 /platform/android/file_access_filesystem_jandroid.cpp
parentb5222c07846b4742425a001121d998fe92050c20 (diff)
parent9679c67904b4714e3f3166fbc7174347f1038bc4 (diff)
Merge pull request #63481 from m4gr3d/fix_remaining_scoped_storage_regressions_main
Address remaining scoped storage regressions
Diffstat (limited to 'platform/android/file_access_filesystem_jandroid.cpp')
-rw-r--r--platform/android/file_access_filesystem_jandroid.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/platform/android/file_access_filesystem_jandroid.cpp b/platform/android/file_access_filesystem_jandroid.cpp
index c1a48e025e..733d92f741 100644
--- a/platform/android/file_access_filesystem_jandroid.cpp
+++ b/platform/android/file_access_filesystem_jandroid.cpp
@@ -30,6 +30,7 @@
#include "file_access_filesystem_jandroid.h"
#include "core/os/os.h"
+#include "core/templates/local_vector.h"
#include "thread_jandroid.h"
#include <unistd.h>
@@ -166,6 +167,51 @@ uint8_t FileAccessFilesystemJAndroid::get_8() const {
return byte;
}
+String FileAccessFilesystemJAndroid::get_line() const {
+ ERR_FAIL_COND_V_MSG(!is_open(), String(), "File must be opened before use.");
+
+ const size_t buffer_size_limit = 2048;
+ const uint64_t file_size = get_length();
+ const uint64_t start_position = get_position();
+
+ String result;
+ LocalVector<uint8_t> line_buffer;
+ size_t current_buffer_size = 0;
+ uint64_t line_buffer_position = 0;
+
+ while (true) {
+ size_t line_buffer_size = MIN(buffer_size_limit, file_size - get_position());
+ if (line_buffer_size <= 0) {
+ break;
+ }
+
+ current_buffer_size += line_buffer_size;
+ line_buffer.resize(current_buffer_size);
+
+ uint64_t bytes_read = get_buffer(&line_buffer[line_buffer_position], current_buffer_size - line_buffer_position);
+ if (bytes_read <= 0) {
+ break;
+ }
+
+ for (; bytes_read > 0; line_buffer_position++, bytes_read--) {
+ uint8_t elem = line_buffer[line_buffer_position];
+ if (elem == '\n' || elem == '\0') {
+ // Found the end of the line
+ const_cast<FileAccessFilesystemJAndroid *>(this)->seek(start_position + line_buffer_position + 1);
+ if (result.parse_utf8((const char *)line_buffer.ptr(), line_buffer_position)) {
+ return String();
+ }
+ return result;
+ }
+ }
+ }
+
+ if (result.parse_utf8((const char *)line_buffer.ptr(), line_buffer_position)) {
+ return String();
+ }
+ return result;
+}
+
uint64_t FileAccessFilesystemJAndroid::get_buffer(uint8_t *p_dst, uint64_t p_length) const {
if (_file_read) {
ERR_FAIL_COND_V_MSG(!is_open(), 0, "File must be opened before use.");