RASCSI/src/raspberrypi/fileio.cpp
Uwe Seimet 45cd5e58d1
Inheritance hierarchy improvements, reduced dependencies to Disk class (#662)
* Fixed buster compile-time issue

* Host services inherit from ModePageDevice

* Call base class

* Visibility update

* Updated includes

* Updated dispatcher

* Added TODOs

* Logging update

* Code cleanup

* Use namespace instead of class for ScsiDefs

* Renaming

* Cleanup

* Use dispatcher template in order to remove duplicate code

* Updated all dispatchers

* Clean up commands

* Removed duplicate code

* Removed duplicate code

* Updated template definition

* Fixed typo

* Fixed warning

* Code cleanup

* Device list must be static

* Cleanup

* Logging update

* Added comments

* Cleanup

* Base class update

* SCSIBR is not a subclass of Disk anymore, but of PrimaryDevice

* Updated includes

* Fixed compile-time issue on the Pi

* Header file cleanup

* Interface cleanup

* Removed wrong override

* include file cleanup

* Removed obsolete usage of streams

* Removed more stream usages

* Stream usage cleanup

* Include cleanup

* Renaming

* Include cleanup

* Interface update
2022-02-13 13:30:02 -06:00

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;
}
}