summaryrefslogtreecommitdiff
path: root/common/file.h
blob: d891e9c1cc213ccdcf170f636dcb9892bf069f1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#ifndef _FILE_H_
#define _FILE_H_

#include <stdio.h>
#include <string.h>
#include "defines.h"

class File
{
public:
	// Constructors
	File();
	virtual ~File();

	// Implementation
public:
	virtual unsigned long GetPosition() const = 0;
	virtual unsigned long Seek(long lOff, int nFrom) = 0;
	virtual void SetLength(unsigned long nNewLen) = 0;
	virtual unsigned long GetLength() const = 0;

	virtual char* ReadString(char* pBuf, unsigned long nMax)=0;
	virtual unsigned long Read(void* pBuf, unsigned long nCount)=0;
	virtual unsigned long Write(const void* pBuf, unsigned long nCount)=0;
	virtual int GetChar()=0;
	virtual int PutChar(int c)=0;

	unsigned long ReadByte(void* pBuf, unsigned long nCount);
	unsigned long ReadShort(void* pBuf, unsigned long nCount);
	unsigned long ReadLong(void* pBuf, unsigned long nCount);
	unsigned long ReadFloat(void* pBuf, unsigned long nCount);
	unsigned long ReadDouble(void* pBuf, unsigned long nCount);
	unsigned long WriteByte(const void* pBuf, unsigned long nCount);
	unsigned long WriteShort(const void* pBuf, unsigned long nCount);
	unsigned long WriteLong(const void* pBuf, unsigned long nCount);
	unsigned long WriteFloat(const void* pBuf, unsigned long nCount);
	unsigned long WriteDouble(const void* pBuf, unsigned long nCount);

	virtual void Abort()=0;
	virtual void Flush()=0;
	virtual void Close()=0;

	const char* GetFileName() const
		{ return FileName; }
	
	void SetFileName(const char* Name)
		{ strncpy(FileName, Name, LC_MAXPATH); }

protected:
	char FileName[LC_MAXPATH];
};

class FileMem : public File
{
public:
// Constructors
	FileMem();
	~FileMem();

// Implementation
public:
	unsigned long GetPosition() const;
	unsigned long Seek(long lOff, int nFrom);
	void SetLength(unsigned long nNewLen);
	unsigned long GetLength() const;

	char* ReadString(char* pBuf, unsigned long nMax);
	unsigned long Read(void* pBuf, unsigned long nCount);
	unsigned long Write(const void* pBuf, unsigned long nCount);
	int GetChar();
	int PutChar(int c);

	void Abort();
	void Flush();
	void Close();
	bool Open(const char *filename, const char *mode);

protected:
	// MemFile specific:
	unsigned long m_nGrowBytes;
	unsigned long m_nPosition;
	unsigned long m_nBufferSize;
	unsigned long m_nFileSize;
	unsigned char* m_pBuffer;
	bool m_bAutoDelete;
	void GrowFile(unsigned long nNewLen);
};

class FileDisk : public File
{
public:
// Constructors
	FileDisk();
	~FileDisk();

// Implementation
public:
	unsigned long GetPosition() const;
	unsigned long Seek(long lOff, int nFrom);
	void SetLength(unsigned long nNewLen);
	unsigned long GetLength() const;

	char* ReadString(char* pBuf, unsigned long nMax);
	unsigned long Read(void* pBuf, unsigned long nCount);
	unsigned long Write(const void* pBuf, unsigned long nCount);
	int GetChar();
	int PutChar(int c);

	void Abort();
	void Flush();
	void Close();
	bool Open(const char *filename, const char *mode);

protected:
	// DiscFile specific:
	FILE* m_hFile;
	bool m_bCloseOnDelete;
};

#endif // _FILE_H_