Card writing bug fixes

This commit is contained in:
Jack Andersen 2017-02-03 17:43:49 -10:00
parent 11d1c676c4
commit 537cceca49
2 changed files with 65 additions and 9 deletions

View File

@ -20,13 +20,13 @@ namespace kabufuda
class FileHandle class FileHandle
{ {
friend class Card; friend class Card;
uint32_t idx = 0; uint32_t idx = -1;
int32_t offset = 0; int32_t offset = 0;
FileHandle(uint32_t idx) : idx(idx) {} FileHandle(uint32_t idx) : idx(idx) {}
public: public:
FileHandle() = default; FileHandle() = default;
uint32_t getFileNo() const { return idx; } uint32_t getFileNo() const { return idx; }
operator bool() const { return getFileNo() != 0; } operator bool() const { return getFileNo() != -1; }
}; };
enum class ECardResult enum class ECardResult
@ -519,6 +519,11 @@ public:
*/ */
void commit(); void commit();
/**
* @brief Commits changes to disk and closes host file
*/
void close();
/** /**
* @brief Gets card-scope error state * @brief Gets card-scope error state
* @return READY, BROKEN, or NOCARD * @return READY, BROKEN, or NOCARD

View File

@ -10,6 +10,11 @@ namespace kabufuda
#define ROUND_UP_8192(val) (((val) + 8191) & ~8191) #define ROUND_UP_8192(val) (((val) + 8191) & ~8191)
static void NullFileAccess()
{
fprintf(stderr, "Attempted to access null file\n");
}
void Card::_swapEndian() void Card::_swapEndian()
{ {
m_formatTime = SBig(m_formatTime); m_formatTime = SBig(m_formatTime);
@ -46,9 +51,7 @@ Card::Card(Card&& other)
Card& Card::operator=(Card&& other) Card& Card::operator=(Card&& other)
{ {
commit(); close();
if (m_fileHandle)
fclose(m_fileHandle);
memmove(__raw, other.__raw, BlockSize); memmove(__raw, other.__raw, BlockSize);
m_filename = std::move(other.m_filename); m_filename = std::move(other.m_filename);
@ -121,9 +124,7 @@ Card::Card(const SystemString& filename, const char* game, const char* maker) :
Card::~Card() Card::~Card()
{ {
commit(); close();
if (m_fileHandle)
fclose(m_fileHandle);
} }
ECardResult Card::openFile(const char* filename, FileHandle& handleOut) ECardResult Card::openFile(const char* filename, FileHandle& handleOut)
@ -175,6 +176,11 @@ void Card::_updateChecksum()
File* Card::_fileFromHandle(const FileHandle& fh) const File* Card::_fileFromHandle(const FileHandle& fh) const
{ {
if (!fh)
{
NullFileAccess();
return nullptr;
}
return const_cast<Directory&>(m_dirs[m_currentDir]).getFile(fh.idx); return const_cast<Directory&>(m_dirs[m_currentDir]).getFile(fh.idx);
} }
@ -205,7 +211,7 @@ ECardResult Card::createFile(const char* filename, size_t size,
f->m_firstBlock = block; f->m_firstBlock = block;
f->m_blockCount = neededBlocks; f->m_blockCount = neededBlocks;
handleOut = FileHandle(m_dirs[m_currentDir].indexForFile(f)); handleOut = FileHandle(dir.indexForFile(f));
_updateDirAndBat(dir, bat); _updateDirAndBat(dir, bat);
return ECardResult::READY; return ECardResult::READY;
} }
@ -230,6 +236,11 @@ FileHandle Card::firstFile()
FileHandle Card::nextFile(const FileHandle& cur) FileHandle Card::nextFile(const FileHandle& cur)
{ {
if (!cur)
{
NullFileAccess();
return {};
}
File* next = m_dirs[m_currentDir].getFirstNonFreeFile(cur.idx + 1, m_game, m_maker); File* next = m_dirs[m_currentDir].getFirstNonFreeFile(cur.idx + 1, m_game, m_maker);
if (!next) if (!next)
return {}; return {};
@ -259,6 +270,11 @@ void Card::_deleteFile(File& f, BlockAllocationTable& bat)
void Card::deleteFile(const FileHandle& fh) void Card::deleteFile(const FileHandle& fh)
{ {
if (!fh)
{
NullFileAccess();
return;
}
Directory dir = m_dirs[m_currentDir]; Directory dir = m_dirs[m_currentDir];
BlockAllocationTable bat = m_bats[m_currentBat]; BlockAllocationTable bat = m_bats[m_currentBat];
_deleteFile(*dir.getFile(fh.idx), bat); _deleteFile(*dir.getFile(fh.idx), bat);
@ -310,6 +326,11 @@ ECardResult Card::write(FileHandle& fh, const void* buf, size_t size)
{ {
if (m_fileHandle) if (m_fileHandle)
{ {
if (!fh)
{
NullFileAccess();
return ECardResult::NOFILE;
}
File* file = m_dirs[m_currentDir].getFile(fh.idx); File* file = m_dirs[m_currentDir].getFile(fh.idx);
if (!file) if (!file)
return ECardResult::NOFILE; return ECardResult::NOFILE;
@ -358,6 +379,11 @@ ECardResult Card::read(FileHandle& fh, void* dst, size_t size)
{ {
if (m_fileHandle) if (m_fileHandle)
{ {
if (!fh)
{
NullFileAccess();
return ECardResult::NOFILE;
}
File* file = m_dirs[m_currentDir].getFile(fh.idx); File* file = m_dirs[m_currentDir].getFile(fh.idx);
if (!file) if (!file)
return ECardResult::NOFILE; return ECardResult::NOFILE;
@ -403,6 +429,11 @@ ECardResult Card::read(FileHandle& fh, void* dst, size_t size)
void Card::seek(FileHandle& fh, int32_t pos, SeekOrigin whence) void Card::seek(FileHandle& fh, int32_t pos, SeekOrigin whence)
{ {
if (!fh)
{
NullFileAccess();
return;
}
File* file = m_dirs[m_currentDir].getFile(fh.idx); File* file = m_dirs[m_currentDir].getFile(fh.idx);
if (!file) if (!file)
return; return;
@ -532,6 +563,11 @@ static uint32_t TlutSize(EImageFormat fmt)
ECardResult Card::getStatus(const FileHandle& fh, CardStat& statOut) const ECardResult Card::getStatus(const FileHandle& fh, CardStat& statOut) const
{ {
if (!fh)
{
NullFileAccess();
return ECardResult::NOFILE;
}
return getStatus(fh.idx, statOut); return getStatus(fh.idx, statOut);
} }
@ -593,6 +629,11 @@ ECardResult Card::getStatus(uint32_t fileNo, CardStat& statOut) const
ECardResult Card::setStatus(const FileHandle& fh, const CardStat& stat) ECardResult Card::setStatus(const FileHandle& fh, const CardStat& stat)
{ {
if (!fh)
{
NullFileAccess();
return ECardResult::NOFILE;
}
return setStatus(fh.idx, stat); return setStatus(fh.idx, stat);
} }
@ -950,6 +991,16 @@ void Card::commit()
} }
} }
void Card::close()
{
if (m_fileHandle)
{
commit();
fclose(m_fileHandle);
m_fileHandle = nullptr;
}
}
ECardResult Card::getError() const ECardResult Card::getError() const
{ {
if (m_fileHandle == nullptr) if (m_fileHandle == nullptr)