mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-06-07 19:41:38 +12:00
[FS] More concrete path impl
This commit is contained in:
parent
1730ab9734
commit
deaf7d518c
6 changed files with 55 additions and 21 deletions
|
@ -11,12 +11,12 @@ bool ExtSaveDataArchive::openFile(const FSPath& path) {
|
|||
}
|
||||
|
||||
ArchiveBase* ExtSaveDataArchive::openArchive(const FSPath& path) {
|
||||
if (path.type != PathType::Binary || path.size != 12) {
|
||||
if (path.type != PathType::Binary || path.binary.size() != 12) {
|
||||
Helpers::panic("ExtSaveData accessed with an invalid path in OpenArchive");
|
||||
}
|
||||
|
||||
u32 mediaType = mem.read32(path.pointer);
|
||||
u64 saveID = mem.read64(path.pointer + 4);
|
||||
u32 mediaType = *(u32*)&path.binary[0];
|
||||
u64 saveID = *(u64*)&path.binary[4]; // TODO: Get rid of UB here.
|
||||
|
||||
Helpers::panic("ExtSaveData: media type = %d\n", mediaType);
|
||||
|
||||
|
|
|
@ -7,13 +7,15 @@ bool SelfNCCHArchive::openFile(const FSPath& path) {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (path.type != PathType::Binary) {
|
||||
if (path.type != PathType::Binary || path.binary.size() != 12) {
|
||||
printf("Invalid SelfNCCH path type\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
// We currently only know how to read from an NCCH's RomFS
|
||||
if (mem.read32(path.pointer) != 0) {
|
||||
// Where to read the file from. (https://www.3dbrew.org/wiki/Filesystem_services#SelfNCCH_File_Path_Data_Format)
|
||||
// We currently only know how to read from an NCCH's RomFS, ie type = 0
|
||||
const u32 type = *(u32*)&path.binary[0]; // TODO: Get rid of UB here
|
||||
if (type != 0) {
|
||||
Helpers::panic("Read from NCCH's non-RomFS section!");
|
||||
}
|
||||
|
||||
|
|
|
@ -8,8 +8,8 @@ bool SaveDataArchive::openFile(const FSPath& path) {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (path.type == PathType::UTF16 && mem.readString(path.pointer, path.size) == "/") {
|
||||
printf("Reading root save data dir\n");
|
||||
if (path.type == PathType::UTF16 /* && path.utf16_string == u"/game_header" */) {
|
||||
printf("Opened file from the SaveData archive \n");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -72,6 +72,16 @@ std::optional<Handle> FSService::openArchiveHandle(u32 archiveID, const FSPath&
|
|||
}
|
||||
}
|
||||
|
||||
FSPath FSService::readPath(u32 type, u32 pointer, u32 size) {
|
||||
std::vector<u8> data;
|
||||
data.resize(size);
|
||||
|
||||
for (u32 i = 0; i < size; i++)
|
||||
data[i] = mem.read8(pointer + i);
|
||||
|
||||
return FSPath(type, data);
|
||||
}
|
||||
|
||||
void FSService::handleSyncRequest(u32 messagePointer) {
|
||||
const u32 command = mem.read32(messagePointer);
|
||||
switch (command) {
|
||||
|
@ -120,8 +130,8 @@ void FSService::openArchive(u32 messagePointer) {
|
|||
const u32 archivePathType = mem.read32(messagePointer + 8);
|
||||
const u32 archivePathSize = mem.read32(messagePointer + 12);
|
||||
const u32 archivePathPointer = mem.read32(messagePointer + 20);
|
||||
FSPath archivePath{ .type = archivePathType, .size = archivePathSize, .pointer = archivePathPointer };
|
||||
|
||||
auto archivePath = readPath(archivePathType, archivePathPointer, archivePathSize);
|
||||
log("FS::OpenArchive(archive ID = %d, archive path type = %d)\n", archiveID, archivePathType);
|
||||
|
||||
std::optional<Handle> handle = openArchiveHandle(archiveID, archivePath);
|
||||
|
@ -152,7 +162,7 @@ void FSService::openFile(u32 messagePointer) {
|
|||
}
|
||||
|
||||
ArchiveBase* archive = archiveObject->getData<ArchiveSession>()->archive;
|
||||
FSPath filePath{ .type = filePathType, .size = filePathSize, .pointer = filePathPointer };
|
||||
auto filePath = readPath(filePathType, filePathPointer, filePathSize);
|
||||
|
||||
std::optional<Handle> handle = openFileHandle(archive, filePath);
|
||||
if (!handle.has_value()) {
|
||||
|
@ -183,8 +193,8 @@ void FSService::openFileDirectly(u32 messagePointer) {
|
|||
Helpers::panic("OpenFileDirectly: Tried to open unknown archive %d.", archiveID);
|
||||
}
|
||||
|
||||
FSPath archivePath { .type = archivePathType, .size = archivePathSize, .pointer = archivePathPointer };
|
||||
FSPath filePath { .type = filePathType, .size = filePathSize, .pointer = filePathPointer };
|
||||
auto archivePath = readPath(archivePathType, archivePathPointer, archivePathSize);
|
||||
auto filePath = readPath(filePathType, filePathPointer, filePathSize);
|
||||
|
||||
archive = archive->openArchive(archivePath);
|
||||
if (archive == nullptr) [[unlikely]] {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue