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