28#include "../corepp/class.h"
29#include "../corepp/str.h"
30#include "../corepp/vector.h"
32#define ARCHIVE_NULL_POINTER (-654321)
33#define ARCHIVE_POINTER_VALID (0)
34#define ARCHIVE_POINTER_NULL (ARCHIVE_NULL_POINTER)
35#define ARCHIVE_POINTER_SELF_REFERENTIAL (-123456)
36#define ARCHIVE_USE_TYPES
56using fileSize_t = uint32_t;
73 const char *Filename(
void);
78 qboolean Seek(
size_t newpos);
79 qboolean OpenRead(
const char *name);
80 qboolean OpenWrite(
const char *name);
81 qboolean Read(
void *dest,
size_t size);
82 qboolean Write(
const void *source,
size_t size);
102 void CheckRead(
void);
103 void CheckType(
int type);
105 fileSize_t ReadSize(
void);
106 void CheckSize(
int type, fileSize_t size);
107 void ArchiveData(
int type,
void *data,
size_t size);
109 void CheckWrite(
void);
110 void WriteType(
int type);
111 void WriteSize(fileSize_t size);
116 void FileError(
const char *fmt, ...) Q_PRINTF_FUNC(2, 3);
118 void CloseDeferred(
void);
120 qboolean SeekToStart(
void);
121 size_t FileLength(
void);
122 byte *DetachFileBuffer(
void);
124 qboolean Read(str& name, qboolean bHardError = qtrue);
125 qboolean Read(
const char *name, qboolean bHardError = qtrue);
126 Class *ReadObject(
void);
128 qboolean Create(str& name, qboolean bHardError = qtrue);
129 qboolean Create(
const char *name, qboolean bHardError = qtrue);
131 qboolean Loading(
void);
132 qboolean Saving(
void);
133 qboolean NoErrors(
void);
135 void ArchiveVector(Vector *vec);
136 void ArchiveQuat(Quat *quat);
137 void ArchiveInteger(
int *num);
138 void ArchiveUnsigned(
unsigned *unum);
139 void ArchiveSize(
long *unum);
140 void ArchiveByte(
byte *num);
141 void ArchiveChar(
char *ch);
142 void ArchiveShort(
short *num);
143 void ArchiveUnsignedShort(
unsigned short *num);
144 void ArchiveFloat(
float *num);
145 void ArchiveDouble(
double *num);
146 void ArchiveBoolean(qboolean *
boolean);
147 void ArchiveString(str *
string);
148 void ArchiveObjectPointer(LightClass **ptr);
149 void ArchiveObjectPointer(Class **ptr);
150 void ArchiveObjectPosition(LightClass *obj);
151 void ArchiveSafePointer(SafePtrBase *ptr);
152 void ArchiveEventPointer(Event **ev);
153 void ArchiveBool(
bool *
boolean);
154 void ArchivePosition(
int *pos);
155 void ArchiveSvsTime(
int *time);
156 void ArchiveVec2(vec2_t vec);
157 void ArchiveVec3(vec3_t vec);
158 void ArchiveVec4(vec4_t vec);
160 void ArchiveRaw(
void *data,
size_t size);
161 void ArchiveObject(Class *obj);
162 void ArchiveObject(SafePtrBase *obj);
164 qboolean ObjectPositionExists(
void *obj);
167 size_t Counter()
const;
169 void ArchiveConfigString(
int cs);
170 void SetSilent(
bool bSilent);
174inline void Container<Type>::Archive(
Archiver& arc,
void (*ArchiveFunc)(
Archiver& arc, Type *obj))
181 arc.ArchiveInteger(&num);
184 if (num > numobjects) {
188 for (i = 0; i < num; i++) {
189 obj =
new (objlist + i) Type();
190 ArchiveFunc(arc, obj);
194 arc.ArchiveInteger(&num);
196 for (i = 0; i < num; i++) {
197 ArchiveFunc(arc, &objlist[i]);
203inline void Container<str>::Archive(
Archiver& arc)
209 arc.ArchiveInteger(&num);
213 arc.ArchiveInteger(&num);
215 for (i = 1; i <= num; i++) {
216 arc.ArchiveString(AddressOfObjectAt(i));
221inline void Container<Vector>::Archive(
Archiver& arc)
227 arc.ArchiveInteger(&num);
231 arc.ArchiveInteger(&num);
233 for (i = 1; i <= num; i++) {
234 arc.ArchiveVector(AddressOfObjectAt(i));
239inline void Container<int>::Archive(
Archiver& arc)
245 arc.ArchiveInteger(&num);
249 arc.ArchiveInteger(&num);
251 for (i = 1; i <= num; i++) {
252 arc.ArchiveInteger(AddressOfObjectAt(i));
257inline void Container<float>::Archive(
Archiver& arc)
263 arc.ArchiveInteger(&num);
267 arc.ArchiveInteger(&num);
269 for (i = 1; i <= num; i++) {
270 arc.ArchiveFloat(AddressOfObjectAt(i));
275inline void ArchiveClass(
Archiver& arc, c *obj)
277 arc.ArchiveObject(obj);
280template<
typename Type>
281void Container<Type>::Archive(
Archiver& arc)
283 Archive(arc, ArchiveClass<Type>);
288template<
typename key,
typename value>
289void con_set<key, value>::Archive(
Archiver& arc)
295 arc.ArchiveUnsigned(&tableLength);
296 arc.ArchiveUnsigned(&threshold);
297 arc.ArchiveUnsigned(&count);
298 arc.ArchiveUnsignedShort(&tableLengthIndex);
301 if (tableLength != 1) {
302 table =
new (NewTable(tableLength)) Entry *[tableLength]();
303 memset(table, 0, tableLength *
sizeof(Entry *));
306 for (i = 0; i < count; i++) {
310 hash = HashCode<key>(e->GetKey()) % tableLength;
312 e->next = table[hash];
323 for (i = 0; i < tableLength; i++) {
324 for (e = table[i]; e != NULL; e = e->next) {
330 assert(total == count);
332 for (i = 0; i < tableLength; i++) {
333 for (e = table[i]; e != NULL; e = e->next) {
341template<
typename key,
typename value>
342void con_map<key, value>::Archive(
Archiver& arc)
344 m_con_set.Archive(arc);
349#define ArchiveEnum(thing, type) \
353 tempInt = (int)(thing); \
354 arc.ArchiveInteger(&tempInt); \
355 (thing) = (type)tempInt; \
358#define MAX_DEFERRED_SAVE_FILENAME 256
360extern byte *g_deferredSaveBuffer;
361extern size_t g_deferredSaveLength;
362extern char g_deferredSaveFilename[MAX_DEFERRED_SAVE_FILENAME];
363extern qboolean g_deferredSavePending;
365qboolean DeferredSave_Tick(
int max_ms);
366void DeferredSave_Cancel(
void);
368void Archive_StashValidatedLoad(
const char *name,
byte *buf,
size_t len);
369void Archive_ClearPendingLoad(
void);