summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/save.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/save.cpp')
-rw-r--r--src/emu/save.cpp55
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);
});
}