Files
pokediamond/arm9/lib/src/FS_command.c
T
2020-05-08 19:39:43 -04:00

76 lines
2.0 KiB
C

#include "FS_file.h"
#include "FS_archive.h"
#include "FSi_util.h"
#include "FS_command.h"
ARM_FUNC void FSi_ReleaseCommand(FSFile * p_file, FSResult ret)
{
OSIntrMode bak_psr = OS_DisableInterrupts();
FSi_CutFromList(p_file);
p_file->stat &= ~(FS_FILE_STATUS_CANCEL | FS_FILE_STATUS_BUSY | FS_FILE_STATUS_SYNC | FS_FILE_STATUS_ASYNC | FS_FILE_STATUS_OPERATING);
p_file->error = ret;
OS_WakeupThread(p_file->queue);
OS_RestoreInterrupts(bak_psr);
}
ARM_FUNC FSResult FSi_TranslateCommand(FSFile *p_file, FSCommandType command)
{
FSResult ret;
FSArchive *const p_arc = p_file->arc;
const int bit = (1 << command);
if (FS_IsFileSyncMode(p_file))
p_arc->flag |= FS_ARCHIVE_FLAG_IS_SYNC;
else
p_arc->flag |= FS_ARCHIVE_FLAG_IS_ASYNC;
if ((p_arc->proc_flag & bit) != 0)
{
switch (ret = (*p_arc->proc) (p_file, command))
{
case FS_RESULT_SUCCESS:
case FS_RESULT_FAILURE:
case FS_RESULT_UNSUPPORTED:
p_file->error = ret;
break;
case FS_RESULT_PROC_ASYNC:
break;
case FS_RESULT_PROC_UNKNOWN:
ret = FS_RESULT_PROC_DEFAULT;
p_arc->proc_flag &= ~bit;
break;
}
}
else
{
ret = FS_RESULT_PROC_DEFAULT;
}
if (ret == FS_RESULT_PROC_DEFAULT)
{
ret = (*fsi_default_command[command]) (p_file);
}
if (ret == FS_RESULT_PROC_ASYNC)
{
if (FS_IsFileSyncMode(p_file))
{
OSIntrMode bak_psr = OS_DisableInterrupts();
while (FSi_IsArchiveSync(p_arc))
OS_SleepThread(&p_arc->sync_q);
ret = p_file->error;
OS_RestoreInterrupts(bak_psr);
}
}
else if (!FS_IsFileSyncMode(p_file))
{
p_arc->flag &= ~FS_ARCHIVE_FLAG_IS_ASYNC;
FSi_ReleaseCommand(p_file, ret);
}
else
{
p_arc->flag &= ~FS_ARCHIVE_FLAG_IS_SYNC;
p_file->error = ret;
}
return ret;
}