sead
Loading...
Searching...
No Matches
seadFileDevice.h
Go to the documentation of this file.
1#ifndef SEAD_FILEDEVICE_H_
2#define SEAD_FILEDEVICE_H_
3
4#include <basis/seadAssert.h>
5#include <container/seadSafeArray.h>
6#include <container/seadTList.h>
7#include <heap/seadDisposer.h>
8#include <heap/seadHeap.h>
9#include <prim/seadRuntimeTypeInfo.h>
10#include <prim/seadSafeString.h>
11
12namespace sead {
13
16
17class FileDevice;
18
19class HandleBase : public IDisposer
20{
21public:
24 , mDevice(nullptr)
25 , mOriginalDevice(nullptr)
26 {
27 }
28
29private:
32
33public:
34 ~HandleBase() override { }
35
36 FileDevice* getDevice() const { return mDevice; }
38 bool isOpen() const { return mDevice != nullptr; }
39
40protected:
44
45 friend class FileDevice;
46};
47#ifdef cafe
48static_assert(sizeof(HandleBase) == 0x38, "sead::HandleBase size mismatch");
49#endif // cafe
50
51class FileHandle;
52class DirectoryHandle;
53struct DirectoryEntry;
54
55class FileDevice : public TListNode<FileDevice*>, public IDisposer
56{
58
59public:
67
74
75 static const s32 cDriveNameBufferSize = 32;
76#ifdef cafe
77 static const s32 cBufferMinAlignment = 64;
78#else
79 static const s32 cBufferMinAlignment = 32;
80#endif // cafe
81
82 struct LoadArg
83 {
85 : path("")
86 , buffer(nullptr)
87 , buffer_size(0)
88 , heap(nullptr)
89 , alignment(0)
90 , div_size(0)
91 , read_size(0)
92 , roundup_size(0)
93 , need_unload(false)
94 {
95 }
96
109
119 };
120#ifdef cafe
121 static_assert(sizeof(LoadArg) == 0x28, "sead::FileDevice::LoadArg size mismatch");
122#endif // cafe
123
124public:
125 FileDevice(const SafeString& default_drive_name)
126 : TListNode<FileDevice*>(this)
128 , mDriveName()
129 , mPermission(true)
130 {
131 mDriveName.copy(default_drive_name);
132 }
133
134 ~FileDevice() override;
135
137 {
138 return mDriveName;
139 }
140
141 void setDriveName(const SafeString& drive_name)
142 {
143 mDriveName.copy(drive_name);
144 }
145
146 void setPermission(bool permission)
147 {
148 mPermission = permission;
149 }
150
151 bool hasPermission() const
152 {
153 return mPermission;
154 }
155
156 bool isAvailable() const;
157
159 {
160 u8* ret = tryLoad(arg);
161 SEAD_ASSERT_MSG(ret != nullptr, "load failed. [%s]", arg.path.cstr());
162 return ret;
163 }
164
165 u8* tryLoad(LoadArg& arg);
166
167 void unload(u8* data)
168 {
169 SEAD_ASSERT(data);
170 delete data;
171 }
172
173 FileDevice* open(FileHandle* handle, const SafeString& filename, FileOpenFlag flag, u32 div_size)
174 {
175 FileDevice* device = tryOpen(handle, filename, flag, div_size);
176 SEAD_ASSERT_MSG(device != nullptr, "open failed. [%s]", filename.cstr());
177 return device;
178 }
179
180 FileDevice* tryOpen(FileHandle* handle, const SafeString& filename, FileOpenFlag flag, u32 div_size);
181
182 bool close(FileHandle* handle)
183 {
184 bool success = tryClose(handle);
185 SEAD_ASSERT_MSG(success, "file close error");
186 return success;
187 }
188
189 bool tryClose(FileHandle* handle);
190
191 u32 read(FileHandle* handle, u8* buf, u32 size)
192 {
193 u32 read_size = 0;
194 bool success = tryRead(&read_size, handle, buf, size);
195 SEAD_ASSERT_MSG(success, "file read error");
196 return read_size;
197 }
198
199 bool tryRead(u32* read_size, FileHandle* handle, u8* buf, u32 size);
200
201 u32 write(FileHandle* handle, const u8* buf, u32 size)
202 {
203 u32 write_size = 0;
204 bool success = tryWrite(&write_size, handle, buf, size);
205 SEAD_ASSERT_MSG(success, "file write error");
206 return write_size;
207 }
208
209 bool tryWrite(u32* write_size, FileHandle* handle, const u8* buf, u32 size);
210
211 bool seek(FileHandle* handle, s32 offset, SeekOrigin origin)
212 {
213 bool success = trySeek(handle, offset, origin);
214 SEAD_ASSERT_MSG(success, "file seek error");
215 return success;
216 }
217
218 bool trySeek(FileHandle* handle, s32 offset, SeekOrigin origin);
219
221 {
222 u32 pos = 0;
223 bool success = tryGetCurrentSeekPos(&pos, handle);
224 SEAD_ASSERT_MSG(success, "getCurrentSeekPos error");
225 return pos;
226 }
227
228 bool tryGetCurrentSeekPos(u32* pos, FileHandle* handle);
229
231 {
232 u32 size = 0;
233 bool success = tryGetFileSize(&size, path);
234 SEAD_ASSERT_MSG(success, "getFileSize error");
235 return size;
236 }
237
239 {
240 u32 size = 0;
241 bool success = tryGetFileSize(&size, handle);
242 SEAD_ASSERT_MSG(success, "getFileSize error");
243 return size;
244 }
245
246 bool tryGetFileSize(u32* size, const SafeString& path);
247 bool tryGetFileSize(u32* size, FileHandle* handle);
248
249 bool isExistFile(const SafeString& path)
250 {
251 bool is_exist = false;
252 bool success = tryIsExistFile(&is_exist, path);
253 SEAD_ASSERT_MSG(success, "isExistFile failed");
254 return is_exist;
255 }
256
257 bool tryIsExistFile(bool* is_exist, const SafeString& path);
258
259 bool isExistDirectory(const SafeString& path)
260 {
261 bool is_exist = false;
262 bool success = tryIsExistDirectory(&is_exist, path);
263 SEAD_ASSERT_MSG(success, "isExistDirectory failed");
264 return is_exist;
265 }
266
267 bool tryIsExistDirectory(bool* is_exist, const SafeString& path);
268
270 {
271 FileDevice* device = tryOpenDirectory(handle, dirname);
272 SEAD_ASSERT_MSG(device != nullptr, "open directory failed. [%s]", dirname.cstr());
273 return device;
274 }
275
276 FileDevice* tryOpenDirectory(DirectoryHandle* handle, const SafeString& dirname);
277
279 {
280 bool success = tryCloseDirectory(handle);
281 SEAD_ASSERT_MSG(success, "directory close error");
282 return success;
283 }
284
286
288 {
289 u32 read_num = 0;
290 bool success = tryReadDirectory(&read_num, handle, entry, num);
291 SEAD_ASSERT_MSG(success, "readDirectory failed");
292 return read_num;
293 }
294
295 bool tryReadDirectory(u32* read_num, DirectoryHandle* handle, DirectoryEntry* entry, u32 num);
296
297 bool makeDirectory(const SafeString& path, u32 permission)
298 {
299 bool success = tryMakeDirectory(path, permission);
300 SEAD_ASSERT_MSG(success, "makeDirectory failed");
301 return success;
302 }
303
304 bool tryMakeDirectory(const SafeString& path, u32 permission);
305
306 bool makeDirectoryWithParent(const SafeString& path, u32 permission)
307 {
308 bool success = tryMakeDirectoryWithParent(path, permission);
309 SEAD_ASSERT_MSG(success, "makeDirectoryWithParent failed");
310 return success;
311 }
312
313 bool tryMakeDirectoryWithParent(const SafeString& path, u32 permission);
314
316
317 virtual void traceFilePath(const SafeString& path) const
318 {
319 doTracePath_(path);
320 }
321
322 virtual void traceDirectoryPath(const SafeString& path) const
323 {
324 doTracePath_(path);
325 }
326
327 virtual void resolveFilePath(BufferedSafeString* out, const SafeString& path) const
328 {
329 doResolvePath_(out, path);
330 }
331
332 virtual void resolveDirectoryPath(BufferedSafeString* out, const SafeString& path) const
333 {
334 doResolvePath_(out, path);
335 }
336
337 virtual bool isMatchDevice_(const HandleBase* handle) const;
338
339protected:
340 virtual bool doIsAvailable_() const = 0;
341 virtual u8* doLoad_(LoadArg& arg);
342 virtual FileDevice* doOpen_(FileHandle* handle, const SafeString& filename, FileOpenFlag flag) = 0;
343 virtual bool doClose_(FileHandle* handle) = 0;
344 virtual bool doRead_(u32* read_size, FileHandle* handle, u8* buf, u32 size) = 0;
345 virtual bool doWrite_(u32* write_size, FileHandle* handle, const u8* buf, u32 size) = 0;
346 virtual bool doSeek_(FileHandle* handle, s32 offset, SeekOrigin origin) = 0;
347 virtual bool doGetCurrentSeekPos_(u32* pos, FileHandle* handle) = 0;
348 virtual bool doGetFileSize_(u32* size, const SafeString& path) = 0;
349 virtual bool doGetFileSize_(u32* size, FileHandle* handle) = 0;
350 virtual bool doIsExistFile_(bool* is_exist, const SafeString& path) = 0;
351 virtual bool doIsExistDirectory_(bool* is_exist, const SafeString& path) = 0;
352 virtual FileDevice* doOpenDirectory_(DirectoryHandle* handle, const SafeString& dirname) = 0;
353 virtual bool doCloseDirectory_(DirectoryHandle* handle) = 0;
354 virtual bool doReadDirectory_(u32* read_num, DirectoryHandle* handle, DirectoryEntry* entry, u32 num) = 0;
355 virtual bool doMakeDirectory_(const SafeString& path, u32 permission) = 0;
356 virtual RawErrorCode doGetLastRawError_() const = 0;
357 virtual void doTracePath_(const SafeString& path) const;
358 virtual void doResolvePath_(BufferedSafeString* out, const SafeString& path) const;
359
361 void setHandleBaseFileDevice_(HandleBase* handle, FileDevice* device) const;
362 void setHandleBaseOriginalFileDevice_(HandleBase* handle, FileDevice* device) const;
363 void setFileHandleDivSize_(FileHandle* handle, u32 div_size) const;
364
365protected:
366 FixedSafeString<cDriveNameBufferSize> mDriveName;
368
369 friend class FileDeviceMgr;
370};
371#ifdef cafe
372static_assert(sizeof(FileDevice) == 0x54, "sead::FileDevice size mismatch");
373#endif // cafe
374
375class FileHandle : public HandleBase
376{
377public:
380 , mDivSize(0)
381 {
382 }
383
384 ~FileHandle() override
385 {
386 FileDevice* device = mOriginalDevice;
387 if (device != nullptr)
388 device->tryClose(this);
389 }
390
391 u32 getDivSize() const { return mDivSize; }
392
393 bool close();
394 bool tryClose();
395
396 u32 read(u8* buf, u32 size);
397 bool tryRead(u32* read_size, u8* buf, u32 size);
398
399 u32 write(const u8* buf, u32 size);
400 bool tryWrite(u32* write_size, const u8* buf, u32 size);
401
402 bool seek(s32 offset, FileDevice::SeekOrigin origin);
403 bool trySeek(s32 offset, FileDevice::SeekOrigin origin);
404
406 bool tryGetCurrentSeekPos(u32* pos);
407
409 bool tryGetFileSize(u32* size);
410
411protected:
413
414 friend class FileDevice;
415};
416#ifdef cafe
417static_assert(sizeof(FileHandle) == 0x3C, "sead::FileHandle size mismatch");
418#endif // cafe
419
421{
422public:
425 {
426 }
427
428 ~DirectoryHandle() override
429 {
430 FileDevice* device = mOriginalDevice;
431 if (device != nullptr)
432 device->tryCloseDirectory(this);
433 }
434
435 bool close();
436 bool tryClose();
437
438 u32 read(DirectoryEntry* entry, u32 num);
439 bool tryRead(u32* read_num, DirectoryEntry* entry, u32 num);
440};
441
443{
445 : name()
446 , is_directory(false)
447 {
448 }
449
452};
453#ifdef cafe
454static_assert(sizeof(DirectoryEntry) == 0x110, "sead::DirectoryEntry size mismatch");
455#endif // cafe
456
457} // namespace sead
458
459#endif // SEAD_FILEDEVICE_H_
Definition seadFileDevice.h:421
DirectoryHandle()
Definition seadFileDevice.h:423
u32 read(DirectoryEntry *entry, u32 num)
bool tryRead(u32 *read_num, DirectoryEntry *entry, u32 num)
~DirectoryHandle() override
Definition seadFileDevice.h:428
Definition seadFileDeviceMgr.h:18
Definition seadFileDevice.h:56
virtual void traceDirectoryPath(const SafeString &path) const
Definition seadFileDevice.h:322
SeekOrigin
Definition seadFileDevice.h:69
@ cSeekOrigin_Current
Definition seadFileDevice.h:71
@ cSeekOrigin_End
Definition seadFileDevice.h:72
@ cSeekOrigin_Begin
Definition seadFileDevice.h:70
bool tryWrite(u32 *write_size, FileHandle *handle, const u8 *buf, u32 size)
Definition seadFileDevice.cpp:264
virtual bool doWrite_(u32 *write_size, FileHandle *handle, const u8 *buf, u32 size)=0
const SafeString & getDriveName() const
Definition seadFileDevice.h:136
u32 readDirectory(DirectoryHandle *handle, DirectoryEntry *entry, u32 num)
Definition seadFileDevice.h:287
virtual FileDevice * doOpenDirectory_(DirectoryHandle *handle, const SafeString &dirname)=0
virtual void doResolvePath_(BufferedSafeString *out, const SafeString &path) const
Definition seadFileDevice.cpp:114
bool mPermission
Definition seadFileDevice.h:367
u32 getCurrentSeekPos(FileHandle *handle)
Definition seadFileDevice.h:220
bool tryGetCurrentSeekPos(u32 *pos, FileHandle *handle)
Definition seadFileDevice.cpp:322
bool isExistFile(const SafeString &path)
Definition seadFileDevice.h:249
bool tryReadDirectory(u32 *read_num, DirectoryHandle *handle, DirectoryEntry *entry, u32 num)
Definition seadFileDevice.cpp:489
~FileDevice() override
Definition seadFileDevice.cpp:29
FileDevice * tryOpen(FileHandle *handle, const SafeString &filename, FileOpenFlag flag, u32 div_size)
Definition seadFileDevice.cpp:142
bool trySeek(FileHandle *handle, s32 offset, SeekOrigin origin)
Definition seadFileDevice.cpp:296
bool tryGetFileSize(u32 *size, FileHandle *handle)
Definition seadFileDevice.cpp:372
bool tryMakeDirectoryWithParent(const SafeString &path, u32 permission)
bool tryClose(FileHandle *handle)
Definition seadFileDevice.cpp:168
u32 read(FileHandle *handle, u8 *buf, u32 size)
Definition seadFileDevice.h:191
FileDevice * open(FileHandle *handle, const SafeString &filename, FileOpenFlag flag, u32 div_size)
Definition seadFileDevice.h:173
u32 getFileSize(FileHandle *handle)
Definition seadFileDevice.h:238
bool tryIsExistDirectory(bool *is_exist, const SafeString &path)
Definition seadFileDevice.cpp:416
FileDevice(const SafeString &default_drive_name)
Definition seadFileDevice.h:125
virtual bool doIsExistFile_(bool *is_exist, const SafeString &path)=0
virtual u8 * doLoad_(LoadArg &arg)
Definition seadFileDevice.cpp:43
bool tryGetFileSize(u32 *size, const SafeString &path)
Definition seadFileDevice.cpp:353
virtual bool doGetFileSize_(u32 *size, const SafeString &path)=0
virtual bool doGetFileSize_(u32 *size, FileHandle *handle)=0
void setPermission(bool permission)
Definition seadFileDevice.h:146
virtual bool doClose_(FileHandle *handle)=0
void setFileHandleDivSize_(FileHandle *handle, u32 div_size) const
Definition seadFileDevice.cpp:545
bool isExistDirectory(const SafeString &path)
Definition seadFileDevice.h:259
virtual bool doIsAvailable_() const =0
virtual bool doSeek_(FileHandle *handle, s32 offset, SeekOrigin origin)=0
virtual bool doRead_(u32 *read_size, FileHandle *handle, u8 *buf, u32 size)=0
virtual bool doIsExistDirectory_(bool *is_exist, const SafeString &path)=0
bool makeDirectoryWithParent(const SafeString &path, u32 permission)
Definition seadFileDevice.h:306
static const s32 cDriveNameBufferSize
Definition seadFileDevice.h:75
HandleBuffer & getHandleBaseHandleBuffer_(HandleBase *handle) const
Definition seadFileDevice.cpp:569
virtual bool doGetCurrentSeekPos_(u32 *pos, FileHandle *handle)=0
bool seek(FileHandle *handle, s32 offset, SeekOrigin origin)
Definition seadFileDevice.h:211
bool tryIsExistFile(bool *is_exist, const SafeString &path)
Definition seadFileDevice.cpp:397
void setHandleBaseOriginalFileDevice_(HandleBase *handle, FileDevice *device) const
Definition seadFileDevice.cpp:561
RawErrorCode getLastRawError() const
Definition seadFileDevice.cpp:539
bool makeDirectory(const SafeString &path, u32 permission)
Definition seadFileDevice.h:297
virtual void resolveFilePath(BufferedSafeString *out, const SafeString &path) const
Definition seadFileDevice.h:327
virtual bool doCloseDirectory_(DirectoryHandle *handle)=0
virtual bool isMatchDevice_(const HandleBase *handle) const
Definition seadFileDevice.cpp:36
bool isAvailable() const
Definition seadFileDevice.cpp:121
virtual bool doMakeDirectory_(const SafeString &path, u32 permission)=0
bool closeDirectory(DirectoryHandle *handle)
Definition seadFileDevice.h:278
virtual void resolveDirectoryPath(BufferedSafeString *out, const SafeString &path) const
Definition seadFileDevice.h:332
u32 getFileSize(const SafeString &path)
Definition seadFileDevice.h:230
bool tryRead(u32 *read_size, FileHandle *handle, u8 *buf, u32 size)
Definition seadFileDevice.cpp:198
u8 * tryLoad(LoadArg &arg)
Definition seadFileDevice.cpp:131
virtual FileDevice * doOpen_(FileHandle *handle, const SafeString &filename, FileOpenFlag flag)=0
virtual void traceFilePath(const SafeString &path) const
Definition seadFileDevice.h:317
virtual void doTracePath_(const SafeString &path) const
Definition seadFileDevice.cpp:105
FileDevice * openDirectory(DirectoryHandle *handle, const SafeString &dirname)
Definition seadFileDevice.h:269
bool hasPermission() const
Definition seadFileDevice.h:151
virtual RawErrorCode doGetLastRawError_() const =0
void setHandleBaseFileDevice_(HandleBase *handle, FileDevice *device) const
Definition seadFileDevice.cpp:553
bool tryCloseDirectory(DirectoryHandle *handle)
Definition seadFileDevice.cpp:459
u32 write(FileHandle *handle, const u8 *buf, u32 size)
Definition seadFileDevice.h:201
virtual bool doReadDirectory_(u32 *read_num, DirectoryHandle *handle, DirectoryEntry *entry, u32 num)=0
FixedSafeString< cDriveNameBufferSize > mDriveName
Definition seadFileDevice.h:366
bool tryMakeDirectory(const SafeString &path, u32 permission)
Definition seadFileDevice.cpp:527
void unload(u8 *data)
Definition seadFileDevice.h:167
FileOpenFlag
Definition seadFileDevice.h:61
@ cFileOpenFlag_ReadWrite
Definition seadFileDevice.h:64
@ cFileOpenFlag_Create
Definition seadFileDevice.h:65
@ cFileOpenFlag_WriteOnly
Definition seadFileDevice.h:63
@ cFileOpenFlag_ReadOnly
Definition seadFileDevice.h:62
bool close(FileHandle *handle)
Definition seadFileDevice.h:182
u8 * load(LoadArg &arg)
Definition seadFileDevice.h:158
FileDevice * tryOpenDirectory(DirectoryHandle *handle, const SafeString &dirname)
Definition seadFileDevice.cpp:435
void setDriveName(const SafeString &drive_name)
Definition seadFileDevice.h:141
Definition seadFileDevice.h:376
u32 write(const u8 *buf, u32 size)
Definition seadFileDevice.cpp:20
u32 mDivSize
Definition seadFileDevice.h:412
bool seek(s32 offset, FileDevice::SeekOrigin origin)
bool trySeek(s32 offset, FileDevice::SeekOrigin origin)
bool tryWrite(u32 *write_size, const u8 *buf, u32 size)
~FileHandle() override
Definition seadFileDevice.h:384
u32 getDivSize() const
Definition seadFileDevice.h:391
bool tryGetCurrentSeekPos(u32 *pos)
bool tryRead(u32 *read_size, u8 *buf, u32 size)
bool tryGetFileSize(u32 *size)
FileHandle()
Definition seadFileDevice.h:378
u32 read(u8 *buf, u32 size)
Definition seadFileDevice.cpp:11
Definition seadSafeString.h:421
Definition seadFileDevice.h:20
const HandleBase & operator=(const HandleBase &)
HandleBase(const HandleBase &)
HandleBase()
Definition seadFileDevice.h:22
bool isOpen() const
Definition seadFileDevice.h:38
FileDevice * mDevice
Definition seadFileDevice.h:41
FileDevice * getDevice() const
Definition seadFileDevice.h:36
FileDevice * getOriginalDevice() const
Definition seadFileDevice.h:37
~HandleBase() override
Definition seadFileDevice.h:34
HandleBuffer mHandleBuffer
Definition seadFileDevice.h:43
FileDevice * mOriginalDevice
Definition seadFileDevice.h:42
Definition seadHeap.h:23
friend IDisposer::IDisposer()
Definition seadDisposer.h:12
Definition seadAssert.h:44
s32 RawErrorCode
Definition seadFileDevice.h:14
SafeStringBase< char > SafeString
Definition seadSafeString.h:409
BufferedSafeStringBase< char > BufferedSafeString
Definition seadSafeString.h:411
SafeArray< u8, 32 > HandleBuffer
Definition seadFileDevice.h:15
#define SEAD_ASSERT(condition)
Definition seadAssert.h:24
#define SEAD_ASSERT_MSG(condition, format,...)
Definition seadAssert.h:33
#define SEAD_RTTI_BASE(CLASS)
Definition seadRuntimeTypeInfo.h:75
Definition seadFileDevice.h:443
FixedSafeString< 256 > name
Definition seadFileDevice.h:450
bool is_directory
Definition seadFileDevice.h:451
DirectoryEntry()
Definition seadFileDevice.h:444
Definition seadFileDevice.h:83
SafeString path
Definition seadFileDevice.h:110
bool need_unload
Definition seadFileDevice.h:118
s32 alignment
Definition seadFileDevice.h:114
u8 * buffer
Definition seadFileDevice.h:111
LoadArg(const LoadArg &arg)
Definition seadFileDevice.h:97
LoadArg()
Definition seadFileDevice.h:84
u32 roundup_size
Definition seadFileDevice.h:117
u32 read_size
Definition seadFileDevice.h:116
Heap * heap
Definition seadFileDevice.h:113
u32 buffer_size
Definition seadFileDevice.h:112
u32 div_size
Definition seadFileDevice.h:115