RASCSI/src_old/raspberrypi/fileio.cpp

242 lines
3.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//---------------------------------------------------------------------------
//
// X68000 EMULATOR "XM6"
//
// Copyright (C) 2001-2006 (ytanaka@ipc-tokai.or.jp)
// Copyright (C) 2010-2020 GIMONS
// [ File I/O (Subset for RaSCSI) ]
//
//---------------------------------------------------------------------------
#include "os.h"
#include "filepath.h"
#include "fileio.h"
#include "config.h"
//===========================================================================
//
// File I/O
//
//===========================================================================
Fileio::Fileio()
{
// Initialize work
handle = -1;
}
Fileio::~Fileio()
{
ASSERT(handle == -1);
// Safety measure for Release
Close();
}
BOOL Fileio::Load(const Filepath& path, void *buffer, int size)
{
ASSERT(buffer);
ASSERT(size > 0);
ASSERT(handle < 0);
if (!Open(path, ReadOnly)) {
return FALSE;
}
if (!Read(buffer, size)) {
Close();
return FALSE;
}
Close();
return TRUE;
}
BOOL Fileio::Save(const Filepath& path, void *buffer, int size)
{
ASSERT(buffer);
ASSERT(size > 0);
ASSERT(handle < 0);
if (!Open(path, WriteOnly)) {
return FALSE;
}
if (!Write(buffer, size)) {
Close();
return FALSE;
}
Close();
return TRUE;
}
BOOL Fileio::Open(const char *fname, OpenMode mode, BOOL directIO)
{
mode_t omode;
ASSERT(fname);
ASSERT(handle < 0);
// Always fail a read from a null array
if (fname[0] == _T('\0')) {
handle = -1;
return FALSE;
}
// Default mode
omode = directIO ? O_DIRECT : 0;
switch (mode) {
case ReadOnly:
handle = open(fname, O_RDONLY | omode);
break;
case WriteOnly:
handle = open(fname, O_CREAT | O_WRONLY | O_TRUNC | omode, 0666);
break;
case ReadWrite:
// Make sure RW does not succeed when reading from CD-ROM
if (access(fname, 0x06) != 0) {
return FALSE;
}
handle = open(fname, O_RDWR | omode);
break;
default:
ASSERT(FALSE);
break;
}
// Evaluate results
if (handle == -1) {
return FALSE;
}
ASSERT(handle >= 0);
return TRUE;
}
BOOL Fileio::Open(const char *fname, OpenMode mode)
{
return Open(fname, mode, FALSE);
}
BOOL Fileio::Open(const Filepath& path, OpenMode mode)
{
return Open(path.GetPath(), mode);
}
BOOL Fileio::OpenDIO(const char *fname, OpenMode mode)
{
// Open with included O_DIRECT
if (!Open(fname, mode, TRUE)) {
// Normal mode retry (tmpfs etc.)
return Open(fname, mode, FALSE);
}
return TRUE;
}
BOOL Fileio::OpenDIO(const Filepath& path, OpenMode mode)
{
return OpenDIO(path.GetPath(), mode);
}
BOOL Fileio::Read(void *buffer, int size)
{
int count;
ASSERT(buffer);
ASSERT(size > 0);
ASSERT(handle >= 0);
count = read(handle, buffer, size);
if (count != size) {
return FALSE;
}
return TRUE;
}
BOOL Fileio::Write(const void *buffer, int size)
{
int count;
ASSERT(buffer);
ASSERT(size > 0);
ASSERT(handle >= 0);
count = write(handle, buffer, size);
if (count != size) {
return FALSE;
}
return TRUE;
}
BOOL Fileio::Seek(off_t offset, BOOL relative)
{
ASSERT(handle >= 0);
ASSERT(offset >= 0);
// Add current position in case of relative seek
if (relative) {
offset += GetFilePos();
}
if (lseek(handle, offset, SEEK_SET) != offset) {
return FALSE;
}
return TRUE;
}
off_t Fileio::GetFileSize()
{
off_t cur;
off_t end;
ASSERT(handle >= 0);
// Get file position in 64bit
cur = GetFilePos();
// Get file size in64bitで
end = lseek(handle, 0, SEEK_END);
// Return to start position
Seek(cur);
return end;
}
off_t Fileio::GetFilePos() const
{
off_t pos;
ASSERT(handle >= 0);
// Get file position in 64bit
pos = lseek(handle, 0, SEEK_CUR);
return pos;
}
void Fileio::Close()
{
if (handle != -1) {
close(handle);
handle = -1;
}
}