ReXGlue SDK
Loading...
Searching...
No Matches
file_object.h
Go to the documentation of this file.
1
13
14#pragma once
15
16#include <memory>
17#include <mutex>
18#include <optional>
19#include <string>
20#include <string_view>
21#include <utility>
22#include <vector>
23
24#include <rex/platform.h>
25#include <rex/types.h>
26#include <rex/assert.h>
27#include <rex/platform/thread.h>
28#include <rex/utility.h>
29#include <rex/platform/sync.h>
30#include <rex/result.h>
32#include <rex/kernel/types/io.h>
34
35namespace rex {
36namespace filesystem {
37class IDirectory;
38class IFile;
39class IFileSystem;
40struct FileStat;
41} // namespace filesystem
42namespace kernel {
43class TitleRuntime;
44} // namespace kernel
45} // namespace rex
46
47namespace rex::kernel {
48
49class IObjectTable;
50
51enum class SeekOrigin : u8 {
52 kBegin = 0,
53 kCurrent = 1,
54 kEnd = 2,
55};
56
59 public:
61 be_u32 file_index;
62 be_u64 creation_time;
63 be_u64 last_access_time;
64 be_u64 last_write_time;
65 be_u64 change_time;
66 be_u64 end_of_file;
68 be_u32 attributes;
70 char file_name[1];
71
77 void Write(u8* base, u32 guest_address) {
78 u8* dst = base + guest_address;
79 u8* src = reinterpret_cast<u8*>(this);
81 do {
82 auto left = reinterpret_cast<X_FILE_DIRECTORY_INFORMATION*>(dst);
83 right = reinterpret_cast<X_FILE_DIRECTORY_INFORMATION*>(src);
85 left->file_index = right->file_index;
86 left->creation_time = right->creation_time;
87 left->last_access_time = right->last_access_time;
88 left->last_write_time = right->last_write_time;
89 left->change_time = right->change_time;
90 left->end_of_file = right->end_of_file;
91 left->allocation_size = right->allocation_size;
92 left->attributes = right->attributes;
93 left->file_name_length = right->file_name_length;
94 std::memcpy(left->file_name, right->file_name, right->file_name_length);
95
96 dst += right->next_entry_offset;
97 src += right->next_entry_offset;
98 } while (right->next_entry_offset != 0);
99 }
100};
101REX_STATIC_ASSERT_SIZE(X_FILE_DIRECTORY_INFORMATION, 0x48);
102
105 public:
106 virtual ~IOpenedFile() = default;
107
116 virtual X_STATUS Read(u32 buffer_address, u32 buffer_length, u64 byte_offset, u32* out_bytes_read,
117 u32 apc_context, bool notify_completion = true) = 0;
118
126 virtual X_STATUS Write(u32 buffer_address, u32 buffer_length, u64 byte_offset,
127 u32* out_bytes_written, u32 apc_context) = 0;
128
135 virtual u64 Seek(i64 distance, SeekOrigin origin) = 0;
136
143
149 virtual void SetFindPattern(std::string_view pattern) = 0;
150
154 virtual std::optional<filesystem::FileStat> FindNext() = 0;
155
156 virtual u64 GetSize() = 0;
157
158 virtual std::string GetAbsolutePath() = 0;
159};
160
165 REX_KERNEL_API FileObject(std::unique_ptr<filesystem::IFile> file_in, bool synchronous);
166
169
170 std::unique_ptr<filesystem::IFile> file;
172 std::unique_ptr<rex::platform::Event> async_event;
173 mutable std::mutex file_lock;
176 std::vector<std::pair<u32, X_HANDLE>> completion_ports;
181 bool is_synchronous = false;
183 TitleRuntime* owner = nullptr;
184
194 REX_KERNEL_API X_STATUS ReadScatter(TitleRuntime& runtime, u32 segments_address, u32 length,
195 u64 byte_offset, u32* out_bytes_read, u32 apc_context);
196
205 REX_KERNEL_API X_STATUS Read(TitleRuntime& runtime, u32 buffer_address, u32 buffer_length,
206 u64 byte_offset, u32* out_bytes_read, u32 apc_context,
207 bool notify_completion = true);
208
209 X_STATUS Read(u32 buffer_address, u32 buffer_length, u64 byte_offset, u32* out_bytes_read,
210 u32 apc_context, bool notify_completion = true) override {
211 return Read(*owner, buffer_address, buffer_length, byte_offset, out_bytes_read, apc_context,
212 notify_completion);
213 }
214
222 REX_KERNEL_API X_STATUS Write(TitleRuntime& runtime, u32 buffer_address, u32 buffer_length,
223 u64 byte_offset, u32* out_bytes_written, u32 apc_context);
224
225 X_STATUS Write(u32 buffer_address, u32 buffer_length, u64 byte_offset, u32* out_bytes_written,
226 u32 apc_context) override {
227 return Write(*owner, buffer_address, buffer_length, byte_offset, out_bytes_written,
228 apc_context);
229 }
230
241 X_FILE_DIRECTORY_INFORMATION* out_info, size_t length,
242 std::string_view file_name, bool restart);
243
248
255
264 REX_KERNEL_API X_STATUS Rename(filesystem::IFileSystem& file_system, std::string_view path,
265 bool replace_existing, FileObject* root);
266
267 REX_KERNEL_API u64 Seek(i64 distance, SeekOrigin origin) override;
268
270
271 REX_KERNEL_API void SetPosition(u64 value);
272
273 REX_KERNEL_API u64 GetPosition();
274
275 REX_KERNEL_API void SetFindPattern(std::string_view pattern) override;
276
277 REX_KERNEL_API std::optional<filesystem::FileStat> FindNext() override;
278
279 REX_KERNEL_API u64 GetSize() override;
280
281 REX_KERNEL_API std::string GetAbsolutePath() override;
282
289 REX_KERNEL_API void RegisterIOCompletionPort(TitleRuntime& runtime, u32 key, X_HANDLE port);
290
291 private:
292 X_STATUS ReadInternal(TitleRuntime& runtime, u32 buffer_address, u32 buffer_length,
293 u64 byte_offset, u32* out_bytes_read, u32 apc_context,
294 bool notify_completion);
295
296 u64 position_ = 0;
297};
298
299} // namespace rex::kernel
Definition utility.h:264
Definition directory.h:22
Definition file_system.h:37
Definition file.h:27
Definition object_table.h:42
Definition file_object.h:104
virtual X_STATUS Write(u32 buffer_address, u32 buffer_length, u64 byte_offset, u32 *out_bytes_written, u32 apc_context)=0
virtual u64 Seek(i64 distance, SeekOrigin origin)=0
virtual X_STATUS Read(u32 buffer_address, u32 buffer_length, u64 byte_offset, u32 *out_bytes_read, u32 apc_context, bool notify_completion=true)=0
virtual std::optional< filesystem::FileStat > FindNext()=0
virtual void SetFindPattern(std::string_view pattern)=0
virtual X_STATUS SetLengthToPosition()=0
Definition title_runtime.h:85
void Write(u8 *base, u32 guest_address)
Definition file_object.h:77
be_u32 file_name_length
Definition file_object.h:69
char file_name[1]
Definition file_object.h:70
be_u32 next_entry_offset
Definition file_object.h:60
be_u64 allocation_size
Definition file_object.h:67
Definition export.h:24
u32 X_STATUS
Definition status.h:23
Definition app.h:36
Platform flags, packing macros and export markers.
#define REX_KERNEL_API
Definition platform.h:297
Definition file_stat.h:45
std::mutex completion_port_lock
Definition file_object.h:174
IObjectTable * port_table
Definition file_object.h:178
TitleRuntime * owner
Definition file_object.h:183
std::mutex file_lock
Definition file_object.h:173
X_STATUS SetLengthToPosition() override
void RegisterIOCompletionPort(TitleRuntime &runtime, u32 key, X_HANDLE port)
PropagateConst< std::unique_ptr< filesystem::IDirectory > > find
Definition file_object.h:180
std::optional< filesystem::FileStat > FindNext() override
FileObject(std::unique_ptr< filesystem::IFile > file_in, bool synchronous)
X_STATUS SetAllocation(u64 size)
X_STATUS SetLength(u64 length)
X_STATUS Write(u32 buffer_address, u32 buffer_length, u64 byte_offset, u32 *out_bytes_written, u32 apc_context) override
Definition file_object.h:225
void SetFindPattern(std::string_view pattern) override
X_STATUS QueryDirectory(TitleRuntime &runtime, X_FILE_DIRECTORY_INFORMATION *out_info, size_t length, std::string_view file_name, bool restart)
std::unique_ptr< rex::platform::Event > async_event
Definition file_object.h:172
X_STATUS Write(TitleRuntime &runtime, u32 buffer_address, u32 buffer_length, u64 byte_offset, u32 *out_bytes_written, u32 apc_context)
X_STATUS ReadScatter(TitleRuntime &runtime, u32 segments_address, u32 length, u64 byte_offset, u32 *out_bytes_read, u32 apc_context)
X_STATUS Rename(filesystem::IFileSystem &file_system, std::string_view path, bool replace_existing, FileObject *root)
u64 Seek(i64 distance, SeekOrigin origin) override
std::vector< std::pair< u32, X_HANDLE > > completion_ports
Definition file_object.h:176
X_STATUS Read(u32 buffer_address, u32 buffer_length, u64 byte_offset, u32 *out_bytes_read, u32 apc_context, bool notify_completion=true) override
Definition file_object.h:209
X_STATUS Read(TitleRuntime &runtime, u32 buffer_address, u32 buffer_length, u64 byte_offset, u32 *out_bytes_read, u32 apc_context, bool notify_completion=true)
Wait objects and wait functions.
Integer types, byte order wrappers and size literals.
Move only function, const propagating pointer and scope guard.