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);
194 setupInitQueue(archiveName, parser, eastl::move(callback));
195 m_queueInitFilename.
run();
198 setupInitQueue(archiveName, parser, {});
199 return m_queueInitFilename.
schedule();
202 return {archiveName, parser, *
this};
204 void initialize(uint32_t LBA,
CDRom &device, eastl::function<
void(
bool)> &&callback) {
205 setupInitQueue(LBA, device, eastl::move(callback));
209 setupInitQueue(LBA, device, {});
226 if (m_index.size() == 0) {
267 const IndexEntry *
getIndexEntry(eastl::string_view path)
const;
268 template <
unsigned S>
281 return m_archiveDirentry.
LBA + entry->getSectorOffset();
307 template <
unsigned S>
309 setupQueue(
getIndexEntry(path), device, eastl::move(callback));
313 setupQueue(
getIndexEntry(path), device, eastl::move(callback));
317 setupQueue(
getIndexEntry(hash), device, eastl::move(callback));
321 setupQueue(entry, device, eastl::move(callback));
324 template <
unsigned S>
338 setupQueue(entry, device, {});
341 template <
unsigned S>
384 eastl::function<void(
bool)> m_initCallback;
392 bool m_pending =
false;
393 bool m_success =
false;
395 void setupInitQueue(eastl::string_view archiveName,
ISO9660Parser &parser, eastl::function<
void(
bool)> &&callback);
396 void setupInitQueue(uint32_t LBA,
CDRom &device, eastl::function<
void(
bool)> &&callback);
397 void setupQueue(
const IndexEntry *entry,
CDRom &device, eastl::function<
void(
Buffer<uint8_t> &&)> &&callback);
398 uint32_t getIndexSectorCount()
const {
399 static_assert(
sizeof(IndexEntry) == 16,
"IndexEntry size is not 16 bytes");
400 uint32_t indexSize = (
getIndexCount() + 1) *
sizeof(IndexEntry);
401 return (indexSize + 2047) / 2048;
403 static eastl::array<void (ArchiveManager::*)(const IndexEntry *),
toUnderlying(IndexEntry::Method::COUNT)>
405 void decompressUCL_NRV2E(
const IndexEntry *entry);
406 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:333
void initialize(eastl::string_view archiveName, ISO9660Parser &parser, eastl::function< void(bool)> &&callback)
Asynchronous initialization of the archive manager.
Definition archive-manager.hh:193
InitAwaiterWithFilename initialize(eastl::string_view archiveName, ISO9660Parser &parser)
Definition archive-manager.hh:201
void readFile(const IndexEntry *entry, CDRom &device, eastl::function< void(Buffer< uint8_t > &&)> &&callback)
Definition archive-manager.hh:320
uint32_t getIndexCount() const
Get the number of entries in the index.
Definition archive-manager.hh:241
void setBuffer(Buffer< uint8_t > &&buffer)
Set the Buffer object for the next read operation.
Definition archive-manager.hh:295
static void registerLZ4Decompressor()
Definition archive-manager.hh:366
psyqo::TaskQueue::Task scheduleInitialize(eastl::string_view archiveName, ISO9660Parser &parser)
Definition archive-manager.hh:197
void readFile(eastl::string_view path, CDRom &device, eastl::function< void(Buffer< uint8_t > &&)> &&callback)
Definition archive-manager.hh:312
void readFile(uint64_t hash, CDRom &device, eastl::function< void(Buffer< uint8_t > &&)> &&callback)
Definition archive-manager.hh:316
const IndexEntry * getFirstIndexEntry() const
Get the First IndexEntry object.
Definition archive-manager.hh:225
static void registerAllDecompressors()
Register all decompressors.
Definition archive-manager.hh:378
static void registerUCL_NRV2EDecompressor()
Register a decompressor for a specific compression method.
Definition archive-manager.hh:363
ReadFileAwaiter readFile(const IndexEntry *entry, CDRom &device)
Definition archive-manager.hh:347
psyqo::TaskQueue::Task scheduleInitialize(uint32_t LBA, CDRom &device)
Definition archive-manager.hh:208
psyqo::TaskQueue::Task scheduleReadFile(eastl::string_view path, CDRom &device)
Definition archive-manager.hh:329
uint32_t getIndexEntrySectorStart(const IndexEntry *entry) const
Get the LBA of the first sector of the file in the archive.
Definition archive-manager.hh:280
InitAwaiter initialize(uint32_t LBA, CDRom &device)
Definition archive-manager.hh:212
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:308
const IndexEntry * getIndexEntry(const char(&path)[S]) const
Definition archive-manager.hh:269
ReadFileAwaiter readFile(const char(&path)[S], CDRom &device)
Definition archive-manager.hh:342
void initialize(uint32_t LBA, CDRom &device, eastl::function< void(bool)> &&callback)
Definition archive-manager.hh:204
psyqo::TaskQueue::Task scheduleReadFile(const char(&path)[S], CDRom &device)
Definition archive-manager.hh:325
ReadFileAwaiter readFile(uint64_t hash, CDRom &device)
Definition archive-manager.hh:346
psyqo::TaskQueue::Task scheduleReadFile(const IndexEntry *entry, CDRom &device)
Definition archive-manager.hh:337
ReadFileAwaiter readFile(eastl::string_view path, CDRom &device)
Definition archive-manager.hh:345
const IndexEntry * getIndexEntry(eastl::string_view path) const
Get the IndexEntry object for a given path.
Definition archive-manager.cpp:92
uint32_t getSafeMarginLength() const
Get the safe margin length for decompression.
Definition archive-manager.hh:252
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:274
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:151
uint32_t getStreamSectors() const
Definition archive-manager.hh:173
Utilities::BitSpan< Method, 3 > MethodField
Definition archive-manager.hh:153
uint32_t getDecompSize() const
Definition archive-manager.hh:157
Method
Definition archive-manager.hh:138
CompressedEntry entry
Definition archive-manager.hh:177
uint32_t getCompressedSize() const
Definition archive-manager.hh:169
uint32_t getSectorOffset() const
Definition archive-manager.hh:165
Utilities::BitSpan< uint32_t, 10 > CompressedSizeField
Definition archive-manager.hh:152
Utilities::BitField< DecompSizeField, PaddingField, SectorOffsetField, CompressedSizeField, MethodField > CompressedEntry
Definition archive-manager.hh:155
uint64_t hash
Definition archive-manager.hh:176
Utilities::BitSpan< uint32_t, 21 > DecompSizeField
Definition archive-manager.hh:149
uint32_t getPadding() const
Definition archive-manager.hh:162
Method getCompressionMethod() const
Definition archive-manager.hh:171
Utilities::BitSpan< uint32_t, 11 > PaddingField
Definition archive-manager.hh:150
uint32_t asArray[4]
Definition archive-manager.hh:174