Play-/Source/hdd/PfsReader.h

77 lines
1.6 KiB
C
Raw Permalink Normal View History

2023-01-03 21:18:18 -05:00
#pragma once
#include "Stream.h"
#include "HddDefs.h"
2023-01-04 19:36:29 -05:00
#include "ApaDefs.h"
#include "PfsDefs.h"
2023-01-03 21:18:18 -05:00
namespace Hdd
{
class CPfsReader
{
public:
2023-01-04 19:36:29 -05:00
CPfsReader(Framework::CStream&, const APA_HEADER&);
2023-01-06 12:26:39 -05:00
2023-01-03 21:18:18 -05:00
class CPfsFileReader* GetFileStream(const char*);
class CPfsDirectoryReader* GetDirectoryReader(const char*);
2023-01-03 21:18:18 -05:00
2023-01-04 19:36:29 -05:00
uint32 GetZoneSize() const;
uint32 GetBlockLba(uint32, uint32) const;
2023-01-03 21:18:18 -05:00
PFS_INODE ReadInode(uint32, uint32);
2023-01-06 12:26:39 -05:00
private:
bool TryGetInodeFromPath(const char*, PFS_INODE&);
2023-04-14 10:08:11 -04:00
2023-01-03 21:18:18 -05:00
Framework::CStream& m_stream;
2023-01-04 19:36:29 -05:00
APA_HEADER m_partitionHeader = {};
2023-01-03 21:18:18 -05:00
PFS_SUPERBLOCK m_superBlock = {};
uint32 m_inodeScale = 0;
};
class CPfsFileReader : public Framework::CStream
{
public:
CPfsFileReader(CPfsReader&, Framework::CStream&, PFS_INODE);
~CPfsFileReader() = default;
2023-01-06 12:26:39 -05:00
2023-01-03 21:18:18 -05:00
void Seek(int64, Framework::STREAM_SEEK_DIRECTION) override;
uint64 Tell() override;
uint64 Read(void*, uint64) override;
uint64 Write(const void*, uint64) override;
bool IsEOF() override;
private:
CPfsReader& m_reader;
Framework::CStream& m_stream;
PFS_INODE m_inode;
2023-01-06 12:26:39 -05:00
2023-01-03 21:18:18 -05:00
uint64 m_position = 0;
bool m_isEof = false;
};
class CPfsDirectoryReader
{
public:
CPfsDirectoryReader(CPfsReader&, Framework::CStream&, PFS_INODE);
2023-04-14 10:08:11 -04:00
void ReadEntry(std::string&, PFS_INODE&);
bool IsDone() const;
2023-04-14 10:08:11 -04:00
private:
static const uint32_t g_dirBlockSize = Hdd::g_sectorSize << PFS_BLOCK_SCALE;
void Advance();
2023-04-14 10:08:11 -04:00
CPfsReader& m_reader;
2023-04-14 10:08:11 -04:00
uint8 m_dirBlock[g_dirBlockSize];
uint8* m_dirBlockCurr = nullptr;
uint8* m_dirBlockEnd = nullptr;
2023-04-14 10:08:11 -04:00
std::string m_currentEntryName;
PFS_INODE m_currentEntryInode;
};
2023-01-03 21:18:18 -05:00
}