Play-/Source/iop/Iop_Ioman.h

174 lines
4.3 KiB
C
Raw Permalink Normal View History

#pragma once
#include <map>
#include <memory>
#include "Iop_Module.h"
#include "Ioman_Defs.h"
#include "Ioman_Device.h"
#include "Stream.h"
2019-02-06 20:19:22 -05:00
#include "zip/ZipArchiveWriter.h"
#include "zip/ZipArchiveReader.h"
2019-09-16 18:29:18 -04:00
class CIopBios;
namespace Iop
{
class CIoman : public CModule
{
public:
enum
{
FID_STDOUT = 1,
FID_STDERR = 2
};
enum
{
SEEK_DIR_SET = 0,
SEEK_DIR_CUR = 1,
SEEK_DIR_END = 2
};
class FileNotFoundException : public std::exception
{
};
2019-09-16 18:29:18 -04:00
CIoman(CIopBios&, uint8*);
2018-04-30 21:01:23 +01:00
virtual ~CIoman();
2018-04-30 21:01:23 +01:00
std::string GetId() const override;
std::string GetFunctionName(unsigned int) const override;
void Invoke(CMIPS&, unsigned int) override;
void SaveState(Framework::CZipArchiveWriter&) const override;
void LoadState(Framework::CZipArchiveReader&) override;
2019-02-06 20:19:22 -05:00
2023-01-03 21:18:18 -05:00
void RegisterDevice(const char*, const Ioman::DevicePtr&);
2018-04-30 21:01:23 +01:00
uint32 Open(uint32, const char*);
uint32 Close(uint32);
uint32 Read(uint32, uint32, void*);
uint32 Write(uint32, uint32, const void*);
2021-01-06 08:26:18 -05:00
uint32 Seek(uint32, int32, uint32);
int32 Mkdir(const char* path);
int32 Dopen(const char*);
int32 Dread(uint32, Ioman::DIRENTRY*);
int32 Dclose(uint32);
uint32 GetStat(const char*, Ioman::STAT*);
int32 ChStat(const char*, Ioman::STAT*, uint32);
2018-04-30 21:01:23 +01:00
uint32 DelDrv(uint32);
2024-08-12 18:10:33 -04:00
int32 Rename(const char*, const char*);
int32 Mount(const char*, const char*);
int32 Umount(const char*);
2021-01-06 10:54:25 -05:00
uint64 Seek64(uint32, int64, uint32);
2021-03-04 20:33:00 -05:00
int32 DevCtl(const char*, uint32, const uint32*, uint32, uint32*, uint32);
//These are to be called from VM code, because they might
//execute user device code
int32 OpenVirtual(CMIPS&);
int32 CloseVirtual(CMIPS&);
int32 ReadVirtual(CMIPS&);
2021-01-22 19:20:34 -05:00
int32 WriteVirtual(CMIPS&);
int32 SeekVirtual(CMIPS&);
int32 AddDrv(CMIPS&);
2021-03-04 20:35:23 -05:00
int32 DevCtlVirtual(CMIPS&);
2019-08-01 12:54:55 -04:00
uint32 GetFileMode(uint32) const;
2018-04-30 21:01:23 +01:00
Framework::CStream* GetFileStream(uint32);
void SetFileStream(uint32, Framework::CStream*);
private:
struct FileInfo
{
FileInfo() = default;
FileInfo(Framework::CStream* stream)
2019-02-11 18:45:16 -05:00
: stream(stream)
{
}
FileInfo(FileInfo&& rhs)
{
MoveFrom(std::move(rhs));
}
~FileInfo()
{
Reset();
}
2019-02-11 18:45:16 -05:00
FileInfo& operator=(FileInfo&& rhs)
{
MoveFrom(std::move(rhs));
return (*this);
}
void MoveFrom(FileInfo&& rhs)
{
Reset();
std::swap(stream, rhs.stream);
std::swap(path, rhs.path);
std::swap(flags, rhs.flags);
2019-09-17 12:27:02 -04:00
std::swap(descPtr, rhs.descPtr);
}
void Reset()
{
delete stream;
stream = nullptr;
flags = 0;
2019-09-17 12:27:02 -04:00
descPtr = 0;
path.clear();
}
2019-02-11 18:45:16 -05:00
FileInfo& operator=(const FileInfo&) = delete;
FileInfo(const FileInfo&) = delete;
Framework::CStream* stream = nullptr;
uint32 descPtr = 0;
std::string path;
uint32 flags = 0;
};
typedef std::map<int32, FileInfo> FileMapType;
typedef std::map<uint32, Ioman::DirectoryIteratorPtr> DirectoryMapType;
2023-01-03 21:18:18 -05:00
typedef std::map<std::string, Ioman::DevicePtr> DeviceMapType;
typedef std::map<std::string, uint32> UserDeviceMapType;
typedef std::map<std::string, std::string> MountedDeviceMapType;
void PrepareOpenThunk();
Framework::CStream* OpenInternal(uint32, const char*);
int32 AllocateFileHandle();
void FreeFileHandle(uint32);
int32 PreOpen(uint32, const char*);
2021-01-06 10:54:25 -05:00
static Framework::STREAM_SEEK_DIRECTION ConvertWhence(uint32);
void InvokeUserDeviceMethod(CMIPS&, uint32, size_t offset, uint32 arg0 = 0, uint32 arg1 = 0, uint32 arg2 = 0);
bool IsUserDeviceFileHandle(int32) const;
uint32 GetUserDeviceFileDescPtr(int32) const;
void SaveFilesState(Framework::CZipArchiveWriter&) const;
void SaveUserDevicesState(Framework::CZipArchiveWriter&) const;
void SaveMountedDevicesState(Framework::CZipArchiveWriter&) const;
void LoadFilesState(Framework::CZipArchiveReader&);
void LoadUserDevicesState(Framework::CZipArchiveReader&);
void LoadMountedDevicesState(Framework::CZipArchiveReader&);
2018-04-30 21:01:23 +01:00
FileMapType m_files;
DirectoryMapType m_directories;
2018-04-30 21:01:23 +01:00
DeviceMapType m_devices;
UserDeviceMapType m_userDevices;
MountedDeviceMapType m_mountedDevices;
2019-09-16 18:29:18 -04:00
CIopBios& m_bios;
2018-04-30 21:01:23 +01:00
uint8* m_ram;
uint32 m_nextFileHandle;
uint32 m_openThunkPtr = 0;
};
typedef std::shared_ptr<CIoman> IomanPtr;
}