fs: improve UnsupportedOperation results

This commit is contained in:
Michael Scire 2020-03-06 09:50:59 -08:00
parent 4f4a54abda
commit 7004ad3d7f
7 changed files with 58 additions and 30 deletions

View file

@ -26,21 +26,15 @@ namespace ams::fs {
virtual Result Read(s64 offset, void *buffer, size_t size) = 0;
virtual Result Write(s64 offset, const void *buffer, size_t size) {
return fs::ResultUnsupportedOperation();
}
virtual Result Write(s64 offset, const void *buffer, size_t size) = 0;
virtual Result Flush() = 0;
virtual Result SetSize(s64 size) {
return fs::ResultUnsupportedOperation();
}
virtual Result SetSize(s64 size) = 0;
virtual Result GetSize(s64 *out) = 0;
virtual Result OperateRange(void *dst, size_t dst_size, OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) {
return fs::ResultUnsupportedOperation();
}
virtual Result OperateRange(void *dst, size_t dst_size, OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) = 0;
virtual Result OperateRange(OperationId op_id, s64 offset, s64 size) {
return this->OperateRange(nullptr, 0, op_id, offset, size, nullptr, 0);
@ -86,21 +80,31 @@ namespace ams::fs {
virtual ~ReadOnlyStorageAdapter() { /* ... */ }
public:
virtual Result Read(s64 offset, void *buffer, size_t size) {
virtual Result Read(s64 offset, void *buffer, size_t size) override {
return this->storage->Read(offset, buffer, size);
}
virtual Result Flush() {
virtual Result Flush() override {
return this->storage->Flush();
}
virtual Result GetSize(s64 *out) {
virtual Result GetSize(s64 *out) override {
return this->storage->GetSize(out);
}
virtual Result OperateRange(void *dst, size_t dst_size, OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) override {
return this->storage->OperateRange(dst, dst_size, op_id, offset, size, src, src_size);
}
virtual Result Write(s64 offset, const void *buffer, size_t size) override {
/* TODO: Better result? Is it possible to get a more specific one? */
return fs::ResultUnsupportedOperation();
}
virtual Result SetSize(s64 size) override {
/* TODO: Better result? Is it possible to get a more specific one? */
return fs::ResultUnsupportedOperation();
}
};
}

View file

@ -62,6 +62,10 @@ namespace ams::fs {
return ResultSuccess();
}
virtual Result SetSize(s64 size) override {
return fs::ResultUnsupportedMemoryStorageSetSize();
}
virtual Result OperateRange(void *dst, size_t dst_size, OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) override {
switch (op_id) {
case OperationId::InvalidateCache:
@ -72,7 +76,7 @@ namespace ams::fs {
reinterpret_cast<QueryRangeInfo *>(dst)->Clear();
return ResultSuccess();
default:
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedMemoryStorageOperateRange();
}
}
};

View file

@ -103,13 +103,13 @@ namespace ams::fs {
virtual Result SetSize(s64 size) override {
/* Ensure we're initialized and validate arguments. */
R_UNLESS(this->IsValid(), fs::ResultNotInitialized());
R_UNLESS(this->resizable, fs::ResultUnsupportedOperation());
R_UNLESS(this->resizable, fs::ResultUnsupportedSubStorageSetSizeA());
R_UNLESS(IStorage::IsOffsetAndSizeValid(this->offset, size), fs::ResultInvalidSize());
/* Ensure that we're allowed to set size. */
s64 cur_size;
R_TRY(this->base_storage->GetSize(std::addressof(cur_size)));
R_UNLESS(cur_size == this->offset + this->size, fs::ResultUnsupportedOperation());
R_UNLESS(cur_size == this->offset + this->size, fs::ResultUnsupportedSubStorageSetSizeB());
/* Set the size. */
R_TRY(this->base_storage->SetSize(this->offset + size));

View file

@ -86,7 +86,7 @@ namespace ams::fs {
R_UNLESS(IStorage::IsOffsetAndSizeValid(offset, size), fs::ResultOutOfRange());
return this->base_file->OperateRange(dst, dst_size, op_id, offset, size, src, src_size);
default:
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedFileStorageOperateRange();
}
}

View file

@ -223,11 +223,11 @@ namespace ams::fs {
}
virtual Result WriteImpl(s64 offset, const void *buffer, size_t size, const fs::WriteOption &option) override {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileWrite();
}
virtual Result SetSizeImpl(s64 size) override {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileWrite();
}
virtual Result OperateRangeImpl(void *dst, size_t dst_size, fs::OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) override {
@ -239,7 +239,7 @@ namespace ams::fs {
R_UNLESS(this->GetSize() >= 0, fs::ResultOutOfRange());
}
default:
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileOperateRange();
}
}
public:
@ -438,31 +438,31 @@ namespace ams::fs {
}
Result RomFsFileSystem::CreateFileImpl(const char *path, s64 size, int flags) {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileSystemWrite();
}
Result RomFsFileSystem::DeleteFileImpl(const char *path) {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileSystemWrite();
}
Result RomFsFileSystem::CreateDirectoryImpl(const char *path) {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileSystemWrite();
}
Result RomFsFileSystem::DeleteDirectoryImpl(const char *path) {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileSystemWrite();
}
Result RomFsFileSystem::DeleteDirectoryRecursivelyImpl(const char *path) {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileSystemWrite();
}
Result RomFsFileSystem::RenameFileImpl(const char *old_path, const char *new_path) {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileSystemWrite();
}
Result RomFsFileSystem::RenameDirectoryImpl(const char *old_path, const char *new_path) {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileSystemWrite();
}
Result RomFsFileSystem::GetEntryTypeImpl(fs::DirectoryEntryType *out, const char *path) {
@ -519,19 +519,19 @@ namespace ams::fs {
}
Result RomFsFileSystem::GetFreeSpaceSizeImpl(s64 *out, const char *path) {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileSystemGetSize();
}
Result RomFsFileSystem::GetTotalSpaceSizeImpl(s64 *out, const char *path) {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileSystemGetSize();
}
Result RomFsFileSystem::CleanDirectoryRecursivelyImpl(const char *path) {
return fs::ResultUnsupportedOperation();
return fs::ResultUnsupportedRomFsFileSystemWrite();
}
Result RomFsFileSystem::CommitProvisionallyImpl(s64 counter) {
return ResultSuccess();
return fs::ResultUnsupportedRomFsFileSystemCommitProvisionally();
}
Result RomFsFileSystem::RollbackImpl() {

View file

@ -231,6 +231,16 @@ namespace ams::fs {
R_DEFINE_ERROR_RESULT(FileExtensionWithoutOpenModeAllowAppend, 6201);
R_DEFINE_ERROR_RANGE(UnsupportedOperation, 6300, 6399);
R_DEFINE_ERROR_RESULT(UnsupportedSubStorageSetSizeA, 6302);
R_DEFINE_ERROR_RESULT(UnsupportedSubStorageSetSizeB, 6303);
R_DEFINE_ERROR_RESULT(UnsupportedMemoryStorageSetSize, 6304);
R_DEFINE_ERROR_RESULT(UnsupportedMemoryStorageOperateRange, 6305);
R_DEFINE_ERROR_RESULT(UnsupportedFileStorageOperateRange, 6306);
R_DEFINE_ERROR_RESULT(UnsupportedRomFsFileSystemWrite, 6364);
R_DEFINE_ERROR_RESULT(UnsupportedRomFsFileSystemCommitProvisionally, 6365);
R_DEFINE_ERROR_RESULT(UnsupportedRomFsFileSystemGetSize, 6366);
R_DEFINE_ERROR_RESULT(UnsupportedRomFsFileWrite, 6367);
R_DEFINE_ERROR_RESULT(UnsupportedRomFsFileOperateRange, 6368);
R_DEFINE_ERROR_RANGE(PermissionDenied, 6400, 6449);

View file

@ -49,6 +49,16 @@ namespace ams::mitm::fs {
virtual Result GetSize(s64 *out_size) override;
virtual Result Flush() override;
virtual Result OperateRange(void *dst, size_t dst_size, ams::fs::OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) override;
virtual Result Write(s64 offset, const void *buffer, size_t size) override {
/* TODO: Better result code? */
return ams::fs::ResultUnsupportedOperation();
}
virtual Result SetSize(s64 size) override {
/* TODO: Better result code? */
return ams::fs::ResultUnsupportedOperation();
}
};
}