diff options
author | 2021-08-22 09:06:15 +1000 | |
---|---|---|
committer | 2021-08-22 09:06:15 +1000 | |
commit | e8bbea1fc6e94e14768509d322f6c624403ffb36 (patch) | |
tree | 74dd1606a900d83de8aecff17a6737af4113308d /src/tools/image_handler.cpp | |
parent | e319bde5fc3696d7f48f62b15b6366c4377fe5d1 (diff) |
formats, osd, util: Started refactoring file I/O stuff. (#8456)
Added more modern generic I/O interfaces with implementation backed by stdio, osd_file and core_file, replacing io_generic. Also replaced core_file's build-in zlib compression with a filter.
unzip.cpp, un7z.cpp: Added option to supply abstract I/O interface rather than filename.
Converted osd_file, core_file, archive_file, chd_file and device_image_interface to use std::error_condition rather than their own error enums.
Allow mounting TI-99 RPK from inside archives.
Diffstat (limited to 'src/tools/image_handler.cpp')
-rw-r--r-- | src/tools/image_handler.cpp | 116 |
1 files changed, 22 insertions, 94 deletions
diff --git a/src/tools/image_handler.cpp b/src/tools/image_handler.cpp index abb45de2db3..a520383846d 100644 --- a/src/tools/image_handler.cpp +++ b/src/tools/image_handler.cpp @@ -4,10 +4,16 @@ // Image generic handler class and helpers #include "image_handler.h" + #include "formats/all.h" #include "formats/fsblk_vec.h" #include "formats/fs_unformatted.h" +#include "ioprocs.h" +#include "ioprocsfill.h" +#include "ioprocsvec.h" + + // Fatalerror implementation emu_fatalerror::emu_fatalerror(util::format_argument_pack<std::ostream> const &args) @@ -21,70 +27,6 @@ emu_fatalerror::emu_fatalerror(int _exitcode, util::format_argument_pack<std::os { } -// io_generic from vector<u8> - -static void ram_closeproc(void *file) -{ - auto f = (iofile_ram *)file; - delete f; -} - -static int ram_seekproc(void *file, int64_t offset, int whence) -{ - auto f = (iofile_ram *)file; - switch(whence) { - case SEEK_SET: f->pos = offset; break; - case SEEK_CUR: f->pos += offset; break; - case SEEK_END: f->pos = f->data->size() + offset; break; - } - - if(whence == SEEK_CUR) - f->pos = std::max<int64_t>(f->pos, 0); - else - f->pos = std::clamp<int64_t>(f->pos, 0, f->data->size()); - return 0; -} - -static size_t ram_readproc(void *file, void *buffer, size_t length) -{ - auto f = (iofile_ram *)file; - size_t l = std::min<std::common_type_t<size_t, int64_t> >(length, f->data->size() - f->pos); - memcpy(buffer, f->data->data() + f->pos, l); - return l; -} - -static size_t ram_writeproc(void *file, const void *buffer, size_t length) -{ - auto f = (iofile_ram *)file; - size_t l = std::max<std::common_type_t<size_t, int64_t> >(f->pos + length, f->data->size()); - f->data->resize(l); - memcpy(f->data->data() + f->pos, buffer, length); - return length; -} - -static uint64_t ram_filesizeproc(void *file) -{ - auto f = (iofile_ram *)file; - return f->data->size(); -} - - -static const io_procs iop_ram = { - ram_closeproc, - ram_seekproc, - ram_readproc, - ram_writeproc, - ram_filesizeproc -}; - -io_generic *ram_open(std::vector<u8> &data) -{ - iofile_ram *f = new iofile_ram; - f->data = &data; - f->pos = 0; - return new io_generic({ &iop_ram, f }); -} - // Format enumeration @@ -304,45 +246,37 @@ std::vector<std::pair<u8, const floppy_format_info *>> image_handler::identify(c std::vector<std::pair<u8, const floppy_format_info *>> res; std::vector<uint32_t> variants; - std::string msg = util::string_format("Error opening %s for reading", m_on_disk_path); FILE *f = fopen(m_on_disk_path.c_str(), "rb"); if (!f) { + std::string msg = util::string_format("Error opening %s for reading", m_on_disk_path); perror(msg.c_str()); return res; } - io_generic io; - io.file = f; - io.procs = &stdio_ioprocs_noclose; - io.filler = 0xff; + auto io = util::stdio_read(f, 0xff); for(const auto &e : formats.floppy_format_info_by_key) { - u8 score = e.second->m_format->identify(&io, floppy_image::FF_UNKNOWN, variants); + u8 score = e.second->m_format->identify(*io, floppy_image::FF_UNKNOWN, variants); if(score) res.emplace_back(std::make_pair(score, e.second)); } - fclose(f); - return res; } bool image_handler::floppy_load(const floppy_format_info *format) { std::vector<uint32_t> variants; - std::string msg = util::string_format("Error opening %s for reading", m_on_disk_path); FILE *f = fopen(m_on_disk_path.c_str(), "rb"); if (!f) { + std::string msg = util::string_format("Error opening %s for reading", m_on_disk_path); perror(msg.c_str()); return true; } - io_generic io; - io.file = f; - io.procs = &stdio_ioprocs_noclose; - io.filler = 0xff; + auto io = util::stdio_read(f, 0xff); - return !format->m_format->load(&io, floppy_image::FF_UNKNOWN, variants, &m_floppy_image); + return !format->m_format->load(*io, floppy_image::FF_UNKNOWN, variants, &m_floppy_image); } bool image_handler::floppy_save(const floppy_format_info *format) @@ -355,12 +289,9 @@ bool image_handler::floppy_save(const floppy_format_info *format) return true; } - io_generic io; - io.file = f; - io.procs = &stdio_ioprocs_noclose; - io.filler = 0xff; + auto io = util::stdio_read_write(f, 0xff); - return !format->m_format->save(&io, variants, &m_floppy_image); + return !format->m_format->save(*io, variants, &m_floppy_image); } void image_handler::floppy_create(const floppy_create_info *format, fs_meta_data meta) @@ -372,14 +303,13 @@ void image_handler::floppy_create(const floppy_create_info *format, fs_meta_data auto fs = format->m_manager->mount(blockdev); fs->format(meta); - auto iog = ram_open(img); auto source_format = format->m_type(); - source_format->load(iog, floppy_image::FF_UNKNOWN, variants, &m_floppy_image); + auto io = util::ram_read(img.data(), img.size(), 0xff); + source_format->load(*io, floppy_image::FF_UNKNOWN, variants, &m_floppy_image); delete source_format; - delete iog; - - } else + } else { fs_unformatted::format(format->m_key, &m_floppy_image); + } } bool image_handler::floppy_mount_fs(const filesystem_format *format) @@ -390,11 +320,10 @@ bool image_handler::floppy_mount_fs(const filesystem_format *format) std::vector<uint32_t> variants; m_floppy_fs_converter = ci->m_type; m_sector_image.clear(); - auto iog = ram_open(m_sector_image); auto load_format = m_floppy_fs_converter(); - load_format->save(iog, variants, &m_floppy_image); + util::random_read_write_fill_wrapper<util::vector_read_write_adapter<u8>, 0xff> io(m_sector_image); + load_format->save(io, variants, &m_floppy_image); delete load_format; - delete iog; } if(ci->m_image_size == m_sector_image.size()) @@ -425,11 +354,10 @@ bool image_handler::hd_mount_fs(const filesystem_format *format) void image_handler::fs_to_floppy() { std::vector<uint32_t> variants; - auto iog = ram_open(m_sector_image); + auto io = util::ram_read(m_sector_image.data(), m_sector_image.size(), 0xff); auto format = m_floppy_fs_converter(); - format->load(iog, floppy_image::FF_UNKNOWN, variants, &m_floppy_image); + format->load(*io, floppy_image::FF_UNKNOWN, variants, &m_floppy_image); delete format; - delete iog; } std::vector<std::string> image_handler::path_split(std::string path) const |