Tiberian Technologies Scripts Reference Revision: 9000
Loading...
Searching...
No Matches
BufferedFileClass.h
1/* Renegade Scripts.dll
2 Copyright 2013 Tiberian Technologies
3
4 This file is part of the Renegade scripts.dll
5 The Renegade scripts.dll is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2, or (at your option) any later
8 version. See the file COPYING for more details.
9 In addition, an exemption is given to allow Run Time Dynamic Linking of this code with any closed source module that does not contain code covered by this licence.
10 Only the source code to the module(s) containing the licenced code has to be released.
11*/
12#ifndef TT_INCLUDE_BUFFEREDFILECLASS_H
13#define TT_INCLUDE_BUFFEREDFILECLASS_H
14
15#include "RawFileClass.h"
16class BufferedFileClass : public RawFileClass {
17private:
18 unsigned char* Buffer;
19 unsigned int BufferSize;
20 int BufferAvailable;
21 int BufferOffset;
22public:
23 BufferedFileClass() : Buffer(0), BufferSize(0), BufferAvailable(0), BufferOffset(0)
24 {
25 }
26 ~BufferedFileClass()
27 {
28 Reset_Buffer();
29 }
30 int Read(void* buffer,int size)
31 {
32 void *tmp = buffer;
33 int sz = size;
34 int result = 0;
35 if (BufferAvailable > 0)
36 {
37 int buf = BufferAvailable;
38 if (buf > size)
39 {
40 buf = size;
41 }
42 memcpy(buffer, Buffer + BufferOffset, buf);
43 BufferAvailable -= buf;
44 BufferOffset += buf;
45 sz -= buf;
46 tmp = (char *)tmp + buf;
47 result += buf;
48 }
49 if (sz)
50 {
51 int buf = BufferSize;
52 if (!buf)
53 {
54 buf = 16384;
55 }
56 if (sz > buf)
57 {
58 return result + RawFileClass::Read(tmp,sz);
59 }
60 if (!BufferSize)
61 {
62 BufferSize = 16384;
63 Buffer = new unsigned char[16384];
64 BufferAvailable = 0;
65 BufferOffset = 0;
66 }
67 if (!Buffer)
68 {
69 return 0;
70 }
71 if (!BufferAvailable)
72 {
73 BufferAvailable = RawFileClass::Read(Buffer,BufferSize);
74 BufferOffset = 0;
75 }
76 if (BufferAvailable > 0)
77 {
78 int buf2 = BufferAvailable;
79 if (buf2 > sz)
80 {
81 buf2 = sz;
82 }
83 if (!Buffer)
84 {
85 return 0;
86 }
87 memcpy(tmp,Buffer+BufferOffset,buf2);
88 BufferAvailable -= buf2;
89 BufferOffset += buf2;
90 result += buf2;
91 }
92 }
93 return result;
94 }
95 int Seek(int pos,int dir)
96 {
97 if (dir != 1 || pos < 0)
98 {
99 Reset_Buffer();
100 }
101 if (BufferAvailable)
102 {
103 int buf = BufferAvailable;
104 if (buf > pos)
105 {
106 buf = pos;
107 }
108 BufferAvailable -= buf;
109 BufferOffset += buf;
110 return RawFileClass::Seek(pos - buf,dir) - BufferAvailable;
111 }
112 else
113 {
114 return RawFileClass::Seek(pos,dir);
115 }
116 }
117 int Write(void* buffer,int size)
118 {
119 return RawFileClass::Write(buffer,size);
120 }
121 void Close()
122 {
123 RawFileClass::Close();
124 Reset_Buffer();
125 }
126 void Reset_Buffer()
127 {
128 if (Buffer)
129 {
130 delete[] Buffer;
131 Buffer = 0;
132 BufferSize = 0;
133 BufferAvailable = 0;
134 BufferOffset = 0;
135 }
136 }
137};
138
139#endif