|
|
|
@@ -15,9 +15,10 @@
|
|
|
|
|
#include "common/logging/log.h"
|
|
|
|
|
#include "core/file_sys/archive_backend.h"
|
|
|
|
|
#include "core/file_sys/archive_extsavedata.h"
|
|
|
|
|
#include "core/file_sys/archive_ncch.h"
|
|
|
|
|
#include "core/file_sys/archive_savedata.h"
|
|
|
|
|
#include "core/file_sys/archive_savedatacheck.h"
|
|
|
|
|
#include "core/file_sys/archive_sdmc.h"
|
|
|
|
|
#include "core/file_sys/archive_sdmcwriteonly.h"
|
|
|
|
|
#include "core/file_sys/archive_systemsavedata.h"
|
|
|
|
|
#include "core/file_sys/directory_backend.h"
|
|
|
|
|
#include "core/file_sys/file_backend.h"
|
|
|
|
@@ -338,17 +339,11 @@ ResultCode RenameFileBetweenArchives(ArchiveHandle src_archive_handle,
|
|
|
|
|
return ERR_INVALID_ARCHIVE_HANDLE;
|
|
|
|
|
|
|
|
|
|
if (src_archive == dest_archive) {
|
|
|
|
|
if (src_archive->RenameFile(src_path, dest_path))
|
|
|
|
|
return RESULT_SUCCESS;
|
|
|
|
|
return src_archive->RenameFile(src_path, dest_path);
|
|
|
|
|
} else {
|
|
|
|
|
// TODO: Implement renaming across archives
|
|
|
|
|
return UnimplementedFunction(ErrorModule::FS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't
|
|
|
|
|
// exist or similar. Verify.
|
|
|
|
|
return ResultCode(ErrorDescription::NoData, ErrorModule::FS, // TODO: verify description
|
|
|
|
|
ErrorSummary::NothingHappened, ErrorLevel::Status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ResultCode DeleteDirectoryFromArchive(ArchiveHandle archive_handle, const FileSys::Path& path) {
|
|
|
|
@@ -356,10 +351,7 @@ ResultCode DeleteDirectoryFromArchive(ArchiveHandle archive_handle, const FileSy
|
|
|
|
|
if (archive == nullptr)
|
|
|
|
|
return ERR_INVALID_ARCHIVE_HANDLE;
|
|
|
|
|
|
|
|
|
|
if (archive->DeleteDirectory(path))
|
|
|
|
|
return RESULT_SUCCESS;
|
|
|
|
|
return ResultCode(ErrorDescription::NoData, ErrorModule::FS, // TODO: verify description
|
|
|
|
|
ErrorSummary::Canceled, ErrorLevel::Status);
|
|
|
|
|
return archive->DeleteDirectory(path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ResultCode DeleteDirectoryRecursivelyFromArchive(ArchiveHandle archive_handle,
|
|
|
|
@@ -368,10 +360,7 @@ ResultCode DeleteDirectoryRecursivelyFromArchive(ArchiveHandle archive_handle,
|
|
|
|
|
if (archive == nullptr)
|
|
|
|
|
return ERR_INVALID_ARCHIVE_HANDLE;
|
|
|
|
|
|
|
|
|
|
if (archive->DeleteDirectoryRecursively(path))
|
|
|
|
|
return RESULT_SUCCESS;
|
|
|
|
|
return ResultCode(ErrorDescription::NoData, ErrorModule::FS, // TODO: verify description
|
|
|
|
|
ErrorSummary::Canceled, ErrorLevel::Status);
|
|
|
|
|
return archive->DeleteDirectoryRecursively(path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ResultCode CreateFileInArchive(ArchiveHandle archive_handle, const FileSys::Path& path,
|
|
|
|
@@ -388,10 +377,7 @@ ResultCode CreateDirectoryFromArchive(ArchiveHandle archive_handle, const FileSy
|
|
|
|
|
if (archive == nullptr)
|
|
|
|
|
return ERR_INVALID_ARCHIVE_HANDLE;
|
|
|
|
|
|
|
|
|
|
if (archive->CreateDirectory(path))
|
|
|
|
|
return RESULT_SUCCESS;
|
|
|
|
|
return ResultCode(ErrorDescription::NoData, ErrorModule::FS, // TODO: verify description
|
|
|
|
|
ErrorSummary::Canceled, ErrorLevel::Status);
|
|
|
|
|
return archive->CreateDirectory(path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle,
|
|
|
|
@@ -404,17 +390,11 @@ ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle,
|
|
|
|
|
return ERR_INVALID_ARCHIVE_HANDLE;
|
|
|
|
|
|
|
|
|
|
if (src_archive == dest_archive) {
|
|
|
|
|
if (src_archive->RenameDirectory(src_path, dest_path))
|
|
|
|
|
return RESULT_SUCCESS;
|
|
|
|
|
return src_archive->RenameDirectory(src_path, dest_path);
|
|
|
|
|
} else {
|
|
|
|
|
// TODO: Implement renaming across archives
|
|
|
|
|
return UnimplementedFunction(ErrorModule::FS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't
|
|
|
|
|
// exist or similar. Verify.
|
|
|
|
|
return ResultCode(ErrorDescription::NoData, ErrorModule::FS, // TODO: verify description
|
|
|
|
|
ErrorSummary::NothingHappened, ErrorLevel::Status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ResultVal<Kernel::SharedPtr<Directory>> OpenDirectoryFromArchive(ArchiveHandle archive_handle,
|
|
|
|
@@ -423,13 +403,11 @@ ResultVal<Kernel::SharedPtr<Directory>> OpenDirectoryFromArchive(ArchiveHandle a
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
auto backend = archive->OpenDirectory(path);
|
|
|
|
|
if (backend.Failed())
|
|
|
|
|
return backend.Code();
|
|
|
|
|
|
|
|
|
|
auto directory = Kernel::SharedPtr<Directory>(new Directory(std::move(backend), path));
|
|
|
|
|
auto directory = Kernel::SharedPtr<Directory>(new Directory(backend.MoveFrom(), path));
|
|
|
|
|
return MakeResult<Kernel::SharedPtr<Directory>>(std::move(directory));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -549,6 +527,13 @@ void RegisterArchiveTypes() {
|
|
|
|
|
LOG_ERROR(Service_FS, "Can't instantiate SDMC archive with path %s",
|
|
|
|
|
sdmc_directory.c_str());
|
|
|
|
|
|
|
|
|
|
auto sdmcwo_factory = std::make_unique<FileSys::ArchiveFactory_SDMCWriteOnly>(sdmc_directory);
|
|
|
|
|
if (sdmcwo_factory->Initialize())
|
|
|
|
|
RegisterArchiveType(std::move(sdmcwo_factory), ArchiveIdCode::SDMCWriteOnly);
|
|
|
|
|
else
|
|
|
|
|
LOG_ERROR(Service_FS, "Can't instantiate SDMCWriteOnly 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);
|
|
|
|
@@ -569,10 +554,9 @@ void RegisterArchiveTypes() {
|
|
|
|
|
LOG_ERROR(Service_FS, "Can't instantiate SharedExtSaveData archive with path %s",
|
|
|
|
|
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);
|
|
|
|
|
RegisterArchiveType(std::move(savedatacheck_factory), ArchiveIdCode::SaveDataCheck);
|
|
|
|
|
// Create the NCCH archive, basically a small variation of the RomFS archive
|
|
|
|
|
auto savedatacheck_factory = std::make_unique<FileSys::ArchiveFactory_NCCH>(nand_directory);
|
|
|
|
|
RegisterArchiveType(std::move(savedatacheck_factory), ArchiveIdCode::NCCH);
|
|
|
|
|
|
|
|
|
|
auto systemsavedata_factory =
|
|
|
|
|
std::make_unique<FileSys::ArchiveFactory_SystemSaveData>(nand_directory);
|
|
|
|
|