1 #pragma once 2 3 #include <array> 4 #include <boost/serialization/array.hpp> 5 #include <boost/serialization/base_object.hpp> 6 #include <boost/serialization/export.hpp> 7 #include "common/common_types.h" 8 #include "common/file_util.h" 9 10 namespace FileSys { 11 12 /** 13 * Interface for reading RomFS data. 14 */ 15 class RomFSReader { 16 public: 17 virtual ~RomFSReader() = default; 18 19 virtual std::size_t GetSize() const = 0; 20 virtual std::size_t ReadFile(std::size_t offset, std::size_t length, u8* buffer) = 0; 21 22 private: 23 template <class Archive> serialize(Archive & ar,const unsigned int file_version)24 void serialize(Archive& ar, const unsigned int file_version) {} 25 friend class boost::serialization::access; 26 }; 27 28 /** 29 * A RomFS reader that directly reads the RomFS file. 30 */ 31 class DirectRomFSReader : public RomFSReader { 32 public: DirectRomFSReader(FileUtil::IOFile && file,std::size_t file_offset,std::size_t data_size)33 DirectRomFSReader(FileUtil::IOFile&& file, std::size_t file_offset, std::size_t data_size) 34 : is_encrypted(false), file(std::move(file)), file_offset(file_offset), 35 data_size(data_size) {} 36 DirectRomFSReader(FileUtil::IOFile && file,std::size_t file_offset,std::size_t data_size,const std::array<u8,16> & key,const std::array<u8,16> & ctr,std::size_t crypto_offset)37 DirectRomFSReader(FileUtil::IOFile&& file, std::size_t file_offset, std::size_t data_size, 38 const std::array<u8, 16>& key, const std::array<u8, 16>& ctr, 39 std::size_t crypto_offset) 40 : is_encrypted(true), file(std::move(file)), key(key), ctr(ctr), file_offset(file_offset), 41 crypto_offset(crypto_offset), data_size(data_size) {} 42 43 ~DirectRomFSReader() override = default; 44 GetSize()45 std::size_t GetSize() const override { 46 return data_size; 47 } 48 49 std::size_t ReadFile(std::size_t offset, std::size_t length, u8* buffer) override; 50 51 private: 52 bool is_encrypted; 53 FileUtil::IOFile file; 54 std::array<u8, 16> key; 55 std::array<u8, 16> ctr; 56 u64 file_offset; 57 u64 crypto_offset; 58 u64 data_size; 59 60 DirectRomFSReader() = default; 61 62 template <class Archive> serialize(Archive & ar,const unsigned int)63 void serialize(Archive& ar, const unsigned int) { 64 ar& boost::serialization::base_object<RomFSReader>(*this); 65 ar& is_encrypted; 66 ar& file; 67 ar& key; 68 ar& ctr; 69 ar& file_offset; 70 ar& crypto_offset; 71 ar& data_size; 72 } 73 friend class boost::serialization::access; 74 }; 75 76 } // namespace FileSys 77 78 BOOST_CLASS_EXPORT_KEY(FileSys::DirectRomFSReader) 79