mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +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_savedata.cpp | ||||||
|             file_sys/archive_savedatacheck.cpp |             file_sys/archive_savedatacheck.cpp | ||||||
|             file_sys/archive_sdmc.cpp |             file_sys/archive_sdmc.cpp | ||||||
|  |             file_sys/archive_sdmcwriteonly.cpp | ||||||
|             file_sys/archive_systemsavedata.cpp |             file_sys/archive_systemsavedata.cpp | ||||||
|             file_sys/disk_archive.cpp |             file_sys/disk_archive.cpp | ||||||
|             file_sys/ivfc_archive.cpp |             file_sys/ivfc_archive.cpp | ||||||
|  | @ -165,6 +166,7 @@ set(HEADERS | ||||||
|             file_sys/archive_savedata.h |             file_sys/archive_savedata.h | ||||||
|             file_sys/archive_savedatacheck.h |             file_sys/archive_savedatacheck.h | ||||||
|             file_sys/archive_sdmc.h |             file_sys/archive_sdmc.h | ||||||
|  |             file_sys/archive_sdmcwriteonly.h | ||||||
|             file_sys/archive_systemsavedata.h |             file_sys/archive_systemsavedata.h | ||||||
|             file_sys/directory_backend.h |             file_sys/directory_backend.h | ||||||
|             file_sys/disk_archive.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); |                                               ErrorLevel::Usage); | ||||||
| const ResultCode ERROR_INVALID_OPEN_FLAGS(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS, | const ResultCode ERROR_INVALID_OPEN_FLAGS(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS, | ||||||
|                                           ErrorSummary::Canceled, ErrorLevel::Status); |                                           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, | const ResultCode ERROR_FILE_NOT_FOUND(ErrorDescription::FS_FileNotFound, ErrorModule::FS, | ||||||
|                                       ErrorSummary::NotFound, ErrorLevel::Status); |                                       ErrorSummary::NotFound, ErrorLevel::Status); | ||||||
| const ResultCode ERROR_PATH_NOT_FOUND(ErrorDescription::FS_PathNotFound, ErrorModule::FS, | const ResultCode ERROR_PATH_NOT_FOUND(ErrorDescription::FS_PathNotFound, ErrorModule::FS, | ||||||
|  |  | ||||||
|  | @ -33,6 +33,7 @@ enum class ErrorDescription : u32 { | ||||||
|     OutofRangeOrMisalignedAddress = |     OutofRangeOrMisalignedAddress = | ||||||
|         513, // TODO(purpasmart): Check if this name fits its actual usage
 |         513, // TODO(purpasmart): Check if this name fits its actual usage
 | ||||||
|     GPU_FirstInitialization = 519, |     GPU_FirstInitialization = 519, | ||||||
|  |     FS_InvalidReadFlag = 700, | ||||||
|     FS_InvalidPath = 702, |     FS_InvalidPath = 702, | ||||||
|     FS_WriteBeyondEnd = 705, |     FS_WriteBeyondEnd = 705, | ||||||
|     FS_UnsupportedOpenFlags = 760, |     FS_UnsupportedOpenFlags = 760, | ||||||
|  |  | ||||||
|  | @ -18,6 +18,7 @@ | ||||||
| #include "core/file_sys/archive_savedata.h" | #include "core/file_sys/archive_savedata.h" | ||||||
| #include "core/file_sys/archive_savedatacheck.h" | #include "core/file_sys/archive_savedatacheck.h" | ||||||
| #include "core/file_sys/archive_sdmc.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/archive_systemsavedata.h" | ||||||
| #include "core/file_sys/directory_backend.h" | #include "core/file_sys/directory_backend.h" | ||||||
| #include "core/file_sys/file_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", |         LOG_ERROR(Service_FS, "Can't instantiate SDMC archive with path %s", | ||||||
|                   sdmc_directory.c_str()); |                   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
 |     // Create the SaveData archive
 | ||||||
|     auto savedata_factory = std::make_unique<FileSys::ArchiveFactory_SaveData>(sdmc_directory); |     auto savedata_factory = std::make_unique<FileSys::ArchiveFactory_SaveData>(sdmc_directory); | ||||||
|     RegisterArchiveType(std::move(savedata_factory), ArchiveIdCode::SaveData); |     RegisterArchiveType(std::move(savedata_factory), ArchiveIdCode::SaveData); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue