diff options
author | 2021-08-22 09:06:15 +1000 | |
---|---|---|
committer | 2021-08-22 09:06:15 +1000 | |
commit | e8bbea1fc6e94e14768509d322f6c624403ffb36 (patch) | |
tree | 74dd1606a900d83de8aecff17a6737af4113308d /src/emu/save.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/emu/save.cpp')
-rw-r--r-- | src/emu/save.cpp | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/src/emu/save.cpp b/src/emu/save.cpp index 96fb3429a1c..120fa883655 100644 --- a/src/emu/save.cpp +++ b/src/emu/save.cpp @@ -24,7 +24,10 @@ #include "emu.h" #include "emuopts.h" -#include "coreutil.h" + +#include "util/coreutil.h" +#include "util/ioprocs.h" +#include "util/ioprocsfilter.h" //************************************************************************** @@ -212,7 +215,6 @@ save_error save_manager::check_file(running_machine &machine, emu_file &file, co sig = machine.save().signature(); // seek to the beginning and read the header - file.compress(FCOMPRESS_NONE); file.seek(0, SEEK_SET); u8 header[HEADER_SIZE]; if (file.read(header, sizeof(header)) != sizeof(header)) @@ -257,20 +259,28 @@ void save_manager::dispatch_presave() save_error save_manager::write_file(emu_file &file) { - return do_write( + util::write_stream::ptr writer; + save_error err = do_write( [] (size_t total_size) { return true; }, - [&file] (const void *data, size_t size) { return file.write(data, size) == size; }, - [&file] () + [&writer] (const void *data, size_t size) { - file.compress(FCOMPRESS_NONE); - file.seek(0, SEEK_SET); - return true; + size_t written; + std::error_condition filerr = writer->write(data, size, written); + return !filerr && (size == written); }, - [&file] () + [&file, &writer] () { - file.compress(FCOMPRESS_MEDIUM); - return true; + if (file.seek(0, SEEK_SET)) + return false; + writer = util::core_file_read_write(file); + return bool(writer); + }, + [&file, &writer] () + { + writer = util::zlib_write(util::core_file_read_write(file), 6, 16384); + return bool(writer); }); + return (STATERR_NONE != err) ? err : writer->finalize() ? STATERR_WRITE_ERROR : STATERR_NONE; } @@ -280,19 +290,26 @@ save_error save_manager::write_file(emu_file &file) save_error save_manager::read_file(emu_file &file) { + util::read_stream::ptr reader; return do_read( [] (size_t total_size) { return true; }, - [&file] (void *data, size_t size) { return file.read(data, size) == size; }, - [&file] () + [&reader] (void *data, size_t size) { - file.compress(FCOMPRESS_NONE); - file.seek(0, SEEK_SET); - return true; + std::size_t read; + std::error_condition filerr = reader->read(data, size, read); + return !filerr && (read == size); }, - [&file] () + [&file, &reader] () { - file.compress(FCOMPRESS_MEDIUM); - return true; + if (file.seek(0, SEEK_SET)) + return false; + reader = util::core_file_read(file); + return bool(reader); + }, + [&file, &reader] () + { + reader = util::zlib_read(util::core_file_read(file), 16384); + return bool(reader); }); } |