diff options
author | 2021-10-05 03:34:45 +1100 | |
---|---|---|
committer | 2021-10-05 03:34:45 +1100 | |
commit | aeb9eae87469e67bc6a91caf3840c34c11d959fc (patch) | |
tree | 45bffedf374dbce47caca633ad7bda547592e6c9 /src/lib/util/harddisk.cpp | |
parent | 33723892a3f06e678d817b36aef84364c32848ec (diff) |
util: Further API cleanups: (#8661)
* Turned `core_file` into an implementation of `random_read_write`.
* Turned PNG errors into a standard error category.
* Added a helper for generating what look like derived classes on-the-fly.
Diffstat (limited to 'src/lib/util/harddisk.cpp')
-rw-r--r-- | src/lib/util/harddisk.cpp | 60 |
1 files changed, 34 insertions, 26 deletions
diff --git a/src/lib/util/harddisk.cpp b/src/lib/util/harddisk.cpp index 66d98582bb6..ad0108092c8 100644 --- a/src/lib/util/harddisk.cpp +++ b/src/lib/util/harddisk.cpp @@ -10,7 +10,7 @@ #include "harddisk.h" -#include "corefile.h" +#include "ioprocs.h" #include <cstdlib> @@ -21,9 +21,9 @@ struct hard_disk_file { - chd_file * chd; /* CHD file */ - util::core_file *fhandle; /* core_file if not a CHD */ - hard_disk_info info; /* hard disk info */ + chd_file * chd; // CHD file + util::random_read_write * fhandle; // file if not a CHD + hard_disk_info info; // hard disk info }; @@ -73,11 +73,16 @@ hard_disk_file *hard_disk_open(chd_file *chd) return file; } -hard_disk_file *hard_disk_open(util::core_file &corefile, uint32_t skipoffs) +hard_disk_file *hard_disk_open(util::random_read_write &corefile, uint32_t skipoffs) { + // bail if getting the file length fails + std::uint64_t length; + if (corefile.length(length)) + return nullptr; + hard_disk_file *file; - /* allocate memory for the hard disk file */ + // allocate memory for the hard disk file file = (hard_disk_file *)malloc(sizeof(hard_disk_file)); if (file == nullptr) return nullptr; @@ -91,7 +96,7 @@ hard_disk_file *hard_disk_open(util::core_file &corefile, uint32_t skipoffs) file->info.fileoffset = skipoffs; // attempt to guess geometry in case this is an ATA situation - for (uint32_t totalsectors = (corefile.size() - skipoffs) / file->info.sectorbytes; ; totalsectors++) + for (uint32_t totalsectors = (length - skipoffs) / file->info.sectorbytes; ; totalsectors++) for (uint32_t cursectors = 63; cursectors > 1; cursectors--) if (totalsectors % cursectors == 0) { @@ -118,9 +123,7 @@ hard_disk_file *hard_disk_open(util::core_file &corefile, uint32_t skipoffs) void hard_disk_close(hard_disk_file *file) { if (file->fhandle) - { file->fhandle->flush(); - } free(file); } @@ -164,7 +167,7 @@ hard_disk_info *hard_disk_get_info(hard_disk_file *file) -------------------------------------------------*/ /** - * @fn uint32_t hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer) + * @fn bool hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer) * * @brief Hard disk read. * @@ -172,22 +175,24 @@ hard_disk_info *hard_disk_get_info(hard_disk_file *file) * @param lbasector The sector number (Linear Block Address) to read. * @param buffer The buffer where the hard disk data will be placed. * - * @return An uint32_t. + * @return True if the operation succeeded */ -uint32_t hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer) +bool hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer) { + std::error_condition err; if (file->chd) { - std::error_condition err = file->chd->read_units(lbasector, buffer); + err = file->chd->read_units(lbasector, buffer); return !err; } else { - uint32_t actual = 0; - file->fhandle->seek(file->info.fileoffset + (lbasector * file->info.sectorbytes), SEEK_SET); - actual = file->fhandle->read(buffer, file->info.sectorbytes); - return (actual == file->info.sectorbytes); + size_t actual = 0; + err = file->fhandle->seek(file->info.fileoffset + (lbasector * file->info.sectorbytes), SEEK_SET); + if (!err) + err = file->fhandle->read(buffer, file->info.sectorbytes, actual); + return !err && (actual == file->info.sectorbytes); } } @@ -198,7 +203,7 @@ uint32_t hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer) -------------------------------------------------*/ /** - * @fn uint32_t hard_disk_write(hard_disk_file *file, uint32_t lbasector, const void *buffer) + * @fn bool hard_disk_write(hard_disk_file *file, uint32_t lbasector, const void *buffer) * * @brief Hard disk write. * @@ -206,25 +211,28 @@ uint32_t hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer) * @param lbasector The sector number (Linear Block Address) to write. * @param buffer The buffer containing the data to write. * - * @return An uint32_t. + * @return True if the operation succeeded */ -uint32_t hard_disk_write(hard_disk_file *file, uint32_t lbasector, const void *buffer) +bool hard_disk_write(hard_disk_file *file, uint32_t lbasector, const void *buffer) { + std::error_condition err; if (file->chd) { - std::error_condition err = file->chd->write_units(lbasector, buffer); + err = file->chd->write_units(lbasector, buffer); return !err; } else { - uint32_t actual = 0; - file->fhandle->seek(file->info.fileoffset + (lbasector * file->info.sectorbytes), SEEK_SET); - actual = file->fhandle->write(buffer, file->info.sectorbytes); - return (actual == file->info.sectorbytes); + size_t actual = 0; + err = file->fhandle->seek(file->info.fileoffset + (lbasector * file->info.sectorbytes), SEEK_SET); + if (!err) + err = file->fhandle->write(buffer, file->info.sectorbytes, actual); + return !err && (actual == file->info.sectorbytes); } } + /*------------------------------------------------- hard_disk_set_block_size - sets the block size for a non-CHD-backed hard disk (a bare file). @@ -259,6 +267,6 @@ bool hard_disk_set_block_size(hard_disk_file *file, uint32_t blocksize) else { file->info.sectorbytes = blocksize; + return true; } - return true; } |