1 
2 #ifndef FILEHANDLER_H
3 #define FILEHANDLER_H
4 #pragma once
5 
6 #include <cstdint>
7 #include <memory>
8 
9 #include "globalincs/pstypes.h"
10 
11 #if defined(__GNUC__) && !defined(__clang__)
12 #pragma GCC diagnostic push
13 // This suppresses a GCC bug where it thinks that the Cutscenes from the enum class below shadows a global variable
14 #pragma GCC diagnostic ignored "-Wshadow"
15 #endif
16 
17 // sections of a pilot file. includes both plr and csg sections
18 enum class Section {
19 	Invalid = -1,
20 	Unnamed = 0, //!< Special unnamed section
21 	Flags = 0x0001,
22 	Info = 0x0002,
23 	Loadout = 0x0003,
24 	Controls = 0x0004,
25 	Multiplayer = 0x0005,
26 	Scoring = 0x0006,
27 	ScoringMulti = 0x0007,
28 	Techroom = 0x0008,
29 	HUD = 0x0009,
30 	Settings = 0x0010,
31 	RedAlert = 0x0011,
32 	Variables = 0x0012,
33 	Missions = 0x0013,
34 	Cutscenes = 0x0014,
35 	LastMissions = 0x0015
36 };
37 #if defined(__GNUC__) && !defined(__clang__)
38 #pragma GCC diagnostic pop
39 #endif
40 
41 namespace pilot {
42 class FileHandler {
43  public:
~FileHandler()44 	virtual ~FileHandler() {}
45 
46 	virtual void writeUByte(const char* name, std::uint8_t value) = 0;
47 
48 	virtual void writeShort(const char* name, std::int16_t value) = 0;
49 
50 	virtual void writeInt(const char* name, std::int32_t value) = 0;
51 
52 	virtual void writeUInt(const char* name, std::uint32_t value) = 0;
53 
54 	virtual void writeFloat(const char* name, float value) = 0;
55 
56 	virtual void writeString(const char* name, const char* str) = 0;
57 
58 	virtual void beginWritingSections() = 0;
59 
60 	virtual void startSectionWrite(Section id) = 0;
61 
62 	virtual void endSectionWrite() = 0;
63 
64 	virtual void endWritingSections() = 0;
65 
66 	virtual void startArrayWrite(const char* name, size_t size, bool short_length = false) = 0;
67 
68 	virtual void endArrayWrite() = 0;
69 
70 	virtual void flush() = 0;
71 
72 	virtual std::uint8_t readUByte(const char* name) = 0;
73 
74 	virtual std::int16_t readShort(const char* name) = 0;
75 
76 	virtual std::int32_t readInt(const char* name) = 0;
77 
78 	virtual std::uint32_t readUInt(const char* name) = 0;
79 
80 	virtual float readFloat(const char* name) = 0;
81 
82 	virtual SCP_string readString(const char* name) = 0;
83 
readString(const char * name,char * dest,size_t max_size)84 	virtual void readString(const char* name, char* dest, size_t max_size) {
85 		auto string = readString(name);
86 		Assertion(string.size() < max_size, "String in file is too long! Maximum is "
87 			SIZE_T_ARG
88 			" but the file contained a string with length "
89 			SIZE_T_ARG
90 			"!", max_size, string.size());
91 		strcpy_s(dest, max_size, string.c_str());
92 	}
93 
94 	virtual void beginSectionRead() = 0;
95 
96 	virtual bool hasMoreSections() = 0;
97 
98 	virtual Section nextSection() = 0;
99 
100 	virtual void endSectionRead() = 0;
101 
102 	virtual size_t startArrayRead(const char* name, bool short_index = false) = 0;
103 
104 	virtual void nextArraySection() = 0;
105 
106 	virtual void endArrayRead() = 0;
107 };
108 }
109 
110 #endif // FILEHANDLER_H
111