| 
									
										
										
										
											2014-06-25 18:15:35 -04:00
										 |  |  | // Copyright 2014 Citra Emulator Project
 | 
					
						
							| 
									
										
										
										
											2014-12-16 21:38:14 -08:00
										 |  |  | // Licensed under GPLv2 or any later version
 | 
					
						
							| 
									
										
										
										
											2014-06-25 18:15:35 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-21 15:44:11 +01:00
										 |  |  | #include <memory>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-25 18:15:35 -04:00
										 |  |  | #include "common/common_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-15 02:51:38 -02:00
										 |  |  | #include "core/file_sys/archive_backend.h"
 | 
					
						
							| 
									
										
										
										
											2015-02-07 13:06:48 -05:00
										 |  |  | #include "core/hle/kernel/session.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-23 01:20:01 -02:00
										 |  |  | #include "core/hle/result.h"
 | 
					
						
							| 
									
										
										
										
											2014-06-25 18:15:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-21 15:44:11 +01:00
										 |  |  | namespace FileSys { | 
					
						
							|  |  |  | class DirectoryBackend; | 
					
						
							|  |  |  | class FileBackend; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-03 20:46:05 -05:00
										 |  |  | /// The unique system identifier hash, also known as ID0
 | 
					
						
							| 
									
										
										
										
											2015-01-04 09:10:27 -05:00
										 |  |  | extern const std::string SYSTEM_ID; | 
					
						
							| 
									
										
										
										
											2015-01-03 20:46:05 -05:00
										 |  |  | /// The scrambled SD card CID, also known as ID1
 | 
					
						
							| 
									
										
										
										
											2015-01-04 09:10:27 -05:00
										 |  |  | extern const std::string SDCARD_ID; | 
					
						
							| 
									
										
										
										
											2015-01-03 20:46:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-14 05:55:11 -02:00
										 |  |  | namespace Service { | 
					
						
							|  |  |  | namespace FS { | 
					
						
							| 
									
										
										
										
											2014-06-25 18:15:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-15 02:44:04 -02:00
										 |  |  | /// Supported archive types
 | 
					
						
							|  |  |  | enum class ArchiveIdCode : u32 { | 
					
						
							|  |  |  |     RomFS               = 0x00000003, | 
					
						
							|  |  |  |     SaveData            = 0x00000004, | 
					
						
							|  |  |  |     ExtSaveData         = 0x00000006, | 
					
						
							|  |  |  |     SharedExtSaveData   = 0x00000007, | 
					
						
							|  |  |  |     SystemSaveData      = 0x00000008, | 
					
						
							|  |  |  |     SDMC                = 0x00000009, | 
					
						
							|  |  |  |     SDMCWriteOnly       = 0x0000000A, | 
					
						
							| 
									
										
										
										
											2014-12-31 19:36:50 -05:00
										 |  |  |     SaveDataCheck       = 0x2345678A, | 
					
						
							| 
									
										
										
										
											2014-12-15 02:44:04 -02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-14 12:00:01 -05:00
										 |  |  | /// Media types for the archives
 | 
					
						
							|  |  |  | enum class MediaType : u32 { | 
					
						
							|  |  |  |     NAND     = 0, | 
					
						
							|  |  |  |     SDMC     = 1 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-15 06:41:02 -02:00
										 |  |  | typedef u64 ArchiveHandle; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-07 13:06:48 -05:00
										 |  |  | class File : public Kernel::Session { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2015-05-06 02:15:46 -03:00
										 |  |  |     File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path& path); | 
					
						
							|  |  |  |     ~File(); | 
					
						
							| 
									
										
										
										
											2015-02-07 13:06:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     std::string GetName() const override { return "Path: " + path.DebugStr(); } | 
					
						
							| 
									
										
										
										
											2015-05-06 02:15:46 -03:00
										 |  |  |     ResultVal<bool> SyncRequest() override; | 
					
						
							| 
									
										
										
										
											2015-02-07 13:06:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     FileSys::Path path; ///< Path of the file
 | 
					
						
							|  |  |  |     u32 priority; ///< Priority of the file. TODO(Subv): Find out what this means
 | 
					
						
							|  |  |  |     std::unique_ptr<FileSys::FileBackend> backend; ///< File backend interface
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Directory : public Kernel::Session { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2015-05-06 02:15:46 -03:00
										 |  |  |     Directory(std::unique_ptr<FileSys::DirectoryBackend>&& backend, const FileSys::Path& path); | 
					
						
							|  |  |  |     ~Directory(); | 
					
						
							| 
									
										
										
										
											2015-02-07 13:06:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     std::string GetName() const override { return "Directory: " + path.DebugStr(); } | 
					
						
							| 
									
										
										
										
											2015-05-06 02:15:46 -03:00
										 |  |  |     ResultVal<bool> SyncRequest() override; | 
					
						
							| 
									
										
										
										
											2015-02-07 13:06:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     FileSys::Path path; ///< Path of the directory
 | 
					
						
							|  |  |  |     std::unique_ptr<FileSys::DirectoryBackend> backend; ///< File backend interface
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-25 18:15:35 -04:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2014-06-27 16:18:56 -04:00
										 |  |  |  * Opens an archive | 
					
						
							|  |  |  |  * @param id_code IdCode of the archive to open | 
					
						
							| 
									
										
										
										
											2014-12-29 13:04:37 -05:00
										 |  |  |  * @param archive_path Path to the archive, used with Binary paths | 
					
						
							| 
									
										
										
										
											2014-10-23 01:20:01 -02:00
										 |  |  |  * @return Handle to the opened archive | 
					
						
							| 
									
										
										
										
											2014-06-25 18:15:35 -04:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-12-29 13:04:37 -05:00
										 |  |  | ResultVal<ArchiveHandle> OpenArchive(ArchiveIdCode id_code, FileSys::Path& archive_path); | 
					
						
							| 
									
										
										
										
											2014-06-27 16:18:56 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-14 11:52:52 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Closes an archive | 
					
						
							| 
									
										
										
										
											2015-01-20 13:52:44 -05:00
										 |  |  |  * @param handle Handle to the archive to close | 
					
						
							| 
									
										
										
										
											2014-09-14 11:52:52 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-12-15 06:41:02 -02:00
										 |  |  | ResultCode CloseArchive(ArchiveHandle handle); | 
					
						
							| 
									
										
										
										
											2014-09-14 11:52:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-27 16:18:56 -04:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2015-02-06 11:53:14 -02:00
										 |  |  |  * Registers an Archive type, instances of which can later be opened using its IdCode. | 
					
						
							| 
									
										
										
										
											2015-09-10 11:07:33 -04:00
										 |  |  |  * @param factory File system backend interface to the archive | 
					
						
							| 
									
										
										
										
											2014-12-15 02:44:04 -02:00
										 |  |  |  * @param id_code Id code used to access this type of archive | 
					
						
							| 
									
										
										
										
											2014-06-27 16:18:56 -04:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-02-06 11:53:14 -02:00
										 |  |  | ResultCode RegisterArchiveType(std::unique_ptr<FileSys::ArchiveFactory>&& factory, ArchiveIdCode id_code); | 
					
						
							| 
									
										
										
										
											2014-06-25 18:15:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-12 00:45:40 +02:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Open a File from an Archive | 
					
						
							|  |  |  |  * @param archive_handle Handle to an open Archive object | 
					
						
							|  |  |  |  * @param path Path to the File inside of the Archive | 
					
						
							|  |  |  |  * @param mode Mode under which to open the File | 
					
						
							| 
									
										
										
										
											2015-01-30 12:32:46 -02:00
										 |  |  |  * @return The opened File object as a Session | 
					
						
							| 
									
										
										
										
											2014-09-12 00:45:40 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-02-07 13:06:48 -05:00
										 |  |  | ResultVal<Kernel::SharedPtr<File>> OpenFileFromArchive(ArchiveHandle archive_handle, | 
					
						
							| 
									
										
										
										
											2015-01-30 12:32:46 -02:00
										 |  |  |         const FileSys::Path& path, const FileSys::Mode mode); | 
					
						
							| 
									
										
										
										
											2014-10-28 22:52:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-11 10:37:26 -08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Delete a File from an Archive | 
					
						
							|  |  |  |  * @param archive_handle Handle to an open Archive object | 
					
						
							|  |  |  |  * @param path Path to the File inside of the Archive | 
					
						
							|  |  |  |  * @return Whether deletion succeeded | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-12-15 06:41:02 -02:00
										 |  |  | ResultCode DeleteFileFromArchive(ArchiveHandle archive_handle, const FileSys::Path& path); | 
					
						
							| 
									
										
										
										
											2014-11-11 10:37:26 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-23 23:20:04 -08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Rename a File between two Archives | 
					
						
							|  |  |  |  * @param src_archive_handle Handle to the source Archive object | 
					
						
							|  |  |  |  * @param src_path Path to the File inside of the source Archive | 
					
						
							|  |  |  |  * @param dest_archive_handle Handle to the destination Archive object | 
					
						
							|  |  |  |  * @param dest_path Path to the File inside of the destination Archive | 
					
						
							|  |  |  |  * @return Whether rename succeeded | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-12-15 06:41:02 -02:00
										 |  |  | ResultCode RenameFileBetweenArchives(ArchiveHandle src_archive_handle, const FileSys::Path& src_path, | 
					
						
							|  |  |  |                                      ArchiveHandle dest_archive_handle, const FileSys::Path& dest_path); | 
					
						
							| 
									
										
										
										
											2014-11-23 23:20:04 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-11 10:37:26 -08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Delete a Directory from an Archive | 
					
						
							|  |  |  |  * @param archive_handle Handle to an open Archive object | 
					
						
							|  |  |  |  * @param path Path to the Directory inside of the Archive | 
					
						
							|  |  |  |  * @return Whether deletion succeeded | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-12-15 06:41:02 -02:00
										 |  |  | ResultCode DeleteDirectoryFromArchive(ArchiveHandle archive_handle, const FileSys::Path& path); | 
					
						
							| 
									
										
										
										
											2014-11-11 10:37:26 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-20 12:43:50 -03:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Create a File in an Archive | 
					
						
							|  |  |  |  * @param archive_handle Handle to an open Archive object | 
					
						
							|  |  |  |  * @param path Path to the File inside of the Archive | 
					
						
							|  |  |  |  * @param file_size The size of the new file, filled with zeroes | 
					
						
							|  |  |  |  * @return File creation result code | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-12-28 09:38:10 -05:00
										 |  |  | ResultCode CreateFileInArchive(ArchiveHandle archive_handle, const FileSys::Path& path, u64 file_size); | 
					
						
							| 
									
										
										
										
											2014-12-20 12:43:50 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-28 22:52:56 -07:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Create a Directory from an Archive | 
					
						
							|  |  |  |  * @param archive_handle Handle to an open Archive object | 
					
						
							|  |  |  |  * @param path Path to the Directory inside of the Archive | 
					
						
							|  |  |  |  * @return Whether creation of directory succeeded | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-12-15 06:41:02 -02:00
										 |  |  | ResultCode CreateDirectoryFromArchive(ArchiveHandle archive_handle, const FileSys::Path& path); | 
					
						
							| 
									
										
										
										
											2014-09-12 00:45:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-24 01:12:58 -08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Rename a Directory between two Archives | 
					
						
							|  |  |  |  * @param src_archive_handle Handle to the source Archive object | 
					
						
							|  |  |  |  * @param src_path Path to the Directory inside of the source Archive | 
					
						
							|  |  |  |  * @param dest_archive_handle Handle to the destination Archive object | 
					
						
							|  |  |  |  * @param dest_path Path to the Directory inside of the destination Archive | 
					
						
							|  |  |  |  * @return Whether rename succeeded | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-12-15 06:41:02 -02:00
										 |  |  | ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle, const FileSys::Path& src_path, | 
					
						
							|  |  |  |                                           ArchiveHandle dest_archive_handle, const FileSys::Path& dest_path); | 
					
						
							| 
									
										
										
										
											2014-11-24 01:12:58 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-12 00:48:04 +02:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Open a Directory from an Archive | 
					
						
							|  |  |  |  * @param archive_handle Handle to an open Archive object | 
					
						
							|  |  |  |  * @param path Path to the Directory inside of the Archive | 
					
						
							| 
									
										
										
										
											2015-01-30 12:32:46 -02:00
										 |  |  |  * @return The opened Directory object as a Session | 
					
						
							| 
									
										
										
										
											2014-09-12 00:48:04 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-02-07 13:06:48 -05:00
										 |  |  | ResultVal<Kernel::SharedPtr<Directory>> OpenDirectoryFromArchive(ArchiveHandle archive_handle, | 
					
						
							| 
									
										
										
										
											2015-01-30 12:32:46 -02:00
										 |  |  |         const FileSys::Path& path); | 
					
						
							| 
									
										
										
										
											2014-09-12 00:48:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-18 15:52:37 -07:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Get the free space in an Archive | 
					
						
							|  |  |  |  * @param archive_handle Handle to an open Archive object | 
					
						
							|  |  |  |  * @return The number of free bytes in the archive | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | ResultVal<u64> GetFreeBytesInArchive(ArchiveHandle archive_handle); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-16 00:33:41 -05:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2015-02-07 13:31:34 -05:00
										 |  |  |  * Erases the contents of the physical folder that contains the archive | 
					
						
							|  |  |  |  * identified by the specified id code and path | 
					
						
							|  |  |  |  * @param id_code The id of the archive to format | 
					
						
							|  |  |  |  * @param path The path to the archive, if relevant. | 
					
						
							| 
									
										
										
										
											2014-12-16 00:33:41 -05:00
										 |  |  |  * @return ResultCode 0 on success or the corresponding code on error | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-02-07 13:31:34 -05:00
										 |  |  | ResultCode FormatArchive(ArchiveIdCode id_code, const FileSys::Path& path = FileSys::Path()); | 
					
						
							| 
									
										
										
										
											2014-12-16 00:33:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-13 23:56:00 -05:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Creates a blank SharedExtSaveData archive for the specified extdata ID | 
					
						
							| 
									
										
										
										
											2015-03-14 12:00:01 -05:00
										 |  |  |  * @param media_type The media type of the archive to create (NAND / SDMC) | 
					
						
							| 
									
										
										
										
											2015-01-13 23:56:00 -05:00
										 |  |  |  * @param high The high word of the extdata id to create | 
					
						
							|  |  |  |  * @param low The low word of the extdata id to create | 
					
						
							| 
									
										
										
										
											2015-06-01 21:26:40 -05:00
										 |  |  |  * @param icon_buffer VAddr of the SMDH icon for this ExtSaveData | 
					
						
							|  |  |  |  * @param icon_size Size of the SMDH icon | 
					
						
							| 
									
										
										
										
											2015-01-13 23:56:00 -05:00
										 |  |  |  * @return ResultCode 0 on success or the corresponding code on error | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-06-01 21:26:40 -05:00
										 |  |  | ResultCode CreateExtSaveData(MediaType media_type, u32 high, u32 low, VAddr icon_buffer, u32 icon_size); | 
					
						
							| 
									
										
										
										
											2015-03-14 12:00:01 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Deletes the SharedExtSaveData archive for the specified extdata ID | 
					
						
							|  |  |  |  * @param media_type The media type of the archive to delete (NAND / SDMC) | 
					
						
							|  |  |  |  * @param high The high word of the extdata id to delete | 
					
						
							|  |  |  |  * @param low The low word of the extdata id to delete | 
					
						
							|  |  |  |  * @return ResultCode 0 on success or the corresponding code on error | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | ResultCode DeleteExtSaveData(MediaType media_type, u32 high, u32 low); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Deletes the SystemSaveData archive folder for the specified save data id | 
					
						
							|  |  |  |  * @param high The high word of the SystemSaveData archive to delete | 
					
						
							|  |  |  |  * @param low The low word of the SystemSaveData archive to delete | 
					
						
							|  |  |  |  * @return ResultCode 0 on success or the corresponding code on error | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | ResultCode DeleteSystemSaveData(u32 high, u32 low); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Creates the SystemSaveData archive folder for the specified save data id | 
					
						
							|  |  |  |  * @param high The high word of the SystemSaveData archive to create | 
					
						
							|  |  |  |  * @param low The low word of the SystemSaveData archive to create | 
					
						
							|  |  |  |  * @return ResultCode 0 on success or the corresponding code on error | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | ResultCode CreateSystemSaveData(u32 high, u32 low); | 
					
						
							| 
									
										
										
										
											2015-01-13 23:56:00 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-04 13:38:12 -04:00
										 |  |  | /// Initialize archives
 | 
					
						
							|  |  |  | void ArchiveInit(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// Shutdown archives
 | 
					
						
							|  |  |  | void ArchiveShutdown(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-14 05:55:11 -02:00
										 |  |  | } // namespace FS
 | 
					
						
							|  |  |  | } // namespace Service
 |