1 /*************************************************************************/ 2 /* file_access_compressed.h */ 3 /*************************************************************************/ 4 /* This file is part of: */ 5 /* GODOT ENGINE */ 6 /* https://godotengine.org */ 7 /*************************************************************************/ 8 /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ 9 /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ 10 /* */ 11 /* Permission is hereby granted, free of charge, to any person obtaining */ 12 /* a copy of this software and associated documentation files (the */ 13 /* "Software"), to deal in the Software without restriction, including */ 14 /* without limitation the rights to use, copy, modify, merge, publish, */ 15 /* distribute, sublicense, and/or sell copies of the Software, and to */ 16 /* permit persons to whom the Software is furnished to do so, subject to */ 17 /* the following conditions: */ 18 /* */ 19 /* The above copyright notice and this permission notice shall be */ 20 /* included in all copies or substantial portions of the Software. */ 21 /* */ 22 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ 23 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ 24 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ 25 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ 26 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ 27 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ 28 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 29 /*************************************************************************/ 30 31 #ifndef FILE_ACCESS_COMPRESSED_H 32 #define FILE_ACCESS_COMPRESSED_H 33 34 #include "core/io/compression.h" 35 #include "core/os/file_access.h" 36 37 class FileAccessCompressed : public FileAccess { 38 39 Compression::Mode cmode; 40 bool writing; 41 uint32_t write_pos; 42 uint8_t *write_ptr; 43 uint32_t write_buffer_size; 44 uint32_t write_max; 45 uint32_t block_size; 46 mutable bool read_eof; 47 mutable bool at_end; 48 49 struct ReadBlock { 50 int csize; 51 int offset; 52 }; 53 54 mutable Vector<uint8_t> comp_buffer; 55 uint8_t *read_ptr; 56 mutable int read_block; 57 int read_block_count; 58 mutable int read_block_size; 59 mutable int read_pos; 60 Vector<ReadBlock> read_blocks; 61 uint32_t read_total; 62 63 String magic; 64 mutable Vector<uint8_t> buffer; 65 FileAccess *f; 66 67 public: 68 void configure(const String &p_magic, Compression::Mode p_mode = Compression::MODE_ZSTD, int p_block_size = 4096); 69 70 Error open_after_magic(FileAccess *p_base); 71 72 virtual Error _open(const String &p_path, int p_mode_flags); ///< open a file 73 virtual void close(); ///< close a file 74 virtual bool is_open() const; ///< true when file is open 75 76 virtual void seek(size_t p_position); ///< seek to a given position 77 virtual void seek_end(int64_t p_position = 0); ///< seek from the end of file 78 virtual size_t get_position() const; ///< get position in the file 79 virtual size_t get_len() const; ///< get size of the file 80 81 virtual bool eof_reached() const; ///< reading passed EOF 82 83 virtual uint8_t get_8() const; ///< get a byte 84 virtual int get_buffer(uint8_t *p_dst, int p_length) const; 85 86 virtual Error get_error() const; ///< get last error 87 88 virtual void flush(); 89 virtual void store_8(uint8_t p_dest); ///< store a byte 90 91 virtual bool file_exists(const String &p_name); ///< return true if a file exists 92 93 virtual uint64_t _get_modified_time(const String &p_file); 94 virtual uint32_t _get_unix_permissions(const String &p_file); 95 virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions); 96 97 FileAccessCompressed(); 98 virtual ~FileAccessCompressed(); 99 }; 100 101 #endif // FILE_ACCESS_COMPRESSED_H 102