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