1#ifndef SEAD_SHARC_ARCHIVE_RES_H_
2#define SEAD_SHARC_ARCHIVE_RES_H_
3
4#include <basis/seadTypes.h>
5#include <container/seadBuffer.h>
6#include <filedevice/seadFileDevice.h>
7#include <prim/seadEndian.h>
8#include <prim/seadSafeString.h>
9#include <resource/seadArchiveRes.h>
10
11namespace sead
12{
13class SharcArchiveRes : public ArchiveRes
14{
15 SEAD_RTTI_OVERRIDE(SharcArchiveRes, ArchiveRes)
16
17public:
18 struct ArchiveBlockHeader
19 {
20 char signature[4];
21 u16 header_size;
22 u16 byte_order;
23 u32 file_size;
24 u32 data_block_offset;
25 u16 version;
26 u16 reserved;
27 };
28
29 struct FATBlockHeader
30 {
31 char signature[4];
32 u16 header_size;
33 u16 file_num;
34 u32 hash_key;
35 };
36
37 struct FATEntry
38 {
39 u32 hash;
40 u32 name_offset;
41 u32 data_start_offset;
42 u32 data_end_offset;
43 };
44
45 struct FNTBlockHeader
46 {
47 char signature[4];
48 u16 header_size;
49 u16 reserved;
50 };
51
52public:
53 SharcArchiveRes();
54 ~SharcArchiveRes() override;
55
56 const void* getFileImpl_(const SafeString& file_path,
57 FileInfo* file_info = NULL) const override;
58 const void* getFileFastImpl_(s32 entry_id, FileInfo* file_info) const override;
59 s32 convertPathToEntryIDImpl_(const SafeString& file_path) const override;
60 bool setCurrentDirectoryImpl_(const SafeString&) override;
61 bool openDirectoryImpl_(HandleBuffer* handle, const SafeString& path) const override;
62 bool closeDirectoryImpl_(HandleBuffer* handle) const override;
63 u32 readDirectoryImpl_(HandleBuffer* handle, DirectoryEntry* entry, u32 num) const override;
64 bool isExistFileImpl_(const SafeString& path) const override;
65 bool prepareArchive_(const void* archive) override;
66
67protected:
68 struct HandleInner;
69 HandleInner* getHandleInner_(HandleBuffer* handle, bool create = false) const;
70
71 static const u32 cArchiveVersion = 0x100;
72 static const u32 cArchiveEntryMax = 0x3fff;
73 static const u32 cFileNameTableAlign = 4;
74
75 const ArchiveBlockHeader* mArchiveBlockHeader;
76 const FATBlockHeader* mFATBlockHeader;
77 const char* mFNTBlock;
78 Buffer<const FATEntry> mFATEntrys;
79 const u8* mDataBlock;
80 Endian::Types mEndianType;
81};
82
83} // namespace sead
84
85#endif // SEAD_SHARC_ARCHIVE_RES_H_
86