mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	FileSys: add SDMCWriteOnlyArchive
This commit is contained in:
		
							parent
							
								
									93aa14e345
								
							
						
					
					
						commit
						0987783699
					
				
					 6 changed files with 140 additions and 0 deletions
				
			
		|  | @ -21,6 +21,7 @@ set(SRCS | |||
|             file_sys/archive_savedata.cpp | ||||
|             file_sys/archive_savedatacheck.cpp | ||||
|             file_sys/archive_sdmc.cpp | ||||
|             file_sys/archive_sdmcwriteonly.cpp | ||||
|             file_sys/archive_systemsavedata.cpp | ||||
|             file_sys/disk_archive.cpp | ||||
|             file_sys/ivfc_archive.cpp | ||||
|  | @ -165,6 +166,7 @@ set(HEADERS | |||
|             file_sys/archive_savedata.h | ||||
|             file_sys/archive_savedatacheck.h | ||||
|             file_sys/archive_sdmc.h | ||||
|             file_sys/archive_sdmcwriteonly.h | ||||
|             file_sys/archive_systemsavedata.h | ||||
|             file_sys/directory_backend.h | ||||
|             file_sys/disk_archive.h | ||||
|  |  | |||
							
								
								
									
										70
									
								
								src/core/file_sys/archive_sdmcwriteonly.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/core/file_sys/archive_sdmcwriteonly.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,70 @@ | |||
| // Copyright 2016 Citra Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <memory> | ||||
| #include "common/file_util.h" | ||||
| #include "core/file_sys/archive_sdmcwriteonly.h" | ||||
| #include "core/file_sys/directory_backend.h" | ||||
| #include "core/file_sys/errors.h" | ||||
| #include "core/file_sys/file_backend.h" | ||||
| #include "core/settings.h" | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| ResultVal<std::unique_ptr<FileBackend>> SDMCWriteOnlyArchive::OpenFile(const Path& path, | ||||
|                                                                        const Mode& mode) const { | ||||
|     if (mode.read_flag) { | ||||
|         LOG_ERROR(Service_FS, "Read flag is not supported"); | ||||
|         return ERROR_INVALID_READ_FLAG; | ||||
|     } | ||||
|     return SDMCArchive::OpenFile(path, mode); | ||||
| } | ||||
| 
 | ||||
| ResultVal<std::unique_ptr<DirectoryBackend>> SDMCWriteOnlyArchive::OpenDirectory( | ||||
|     const Path& path) const { | ||||
|     LOG_ERROR(Service_FS, "Not supported"); | ||||
|     return ERROR_UNSUPPORTED_OPEN_FLAGS; | ||||
| } | ||||
| 
 | ||||
| ArchiveFactory_SDMCWriteOnly::ArchiveFactory_SDMCWriteOnly(const std::string& mount_point) | ||||
|     : sdmc_directory(mount_point) { | ||||
|     LOG_INFO(Service_FS, "Directory %s set as SDMCWriteOnly.", sdmc_directory.c_str()); | ||||
| } | ||||
| 
 | ||||
| bool ArchiveFactory_SDMCWriteOnly::Initialize() { | ||||
|     if (!Settings::values.use_virtual_sd) { | ||||
|         LOG_WARNING(Service_FS, "SDMC disabled by config."); | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     if (!FileUtil::CreateFullPath(sdmc_directory)) { | ||||
|         LOG_ERROR(Service_FS, "Unable to create SDMC path."); | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SDMCWriteOnly::Open(const Path& path) { | ||||
|     auto archive = std::make_unique<SDMCWriteOnlyArchive>(sdmc_directory); | ||||
|     return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive)); | ||||
| } | ||||
| 
 | ||||
| ResultCode ArchiveFactory_SDMCWriteOnly::Format(const Path& path, | ||||
|                                                 const FileSys::ArchiveFormatInfo& format_info) { | ||||
|     // TODO(wwylele): hwtest this
 | ||||
|     LOG_ERROR(Service_FS, "Attempted to format a SDMC write-only archive."); | ||||
|     return ResultCode(-1); | ||||
| } | ||||
| 
 | ||||
| ResultVal<ArchiveFormatInfo> ArchiveFactory_SDMCWriteOnly::GetFormatInfo(const Path& path) const { | ||||
|     // TODO(Subv): Implement
 | ||||
|     LOG_ERROR(Service_FS, "Unimplemented GetFormatInfo archive %s", GetName().c_str()); | ||||
|     return ResultCode(-1); | ||||
| } | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
							
								
								
									
										57
									
								
								src/core/file_sys/archive_sdmcwriteonly.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/core/file_sys/archive_sdmcwriteonly.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,57 @@ | |||
| // Copyright 2016 Citra Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "core/file_sys/archive_sdmc.h" | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| /**
 | ||||
|  * Archive backend for SDMC write-only archive. | ||||
|  * The behaviour of SDMCWriteOnlyArchive is almost the same as SDMCArchive, except for | ||||
|  *  - OpenDirectory is unsupported; | ||||
|  *  - OpenFile with read flag is unsupported. | ||||
|  */ | ||||
| class SDMCWriteOnlyArchive : public SDMCArchive { | ||||
| public: | ||||
|     SDMCWriteOnlyArchive(const std::string& mount_point) : SDMCArchive(mount_point) {} | ||||
| 
 | ||||
|     std::string GetName() const override { | ||||
|         return "SDMCWriteOnlyArchive: " + mount_point; | ||||
|     } | ||||
| 
 | ||||
|     ResultVal<std::unique_ptr<FileBackend>> OpenFile(const Path& path, | ||||
|                                                      const Mode& mode) const override; | ||||
| 
 | ||||
|     ResultVal<std::unique_ptr<DirectoryBackend>> OpenDirectory(const Path& path) const override; | ||||
| }; | ||||
| 
 | ||||
| /// File system interface to the SDMC write-only archive
 | ||||
| class ArchiveFactory_SDMCWriteOnly final : public ArchiveFactory { | ||||
| public: | ||||
|     ArchiveFactory_SDMCWriteOnly(const std::string& mount_point); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Initialize the archive. | ||||
|      * @return true if it initialized successfully | ||||
|      */ | ||||
|     bool Initialize(); | ||||
| 
 | ||||
|     std::string GetName() const override { | ||||
|         return "SDMCWriteOnly"; | ||||
|     } | ||||
| 
 | ||||
|     ResultVal<std::unique_ptr<ArchiveBackend>> Open(const Path& path) override; | ||||
|     ResultCode Format(const Path& path, const FileSys::ArchiveFormatInfo& format_info) override; | ||||
|     ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path) const override; | ||||
| 
 | ||||
| private: | ||||
|     std::string sdmc_directory; | ||||
| }; | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
|  | @ -13,6 +13,8 @@ const ResultCode ERROR_UNSUPPORTED_OPEN_FLAGS(ErrorDescription::FS_UnsupportedOp | |||
|                                               ErrorLevel::Usage); | ||||
| const ResultCode ERROR_INVALID_OPEN_FLAGS(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS, | ||||
|                                           ErrorSummary::Canceled, ErrorLevel::Status); | ||||
| const ResultCode ERROR_INVALID_READ_FLAG(ErrorDescription::FS_InvalidReadFlag, ErrorModule::FS, | ||||
|                                          ErrorSummary::InvalidArgument, ErrorLevel::Usage); | ||||
| const ResultCode ERROR_FILE_NOT_FOUND(ErrorDescription::FS_FileNotFound, ErrorModule::FS, | ||||
|                                       ErrorSummary::NotFound, ErrorLevel::Status); | ||||
| const ResultCode ERROR_PATH_NOT_FOUND(ErrorDescription::FS_PathNotFound, ErrorModule::FS, | ||||
|  |  | |||
|  | @ -33,6 +33,7 @@ enum class ErrorDescription : u32 { | |||
|     OutofRangeOrMisalignedAddress = | ||||
|         513, // TODO(purpasmart): Check if this name fits its actual usage
 | ||||
|     GPU_FirstInitialization = 519, | ||||
|     FS_InvalidReadFlag = 700, | ||||
|     FS_InvalidPath = 702, | ||||
|     FS_WriteBeyondEnd = 705, | ||||
|     FS_UnsupportedOpenFlags = 760, | ||||
|  |  | |||
|  | @ -18,6 +18,7 @@ | |||
| #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" | ||||
|  | @ -526,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); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue