summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/chd.cpp
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2023-10-27 06:35:17 +1100
committer Vas Crabb <vas@vastheman.com>2023-10-27 06:35:17 +1100
commit4587e86e8692e0b51a4afae3b67e49329268cfb7 (patch)
tree11721acc12f8de46aafeddb4def51983409ecc97 /src/lib/util/chd.cpp
parent945b92a36007d3209578b4533ecc28c77cd2e70b (diff)
Revert "chd.cpp: Refactoring, part 2"
This reverts commit cc772072fa635146b1df39a5694d2a8f8aa5a34f.
Diffstat (limited to 'src/lib/util/chd.cpp')
-rw-r--r--src/lib/util/chd.cpp247
1 files changed, 130 insertions, 117 deletions
diff --git a/src/lib/util/chd.cpp b/src/lib/util/chd.cpp
index 52b61dbd289..ba96e3897a5 100644
--- a/src/lib/util/chd.cpp
+++ b/src/lib/util/chd.cpp
@@ -1292,19 +1292,19 @@ std::error_condition chd_file::write_bytes(uint64_t offset, const void *buffer,
* @param searchindex The searchindex.
* @param [in,out] output The output.
*
- * @return A std::error_condition.
+ * @return The metadata.
*/
std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::string &output)
{
- // if we didn't find it, just return
- metadata_entry metaentry;
- if (std::error_condition err = metadata_find(searchtag, searchindex, metaentry))
- return err;
-
// wrap this for clean reporting
try
{
+ // if we didn't find it, just return
+ metadata_entry metaentry;
+ if (!metadata_find(searchtag, searchindex, metaentry))
+ return std::error_condition(error::METADATA_NOT_FOUND);
+
// read the metadata
output.assign(metaentry.length, '\0');
file_read(metaentry.offset + METADATA_HEADER_SIZE, &output[0], metaentry.length);
@@ -1329,19 +1329,19 @@ std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_
* @param searchindex The searchindex.
* @param [in,out] output The output.
*
- * @return A std::error_condition.
+ * @return The metadata.
*/
std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output)
{
- // if we didn't find it, just return
- metadata_entry metaentry;
- if (std::error_condition err = metadata_find(searchtag, searchindex, metaentry))
- return err;
-
// wrap this for clean reporting
try
{
+ // if we didn't find it, just return
+ metadata_entry metaentry;
+ if (!metadata_find(searchtag, searchindex, metaentry))
+ throw std::error_condition(error::METADATA_NOT_FOUND);
+
// read the metadata
output.resize(metaentry.length);
file_read(metaentry.offset + METADATA_HEADER_SIZE, &output[0], metaentry.length);
@@ -1368,19 +1368,19 @@ std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_
* @param outputlen The outputlen.
* @param [in,out] resultlen The resultlen.
*
- * @return A std::error_condition.
+ * @return The metadata.
*/
std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, void *output, uint32_t outputlen, uint32_t &resultlen)
{
- // if we didn't find it, just return
- metadata_entry metaentry;
- if (std::error_condition err = metadata_find(searchtag, searchindex, metaentry))
- return err;
-
// wrap this for clean reporting
try
{
+ // if we didn't find it, just return
+ metadata_entry metaentry;
+ if (!metadata_find(searchtag, searchindex, metaentry))
+ throw std::error_condition(error::METADATA_NOT_FOUND);
+
// read the metadata
resultlen = metaentry.length;
file_read(metaentry.offset + METADATA_HEADER_SIZE, output, std::min(outputlen, resultlen));
@@ -1407,19 +1407,19 @@ std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_
* @param [in,out] resulttag The resulttag.
* @param [in,out] resultflags The resultflags.
*
- * @return A std::error_condition.
+ * @return The metadata.
*/
std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output, chd_metadata_tag &resulttag, uint8_t &resultflags)
{
- // if we didn't find it, just return
- metadata_entry metaentry;
- if (std::error_condition err = metadata_find(searchtag, searchindex, metaentry))
- return err;
-
// wrap this for clean reporting
try
{
+ // if we didn't find it, just return
+ metadata_entry metaentry;
+ if (!metadata_find(searchtag, searchindex, metaentry))
+ throw std::error_condition(error::METADATA_NOT_FOUND);
+
// read the metadata
output.resize(metaentry.length);
file_read(metaentry.offset + METADATA_HEADER_SIZE, &output[0], metaentry.length);
@@ -1462,8 +1462,7 @@ std::error_condition chd_file::write_metadata(chd_metadata_tag metatag, uint32_t
// find the entry if it already exists
metadata_entry metaentry;
bool finished = false;
- std::error_condition err = metadata_find(metatag, metaindex, metaentry);
- if (!err)
+ if (metadata_find(metatag, metaindex, metaentry))
{
// if the new data fits over the old data, just overwrite
if (inputlen <= metaentry.length)
@@ -1486,8 +1485,6 @@ std::error_condition chd_file::write_metadata(chd_metadata_tag metatag, uint32_t
else
metadata_set_previous_next(metaentry.prev, metaentry.next);
}
- else if (err != error::METADATA_NOT_FOUND)
- throw err;
// if not yet done, create a new entry and append
if (!finished)
@@ -1536,14 +1533,14 @@ std::error_condition chd_file::write_metadata(chd_metadata_tag metatag, uint32_t
std::error_condition chd_file::delete_metadata(chd_metadata_tag metatag, uint32_t metaindex)
{
- // find the entry
- metadata_entry metaentry;
- if (std::error_condition err = metadata_find(metatag, metaindex, metaentry))
- return err;
-
// wrap this for clean reporting
try
{
+ // find the entry
+ metadata_entry metaentry;
+ if (!metadata_find(metatag, metaindex, metaentry))
+ throw std::error_condition(error::METADATA_NOT_FOUND);
+
// point the previous to the next, unlinking us
metadata_set_previous_next(metaentry.prev, metaentry.next);
return std::error_condition();
@@ -1571,37 +1568,34 @@ std::error_condition chd_file::delete_metadata(chd_metadata_tag metatag, uint32_
std::error_condition chd_file::clone_all_metadata(chd_file &source)
{
- // iterate over metadata entries in the source
- std::vector<uint8_t> filedata;
- metadata_entry metaentry;
- metaentry.metatag = 0;
- metaentry.length = 0;
- metaentry.next = 0;
- metaentry.flags = 0;
- std::error_condition err;
- for (err = source.metadata_find(CHDMETATAG_WILDCARD, 0, metaentry); !err; err = source.metadata_find(CHDMETATAG_WILDCARD, 0, metaentry, true))
+ // wrap this for clean reporting
+ try
{
- // wrap this for clean reporting
- try
+ // iterate over metadata entries in the source
+ std::vector<uint8_t> filedata;
+ metadata_entry metaentry;
+ metaentry.metatag = 0;
+ metaentry.length = 0;
+ metaentry.next = 0;
+ metaentry.flags = 0;
+ for (bool has_data = source.metadata_find(CHDMETATAG_WILDCARD, 0, metaentry); has_data; has_data = source.metadata_find(CHDMETATAG_WILDCARD, 0, metaentry, true))
{
// read the metadata item
filedata.resize(metaentry.length);
source.file_read(metaentry.offset + METADATA_HEADER_SIZE, &filedata[0], metaentry.length);
+
+ // write it to the destination
+ std::error_condition err = write_metadata(metaentry.metatag, (uint32_t)-1, &filedata[0], metaentry.length, metaentry.flags);
+ if (err)
+ throw err;
}
- catch (std::error_condition const &filerr)
- {
- return filerr;
- }
-
- // write it to the destination
- err = write_metadata(metaentry.metatag, (uint32_t)-1, &filedata[0], metaentry.length, metaentry.flags);
- if (err)
- return err;
- }
- if (err == error::METADATA_NOT_FOUND)
return std::error_condition();
- else
+ }
+ catch (std::error_condition const &err)
+ {
+ // return any errors
return err;
+ }
}
/**
@@ -1627,8 +1621,7 @@ util::sha1_t chd_file::compute_overall_sha1(util::sha1_t rawsha1)
std::vector<uint8_t> filedata;
std::vector<metadata_hash> hasharray;
metadata_entry metaentry;
- std::error_condition err;
- for (err = metadata_find(CHDMETATAG_WILDCARD, 0, metaentry); !err; err = metadata_find(CHDMETATAG_WILDCARD, 0, metaentry, true))
+ for (bool has_data = metadata_find(CHDMETATAG_WILDCARD, 0, metaentry); has_data; has_data = metadata_find(CHDMETATAG_WILDCARD, 0, metaentry, true))
{
// if not checksumming, continue
if ((metaentry.flags & CHD_MDFLAGS_CHECKSUM) == 0)
@@ -1644,8 +1637,6 @@ util::sha1_t chd_file::compute_overall_sha1(util::sha1_t rawsha1)
hashentry.sha1 = util::sha1_creator::simple(&filedata[0], metaentry.length);
hasharray.push_back(hashentry);
}
- if (err != error::METADATA_NOT_FOUND)
- throw err;
// sort the array
if (!hasharray.empty())
@@ -2667,7 +2658,7 @@ void chd_file::hunk_copy_from_parent(uint32_t hunknum, uint64_t parentunit)
}
/**
- * @fn std::error_condition chd_file::metadata_find(chd_metadata_tag metatag, int32_t metaindex, metadata_entry &metaentry, bool resume)
+ * @fn bool chd_file::metadata_find(chd_metadata_tag metatag, int32_t metaindex, metadata_entry &metaentry, bool resume)
*
* @brief -------------------------------------------------
* metadata_find - find a metadata entry
@@ -2678,10 +2669,10 @@ void chd_file::hunk_copy_from_parent(uint32_t hunknum, uint64_t parentunit)
* @param [in,out] metaentry The metaentry.
* @param resume true to resume.
*
- * @return A std::error_condition (error::METADATA_NOT_FOUND if the search fails).
+ * @return true if it succeeds, false if it fails.
*/
-std::error_condition chd_file::metadata_find(chd_metadata_tag metatag, int32_t metaindex, metadata_entry &metaentry, bool resume) const
+bool chd_file::metadata_find(chd_metadata_tag metatag, int32_t metaindex, metadata_entry &metaentry, bool resume) const
{
// start at the beginning unless we're resuming a previous search
if (!resume)
@@ -2695,40 +2686,31 @@ std::error_condition chd_file::metadata_find(chd_metadata_tag metatag, int32_t m
metaentry.offset = metaentry.next;
}
- // wrap this for clean reporting
- try
+ // loop until we run out of options
+ while (metaentry.offset != 0)
{
- // loop until we run out of options
- while (metaentry.offset != 0)
- {
- // read the raw header
- uint8_t raw_meta_header[METADATA_HEADER_SIZE];
- file_read(metaentry.offset, raw_meta_header, sizeof(raw_meta_header));
-
- // extract the data
- metaentry.metatag = get_u32be(&raw_meta_header[0]);
- metaentry.flags = raw_meta_header[4];
- metaentry.length = get_u24be(&raw_meta_header[5]);
- metaentry.next = get_u64be(&raw_meta_header[8]);
-
- // if we got a match, proceed
- if (metatag == CHDMETATAG_WILDCARD || metaentry.metatag == metatag)
- if (metaindex-- == 0)
- return std::error_condition();
-
- // no match, fetch the next link
- metaentry.prev = metaentry.offset;
- metaentry.offset = metaentry.next;
- }
+ // read the raw header
+ uint8_t raw_meta_header[METADATA_HEADER_SIZE];
+ file_read(metaentry.offset, raw_meta_header, sizeof(raw_meta_header));
- // if we get here, we didn't find it
- return error::METADATA_NOT_FOUND;
- }
- catch (std::error_condition const &err)
- {
- // return any errors
- return err;
+ // extract the data
+ metaentry.metatag = get_u32be(&raw_meta_header[0]);
+ metaentry.flags = raw_meta_header[4];
+ metaentry.length = get_u24be(&raw_meta_header[5]);
+ metaentry.next = get_u64be(&raw_meta_header[8]);
+
+ // if we got a match, proceed
+ if (metatag == CHDMETATAG_WILDCARD || metaentry.metatag == metatag)
+ if (metaindex-- == 0)
+ return true;
+
+ // no match, fetch the next link
+ metaentry.prev = metaentry.offset;
+ metaentry.offset = metaentry.next;
}
+
+ // if we get here, we didn't find it
+ return false;
}
/**
@@ -3362,40 +3344,71 @@ void chd_file_compressor::hashmap::add(uint64_t itemnum, util::crc16_t crc16, ut
m_map[crc16] = entry;
}
-std::error_condition chd_file::check_is_hd() const
+bool chd_file::is_hd() const
{
- metadata_entry metaentry;
- return metadata_find(HARD_DISK_METADATA_TAG, 0, metaentry);
+ try
+ {
+ metadata_entry metaentry;
+ return metadata_find(HARD_DISK_METADATA_TAG, 0, metaentry);
+ }
+ catch (std::error_condition const &)
+ {
+ return false;
+ }
}
-std::error_condition chd_file::check_is_cd() const
+bool chd_file::is_cd() const
{
- metadata_entry metaentry;
- std::error_condition err = metadata_find(CDROM_OLD_METADATA_TAG, 0, metaentry);
- if (err == error::METADATA_NOT_FOUND)
- err = metadata_find(CDROM_TRACK_METADATA_TAG, 0, metaentry);
- if (err == error::METADATA_NOT_FOUND)
- err = metadata_find(CDROM_TRACK_METADATA2_TAG, 0, metaentry);
- return err;
+ try
+ {
+ metadata_entry metaentry;
+ return metadata_find(CDROM_OLD_METADATA_TAG, 0, metaentry)
+ || metadata_find(CDROM_TRACK_METADATA_TAG, 0, metaentry)
+ || metadata_find(CDROM_TRACK_METADATA2_TAG, 0, metaentry);
+ }
+ catch (std::error_condition const &)
+ {
+ return false;
+ }
}
-std::error_condition chd_file::check_is_gd() const
+bool chd_file::is_gd() const
{
- metadata_entry metaentry;
- std::error_condition err = metadata_find(GDROM_OLD_METADATA_TAG, 0, metaentry);
- if (err == error::METADATA_NOT_FOUND)
- err = metadata_find(GDROM_TRACK_METADATA_TAG, 0, metaentry);
- return err;
+ try
+ {
+ metadata_entry metaentry;
+ return metadata_find(GDROM_OLD_METADATA_TAG, 0, metaentry)
+ || metadata_find(GDROM_TRACK_METADATA_TAG, 0, metaentry);
+ }
+ catch (std::error_condition const &)
+ {
+ return false;
+ }
}
-std::error_condition chd_file::check_is_dvd() const
+bool chd_file::is_dvd() const
{
- metadata_entry metaentry;
- return metadata_find(DVD_METADATA_TAG, 0, metaentry);
+ try
+ {
+ metadata_entry metaentry;
+ return metadata_find(DVD_METADATA_TAG, 0, metaentry);
+ }
+ catch (std::error_condition const &)
+ {
+ return false;
+ }
}
-std::error_condition chd_file::check_is_av() const
+bool chd_file::is_av() const
{
- metadata_entry metaentry;
- return metadata_find(AV_METADATA_TAG, 0, metaentry);
+ try
+ {
+ metadata_entry metaentry;
+ return metadata_find(AV_METADATA_TAG, 0, metaentry);
+ }
+ catch (std::error_condition const &)
+ {
+ return false;
+ }
}
+