mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	FileSys: remove Open from FileBackend
Same as directory, file shouldn't expose Open either.
This commit is contained in:
		
							parent
							
								
									0e754875d1
								
							
						
					
					
						commit
						9a0405858a
					
				
					 4 changed files with 44 additions and 64 deletions
				
			
		|  | @ -18,11 +18,46 @@ namespace FileSys { | ||||||
| ResultVal<std::unique_ptr<FileBackend>> DiskArchive::OpenFile(const Path& path, | ResultVal<std::unique_ptr<FileBackend>> DiskArchive::OpenFile(const Path& path, | ||||||
|                                                               const Mode& mode) const { |                                                               const Mode& mode) const { | ||||||
|     LOG_DEBUG(Service_FS, "called path=%s mode=%01X", path.DebugStr().c_str(), mode.hex); |     LOG_DEBUG(Service_FS, "called path=%s mode=%01X", path.DebugStr().c_str(), mode.hex); | ||||||
|     auto file = std::make_unique<DiskFile>(*this, path, mode); | 
 | ||||||
|     ResultCode result = file->Open(); |     auto full_path = mount_point + path.AsString(); | ||||||
|     if (result.IsError()) |     if (FileUtil::IsDirectory(full_path)) | ||||||
|         return result; |         return ResultCode(ErrorDescription::FS_NotAFile, ErrorModule::FS, ErrorSummary::Canceled, | ||||||
|     return MakeResult<std::unique_ptr<FileBackend>>(std::move(file)); |                           ErrorLevel::Status); | ||||||
|  | 
 | ||||||
|  |     // Specifying only the Create flag is invalid
 | ||||||
|  |     if (mode.create_flag && !mode.read_flag && !mode.write_flag) { | ||||||
|  |         return ResultCode(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS, | ||||||
|  |                           ErrorSummary::Canceled, ErrorLevel::Status); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!FileUtil::Exists(full_path)) { | ||||||
|  |         if (!mode.create_flag) { | ||||||
|  |             LOG_ERROR(Service_FS, "Non-existing file %s can't be open without mode create.", | ||||||
|  |                       full_path.c_str()); | ||||||
|  |             return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, | ||||||
|  |                               ErrorSummary::NotFound, ErrorLevel::Status); | ||||||
|  |         } else { | ||||||
|  |             // Create the file
 | ||||||
|  |             FileUtil::CreateEmptyFile(full_path); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     std::string mode_string = ""; | ||||||
|  |     if (mode.write_flag) | ||||||
|  |         mode_string += "r+"; // Files opened with Write access can be read from
 | ||||||
|  |     else if (mode.read_flag) | ||||||
|  |         mode_string += "r"; | ||||||
|  | 
 | ||||||
|  |     // Open the file in binary mode, to avoid problems with CR/LF on Windows systems
 | ||||||
|  |     mode_string += "b"; | ||||||
|  | 
 | ||||||
|  |     FileUtil::IOFile file(full_path, mode_string.c_str()); | ||||||
|  |     if (!file.IsOpen()) | ||||||
|  |         return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound, | ||||||
|  |                           ErrorLevel::Status); | ||||||
|  | 
 | ||||||
|  |     auto disk_file = std::make_unique<DiskFile>(std::move(file), mode); | ||||||
|  |     return MakeResult<std::unique_ptr<FileBackend>>(std::move(disk_file)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ResultCode DiskArchive::DeleteFile(const Path& path) const { | ResultCode DiskArchive::DeleteFile(const Path& path) const { | ||||||
|  | @ -127,53 +162,6 @@ u64 DiskArchive::GetFreeBytes() const { | ||||||
| 
 | 
 | ||||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
| 
 | 
 | ||||||
| DiskFile::DiskFile(const DiskArchive& archive, const Path& path, const Mode mode) { |  | ||||||
|     // TODO(Link Mauve): normalize path into an absolute path without "..", it can currently bypass
 |  | ||||||
|     // the root directory we set while opening the archive.
 |  | ||||||
|     // For example, opening /../../etc/passwd can give the emulated program your users list.
 |  | ||||||
|     this->path = archive.mount_point + path.AsString(); |  | ||||||
|     this->mode.hex = mode.hex; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ResultCode DiskFile::Open() { |  | ||||||
|     if (FileUtil::IsDirectory(path)) |  | ||||||
|         return ResultCode(ErrorDescription::FS_NotAFile, ErrorModule::FS, ErrorSummary::Canceled, |  | ||||||
|                           ErrorLevel::Status); |  | ||||||
| 
 |  | ||||||
|     // Specifying only the Create flag is invalid
 |  | ||||||
|     if (mode.create_flag && !mode.read_flag && !mode.write_flag) { |  | ||||||
|         return ResultCode(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS, |  | ||||||
|                           ErrorSummary::Canceled, ErrorLevel::Status); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!FileUtil::Exists(path)) { |  | ||||||
|         if (!mode.create_flag) { |  | ||||||
|             LOG_ERROR(Service_FS, "Non-existing file %s can't be open without mode create.", |  | ||||||
|                       path.c_str()); |  | ||||||
|             return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, |  | ||||||
|                               ErrorSummary::NotFound, ErrorLevel::Status); |  | ||||||
|         } else { |  | ||||||
|             // Create the file
 |  | ||||||
|             FileUtil::CreateEmptyFile(path); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     std::string mode_string = ""; |  | ||||||
|     if (mode.write_flag) |  | ||||||
|         mode_string += "r+"; // Files opened with Write access can be read from
 |  | ||||||
|     else if (mode.read_flag) |  | ||||||
|         mode_string += "r"; |  | ||||||
| 
 |  | ||||||
|     // Open the file in binary mode, to avoid problems with CR/LF on Windows systems
 |  | ||||||
|     mode_string += "b"; |  | ||||||
| 
 |  | ||||||
|     file = std::make_unique<FileUtil::IOFile>(path, mode_string.c_str()); |  | ||||||
|     if (file->IsOpen()) |  | ||||||
|         return RESULT_SUCCESS; |  | ||||||
|     return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound, |  | ||||||
|                       ErrorLevel::Status); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ResultVal<size_t> DiskFile::Read(const u64 offset, const size_t length, u8* buffer) const { | ResultVal<size_t> DiskFile::Read(const u64 offset, const size_t length, u8* buffer) const { | ||||||
|     if (!mode.read_flag && !mode.write_flag) |     if (!mode.read_flag && !mode.write_flag) | ||||||
|         return ResultCode(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS, |         return ResultCode(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS, | ||||||
|  |  | ||||||
|  | @ -54,9 +54,11 @@ protected: | ||||||
| 
 | 
 | ||||||
| class DiskFile : public FileBackend { | class DiskFile : public FileBackend { | ||||||
| public: | public: | ||||||
|     DiskFile(const DiskArchive& archive, const Path& path, const Mode mode); |     DiskFile(FileUtil::IOFile&& file_, const Mode& mode_) | ||||||
|  |         : file(new FileUtil::IOFile(std::move(file_))) { | ||||||
|  |         mode.hex = mode_.hex; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     ResultCode Open() override; |  | ||||||
|     ResultVal<size_t> Read(u64 offset, size_t length, u8* buffer) const override; |     ResultVal<size_t> Read(u64 offset, size_t length, u8* buffer) const override; | ||||||
|     ResultVal<size_t> Write(u64 offset, size_t length, bool flush, const u8* buffer) const override; |     ResultVal<size_t> Write(u64 offset, size_t length, bool flush, const u8* buffer) const override; | ||||||
|     u64 GetSize() const override; |     u64 GetSize() const override; | ||||||
|  | @ -68,7 +70,6 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
|     std::string path; |  | ||||||
|     Mode mode; |     Mode mode; | ||||||
|     std::unique_ptr<FileUtil::IOFile> file; |     std::unique_ptr<FileUtil::IOFile> file; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -18,12 +18,6 @@ public: | ||||||
|     FileBackend() {} |     FileBackend() {} | ||||||
|     virtual ~FileBackend() {} |     virtual ~FileBackend() {} | ||||||
| 
 | 
 | ||||||
|     /**
 |  | ||||||
|      * Open the file |  | ||||||
|      * @return Result of the file operation |  | ||||||
|      */ |  | ||||||
|     virtual ResultCode Open() = 0; |  | ||||||
| 
 |  | ||||||
|     /**
 |     /**
 | ||||||
|      * Read data from the file |      * Read data from the file | ||||||
|      * @param offset Offset in bytes to start reading data from |      * @param offset Offset in bytes to start reading data from | ||||||
|  |  | ||||||
|  | @ -55,9 +55,6 @@ public: | ||||||
|     IVFCFile(std::shared_ptr<FileUtil::IOFile> file, u64 offset, u64 size) |     IVFCFile(std::shared_ptr<FileUtil::IOFile> file, u64 offset, u64 size) | ||||||
|         : romfs_file(file), data_offset(offset), data_size(size) {} |         : romfs_file(file), data_offset(offset), data_size(size) {} | ||||||
| 
 | 
 | ||||||
|     ResultCode Open() override { |  | ||||||
|         return RESULT_SUCCESS; |  | ||||||
|     } |  | ||||||
|     ResultVal<size_t> Read(u64 offset, size_t length, u8* buffer) const override; |     ResultVal<size_t> Read(u64 offset, size_t length, u8* buffer) const override; | ||||||
|     ResultVal<size_t> Write(u64 offset, size_t length, bool flush, const u8* buffer) const override; |     ResultVal<size_t> Write(u64 offset, size_t length, bool flush, const u8* buffer) const override; | ||||||
|     u64 GetSize() const override; |     u64 GetSize() const override; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue