123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- #include "file_access_android.h"
- #include "print_string.h"
- AAssetManager *FileAccessAndroid::asset_manager = NULL;
- FileAccess *FileAccessAndroid::create_android() {
- return memnew(FileAccessAndroid);
- }
- Error FileAccessAndroid::_open(const String &p_path, int p_mode_flags) {
- String path = fix_path(p_path).simplify_path();
- if (path.begins_with("/"))
- path = path.substr(1, path.length());
- else if (path.begins_with("res://"))
- path = path.substr(6, path.length());
- ERR_FAIL_COND_V(p_mode_flags & FileAccess::WRITE, ERR_UNAVAILABLE);
- a = AAssetManager_open(asset_manager, path.utf8().get_data(), AASSET_MODE_STREAMING);
- if (!a)
- return ERR_CANT_OPEN;
-
- len = AAsset_getLength(a);
- pos = 0;
- eof = false;
- return OK;
- }
- void FileAccessAndroid::close() {
- if (!a)
- return;
- AAsset_close(a);
- a = NULL;
- }
- bool FileAccessAndroid::is_open() const {
- return a != NULL;
- }
- void FileAccessAndroid::seek(size_t p_position) {
- ERR_FAIL_COND(!a);
- AAsset_seek(a, p_position, SEEK_SET);
- pos = p_position;
- if (pos > len) {
- pos = len;
- eof = true;
- } else {
- eof = false;
- }
- }
- void FileAccessAndroid::seek_end(int64_t p_position) {
- ERR_FAIL_COND(!a);
- AAsset_seek(a, p_position, SEEK_END);
- pos = len + p_position;
- }
- size_t FileAccessAndroid::get_position() const {
- return pos;
- }
- size_t FileAccessAndroid::get_len() const {
- return len;
- }
- bool FileAccessAndroid::eof_reached() const {
- return eof;
- }
- uint8_t FileAccessAndroid::get_8() const {
- if (pos >= len) {
- eof = true;
- return 0;
- }
- uint8_t byte;
- AAsset_read(a, &byte, 1);
- pos++;
- return byte;
- }
- int FileAccessAndroid::get_buffer(uint8_t *p_dst, int p_length) const {
- off_t r = AAsset_read(a, p_dst, p_length);
- if (pos + p_length > len) {
- eof = true;
- }
- if (r >= 0) {
- pos += r;
- if (pos > len) {
- pos = len;
- }
- }
- return r;
- }
- Error FileAccessAndroid::get_error() const {
- return eof ? ERR_FILE_EOF : OK;
- }
- void FileAccessAndroid::flush() {
- ERR_FAIL();
- }
- void FileAccessAndroid::store_8(uint8_t p_dest) {
- ERR_FAIL();
- }
- bool FileAccessAndroid::file_exists(const String &p_path) {
- String path = fix_path(p_path).simplify_path();
- if (path.begins_with("/"))
- path = path.substr(1, path.length());
- else if (path.begins_with("res://"))
- path = path.substr(6, path.length());
- AAsset *at = AAssetManager_open(asset_manager, path.utf8().get_data(), AASSET_MODE_STREAMING);
- if (!at)
- return false;
- AAsset_close(at);
- return true;
- }
- FileAccessAndroid::FileAccessAndroid() {
- a = NULL;
- eof = false;
- }
- FileAccessAndroid::~FileAccessAndroid() {
- close();
- }
|