diff options
author | 2016-03-13 13:54:57 +1100 | |
---|---|---|
committer | 2016-03-14 18:55:00 +1100 | |
commit | 42fbb9c3967fcda37f2d9ae17d5796a79cf027b9 (patch) | |
tree | a43047ee00431e5e22bfc5f8f612ff775586e415 /src/lib/util/corefile.cpp | |
parent | 5fc27747031b6ed6f6c0582502098ebfb960be67 (diff) |
Make osd_file a polymorphic class that's held with smart pointers
Make avi_file a class that's held with smart pointers, encapsulate various AVI I/O structures
Make zip_file and _7z_file classes rather than having free functions everywhere
Hide zip/7z class implementation behind an interface, no longer need to call close() to send back to the cache
Don't dump as much crap in global namespace
Add solaris PTY implementation
Improve variable expansion for SDL OSD - supports ~/$FOO/${BAR} syntax
Rearrange stuff so the same things are in file module for all OSDs
Move file stuff into its own module
7z/zip open and destruct are still not thread-safe due to lack of interlocks around cache access
Directory functions still need to be moved to file module
SDL OSD may not initialise WinSock on Windows
Diffstat (limited to 'src/lib/util/corefile.cpp')
-rw-r--r-- | src/lib/util/corefile.cpp | 168 |
1 files changed, 81 insertions, 87 deletions
diff --git a/src/lib/util/corefile.cpp b/src/lib/util/corefile.cpp index 64169a606fc..ec1e25340e3 100644 --- a/src/lib/util/corefile.cpp +++ b/src/lib/util/corefile.cpp @@ -23,9 +23,7 @@ namespace util { - namespace { - /*************************************************************************** VALIDATION ***************************************************************************/ @@ -143,7 +141,7 @@ class core_proxy_file : public core_file public: core_proxy_file(core_file &file) : m_file(file) { } virtual ~core_proxy_file() override { } - virtual file_error compress(int level) override { return m_file.compress(level); } + virtual osd_file::error compress(int level) override { return m_file.compress(level); } virtual int seek(std::int64_t offset, int whence) override { return m_file.seek(offset, whence); } virtual std::uint64_t tell() const override { return m_file.tell(); } @@ -159,9 +157,9 @@ public: virtual std::uint32_t write(const void *buffer, std::uint32_t length) override { return m_file.write(buffer, length); } virtual int puts(const char *s) override { return m_file.puts(s); } virtual int vprintf(util::format_argument_pack<std::ostream> const &args) override { return m_file.vprintf(args); } - virtual file_error truncate(std::uint64_t offset) override { return m_file.truncate(offset); } + virtual osd_file::error truncate(std::uint64_t offset) override { return m_file.truncate(offset); } - virtual file_error flush() override { return m_file.flush(); } + virtual osd_file::error flush() override { return m_file.flush(); } private: core_file &m_file; @@ -232,7 +230,7 @@ public: } ~core_in_memory_file() override { purge(); } - virtual file_error compress(int level) override { return FILERR_INVALID_ACCESS; } + virtual osd_file::error compress(int level) override { return osd_file::error::INVALID_ACCESS; } virtual int seek(std::int64_t offset, int whence) override; virtual std::uint64_t tell() const override { return m_offset; } @@ -243,8 +241,8 @@ public: virtual void const *buffer() override { return m_data; } virtual std::uint32_t write(void const *buffer, std::uint32_t length) override { return 0; } - virtual file_error truncate(std::uint64_t offset) override; - virtual file_error flush() override { clear_putback(); return FILERR_NONE; } + virtual osd_file::error truncate(std::uint64_t offset) override; + virtual osd_file::error flush() override { clear_putback(); return osd_file::error::NONE; } protected: core_in_memory_file(std::uint32_t openflags, std::uint64_t length) @@ -295,9 +293,9 @@ private: class core_osd_file : public core_in_memory_file { public: - core_osd_file(std::uint32_t openmode, osd_file *file, std::uint64_t length) + core_osd_file(std::uint32_t openmode, osd_file::ptr &&file, std::uint64_t length) : core_in_memory_file(openmode, length) - , m_file(file) + , m_file(std::move(file)) , m_zdata() , m_bufferbase(0) , m_bufferbytes(0) @@ -305,7 +303,7 @@ public: } ~core_osd_file() override; - virtual file_error compress(int level) override; + virtual osd_file::error compress(int level) override; virtual int seek(std::int64_t offset, int whence) override; @@ -313,8 +311,8 @@ public: virtual void const *buffer() override; virtual std::uint32_t write(void const *buffer, std::uint32_t length) override; - virtual file_error truncate(std::uint64_t offset) override; - virtual file_error flush() override; + virtual osd_file::error truncate(std::uint64_t offset) override; + virtual osd_file::error flush() override; protected: @@ -323,10 +321,10 @@ protected: private: static constexpr std::size_t FILE_BUFFER_SIZE = 512; - file_error osd_or_zlib_read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual); - file_error osd_or_zlib_write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual); + osd_file::error osd_or_zlib_read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual); + osd_file::error osd_or_zlib_write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual); - osd_file * m_file; // OSD file handle + osd_file::ptr m_file; // OSD file handle zlib_data::ptr m_zdata; // compression data std::uint64_t m_bufferbase; // base offset of internal buffer std::uint32_t m_bufferbytes; // bytes currently loaded into buffer @@ -688,14 +686,14 @@ std::uint32_t core_in_memory_file::read(void *buffer, std::uint32_t length) truncate - truncate a file -------------------------------------------------*/ -file_error core_in_memory_file::truncate(std::uint64_t offset) +osd_file::error core_in_memory_file::truncate(std::uint64_t offset) { if (m_length < offset) - return FILERR_FAILURE; + return osd_file::error::FAILURE; // adjust to new length and offset set_length(offset); - return FILERR_NONE; + return osd_file::error::NONE; } @@ -736,8 +734,6 @@ core_osd_file::~core_osd_file() // close files and free memory if (m_zdata) compress(FCOMPRESS_NONE); - if (m_file) - osd_close(m_file); } @@ -747,13 +743,13 @@ core_osd_file::~core_osd_file() compression, or up to 9 for max compression -------------------------------------------------*/ -file_error core_osd_file::compress(int level) +osd_file::error core_osd_file::compress(int level) { - file_error result = FILERR_NONE; + osd_file::error result = osd_file::error::NONE; // can only do this for read-only and write-only cases if (read_access() && write_access()) - return FILERR_INVALID_ACCESS; + return osd_file::error::INVALID_ACCESS; // if we have been compressing, flush and free the data if (m_zdata && (level == FCOMPRESS_NONE)) @@ -767,7 +763,7 @@ file_error core_osd_file::compress(int level) zerr = m_zdata->finalise(); if ((zerr != Z_STREAM_END) && (zerr != Z_OK)) { - result = FILERR_INVALID_DATA; + result = osd_file::error::INVALID_DATA; break; } @@ -775,8 +771,8 @@ file_error core_osd_file::compress(int level) if (m_zdata->has_output()) { std::uint32_t actualdata; - auto const filerr = osd_write(m_file, m_zdata->buffer_data(), m_zdata->realoffset(), m_zdata->output_size(), &actualdata); - if (filerr != FILERR_NONE) + auto const filerr = m_file->write(m_zdata->buffer_data(), m_zdata->realoffset(), m_zdata->output_size(), actualdata); + if (filerr != osd_file::error::NONE) break; m_zdata->add_realoffset(actualdata); m_zdata->reset_output(); @@ -800,7 +796,7 @@ file_error core_osd_file::compress(int level) // on error, return an error if (zerr != Z_OK) - return FILERR_OUT_OF_MEMORY; + return osd_file::error::OUT_OF_MEMORY; // flush buffers m_bufferbytes = 0; @@ -888,13 +884,12 @@ void const *core_osd_file::buffer() // read the file std::uint32_t read_length = 0; auto const filerr = osd_or_zlib_read(buf, 0, length(), read_length); - if ((filerr != FILERR_NONE) || (read_length != length())) + if ((filerr != osd_file::error::NONE) || (read_length != length())) purge(); else { // close the file because we don't need it anymore - osd_close(m_file); - m_file = nullptr; + m_file.reset(); } } return core_in_memory_file::buffer(); @@ -931,19 +926,19 @@ std::uint32_t core_osd_file::write(void const *buffer, std::uint32_t length) truncate - truncate a file -------------------------------------------------*/ -file_error core_osd_file::truncate(std::uint64_t offset) +osd_file::error core_osd_file::truncate(std::uint64_t offset) { if (is_loaded()) return core_in_memory_file::truncate(offset); // truncate file - auto const err = osd_truncate(m_file, offset); - if (err != FILERR_NONE) + auto const err = m_file->truncate(offset); + if (err != osd_file::error::NONE) return err; // and adjust to new length and offset set_length(offset); - return FILERR_NONE; + return osd_file::error::NONE; } @@ -951,7 +946,7 @@ file_error core_osd_file::truncate(std::uint64_t offset) flush - flush file buffers -------------------------------------------------*/ -file_error core_osd_file::flush() +osd_file::error core_osd_file::flush() { if (is_loaded()) return core_in_memory_file::flush(); @@ -962,7 +957,7 @@ file_error core_osd_file::flush() // invalidate any buffered data m_bufferbytes = 0; - return osd_fflush(m_file); + return m_file->flush(); } @@ -971,18 +966,18 @@ file_error core_osd_file::flush() handles zlib-compressed data -------------------------------------------------*/ -file_error core_osd_file::osd_or_zlib_read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) +osd_file::error core_osd_file::osd_or_zlib_read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) { // if no compression, just pass through if (!m_zdata) - return osd_read(m_file, buffer, offset, length, &actual); + return m_file->read(buffer, offset, length, actual); // if the offset doesn't match the next offset, fail if (!m_zdata->is_nextoffset(offset)) - return FILERR_INVALID_ACCESS; + return osd_file::error::INVALID_ACCESS; // set up the destination - file_error filerr = FILERR_NONE; + osd_file::error filerr = osd_file::error::NONE; m_zdata->set_output(buffer, length); while (!m_zdata->output_full()) { @@ -992,7 +987,7 @@ file_error core_osd_file::osd_or_zlib_read(void *buffer, std::uint64_t offset, s auto const zerr = m_zdata->decompress(); if (Z_OK != zerr) { - if (Z_STREAM_END != zerr) filerr = FILERR_INVALID_DATA; + if (Z_STREAM_END != zerr) filerr = osd_file::error::INVALID_DATA; break; } } @@ -1001,8 +996,8 @@ file_error core_osd_file::osd_or_zlib_read(void *buffer, std::uint64_t offset, s if (!m_zdata->has_input()) { std::uint32_t actualdata = 0; - filerr = osd_read(m_file, m_zdata->buffer_data(), m_zdata->realoffset(), m_zdata->buffer_size(), &actualdata); - if (filerr != FILERR_NONE) break; + filerr = m_file->read(m_zdata->buffer_data(), m_zdata->realoffset(), m_zdata->buffer_size(), actualdata); + if (filerr != osd_file::error::NONE) break; m_zdata->add_realoffset(actualdata); m_zdata->reset_input(actualdata); if (!m_zdata->has_input()) break; @@ -1022,7 +1017,7 @@ file_error core_osd_file::osd_or_zlib_read(void *buffer, std::uint64_t offset, s -------------------------------------------------*/ /** - * @fn file_error osd_or_zlib_write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t actual) + * @fn osd_file::error osd_or_zlib_write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t actual) * * @brief OSD or zlib write. * @@ -1031,18 +1026,18 @@ file_error core_osd_file::osd_or_zlib_read(void *buffer, std::uint64_t offset, s * @param length The length. * @param [in,out] actual The actual. * - * @return A file_error. + * @return A osd_file::error. */ -file_error core_osd_file::osd_or_zlib_write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) +osd_file::error core_osd_file::osd_or_zlib_write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) { // if no compression, just pass through if (!m_zdata) - return osd_write(m_file, buffer, offset, length, &actual); + return m_file->write(buffer, offset, length, actual); // if the offset doesn't match the next offset, fail if (!m_zdata->is_nextoffset(offset)) - return FILERR_INVALID_ACCESS; + return osd_file::error::INVALID_ACCESS; // set up the source m_zdata->set_input(buffer, length); @@ -1054,15 +1049,15 @@ file_error core_osd_file::osd_or_zlib_write(void const *buffer, std::uint64_t of { actual = length - m_zdata->input_size(); m_zdata->add_nextoffset(actual); - return FILERR_INVALID_DATA; + return osd_file::error::INVALID_DATA; } // write more data if we are full up if (m_zdata->output_full()) { std::uint32_t actualdata = 0; - auto const filerr = osd_write(m_file, m_zdata->buffer_data(), m_zdata->realoffset(), m_zdata->output_size(), &actualdata); - if (filerr != FILERR_NONE) + auto const filerr = m_file->write(m_zdata->buffer_data(), m_zdata->realoffset(), m_zdata->output_size(), actualdata); + if (filerr != osd_file::error::NONE) return filerr; m_zdata->add_realoffset(actualdata); m_zdata->reset_output(); @@ -1072,7 +1067,7 @@ file_error core_osd_file::osd_or_zlib_write(void const *buffer, std::uint64_t of // we wrote everything actual = length; m_zdata->add_nextoffset(actual); - return FILERR_NONE; + return osd_file::error::NONE; } } // anonymous namespace @@ -1088,24 +1083,23 @@ file_error core_osd_file::osd_or_zlib_write(void const *buffer, std::uint64_t of return an error code -------------------------------------------------*/ -file_error core_file::open(char const *filename, std::uint32_t openflags, ptr &file) +osd_file::error core_file::open(char const *filename, std::uint32_t openflags, ptr &file) { - // attempt to open the file - osd_file *f = nullptr; - std::uint64_t length = 0; - auto const filerr = osd_open(filename, openflags, &f, &length); - if (filerr != FILERR_NONE) - return filerr; - try { - file = std::make_unique<core_osd_file>(openflags, f, length); - return FILERR_NONE; + // attempt to open the file + osd_file::ptr f; + std::uint64_t length = 0; + auto const filerr = osd_file::open(filename, openflags, f, length); + if (filerr != osd_file::error::NONE) + return filerr; + + file = std::make_unique<core_osd_file>(openflags, std::move(f), length); + return osd_file::error::NONE; } catch (...) { - osd_close(f); - return FILERR_OUT_OF_MEMORY; + return osd_file::error::OUT_OF_MEMORY; } } @@ -1115,20 +1109,20 @@ file_error core_file::open(char const *filename, std::uint32_t openflags, ptr &f like access and return an error code -------------------------------------------------*/ -file_error core_file::open_ram(void const *data, std::size_t length, std::uint32_t openflags, ptr &file) +osd_file::error core_file::open_ram(void const *data, std::size_t length, std::uint32_t openflags, ptr &file) { // can only do this for read access if ((openflags & OPEN_FLAG_WRITE) || (openflags & OPEN_FLAG_CREATE)) - return FILERR_INVALID_ACCESS; + return osd_file::error::INVALID_ACCESS; try { file.reset(new core_in_memory_file(openflags, data, length, false)); - return FILERR_NONE; + return osd_file::error::NONE; } catch (...) { - return FILERR_OUT_OF_MEMORY; + return osd_file::error::OUT_OF_MEMORY; } } @@ -1139,24 +1133,24 @@ file_error core_file::open_ram(void const *data, std::size_t length, std::uint32 error code -------------------------------------------------*/ -file_error core_file::open_ram_copy(void const *data, std::size_t length, std::uint32_t openflags, ptr &file) +osd_file::error core_file::open_ram_copy(void const *data, std::size_t length, std::uint32_t openflags, ptr &file) { // can only do this for read access if ((openflags & OPEN_FLAG_WRITE) || (openflags & OPEN_FLAG_CREATE)) - return FILERR_INVALID_ACCESS; + return osd_file::error::INVALID_ACCESS; try { ptr result(new core_in_memory_file(openflags, data, length, true)); if (!result->buffer()) - return FILERR_OUT_OF_MEMORY; + return osd_file::error::OUT_OF_MEMORY; file = std::move(result); - return FILERR_NONE; + return osd_file::error::NONE; } catch (...) { - return FILERR_OUT_OF_MEMORY; + return osd_file::error::OUT_OF_MEMORY; } } @@ -1166,16 +1160,16 @@ file_error core_file::open_ram_copy(void const *data, std::size_t length, std::u object and return an error code -------------------------------------------------*/ -file_error core_file::open_proxy(core_file &file, ptr &proxy) +osd_file::error core_file::open_proxy(core_file &file, ptr &proxy) { try { proxy = std::make_unique<core_proxy_file>(file); - return FILERR_NONE; + return osd_file::error::NONE; } catch (...) { - return FILERR_OUT_OF_MEMORY; + return osd_file::error::OUT_OF_MEMORY; } } @@ -1195,19 +1189,19 @@ core_file::~core_file() pointer -------------------------------------------------*/ -file_error core_file::load(char const *filename, void **data, std::uint32_t &length) +osd_file::error core_file::load(char const *filename, void **data, std::uint32_t &length) { ptr file; // attempt to open the file auto const err = open(filename, OPEN_FLAG_READ, file); - if (err != FILERR_NONE) + if (err != osd_file::error::NONE) return err; // get the size auto const size = file->size(); if (std::uint32_t(size) != size) - return FILERR_OUT_OF_MEMORY; + return osd_file::error::OUT_OF_MEMORY; // allocate memory *data = osd_malloc(size); @@ -1217,26 +1211,26 @@ file_error core_file::load(char const *filename, void **data, std::uint32_t &len if (file->read(*data, size) != size) { free(*data); - return FILERR_FAILURE; + return osd_file::error::FAILURE; } // close the file and return data - return FILERR_NONE; + return osd_file::error::NONE; } -file_error core_file::load(char const *filename, dynamic_buffer &data) +osd_file::error core_file::load(char const *filename, dynamic_buffer &data) { ptr file; // attempt to open the file auto const err = open(filename, OPEN_FLAG_READ, file); - if (err != FILERR_NONE) + if (err != osd_file::error::NONE) return err; // get the size auto const size = file->size(); if (std::uint32_t(size) != size) - return FILERR_OUT_OF_MEMORY; + return osd_file::error::OUT_OF_MEMORY; // allocate memory data.resize(size); @@ -1245,11 +1239,11 @@ file_error core_file::load(char const *filename, dynamic_buffer &data) if (file->read(&data[0], size) != size) { data.clear(); - return FILERR_FAILURE; + return osd_file::error::FAILURE; } // close the file and return data - return FILERR_NONE; + return osd_file::error::NONE; } |