Nugget
Bare-metal libraries and examples for the original PlayStation
Loading...
Searching...
No Matches
iso9660-parser.hh
Go to the documentation of this file.
1/*
2
3MIT License
4
5Copyright (c) 2022 PCSX-Redux authors
6
7Permission is hereby granted, free of charge, to any person obtaining a copy
8of this software and associated documentation files (the "Software"), to deal
9in the Software without restriction, including without limitation the rights
10to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11copies of the Software, and to permit persons to whom the Software is
12furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice shall be included in all
15copies or substantial portions of the Software.
16
17THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23SOFTWARE.
24
25*/
26
27#pragma once
28
29#include <EASTL/fixed_string.h>
30#include <EASTL/functional.h>
31#include <EASTL/string_view.h>
32
33#include <coroutine>
34
35#include "psyqo/cdrom.hh"
36#include "psyqo/task.hh"
37
38namespace psyqo {
39
49 public:
56 struct DirEntry {
57 uint32_t LBA = 0;
58 uint32_t size = 0;
59 eastl::fixed_string<char, 15, false> name;
61 };
62
74 struct ReadRequest {
76 void* buffer = nullptr;
77 };
78
87 ISO9660Parser(CDRom* cdrom) : m_cdrom(cdrom) {}
88
98 void initialize(eastl::function<void(bool success)> callback);
101 InitializeAwaiter(ISO9660Parser& parser) : m_parser(parser) {}
102 bool await_ready() const { return false; }
103 template <typename U>
104 void await_suspend(std::coroutine_handle<U> handle) {
105 m_parser.initialize([handle, this](bool success) {
106 m_success = success;
107 handle.resume();
108 });
109 }
110 bool await_resume() { return m_success; }
111
112 private:
113 ISO9660Parser& m_parser;
114 bool m_success;
115 };
117
129 void getDirentry(eastl::string_view path, DirEntry* entry, eastl::function<void(bool success)> callback);
130 TaskQueue::Task scheduleGetDirentry(eastl::string_view path, DirEntry* entry);
132 GetDirentryAwaiter(ISO9660Parser& parser, eastl::string_view path, DirEntry* entry)
133 : m_parser(parser), m_path(path), m_entry(entry) {}
134 bool await_ready() const { return false; }
135 template <typename U>
136 void await_suspend(std::coroutine_handle<U> handle) {
137 m_parser.getDirentry(m_path, m_entry, [handle, this](bool success) {
138 m_success = success;
139 handle.resume();
140 });
141 }
142 bool await_resume() { return m_success; }
143
144 private:
145 ISO9660Parser& m_parser;
146 eastl::string_view m_path;
147 DirEntry* m_entry;
148 bool m_success;
149 };
150 GetDirentryAwaiter getDirentry(eastl::string_view path, DirEntry* entry) {
151 return GetDirentryAwaiter(*this, path, entry);
152 }
153
171 void walkDirectory(const DirEntry& dir,
172 eastl::function<bool(eastl::string_view name, const DirEntry& entry)> visitor,
173 eastl::function<void(bool success)> callback);
175 const DirEntry& dir, eastl::function<bool(eastl::string_view name, const DirEntry& entry)> visitor);
178 eastl::function<bool(eastl::string_view name, const DirEntry& entry)> visitor)
179 : m_parser(parser), m_dir(dir), m_visitor(eastl::move(visitor)) {}
180 bool await_ready() const { return false; }
181 template <typename U>
182 void await_suspend(std::coroutine_handle<U> handle) {
183 m_parser.walkDirectory(m_dir, eastl::move(m_visitor), [handle, this](bool success) {
184 m_success = success;
185 handle.resume();
186 });
187 }
188 bool await_resume() { return m_success; }
189
190 private:
191 ISO9660Parser& m_parser;
192 DirEntry m_dir;
193 eastl::function<bool(eastl::string_view name, const DirEntry& entry)> m_visitor;
194 bool m_success;
195 };
197 eastl::function<bool(eastl::string_view name, const DirEntry& entry)> visitor) {
198 return WalkDirectoryAwaiter(*this, dir, eastl::move(visitor));
199 }
200
213 TaskQueue::Task scheduleReadRequest(const ReadRequest* request);
214
223 bool initialized() { return m_initialized; }
224
230 CDRom* getCDRom() { return m_cdrom; }
231
232 private:
233 void parseDirEntry(const uint8_t* data, DirEntry* entry);
234 eastl::string_view getEntryName(const uint8_t* data);
235 void findDirEntry();
236 void walkSector();
237 void walkDone(bool success);
238
239 uint8_t m_buffer[2048];
240 eastl::function<void(bool success)> m_callback = nullptr;
241 eastl::string_view m_path;
242 DirEntry* m_dirEntry = nullptr;
243 CDRom* m_cdrom = nullptr;
244 uint32_t m_cachedLBA = 0;
245 DirEntry m_root;
246 DirEntry m_cachedEntry;
247 eastl::fixed_string<char, 128> m_cachedPath;
248 bool m_initialized = false;
249 eastl::function<bool(eastl::string_view name, const DirEntry& entry)> m_walkVisitor = nullptr;
250 uint32_t m_walkLBA = 0;
251 uint32_t m_walkEnd = 0;
252};
253
254} // namespace psyqo
The base CDRom class.
Definition cdrom.hh:46
An ISO9660 parser.
Definition iso9660-parser.hh:48
TaskQueue::Task scheduleInitialize()
Definition iso9660-parser.cpp:68
bool initialized()
Returns the state of the parser.
Definition iso9660-parser.hh:223
TaskQueue::Task scheduleGetDirentry(eastl::string_view path, DirEntry *entry)
Definition iso9660-parser.cpp:125
TaskQueue::Task scheduleReadRequest(const ReadRequest *request)
Read a file asynchronously.
Definition iso9660-parser.cpp:132
TaskQueue::Task scheduleWalkDirectory(const DirEntry &dir, eastl::function< bool(eastl::string_view name, const DirEntry &entry)> visitor)
Definition iso9660-parser.cpp:160
WalkDirectoryAwaiter walkDirectory(const DirEntry &dir, eastl::function< bool(eastl::string_view name, const DirEntry &entry)> visitor)
Definition iso9660-parser.hh:196
GetDirentryAwaiter getDirentry(eastl::string_view path, DirEntry *entry)
Definition iso9660-parser.hh:150
ISO9660Parser(CDRom *cdrom)
The ISO9660Parser constructor.
Definition iso9660-parser.hh:87
void initialize(eastl::function< void(bool success)> callback)
Initializes the parser.
Definition iso9660-parser.cpp:32
CDRom * getCDRom()
Returns the CDRom object used by the parser.
Definition iso9660-parser.hh:230
void walkDirectory(const DirEntry &dir, eastl::function< bool(eastl::string_view name, const DirEntry &entry)> visitor, eastl::function< void(bool success)> callback)
Walk the entries of a directory.
Definition iso9660-parser.cpp:140
InitializeAwaiter initialize()
Definition iso9660-parser.hh:116
void getDirentry(eastl::string_view path, DirEntry *entry, eastl::function< void(bool success)> callback)
Get the Direntry object for a given path.
Definition iso9660-parser.cpp:72
The Task class.
Definition task.hh:140
Definition lua.hh:40
Definition direntry.h:33
An ISO9660 directory entry.
Definition iso9660-parser.hh:56
uint32_t size
Definition iso9660-parser.hh:58
uint32_t LBA
Definition iso9660-parser.hh:57
enum psyqo::ISO9660Parser::DirEntry::@34 type
eastl::fixed_string< char, 15, false > name
Definition iso9660-parser.hh:59
@ PARENT_DIR
Definition iso9660-parser.hh:60
@ INVALID
Definition iso9660-parser.hh:60
@ CURRENT_DIR
Definition iso9660-parser.hh:60
@ FILE
Definition iso9660-parser.hh:60
@ DIRECTORY
Definition iso9660-parser.hh:60
Definition iso9660-parser.hh:131
void await_suspend(std::coroutine_handle< U > handle)
Definition iso9660-parser.hh:136
bool await_ready() const
Definition iso9660-parser.hh:134
GetDirentryAwaiter(ISO9660Parser &parser, eastl::string_view path, DirEntry *entry)
Definition iso9660-parser.hh:132
bool await_resume()
Definition iso9660-parser.hh:142
Definition iso9660-parser.hh:100
void await_suspend(std::coroutine_handle< U > handle)
Definition iso9660-parser.hh:104
bool await_ready() const
Definition iso9660-parser.hh:102
bool await_resume()
Definition iso9660-parser.hh:110
InitializeAwaiter(ISO9660Parser &parser)
Definition iso9660-parser.hh:101
An asynchronous read request.
Definition iso9660-parser.hh:74
void * buffer
Definition iso9660-parser.hh:76
struct DirEntry entry
Definition iso9660-parser.hh:75
Definition iso9660-parser.hh:176
bool await_ready() const
Definition iso9660-parser.hh:180
WalkDirectoryAwaiter(ISO9660Parser &parser, const DirEntry &dir, eastl::function< bool(eastl::string_view name, const DirEntry &entry)> visitor)
Definition iso9660-parser.hh:177
void await_suspend(std::coroutine_handle< U > handle)
Definition iso9660-parser.hh:182
bool await_resume()
Definition iso9660-parser.hh:188