29#include <EASTL/array.h> 
   30#include <EASTL/functional.h> 
   31#include <EASTL/string_view.h> 
   64    struct InitAwaiterWithFilename {
 
   66            : m_name(name), m_parser(parser), m_manager(manager) {}
 
   67        bool await_ready()
 const { 
return false; }
 
   69        void await_suspend(std::coroutine_handle<U> handle) {
 
   70            m_manager.initialize(m_name, m_parser, [handle, 
this](
bool success) {
 
   75        bool await_resume() { 
return m_success; }
 
   78        eastl::string_view m_name;
 
   85            : m_LBA(LBA), m_device(device), m_manager(manager) {}
 
   86        bool await_ready()
 const { 
return false; }
 
   88        void await_suspend(std::coroutine_handle<U> handle) {
 
   89            m_manager.initialize(m_LBA, m_device, [handle, 
this](
bool success) {
 
   94        bool await_resume() { 
return m_success; }
 
  107    struct ReadFileAwaiter {
 
  109            : m_entry(entry), m_device(device), m_manager(manager) {}
 
  110        constexpr bool await_ready()
 const { 
return false; }
 
  111        template <
typename U>
 
  112        void await_suspend(std::coroutine_handle<U> handle) {
 
  113            m_manager.readFile(m_entry, m_device, [handle, 
this](
Buffer<uint8_t> &&data) {
 
  114                m_data = eastl::move(data);
 
  187        setupInitQueue(archiveName, parser, eastl::move(callback));
 
  188        m_queueInitFilename.
run();
 
 
  191        setupInitQueue(archiveName, parser, {});
 
  192        return m_queueInitFilename.
schedule();
 
 
  195        return {archiveName, parser, *
this};
 
 
  198        setupInitQueue(LBA, device, eastl::move(callback));
 
 
  202        setupInitQueue(LBA, device, {});
 
 
  219        if (m_index.size() == 0) {
 
 
  249    const IndexEntry *
getIndexEntry(eastl::string_view path) 
const;
 
  250    template <
unsigned S>
 
  289    template <
unsigned S>
 
  291        setupQueue(
getIndexEntry(path), device, eastl::move(callback));
 
 
  295        setupQueue(
getIndexEntry(path), device, eastl::move(callback));
 
 
  299        setupQueue(
getIndexEntry(hash), device, eastl::move(callback));
 
 
  303        setupQueue(entry, device, eastl::move(callback));
 
 
  306    template <
unsigned S>
 
  320        setupQueue(entry, device, {});
 
 
  323    template <
unsigned S>
 
  366    eastl::function<
void(
bool)> m_initCallback;
 
  374    bool m_pending = 
false;
 
  375    bool m_success = 
false;
 
  377    void setupInitQueue(eastl::string_view archiveName, 
ISO9660Parser &parser, eastl::function<
void(
bool)> &&callback);
 
  378    void setupInitQueue(
uint32_t LBA, 
CDRom &device, eastl::function<
void(
bool)> &&callback);
 
  379    void setupQueue(
const IndexEntry *entry, 
CDRom &device, eastl::function<
void(
Buffer<uint8_t> &&)> &&callback);
 
  380    uint32_t getIndexSectorCount()
 const {
 
  381        static_assert(
sizeof(IndexEntry) == 16, 
"IndexEntry size is not 16 bytes");
 
  383        return (indexSize + 2047) / 2048;
 
  385    static eastl::array<
void (ArchiveManager::*)(const IndexEntry *), 
toUnderlying(IndexEntry::Method::COUNT)> s_decompressors;
 
  386    void decompressUCL_NRV2E(
const IndexEntry *entry);
 
  387    void decompressLZ4(
const IndexEntry *entry);
 
 
 
A class that manages a buffer of data.
Definition buffer.hh:63
The base CDRom class.
Definition cdrom.hh:46
An ISO9660 parser.
Definition iso9660-parser.hh:48
The Task class.
Definition task.hh:140
A task queue for processing tasks sequentially.
Definition task.hh:46
Task schedule()
Schedules the task queue to another task queue.
Definition task.cpp:68
void run()
Runs the task queue.
Definition task.cpp:61
This class manages the reading and decompression of files from an archive.
Definition archive-manager.hh:63
psyqo::TaskQueue::Task scheduleReadFile(uint64_t hash, CDRom &device)
Definition archive-manager.hh:315
void initialize(eastl::string_view archiveName, ISO9660Parser &parser, eastl::function< void(bool)> &&callback)
Asynchronous initialization of the archive manager.
Definition archive-manager.hh:186
InitAwaiterWithFilename initialize(eastl::string_view archiveName, ISO9660Parser &parser)
Definition archive-manager.hh:194
void readFile(const IndexEntry *entry, CDRom &device, eastl::function< void(Buffer< uint8_t > &&)> &&callback)
Definition archive-manager.hh:302
uint32_t getIndexCount() const
Get the number of entries in the index.
Definition archive-manager.hh:234
void setBuffer(Buffer< uint8_t > &&buffer)
Set the Buffer object for the next read operation.
Definition archive-manager.hh:277
static void registerLZ4Decompressor()
Definition archive-manager.hh:348
psyqo::TaskQueue::Task scheduleInitialize(eastl::string_view archiveName, ISO9660Parser &parser)
Definition archive-manager.hh:190
void readFile(eastl::string_view path, CDRom &device, eastl::function< void(Buffer< uint8_t > &&)> &&callback)
Definition archive-manager.hh:294
void readFile(uint64_t hash, CDRom &device, eastl::function< void(Buffer< uint8_t > &&)> &&callback)
Definition archive-manager.hh:298
const IndexEntry * getFirstIndexEntry() const
Get the First IndexEntry object.
Definition archive-manager.hh:218
static void registerAllDecompressors()
Register all decompressors.
Definition archive-manager.hh:360
static void registerUCL_NRV2EDecompressor()
Register a decompressor for a specific compression method.
Definition archive-manager.hh:345
ReadFileAwaiter readFile(const IndexEntry *entry, CDRom &device)
Definition archive-manager.hh:329
psyqo::TaskQueue::Task scheduleInitialize(uint32_t LBA, CDRom &device)
Definition archive-manager.hh:201
psyqo::TaskQueue::Task scheduleReadFile(eastl::string_view path, CDRom &device)
Definition archive-manager.hh:311
uint32_t getIndexEntrySectorStart(const IndexEntry *entry) const
Get the LBA of the first sector of the file in the archive.
Definition archive-manager.hh:262
InitAwaiter initialize(uint32_t LBA, CDRom &device)
Definition archive-manager.hh:205
void readFile(const char(&path)[S], CDRom &device, eastl::function< void(Buffer< uint8_t > &&)> &&callback)
Read a file from the archive.
Definition archive-manager.hh:290
const IndexEntry * getIndexEntry(const char(&path)[S]) const
Definition archive-manager.hh:251
ReadFileAwaiter readFile(const char(&path)[S], CDRom &device)
Definition archive-manager.hh:324
void initialize(uint32_t LBA, CDRom &device, eastl::function< void(bool)> &&callback)
Definition archive-manager.hh:197
psyqo::TaskQueue::Task scheduleReadFile(const char(&path)[S], CDRom &device)
Definition archive-manager.hh:307
ReadFileAwaiter readFile(uint64_t hash, CDRom &device)
Definition archive-manager.hh:328
psyqo::TaskQueue::Task scheduleReadFile(const IndexEntry *entry, CDRom &device)
Definition archive-manager.hh:319
ReadFileAwaiter readFile(eastl::string_view path, CDRom &device)
Definition archive-manager.hh:327
const IndexEntry * getIndexEntry(eastl::string_view path) const
Get the IndexEntry object for a given path.
Definition archive-manager.cpp:91
Definition archive-manager.hh:43
constexpr std::underlying_type_t< E > toUnderlying(E v)
Definition utility-polyfill.h:38
A bit field that can hold multiple bit field elements of different types.
Definition bitfield.hh:155
constexpr Field::Type get() const
Definition bitfield.hh:157
A bit field element to be used in a BitField.
Definition bitfield.hh:130
An asynchronous read request.
Definition cdrom.hh:78
An ISO9660 directory entry.
Definition iso9660-parser.hh:56
uint32_t LBA
Definition iso9660-parser.hh:57
static void * buffer
Definition syscalls.h:230
void uint32_t(classId, spec)
The IndexEntry struct represents an entry in the archive index.
Definition archive-manager.hh:137
Utilities::BitSpan< uint32_t, 19 > SectorOffsetField
Definition archive-manager.hh:146
Utilities::BitSpan< Method, 3 > MethodField
Definition archive-manager.hh:148
uint32_t getDecompSize() const
Definition archive-manager.hh:152
Method
Definition archive-manager.hh:138
CompressedEntry entry
Definition archive-manager.hh:170
uint32_t getCompressedSize() const
Definition archive-manager.hh:164
uint32_t getSectorOffset() const
Definition archive-manager.hh:160
Utilities::BitSpan< uint32_t, 10 > CompressedSizeField
Definition archive-manager.hh:147
Utilities::BitField< DecompSizeField, PaddingField, SectorOffsetField, CompressedSizeField, MethodField > CompressedEntry
Definition archive-manager.hh:150
uint64_t hash
Definition archive-manager.hh:169
Utilities::BitSpan< uint32_t, 21 > DecompSizeField
Definition archive-manager.hh:144
uint32_t getPadding() const
Definition archive-manager.hh:157
Method getCompressionMethod() const
Definition archive-manager.hh:166
Utilities::BitSpan< uint32_t, 11 > PaddingField
Definition archive-manager.hh:145
uint32_t asArray[4]
Definition archive-manager.hh:167