| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | // Copyright 2018 yuzu emulator team
 | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | // Licensed under GPLv2 or any later version
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-21 14:58:59 +01:00
										 |  |  | #include <cstring>
 | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | #include <memory>
 | 
					
						
							|  |  |  | #include "common/common_types.h"
 | 
					
						
							| 
									
										
										
										
											2015-05-06 04:06:12 -03:00
										 |  |  | #include "common/logging/log.h"
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | #include "core/file_sys/romfs_archive.h"
 | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace FileSys { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | std::string ROMFSArchive::GetName() const { | 
					
						
							|  |  |  |     return "RomFS"; | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | ResultVal<std::unique_ptr<FileBackend>> ROMFSArchive::OpenFile(const Path& path, | 
					
						
							|  |  |  |                                                                const Mode& mode) const { | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  |     return MakeResult<std::unique_ptr<FileBackend>>( | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  |         std::make_unique<ROMFSFile>(romfs_file, data_offset, data_size)); | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | ResultCode ROMFSArchive::DeleteFile(const Path& path) const { | 
					
						
							|  |  |  |     LOG_CRITICAL(Service_FS, "Attempted to delete a file from an ROMFS archive (%s).", | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  |                  GetName().c_str()); | 
					
						
							| 
									
										
										
										
											2017-10-31 19:26:11 -04:00
										 |  |  |     // TODO(bunnei): Use correct error code
 | 
					
						
							|  |  |  |     return ResultCode(-1); | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | ResultCode ROMFSArchive::RenameFile(const Path& src_path, const Path& dest_path) const { | 
					
						
							|  |  |  |     LOG_CRITICAL(Service_FS, "Attempted to rename a file within an ROMFS archive (%s).", | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  |                  GetName().c_str()); | 
					
						
							| 
									
										
										
										
											2016-10-14 15:29:09 +08:00
										 |  |  |     // TODO(wwylele): Use correct error code
 | 
					
						
							|  |  |  |     return ResultCode(-1); | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | ResultCode ROMFSArchive::DeleteDirectory(const Path& path) const { | 
					
						
							|  |  |  |     LOG_CRITICAL(Service_FS, "Attempted to delete a directory from an ROMFS archive (%s).", | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  |                  GetName().c_str()); | 
					
						
							| 
									
										
										
										
											2016-10-14 15:29:09 +08:00
										 |  |  |     // TODO(wwylele): Use correct error code
 | 
					
						
							|  |  |  |     return ResultCode(-1); | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | ResultCode ROMFSArchive::DeleteDirectoryRecursively(const Path& path) const { | 
					
						
							|  |  |  |     LOG_CRITICAL(Service_FS, "Attempted to delete a directory from an ROMFS archive (%s).", | 
					
						
							| 
									
										
										
										
											2016-10-02 11:29:04 +08:00
										 |  |  |                  GetName().c_str()); | 
					
						
							| 
									
										
										
										
											2016-10-14 15:29:09 +08:00
										 |  |  |     // TODO(wwylele): Use correct error code
 | 
					
						
							|  |  |  |     return ResultCode(-1); | 
					
						
							| 
									
										
										
										
											2016-10-02 11:29:04 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | ResultCode ROMFSArchive::CreateFile(const Path& path, u64 size) const { | 
					
						
							|  |  |  |     LOG_CRITICAL(Service_FS, "Attempted to create a file in an ROMFS archive (%s).", | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  |                  GetName().c_str()); | 
					
						
							| 
									
										
										
										
											2017-10-31 19:26:11 -04:00
										 |  |  |     // TODO(bunnei): Use correct error code
 | 
					
						
							|  |  |  |     return ResultCode(-1); | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | ResultCode ROMFSArchive::CreateDirectory(const Path& path) const { | 
					
						
							|  |  |  |     LOG_CRITICAL(Service_FS, "Attempted to create a directory in an ROMFS archive (%s).", | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  |                  GetName().c_str()); | 
					
						
							| 
									
										
										
										
											2016-10-14 15:29:09 +08:00
										 |  |  |     // TODO(wwylele): Use correct error code
 | 
					
						
							|  |  |  |     return ResultCode(-1); | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | ResultCode ROMFSArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const { | 
					
						
							|  |  |  |     LOG_CRITICAL(Service_FS, "Attempted to rename a file within an ROMFS archive (%s).", | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  |                  GetName().c_str()); | 
					
						
							| 
									
										
										
										
											2016-10-14 15:29:09 +08:00
										 |  |  |     // TODO(wwylele): Use correct error code
 | 
					
						
							|  |  |  |     return ResultCode(-1); | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | ResultVal<std::unique_ptr<DirectoryBackend>> ROMFSArchive::OpenDirectory(const Path& path) const { | 
					
						
							|  |  |  |     return MakeResult<std::unique_ptr<DirectoryBackend>>(std::make_unique<ROMFSDirectory>()); | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | u64 ROMFSArchive::GetFreeBytes() const { | 
					
						
							|  |  |  |     LOG_WARNING(Service_FS, "Attempted to get the free space in an ROMFS archive"); | 
					
						
							| 
									
										
										
										
											2015-10-18 15:52:37 -07:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | ResultVal<size_t> ROMFSFile::Read(const u64 offset, const size_t length, u8* buffer) const { | 
					
						
							| 
									
										
										
										
											2015-09-30 08:19:42 -04:00
										 |  |  |     LOG_TRACE(Service_FS, "called offset=%llu, length=%zu", offset, length); | 
					
						
							| 
									
										
										
										
											2015-07-10 00:55:23 +03:00
										 |  |  |     romfs_file->Seek(data_offset + offset, SEEK_SET); | 
					
						
							| 
									
										
										
										
											2015-07-13 20:43:34 -03:00
										 |  |  |     size_t read_length = (size_t)std::min((u64)length, data_size - offset); | 
					
						
							| 
									
										
										
										
											2015-07-10 00:55:23 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-28 10:03:09 -05:00
										 |  |  |     return MakeResult<size_t>(romfs_file->ReadBytes(buffer, read_length)); | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | ResultVal<size_t> ROMFSFile::Write(const u64 offset, const size_t length, const bool flush, | 
					
						
							|  |  |  |                                    const u8* buffer) const { | 
					
						
							|  |  |  |     LOG_ERROR(Service_FS, "Attempted to write to ROMFS file"); | 
					
						
							| 
									
										
										
										
											2015-12-28 10:03:09 -05:00
										 |  |  |     // TODO(Subv): Find error code
 | 
					
						
							|  |  |  |     return MakeResult<size_t>(0); | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | u64 ROMFSFile::GetSize() const { | 
					
						
							| 
									
										
										
										
											2015-07-13 20:43:34 -03:00
										 |  |  |     return data_size; | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 21:45:07 -05:00
										 |  |  | bool ROMFSFile::SetSize(const u64 size) const { | 
					
						
							|  |  |  |     LOG_ERROR(Service_FS, "Attempted to set the size of an ROMFS file"); | 
					
						
							| 
									
										
										
										
											2015-01-01 12:39:27 -05:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace FileSys
 |