header.hpp (2548B)
1 #ifndef UUID_F87DF453_742A_4C38_8660_ABC81ACB04B8 2 #define UUID_F87DF453_742A_4C38_8660_ABC81ACB04B8 3 #pragma once 4 5 #include "file.hpp" 6 #include "../../source.hpp" 7 #include "../item.hpp" 8 9 #include <boost/endian/arithmetic.hpp> 10 11 #include <optional> 12 13 namespace Neptools::Stsc 14 { 15 16 class HeaderItem final : public Item 17 { 18 LIBSHIT_DYNAMIC_OBJECT; 19 public: 20 struct Header 21 { 22 char magic[4]; 23 boost::endian::little_uint32_t entry_point; 24 boost::endian::little_uint32_t flags; 25 26 void Validate(FilePosition size) const; 27 }; 28 static_assert(sizeof(Header) == 12); 29 30 struct ExtraHeader2Ser 31 { 32 boost::endian::little_uint16_t field_0; 33 boost::endian::little_uint16_t field_2; 34 boost::endian::little_uint16_t field_4; 35 boost::endian::little_uint16_t field_6; 36 boost::endian::little_uint16_t field_8; 37 boost::endian::little_uint16_t field_a; 38 boost::endian::little_uint16_t field_c; 39 }; 40 static_assert(sizeof(ExtraHeader2Ser) == 14); 41 42 class LIBSHIT_LUAGEN(name: "extra_headers_2") ExtraHeaders2 43 : public Libshit::Lua::ValueObject 44 { 45 LIBSHIT_LUA_CLASS; 46 47 public: 48 std::uint16_t field_0; 49 std::uint16_t field_2; 50 std::uint16_t field_4; 51 std::uint16_t field_6; 52 std::uint16_t field_8; 53 std::uint16_t field_a; 54 std::uint16_t field_c; 55 56 ExtraHeaders2( 57 std::uint16_t field_0, std::uint16_t field_2, std::uint16_t field_4, 58 std::uint16_t field_6, std::uint16_t field_8, std::uint16_t field_a, 59 std::uint16_t field_c) noexcept 60 : field_0{field_0}, field_2{field_2}, field_4{field_4}, 61 field_6{field_6}, field_8{field_8}, field_a{field_a}, 62 field_c{field_c} {} 63 }; 64 65 HeaderItem(Key k, Context& ctx, Source src); 66 HeaderItem( 67 Key k, Context& ctx, Libshit::NotNull<LabelPtr> entry_point, 68 std::optional<Libshit::StringView> extra_headers_1, 69 std::optional<ExtraHeaders2> extra_headers_2, 70 std::optional<uint16_t> extra_headers_4); 71 static HeaderItem& CreateAndInsert(ItemPointer ptr, Flavor flavor); 72 73 FilePosition GetSize() const noexcept override; 74 75 Libshit::NotNull<LabelPtr> entry_point; 76 77 std::optional<std::array<std::uint8_t, 32>> extra_headers_1; 78 std::optional<ExtraHeaders2> extra_headers_2; 79 std::optional<std::uint16_t> extra_headers_4; 80 81 private: 82 void Parse_(Context& ctx, Source& src); 83 void Dump_(Sink& sink) const override; 84 void Inspect_(std::ostream& os, unsigned indent) const override; 85 }; 86 87 } 88 89 #endif