| 29 | |
| 30 | #ifdef USE_SDFAT |
| 31 | class SdFatFileHandle : public filebuf { |
| 32 | private: |
| 33 | SdFile _file; |
| 34 | string _path; |
| 35 | |
| 36 | public: |
| 37 | SdFatFileHandle(SdFile file, const char* path) : _file(fl::move(file)), _path(path) {} |
| 38 | ~SdFatFileHandle() override { |
| 39 | if (_file.isOpen()) { |
| 40 | _file.close(); |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | bool is_open() const FL_NOEXCEPT override { |
| 45 | return _file.isOpen(); |
| 46 | } |
| 47 | bool available() const FL_NOEXCEPT override { |
| 48 | auto f = const_cast<SdFatFileHandle*>(this); |
| 49 | return f->_file.available() > 0; |
| 50 | } |
| 51 | fl::size_t size() const FL_NOEXCEPT override { |
| 52 | return _file.fileSize(); |
| 53 | } |
| 54 | fl::size_t read(char *dst, fl::size_t bytesToRead) FL_NOEXCEPT override { |
| 55 | return _file.read(reinterpret_cast<u8*>(dst), bytesToRead); // ok reinterpret cast |
| 56 | } |
| 57 | using filebuf::read; |
| 58 | fl::size_t write(const char *data, fl::size_t count) FL_NOEXCEPT override { |
| 59 | (void)data; (void)count; |
| 60 | return 0; |
| 61 | } |
| 62 | fl::size_t tell() FL_NOEXCEPT override { |
| 63 | return _file.curPosition(); |
| 64 | } |
| 65 | const char* path() const FL_NOEXCEPT override { |
| 66 | return _path.c_str(); |
| 67 | } |
| 68 | bool seek(fl::size_t pos, fl::seek_dir dir) FL_NOEXCEPT override { |
| 69 | if (dir == fl::seek_dir::beg) return _file.seekSet(pos); |
| 70 | if (dir == fl::seek_dir::cur) return _file.seekCur(pos); |
| 71 | return _file.seekEnd(pos); |
| 72 | } |
| 73 | using filebuf::seek; |
| 74 | void close() FL_NOEXCEPT override { |
| 75 | if (_file.isOpen()) { |
| 76 | _file.close(); |
| 77 | } |
| 78 | } |
| 79 | bool is_eof() const FL_NOEXCEPT override { |
| 80 | auto f = const_cast<SdFatFileHandle*>(this); |
| 81 | return f->_file.available() <= 0; |
| 82 | } |
| 83 | bool has_error() const override { return false; } |
| 84 | void clear_error() override {} |
| 85 | int error_code() const override { return 0; } |
| 86 | const char* error_message() const override { return "No error"; } |
| 87 | }; |
| 88 | #else |