| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- // Copyright 2014 Citra Emulator Project
- // Licensed under GPLv2 or any later version
- // Refer to the license.txt file included.
- #pragma once
- #include <memory>
- #include <string>
- #include "common/common_types.h"
- #include "core/file_sys/archive_backend.h"
- #include "core/hle/kernel/server_session.h"
- #include "core/hle/result.h"
- namespace FileSys {
- class DirectoryBackend;
- class FileBackend;
- }
- /// The unique system identifier hash, also known as ID0
- extern const std::string SYSTEM_ID;
- /// The scrambled SD card CID, also known as ID1
- extern const std::string SDCARD_ID;
- namespace Service {
- namespace FS {
- /// Supported archive types
- enum class ArchiveIdCode : u32 {
- RomFS = 0x00000003,
- SaveData = 0x00000004,
- ExtSaveData = 0x00000006,
- SharedExtSaveData = 0x00000007,
- SystemSaveData = 0x00000008,
- SDMC = 0x00000009,
- SDMCWriteOnly = 0x0000000A,
- NCCH = 0x2345678A,
- };
- /// Media types for the archives
- enum class MediaType : u32 { NAND = 0, SDMC = 1 };
- typedef u64 ArchiveHandle;
- class File final : public SessionRequestHandler, public std::enable_shared_from_this<File> {
- public:
- File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path& path);
- ~File();
- std::string GetName() const {
- return "Path: " + path.DebugStr();
- }
- 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
- protected:
- void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
- };
- class Directory final : public SessionRequestHandler {
- public:
- Directory(std::unique_ptr<FileSys::DirectoryBackend>&& backend, const FileSys::Path& path);
- ~Directory();
- std::string GetName() const {
- return "Directory: " + path.DebugStr();
- }
- FileSys::Path path; ///< Path of the directory
- std::unique_ptr<FileSys::DirectoryBackend> backend; ///< File backend interface
- protected:
- void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
- };
- /**
- * Opens an archive
- * @param id_code IdCode of the archive to open
- * @param archive_path Path to the archive, used with Binary paths
- * @return Handle to the opened archive
- */
- ResultVal<ArchiveHandle> OpenArchive(ArchiveIdCode id_code, FileSys::Path& archive_path);
- /**
- * Closes an archive
- * @param handle Handle to the archive to close
- */
- ResultCode CloseArchive(ArchiveHandle handle);
- /**
- * Registers an Archive type, instances of which can later be opened using its IdCode.
- * @param factory File system backend interface to the archive
- * @param id_code Id code used to access this type of archive
- */
- ResultCode RegisterArchiveType(std::unique_ptr<FileSys::ArchiveFactory>&& factory,
- ArchiveIdCode id_code);
- /**
- * 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
- * @return The opened File object
- */
- ResultVal<std::shared_ptr<File>> OpenFileFromArchive(ArchiveHandle archive_handle,
- const FileSys::Path& path,
- const FileSys::Mode mode);
- /**
- * 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
- */
- ResultCode DeleteFileFromArchive(ArchiveHandle archive_handle, const FileSys::Path& path);
- /**
- * 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
- */
- ResultCode RenameFileBetweenArchives(ArchiveHandle src_archive_handle,
- const FileSys::Path& src_path,
- ArchiveHandle dest_archive_handle,
- const FileSys::Path& dest_path);
- /**
- * 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
- */
- ResultCode DeleteDirectoryFromArchive(ArchiveHandle archive_handle, const FileSys::Path& path);
- /**
- * Delete a Directory and anything under it 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
- */
- ResultCode DeleteDirectoryRecursivelyFromArchive(ArchiveHandle archive_handle,
- const FileSys::Path& path);
- /**
- * 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
- */
- ResultCode CreateFileInArchive(ArchiveHandle archive_handle, const FileSys::Path& path,
- u64 file_size);
- /**
- * 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
- */
- ResultCode CreateDirectoryFromArchive(ArchiveHandle archive_handle, const FileSys::Path& path);
- /**
- * 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
- */
- ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle,
- const FileSys::Path& src_path,
- ArchiveHandle dest_archive_handle,
- const FileSys::Path& dest_path);
- /**
- * 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
- * @return The opened Directory object
- */
- ResultVal<std::shared_ptr<Directory>> OpenDirectoryFromArchive(ArchiveHandle archive_handle,
- const FileSys::Path& path);
- /**
- * 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);
- /**
- * 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 format_info Format information about the new archive
- * @param path The path to the archive, if relevant.
- * @return ResultCode 0 on success or the corresponding code on error
- */
- ResultCode FormatArchive(ArchiveIdCode id_code, const FileSys::ArchiveFormatInfo& format_info,
- const FileSys::Path& path = FileSys::Path());
- /**
- * Retrieves the format info about the archive of the specified type and path.
- * The format info is supplied by the client code when creating archives.
- * @param id_code The id of the archive
- * @param archive_path The path of the archive, if relevant
- * @return The format info of the archive, or the corresponding error code if failed.
- */
- ResultVal<FileSys::ArchiveFormatInfo> GetArchiveFormatInfo(ArchiveIdCode id_code,
- FileSys::Path& archive_path);
- /**
- * Creates a blank SharedExtSaveData archive for the specified extdata ID
- * @param media_type The media type of the archive to create (NAND / SDMC)
- * @param high The high word of the extdata id to create
- * @param low The low word of the extdata id to create
- * @param icon_buffer VAddr of the SMDH icon for this ExtSaveData
- * @param icon_size Size of the SMDH icon
- * @param format_info Format information about the new archive
- * @return ResultCode 0 on success or the corresponding code on error
- */
- ResultCode CreateExtSaveData(MediaType media_type, u32 high, u32 low, VAddr icon_buffer,
- u32 icon_size, const FileSys::ArchiveFormatInfo& format_info);
- /**
- * 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);
- /// Initialize archives
- void ArchiveInit();
- /// Shutdown archives
- void ArchiveShutdown();
- /// Register all archive types
- void RegisterArchiveTypes();
- /// Unregister all archive types
- void UnregisterArchiveTypes();
- } // namespace FS
- } // namespace Service
|