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