CDImage: Use Error class for complex errors
This commit is contained in:
@ -1,6 +1,7 @@
|
||||
#include "assert.h"
|
||||
#include "cd_image.h"
|
||||
#include "cd_subchannel_replacement.h"
|
||||
#include "error.h"
|
||||
#include "file_system.h"
|
||||
#include "log.h"
|
||||
#include <array>
|
||||
@ -161,7 +162,7 @@ public:
|
||||
CDImageEcm();
|
||||
~CDImageEcm() override;
|
||||
|
||||
bool Open(const char* filename);
|
||||
bool Open(const char* filename, Common::Error* error);
|
||||
|
||||
bool ReadSubChannelQ(SubChannelQ* subq) override;
|
||||
bool HasNonStandardSubchannel() const override;
|
||||
@ -221,13 +222,16 @@ CDImageEcm::~CDImageEcm()
|
||||
std::fclose(m_fp);
|
||||
}
|
||||
|
||||
bool CDImageEcm::Open(const char* filename)
|
||||
bool CDImageEcm::Open(const char* filename, Common::Error* error)
|
||||
{
|
||||
m_filename = filename;
|
||||
m_fp = FileSystem::OpenCFile(filename, "rb");
|
||||
if (!m_fp)
|
||||
{
|
||||
Log_ErrorPrintf("Failed to open binfile '%s': errno %d", filename, errno);
|
||||
if (error)
|
||||
error->SetErrno(errno);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -236,6 +240,9 @@ bool CDImageEcm::Open(const char* filename)
|
||||
header[3] != 0)
|
||||
{
|
||||
Log_ErrorPrintf("Failed to read/invalid header");
|
||||
if (error)
|
||||
error->SetMessage("Failed to read/invalid header");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -250,6 +257,9 @@ bool CDImageEcm::Open(const char* filename)
|
||||
if (bits == EOF)
|
||||
{
|
||||
Log_ErrorPrintf("Unexpected EOF after %zu chunks", m_data_map.size());
|
||||
if (error)
|
||||
error->SetFormattedMessage("Unexpected EOF after %zu chunks", m_data_map.size());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -263,6 +273,9 @@ bool CDImageEcm::Open(const char* filename)
|
||||
if (bits == EOF)
|
||||
{
|
||||
Log_ErrorPrintf("Unexpected EOF after %zu chunks", m_data_map.size());
|
||||
if (error)
|
||||
error->SetFormattedMessage("Unexpected EOF after %zu chunks", m_data_map.size());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -280,6 +293,9 @@ bool CDImageEcm::Open(const char* filename)
|
||||
if (count >= 0x80000000u)
|
||||
{
|
||||
Log_ErrorPrintf("Corrupted header after %zu chunks", m_data_map.size());
|
||||
if (error)
|
||||
error->SetFormattedMessage("Corrupted header after %zu chunks", m_data_map.size());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -309,6 +325,9 @@ bool CDImageEcm::Open(const char* filename)
|
||||
if (std::fseek(m_fp, file_offset, SEEK_SET) != 0)
|
||||
{
|
||||
Log_ErrorPrintf("Failed to seek to offset %u after %zu chunks", file_offset, m_data_map.size());
|
||||
if (error)
|
||||
error->SetFormattedMessage("Failed to seek to offset %u after %zu chunks", file_offset, m_data_map.size());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -316,6 +335,9 @@ bool CDImageEcm::Open(const char* filename)
|
||||
if (m_data_map.empty())
|
||||
{
|
||||
Log_ErrorPrintf("No data in image '%s'", filename);
|
||||
if (error)
|
||||
error->SetFormattedMessage("No data in image '%s'", filename);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -501,10 +523,10 @@ bool CDImageEcm::ReadSectorFromIndex(void* buffer, const Index& index, LBA lba_i
|
||||
return true;
|
||||
}
|
||||
|
||||
std::unique_ptr<CDImage> CDImage::OpenEcmImage(const char* filename)
|
||||
std::unique_ptr<CDImage> CDImage::OpenEcmImage(const char* filename, Common::Error* error)
|
||||
{
|
||||
std::unique_ptr<CDImageEcm> image = std::make_unique<CDImageEcm>();
|
||||
if (!image->Open(filename))
|
||||
if (!image->Open(filename, error))
|
||||
return {};
|
||||
|
||||
return image;
|
||||
|
||||
Reference in New Issue
Block a user