mirror of
https://github.com/yuzu-emu/yuzu-android.git
synced 2025-06-13 09:58:18 -05:00
Sources: Run clang-format on everything.
This commit is contained in:
@ -3,9 +3,9 @@
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <cstddef>
|
||||
#include <memory>
|
||||
#include <system_error>
|
||||
#include <type_traits>
|
||||
#include <memory>
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
|
||||
@ -25,25 +25,25 @@
|
||||
#include "core/file_sys/directory_backend.h"
|
||||
#include "core/file_sys/file_backend.h"
|
||||
#include "core/hle/hle.h"
|
||||
#include "core/hle/service/service.h"
|
||||
#include "core/hle/result.h"
|
||||
#include "core/hle/service/fs/archive.h"
|
||||
#include "core/hle/service/fs/fs_user.h"
|
||||
#include "core/hle/result.h"
|
||||
#include "core/hle/service/service.h"
|
||||
#include "core/memory.h"
|
||||
|
||||
// Specializes std::hash for ArchiveIdCode, so that we can use it in std::unordered_map.
|
||||
// Workaroung for libstdc++ bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60970
|
||||
namespace std {
|
||||
template <>
|
||||
struct hash<Service::FS::ArchiveIdCode> {
|
||||
typedef Service::FS::ArchiveIdCode argument_type;
|
||||
typedef std::size_t result_type;
|
||||
template <>
|
||||
struct hash<Service::FS::ArchiveIdCode> {
|
||||
typedef Service::FS::ArchiveIdCode argument_type;
|
||||
typedef std::size_t result_type;
|
||||
|
||||
result_type operator()(const argument_type& id_code) const {
|
||||
typedef std::underlying_type<argument_type>::type Type;
|
||||
return std::hash<Type>()(static_cast<Type>(id_code));
|
||||
}
|
||||
};
|
||||
result_type operator()(const argument_type& id_code) const {
|
||||
typedef std::underlying_type<argument_type>::type Type;
|
||||
return std::hash<Type>()(static_cast<Type>(id_code));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/// TODO(Subv): Confirm length of these strings
|
||||
@ -56,197 +56,193 @@ namespace FS {
|
||||
// TODO: Verify code
|
||||
/// Returned when a function is passed an invalid handle.
|
||||
const ResultCode ERR_INVALID_HANDLE(ErrorDescription::InvalidHandle, ErrorModule::FS,
|
||||
ErrorSummary::InvalidArgument, ErrorLevel::Permanent);
|
||||
ErrorSummary::InvalidArgument, ErrorLevel::Permanent);
|
||||
|
||||
/// Returned when a function is passed an invalid archive handle.
|
||||
const ResultCode ERR_INVALID_ARCHIVE_HANDLE(ErrorDescription::FS_ArchiveNotMounted, ErrorModule::FS,
|
||||
ErrorSummary::NotFound, ErrorLevel::Status); // 0xC8804465
|
||||
ErrorSummary::NotFound,
|
||||
ErrorLevel::Status); // 0xC8804465
|
||||
|
||||
// Command to access archive file
|
||||
enum class FileCommand : u32 {
|
||||
Dummy1 = 0x000100C6,
|
||||
Control = 0x040100C4,
|
||||
OpenSubFile = 0x08010100,
|
||||
Read = 0x080200C2,
|
||||
Write = 0x08030102,
|
||||
GetSize = 0x08040000,
|
||||
SetSize = 0x08050080,
|
||||
GetAttributes = 0x08060000,
|
||||
SetAttributes = 0x08070040,
|
||||
Close = 0x08080000,
|
||||
Flush = 0x08090000,
|
||||
SetPriority = 0x080A0040,
|
||||
GetPriority = 0x080B0000,
|
||||
OpenLinkFile = 0x080C0000,
|
||||
Dummy1 = 0x000100C6,
|
||||
Control = 0x040100C4,
|
||||
OpenSubFile = 0x08010100,
|
||||
Read = 0x080200C2,
|
||||
Write = 0x08030102,
|
||||
GetSize = 0x08040000,
|
||||
SetSize = 0x08050080,
|
||||
GetAttributes = 0x08060000,
|
||||
SetAttributes = 0x08070040,
|
||||
Close = 0x08080000,
|
||||
Flush = 0x08090000,
|
||||
SetPriority = 0x080A0040,
|
||||
GetPriority = 0x080B0000,
|
||||
OpenLinkFile = 0x080C0000,
|
||||
};
|
||||
|
||||
// Command to access directory
|
||||
enum class DirectoryCommand : u32 {
|
||||
Dummy1 = 0x000100C6,
|
||||
Control = 0x040100C4,
|
||||
Read = 0x08010042,
|
||||
Close = 0x08020000,
|
||||
Dummy1 = 0x000100C6,
|
||||
Control = 0x040100C4,
|
||||
Read = 0x08010042,
|
||||
Close = 0x08020000,
|
||||
};
|
||||
|
||||
File::File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path & path)
|
||||
: path(path), priority(0), backend(std::move(backend)) {}
|
||||
File::File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path& path)
|
||||
: path(path), priority(0), backend(std::move(backend)) {
|
||||
}
|
||||
|
||||
File::~File() {}
|
||||
File::~File() {
|
||||
}
|
||||
|
||||
ResultVal<bool> File::SyncRequest() {
|
||||
u32* cmd_buff = Kernel::GetCommandBuffer();
|
||||
FileCommand cmd = static_cast<FileCommand>(cmd_buff[0]);
|
||||
switch (cmd) {
|
||||
|
||||
// Read from file...
|
||||
case FileCommand::Read:
|
||||
{
|
||||
u64 offset = cmd_buff[1] | ((u64)cmd_buff[2]) << 32;
|
||||
u32 length = cmd_buff[3];
|
||||
u32 address = cmd_buff[5];
|
||||
LOG_TRACE(Service_FS, "Read %s %s: offset=0x%llx length=%d address=0x%x",
|
||||
GetTypeName().c_str(), GetName().c_str(), offset, length, address);
|
||||
// Read from file...
|
||||
case FileCommand::Read: {
|
||||
u64 offset = cmd_buff[1] | ((u64)cmd_buff[2]) << 32;
|
||||
u32 length = cmd_buff[3];
|
||||
u32 address = cmd_buff[5];
|
||||
LOG_TRACE(Service_FS, "Read %s %s: offset=0x%llx length=%d address=0x%x",
|
||||
GetTypeName().c_str(), GetName().c_str(), offset, length, address);
|
||||
|
||||
if (offset + length > backend->GetSize()) {
|
||||
LOG_ERROR(Service_FS, "Reading from out of bounds offset=0x%llX length=0x%08X file_size=0x%llX",
|
||||
offset, length, backend->GetSize());
|
||||
}
|
||||
|
||||
std::vector<u8> data(length);
|
||||
ResultVal<size_t> read = backend->Read(offset, data.size(), data.data());
|
||||
if (read.Failed()) {
|
||||
cmd_buff[1] = read.Code().raw;
|
||||
return read.Code();
|
||||
}
|
||||
Memory::WriteBlock(address, data.data(), *read);
|
||||
cmd_buff[2] = static_cast<u32>(*read);
|
||||
break;
|
||||
if (offset + length > backend->GetSize()) {
|
||||
LOG_ERROR(Service_FS,
|
||||
"Reading from out of bounds offset=0x%llX length=0x%08X file_size=0x%llX",
|
||||
offset, length, backend->GetSize());
|
||||
}
|
||||
|
||||
// Write to file...
|
||||
case FileCommand::Write:
|
||||
{
|
||||
u64 offset = cmd_buff[1] | ((u64)cmd_buff[2]) << 32;
|
||||
u32 length = cmd_buff[3];
|
||||
u32 flush = cmd_buff[4];
|
||||
u32 address = cmd_buff[6];
|
||||
LOG_TRACE(Service_FS, "Write %s %s: offset=0x%llx length=%d address=0x%x, flush=0x%x",
|
||||
GetTypeName().c_str(), GetName().c_str(), offset, length, address, flush);
|
||||
|
||||
std::vector<u8> data(length);
|
||||
Memory::ReadBlock(address, data.data(), data.size());
|
||||
ResultVal<size_t> written = backend->Write(offset, data.size(), flush != 0, data.data());
|
||||
if (written.Failed()) {
|
||||
cmd_buff[1] = written.Code().raw;
|
||||
return written.Code();
|
||||
}
|
||||
cmd_buff[2] = static_cast<u32>(*written);
|
||||
break;
|
||||
std::vector<u8> data(length);
|
||||
ResultVal<size_t> read = backend->Read(offset, data.size(), data.data());
|
||||
if (read.Failed()) {
|
||||
cmd_buff[1] = read.Code().raw;
|
||||
return read.Code();
|
||||
}
|
||||
Memory::WriteBlock(address, data.data(), *read);
|
||||
cmd_buff[2] = static_cast<u32>(*read);
|
||||
break;
|
||||
}
|
||||
|
||||
case FileCommand::GetSize:
|
||||
{
|
||||
LOG_TRACE(Service_FS, "GetSize %s %s", GetTypeName().c_str(), GetName().c_str());
|
||||
u64 size = backend->GetSize();
|
||||
cmd_buff[2] = (u32)size;
|
||||
cmd_buff[3] = size >> 32;
|
||||
break;
|
||||
// Write to file...
|
||||
case FileCommand::Write: {
|
||||
u64 offset = cmd_buff[1] | ((u64)cmd_buff[2]) << 32;
|
||||
u32 length = cmd_buff[3];
|
||||
u32 flush = cmd_buff[4];
|
||||
u32 address = cmd_buff[6];
|
||||
LOG_TRACE(Service_FS, "Write %s %s: offset=0x%llx length=%d address=0x%x, flush=0x%x",
|
||||
GetTypeName().c_str(), GetName().c_str(), offset, length, address, flush);
|
||||
|
||||
std::vector<u8> data(length);
|
||||
Memory::ReadBlock(address, data.data(), data.size());
|
||||
ResultVal<size_t> written = backend->Write(offset, data.size(), flush != 0, data.data());
|
||||
if (written.Failed()) {
|
||||
cmd_buff[1] = written.Code().raw;
|
||||
return written.Code();
|
||||
}
|
||||
cmd_buff[2] = static_cast<u32>(*written);
|
||||
break;
|
||||
}
|
||||
|
||||
case FileCommand::SetSize:
|
||||
{
|
||||
u64 size = cmd_buff[1] | ((u64)cmd_buff[2] << 32);
|
||||
LOG_TRACE(Service_FS, "SetSize %s %s size=%llu",
|
||||
GetTypeName().c_str(), GetName().c_str(), size);
|
||||
backend->SetSize(size);
|
||||
break;
|
||||
}
|
||||
case FileCommand::GetSize: {
|
||||
LOG_TRACE(Service_FS, "GetSize %s %s", GetTypeName().c_str(), GetName().c_str());
|
||||
u64 size = backend->GetSize();
|
||||
cmd_buff[2] = (u32)size;
|
||||
cmd_buff[3] = size >> 32;
|
||||
break;
|
||||
}
|
||||
|
||||
case FileCommand::Close:
|
||||
{
|
||||
LOG_TRACE(Service_FS, "Close %s %s", GetTypeName().c_str(), GetName().c_str());
|
||||
backend->Close();
|
||||
break;
|
||||
}
|
||||
case FileCommand::SetSize: {
|
||||
u64 size = cmd_buff[1] | ((u64)cmd_buff[2] << 32);
|
||||
LOG_TRACE(Service_FS, "SetSize %s %s size=%llu", GetTypeName().c_str(), GetName().c_str(),
|
||||
size);
|
||||
backend->SetSize(size);
|
||||
break;
|
||||
}
|
||||
|
||||
case FileCommand::Flush:
|
||||
{
|
||||
LOG_TRACE(Service_FS, "Flush");
|
||||
backend->Flush();
|
||||
break;
|
||||
}
|
||||
case FileCommand::Close: {
|
||||
LOG_TRACE(Service_FS, "Close %s %s", GetTypeName().c_str(), GetName().c_str());
|
||||
backend->Close();
|
||||
break;
|
||||
}
|
||||
|
||||
case FileCommand::OpenLinkFile:
|
||||
{
|
||||
LOG_WARNING(Service_FS, "(STUBBED) File command OpenLinkFile %s", GetName().c_str());
|
||||
cmd_buff[3] = Kernel::g_handle_table.Create(this).ValueOr(INVALID_HANDLE);
|
||||
break;
|
||||
}
|
||||
case FileCommand::Flush: {
|
||||
LOG_TRACE(Service_FS, "Flush");
|
||||
backend->Flush();
|
||||
break;
|
||||
}
|
||||
|
||||
case FileCommand::SetPriority:
|
||||
{
|
||||
priority = cmd_buff[1];
|
||||
LOG_TRACE(Service_FS, "SetPriority %u", priority);
|
||||
break;
|
||||
}
|
||||
case FileCommand::OpenLinkFile: {
|
||||
LOG_WARNING(Service_FS, "(STUBBED) File command OpenLinkFile %s", GetName().c_str());
|
||||
cmd_buff[3] = Kernel::g_handle_table.Create(this).ValueOr(INVALID_HANDLE);
|
||||
break;
|
||||
}
|
||||
|
||||
case FileCommand::GetPriority:
|
||||
{
|
||||
cmd_buff[2] = priority;
|
||||
LOG_TRACE(Service_FS, "GetPriority");
|
||||
break;
|
||||
}
|
||||
case FileCommand::SetPriority: {
|
||||
priority = cmd_buff[1];
|
||||
LOG_TRACE(Service_FS, "SetPriority %u", priority);
|
||||
break;
|
||||
}
|
||||
|
||||
// Unknown command...
|
||||
default:
|
||||
LOG_ERROR(Service_FS, "Unknown command=0x%08X!", cmd);
|
||||
ResultCode error = UnimplementedFunction(ErrorModule::FS);
|
||||
cmd_buff[1] = error.raw; // TODO(Link Mauve): use the correct error code for that.
|
||||
return error;
|
||||
case FileCommand::GetPriority: {
|
||||
cmd_buff[2] = priority;
|
||||
LOG_TRACE(Service_FS, "GetPriority");
|
||||
break;
|
||||
}
|
||||
|
||||
// Unknown command...
|
||||
default:
|
||||
LOG_ERROR(Service_FS, "Unknown command=0x%08X!", cmd);
|
||||
ResultCode error = UnimplementedFunction(ErrorModule::FS);
|
||||
cmd_buff[1] = error.raw; // TODO(Link Mauve): use the correct error code for that.
|
||||
return error;
|
||||
}
|
||||
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
|
||||
return MakeResult<bool>(false);
|
||||
}
|
||||
|
||||
Directory::Directory(std::unique_ptr<FileSys::DirectoryBackend>&& backend, const FileSys::Path & path)
|
||||
: path(path), backend(std::move(backend)) {}
|
||||
Directory::Directory(std::unique_ptr<FileSys::DirectoryBackend>&& backend,
|
||||
const FileSys::Path& path)
|
||||
: path(path), backend(std::move(backend)) {
|
||||
}
|
||||
|
||||
Directory::~Directory() {}
|
||||
Directory::~Directory() {
|
||||
}
|
||||
|
||||
ResultVal<bool> Directory::SyncRequest() {
|
||||
u32* cmd_buff = Kernel::GetCommandBuffer();
|
||||
DirectoryCommand cmd = static_cast<DirectoryCommand>(cmd_buff[0]);
|
||||
switch (cmd) {
|
||||
|
||||
// Read from directory...
|
||||
case DirectoryCommand::Read:
|
||||
{
|
||||
u32 count = cmd_buff[1];
|
||||
u32 address = cmd_buff[3];
|
||||
std::vector<FileSys::Entry> entries(count);
|
||||
LOG_TRACE(Service_FS, "Read %s %s: count=%d",
|
||||
GetTypeName().c_str(), GetName().c_str(), count);
|
||||
// Read from directory...
|
||||
case DirectoryCommand::Read: {
|
||||
u32 count = cmd_buff[1];
|
||||
u32 address = cmd_buff[3];
|
||||
std::vector<FileSys::Entry> entries(count);
|
||||
LOG_TRACE(Service_FS, "Read %s %s: count=%d", GetTypeName().c_str(), GetName().c_str(),
|
||||
count);
|
||||
|
||||
// Number of entries actually read
|
||||
u32 read = backend->Read(entries.size(), entries.data());
|
||||
cmd_buff[2] = read;
|
||||
Memory::WriteBlock(address, entries.data(), read * sizeof(FileSys::Entry));
|
||||
break;
|
||||
}
|
||||
// Number of entries actually read
|
||||
u32 read = backend->Read(entries.size(), entries.data());
|
||||
cmd_buff[2] = read;
|
||||
Memory::WriteBlock(address, entries.data(), read * sizeof(FileSys::Entry));
|
||||
break;
|
||||
}
|
||||
|
||||
case DirectoryCommand::Close:
|
||||
{
|
||||
LOG_TRACE(Service_FS, "Close %s %s", GetTypeName().c_str(), GetName().c_str());
|
||||
backend->Close();
|
||||
break;
|
||||
}
|
||||
case DirectoryCommand::Close: {
|
||||
LOG_TRACE(Service_FS, "Close %s %s", GetTypeName().c_str(), GetName().c_str());
|
||||
backend->Close();
|
||||
break;
|
||||
}
|
||||
|
||||
// Unknown command...
|
||||
default:
|
||||
LOG_ERROR(Service_FS, "Unknown command=0x%08X!", cmd);
|
||||
ResultCode error = UnimplementedFunction(ErrorModule::FS);
|
||||
cmd_buff[1] = error.raw; // TODO(Link Mauve): use the correct error code for that.
|
||||
return MakeResult<bool>(false);
|
||||
// Unknown command...
|
||||
default:
|
||||
LOG_ERROR(Service_FS, "Unknown command=0x%08X!", cmd);
|
||||
ResultCode error = UnimplementedFunction(ErrorModule::FS);
|
||||
cmd_buff[1] = error.raw; // TODO(Link Mauve): use the correct error code for that.
|
||||
return MakeResult<bool>(false);
|
||||
}
|
||||
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
|
||||
return MakeResult<bool>(false);
|
||||
@ -280,8 +276,8 @@ ResultVal<ArchiveHandle> OpenArchive(ArchiveIdCode id_code, FileSys::Path& archi
|
||||
auto itr = id_code_map.find(id_code);
|
||||
if (itr == id_code_map.end()) {
|
||||
// TODO: Verify error against hardware
|
||||
return ResultCode(ErrorDescription::NotFound, ErrorModule::FS,
|
||||
ErrorSummary::NotFound, ErrorLevel::Permanent);
|
||||
return ResultCode(ErrorDescription::NotFound, ErrorModule::FS, ErrorSummary::NotFound,
|
||||
ErrorLevel::Permanent);
|
||||
}
|
||||
|
||||
CASCADE_RESULT(std::unique_ptr<ArchiveBackend> res, itr->second->Open(archive_path));
|
||||
@ -303,19 +299,22 @@ ResultCode CloseArchive(ArchiveHandle handle) {
|
||||
|
||||
// TODO(yuriks): This might be what the fs:REG service is for. See the Register/Unregister calls in
|
||||
// http://3dbrew.org/wiki/Filesystem_services#ProgramRegistry_service_.22fs:REG.22
|
||||
ResultCode RegisterArchiveType(std::unique_ptr<FileSys::ArchiveFactory>&& factory, ArchiveIdCode id_code) {
|
||||
ResultCode RegisterArchiveType(std::unique_ptr<FileSys::ArchiveFactory>&& factory,
|
||||
ArchiveIdCode id_code) {
|
||||
auto result = id_code_map.emplace(id_code, std::move(factory));
|
||||
|
||||
bool inserted = result.second;
|
||||
ASSERT_MSG(inserted, "Tried to register more than one archive with same id code");
|
||||
|
||||
auto& archive = result.first->second;
|
||||
LOG_DEBUG(Service_FS, "Registered archive %s with id code 0x%08X", archive->GetName().c_str(), id_code);
|
||||
LOG_DEBUG(Service_FS, "Registered archive %s with id code 0x%08X", archive->GetName().c_str(),
|
||||
id_code);
|
||||
return RESULT_SUCCESS;
|
||||
}
|
||||
|
||||
ResultVal<Kernel::SharedPtr<File>> OpenFileFromArchive(ArchiveHandle archive_handle,
|
||||
const FileSys::Path& path, const FileSys::Mode mode) {
|
||||
const FileSys::Path& path,
|
||||
const FileSys::Mode mode) {
|
||||
ArchiveBackend* archive = GetArchive(archive_handle);
|
||||
if (archive == nullptr)
|
||||
return ERR_INVALID_ARCHIVE_HANDLE;
|
||||
@ -336,8 +335,10 @@ ResultCode DeleteFileFromArchive(ArchiveHandle archive_handle, const FileSys::Pa
|
||||
return archive->DeleteFile(path);
|
||||
}
|
||||
|
||||
ResultCode RenameFileBetweenArchives(ArchiveHandle src_archive_handle, const FileSys::Path& src_path,
|
||||
ArchiveHandle dest_archive_handle, const FileSys::Path& dest_path) {
|
||||
ResultCode RenameFileBetweenArchives(ArchiveHandle src_archive_handle,
|
||||
const FileSys::Path& src_path,
|
||||
ArchiveHandle dest_archive_handle,
|
||||
const FileSys::Path& dest_path) {
|
||||
ArchiveBackend* src_archive = GetArchive(src_archive_handle);
|
||||
ArchiveBackend* dest_archive = GetArchive(dest_archive_handle);
|
||||
if (src_archive == nullptr || dest_archive == nullptr)
|
||||
@ -368,7 +369,8 @@ ResultCode DeleteDirectoryFromArchive(ArchiveHandle archive_handle, const FileSy
|
||||
ErrorSummary::Canceled, ErrorLevel::Status);
|
||||
}
|
||||
|
||||
ResultCode CreateFileInArchive(ArchiveHandle archive_handle, const FileSys::Path& path, u64 file_size) {
|
||||
ResultCode CreateFileInArchive(ArchiveHandle archive_handle, const FileSys::Path& path,
|
||||
u64 file_size) {
|
||||
ArchiveBackend* archive = GetArchive(archive_handle);
|
||||
if (archive == nullptr)
|
||||
return ERR_INVALID_ARCHIVE_HANDLE;
|
||||
@ -387,8 +389,10 @@ ResultCode CreateDirectoryFromArchive(ArchiveHandle archive_handle, const FileSy
|
||||
ErrorSummary::Canceled, ErrorLevel::Status);
|
||||
}
|
||||
|
||||
ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle, const FileSys::Path& src_path,
|
||||
ArchiveHandle dest_archive_handle, const FileSys::Path& dest_path) {
|
||||
ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle,
|
||||
const FileSys::Path& src_path,
|
||||
ArchiveHandle dest_archive_handle,
|
||||
const FileSys::Path& dest_path) {
|
||||
ArchiveBackend* src_archive = GetArchive(src_archive_handle);
|
||||
ArchiveBackend* dest_archive = GetArchive(dest_archive_handle);
|
||||
if (src_archive == nullptr || dest_archive == nullptr)
|
||||
@ -409,15 +413,15 @@ ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle, cons
|
||||
}
|
||||
|
||||
ResultVal<Kernel::SharedPtr<Directory>> OpenDirectoryFromArchive(ArchiveHandle archive_handle,
|
||||
const FileSys::Path& path) {
|
||||
const FileSys::Path& path) {
|
||||
ArchiveBackend* archive = GetArchive(archive_handle);
|
||||
if (archive == nullptr)
|
||||
return ERR_INVALID_ARCHIVE_HANDLE;
|
||||
|
||||
std::unique_ptr<FileSys::DirectoryBackend> backend = archive->OpenDirectory(path);
|
||||
if (backend == nullptr) {
|
||||
return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS,
|
||||
ErrorSummary::NotFound, ErrorLevel::Permanent);
|
||||
return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound,
|
||||
ErrorLevel::Permanent);
|
||||
}
|
||||
|
||||
auto directory = Kernel::SharedPtr<Directory>(new Directory(std::move(backend), path));
|
||||
@ -431,7 +435,8 @@ ResultVal<u64> GetFreeBytesInArchive(ArchiveHandle archive_handle) {
|
||||
return MakeResult<u64>(archive->GetFreeBytes());
|
||||
}
|
||||
|
||||
ResultCode FormatArchive(ArchiveIdCode id_code, const FileSys::ArchiveFormatInfo& format_info, const FileSys::Path& path) {
|
||||
ResultCode FormatArchive(ArchiveIdCode id_code, const FileSys::ArchiveFormatInfo& format_info,
|
||||
const FileSys::Path& path) {
|
||||
auto archive_itr = id_code_map.find(id_code);
|
||||
if (archive_itr == id_code_map.end()) {
|
||||
return UnimplementedFunction(ErrorModule::FS); // TODO(Subv): Find the right error
|
||||
@ -440,7 +445,8 @@ ResultCode FormatArchive(ArchiveIdCode id_code, const FileSys::ArchiveFormatInfo
|
||||
return archive_itr->second->Format(path, format_info);
|
||||
}
|
||||
|
||||
ResultVal<FileSys::ArchiveFormatInfo> GetArchiveFormatInfo(ArchiveIdCode id_code, FileSys::Path& archive_path) {
|
||||
ResultVal<FileSys::ArchiveFormatInfo> GetArchiveFormatInfo(ArchiveIdCode id_code,
|
||||
FileSys::Path& archive_path) {
|
||||
auto archive = id_code_map.find(id_code);
|
||||
if (archive == id_code_map.end()) {
|
||||
return UnimplementedFunction(ErrorModule::FS); // TODO(Subv): Find the right error
|
||||
@ -449,11 +455,14 @@ ResultVal<FileSys::ArchiveFormatInfo> GetArchiveFormatInfo(ArchiveIdCode id_code
|
||||
return archive->second->GetFormatInfo(archive_path);
|
||||
}
|
||||
|
||||
ResultCode CreateExtSaveData(MediaType media_type, u32 high, u32 low, VAddr icon_buffer, u32 icon_size, const FileSys::ArchiveFormatInfo& format_info) {
|
||||
ResultCode CreateExtSaveData(MediaType media_type, u32 high, u32 low, VAddr icon_buffer,
|
||||
u32 icon_size, const FileSys::ArchiveFormatInfo& format_info) {
|
||||
// Construct the binary path to the archive first
|
||||
FileSys::Path path = FileSys::ConstructExtDataBinaryPath(static_cast<u32>(media_type), high, low);
|
||||
FileSys::Path path =
|
||||
FileSys::ConstructExtDataBinaryPath(static_cast<u32>(media_type), high, low);
|
||||
|
||||
auto archive = id_code_map.find(media_type == MediaType::NAND ? ArchiveIdCode::SharedExtSaveData : ArchiveIdCode::ExtSaveData);
|
||||
auto archive = id_code_map.find(media_type == MediaType::NAND ? ArchiveIdCode::SharedExtSaveData
|
||||
: ArchiveIdCode::ExtSaveData);
|
||||
|
||||
if (archive == id_code_map.end()) {
|
||||
return UnimplementedFunction(ErrorModule::FS); // TODO(Subv): Find the right error
|
||||
@ -476,7 +485,8 @@ ResultCode CreateExtSaveData(MediaType media_type, u32 high, u32 low, VAddr icon
|
||||
|
||||
ResultCode DeleteExtSaveData(MediaType media_type, u32 high, u32 low) {
|
||||
// Construct the binary path to the archive first
|
||||
FileSys::Path path = FileSys::ConstructExtDataBinaryPath(static_cast<u32>(media_type), high, low);
|
||||
FileSys::Path path =
|
||||
FileSys::ConstructExtDataBinaryPath(static_cast<u32>(media_type), high, low);
|
||||
|
||||
std::string media_type_directory;
|
||||
if (media_type == MediaType::NAND) {
|
||||
@ -489,7 +499,8 @@ ResultCode DeleteExtSaveData(MediaType media_type, u32 high, u32 low) {
|
||||
}
|
||||
|
||||
// Delete all directories (/user, /boss) and the icon file.
|
||||
std::string base_path = FileSys::GetExtDataContainerPath(media_type_directory, media_type == MediaType::NAND);
|
||||
std::string base_path =
|
||||
FileSys::GetExtDataContainerPath(media_type_directory, media_type == MediaType::NAND);
|
||||
std::string extsavedata_path = FileSys::GetExtSaveDataPath(base_path, path);
|
||||
if (FileUtil::Exists(extsavedata_path) && !FileUtil::DeleteDirRecursively(extsavedata_path))
|
||||
return ResultCode(-1); // TODO(Subv): Find the right error code
|
||||
@ -530,30 +541,36 @@ void RegisterArchiveTypes() {
|
||||
if (sdmc_factory->Initialize())
|
||||
RegisterArchiveType(std::move(sdmc_factory), ArchiveIdCode::SDMC);
|
||||
else
|
||||
LOG_ERROR(Service_FS, "Can't instantiate SDMC archive with path %s", sdmc_directory.c_str());
|
||||
LOG_ERROR(Service_FS, "Can't instantiate SDMC archive with path %s",
|
||||
sdmc_directory.c_str());
|
||||
|
||||
// Create the SaveData archive
|
||||
auto savedata_factory = std::make_unique<FileSys::ArchiveFactory_SaveData>(sdmc_directory);
|
||||
RegisterArchiveType(std::move(savedata_factory), ArchiveIdCode::SaveData);
|
||||
|
||||
auto extsavedata_factory = std::make_unique<FileSys::ArchiveFactory_ExtSaveData>(sdmc_directory, false);
|
||||
auto extsavedata_factory =
|
||||
std::make_unique<FileSys::ArchiveFactory_ExtSaveData>(sdmc_directory, false);
|
||||
if (extsavedata_factory->Initialize())
|
||||
RegisterArchiveType(std::move(extsavedata_factory), ArchiveIdCode::ExtSaveData);
|
||||
else
|
||||
LOG_ERROR(Service_FS, "Can't instantiate ExtSaveData archive with path %s", extsavedata_factory->GetMountPoint().c_str());
|
||||
LOG_ERROR(Service_FS, "Can't instantiate ExtSaveData archive with path %s",
|
||||
extsavedata_factory->GetMountPoint().c_str());
|
||||
|
||||
auto sharedextsavedata_factory = std::make_unique<FileSys::ArchiveFactory_ExtSaveData>(nand_directory, true);
|
||||
auto sharedextsavedata_factory =
|
||||
std::make_unique<FileSys::ArchiveFactory_ExtSaveData>(nand_directory, true);
|
||||
if (sharedextsavedata_factory->Initialize())
|
||||
RegisterArchiveType(std::move(sharedextsavedata_factory), ArchiveIdCode::SharedExtSaveData);
|
||||
else
|
||||
LOG_ERROR(Service_FS, "Can't instantiate SharedExtSaveData archive with path %s",
|
||||
sharedextsavedata_factory->GetMountPoint().c_str());
|
||||
sharedextsavedata_factory->GetMountPoint().c_str());
|
||||
|
||||
// Create the SaveDataCheck archive, basically a small variation of the RomFS archive
|
||||
auto savedatacheck_factory = std::make_unique<FileSys::ArchiveFactory_SaveDataCheck>(nand_directory);
|
||||
auto savedatacheck_factory =
|
||||
std::make_unique<FileSys::ArchiveFactory_SaveDataCheck>(nand_directory);
|
||||
RegisterArchiveType(std::move(savedatacheck_factory), ArchiveIdCode::SaveDataCheck);
|
||||
|
||||
auto systemsavedata_factory = std::make_unique<FileSys::ArchiveFactory_SystemSaveData>(nand_directory);
|
||||
auto systemsavedata_factory =
|
||||
std::make_unique<FileSys::ArchiveFactory_SystemSaveData>(nand_directory);
|
||||
RegisterArchiveType(std::move(systemsavedata_factory), ArchiveIdCode::SystemSaveData);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user