ScummVM API documentation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
stream.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 //=============================================================================
23 //
24 // Base stream class.
25 //
26 // Provides default implementation for a few helper methods.
27 //
28 // Only streams with uncommon behavior should be derived directly from Stream.
29 // Most I/O devices should inherit DataStream instead.
30 //
31 //=============================================================================
32 
33 #ifndef AGS_SHARED_UTIL_STREAM_H
34 #define AGS_SHARED_UTIL_STREAM_H
35 
36 #include "ags/shared/util/iags_stream.h"
37 #include "ags/shared/util/string.h"
38 #include "ags/lib/allegro/file.h"
39 #include "common/stream.h"
40 #include "common/types.h"
41 
42 namespace AGS3 {
43 namespace AGS {
44 namespace Shared {
45 
46 // TODO: merge with FileWorkMode (historical mistake)
47 enum StreamWorkMode {
48  kStream_Read,
49  kStream_Write
50 };
51 
52 class Stream : public IAGSStream {
53 public:
54  Stream() = default;
55  Stream(const String &path)
56  : _path(path) {}
57  virtual ~Stream() {}
58 
59  // Returns an optional path of a stream's source, such as a filepath;
60  // primarily for diagnostic purposes
61  const String &GetPath() const { return _path; }
62  // Tells if there were errors during previous io operation(s);
63  // the call to GetError() *resets* the error record.
64  virtual bool GetError() const { return false; }
65  // Flush stream buffer to the underlying device
66  virtual bool Flush() = 0;
67 
68  //-----------------------------------------------------
69  // Helper methods
70  //-----------------------------------------------------
71  int8_t ReadInt8() override {
72  return ReadByte();
73  }
74 
75  size_t WriteInt8(int8_t val) override {
76  int32_t ival = WriteByte(val);
77  return ival >= 0 ? ival : 0;
78  }
79 
80  bool ReadBool() override {
81  return ReadInt8() != 0;
82  }
83 
84  size_t WriteBool(bool val) override {
85  return WriteInt8(val ? 1 : 0);
86  }
87 
88  // Practically identical to Read() and Write(), these two helpers' only
89  // meaning is to underline the purpose of data being (de)serialized
90  size_t ReadArrayOfInt8(int8_t *buffer, size_t count) override {
91  return Read(buffer, count);
92  }
93  size_t WriteArrayOfInt8(const int8_t *buffer, size_t count) override {
94  return Write(buffer, count);
95  }
96 
97  // Fill the requested number of bytes with particular value
98  size_t WriteByteCount(uint8_t b, size_t count);
99 
100 protected:
101  String _path; // optional name of the stream's source (e.g. filepath)
102 };
103 
105 private:
106  IAGSStream *_stream;
107  DisposeAfterUse::Flag _disposeAfterUse;
108 public:
109  ScummVMReadStream(IAGSStream *src, DisposeAfterUse::Flag disposeAfterUse =
110  DisposeAfterUse::YES) : _stream(src), _disposeAfterUse(disposeAfterUse) {
111  }
112  ~ScummVMReadStream() override {
113  if (_disposeAfterUse == DisposeAfterUse::YES)
114  delete _stream;
115  }
116 
117  bool eos() const override {
118  return _stream->EOS();
119  }
120 
121  uint32 read(void *dataPtr, uint32 dataSize) override {
122  return _stream->Read(dataPtr, dataSize);
123  }
124 
125  int64 pos() const override {
126  return _stream->GetPosition();
127  }
128 
129  int64 size() const override {
130  return _stream->GetLength();
131  }
132 
133  bool seek(int64 offset, int whence = SEEK_SET) override {
134  StreamSeek origin = kSeekBegin;
135  if (whence == SEEK_CUR)
136  origin = kSeekCurrent;
137  if (whence == SEEK_END)
138  origin = kSeekEnd;
139 
140  return _stream->Seek(offset, origin);
141  }
142 };
143 
144 
146 private:
147  PACKFILE *_file;
148  DisposeAfterUse::Flag _disposeAfterUse;
149 public:
150  ScummVMPackReadStream(PACKFILE *src, DisposeAfterUse::Flag disposeAfterUse =
151  DisposeAfterUse::YES) : _file(src), _disposeAfterUse(disposeAfterUse) {
152  }
153  ~ScummVMPackReadStream() override {
154  if (_disposeAfterUse == DisposeAfterUse::YES)
155  delete _file;
156  }
157 
158  bool eos() const override {
159  return _file->pack_feof();
160  }
161 
162  uint32 read(void *dataPtr, uint32 dataSize) override {
163  return _file->pack_fread(dataPtr, dataSize);
164  }
165 
166  int64 pos() const override {
167  error("Unsupported");
168  }
169 
170  int64 size() const override {
171  error("Unsupported");
172  }
173 
174  bool seek(int64 offset, int whence = SEEK_SET) override {
175  error("Unsupported");
176  }
177 };
178 
179 class StreamScummVMFile : public Stream {
180 private:
182  DisposeAfterUse::Flag _disposeAfterUse;
183 public:
185  DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::NO) :
186  _stream(stream), _disposeAfterUse(disposeAfterUse) {
187  }
188  ~StreamScummVMFile() override {
189  Close();
190  }
191 
192  void Close() override {
193  if (_disposeAfterUse == DisposeAfterUse::YES)
194  delete _stream;
195  _stream = nullptr;
196  }
197 
198  bool IsValid() const override {
199  return _stream != nullptr;
200  }
201  bool EOS() const override {
202  return _stream->eos();
203  }
204  soff_t GetLength() const override {
205  return _stream->size();
206  }
207  soff_t GetPosition() const override {
208  return _stream->pos();
209  }
210  bool CanRead() const override {
211  return true;
212  }
213  bool CanWrite() const override {
214  return false;
215  }
216  bool CanSeek() const override {
217  return true;
218  }
219 
220  size_t Read(void *buffer, size_t size) override {
221  return _stream->read(buffer, size);
222  }
223  int32_t ReadByte() override {
224  return _stream->readByte();
225  }
226  size_t Write(const void *buffer, size_t size) override {
227  return 0;
228  }
229  int32_t WriteByte(uint8_t b) override {
230  return 0;
231  }
232 
233  int8_t ReadInt8() override {
234  return (int8)_stream->readByte();
235  }
236  int16_t ReadInt16() override {
237  return _stream->readSint16LE();
238  }
239  int32_t ReadInt32() override {
240  return _stream->readSint32LE();
241  }
242  int64_t ReadInt64() override {
243  return _stream->readSint64LE();
244  }
245  bool ReadBool() override {
246  return _stream->readByte() != 0;
247  }
248  size_t ReadArray(void *buffer, size_t elem_size, size_t count) override {
249  return _stream->read(buffer, elem_size * count) / elem_size;
250  }
251  size_t ReadArrayOfInt8(int8_t *buffer, size_t count) override {
252  return _stream->read(buffer, count);
253  }
254  size_t ReadArrayOfInt16(int16_t *buffer, size_t count) override {
255  for (size_t i = 0; i < count; ++i)
256  *buffer++ = _stream->readSint16LE();
257  return count;
258  }
259  size_t ReadArrayOfInt32(int32_t *buffer, size_t count) override {
260  for (size_t i = 0; i < count; ++i)
261  *buffer++ = _stream->readSint32LE();
262  return count;
263  }
264  size_t ReadArrayOfInt64(int64_t *buffer, size_t count) override {
265  for (size_t i = 0; i < count; ++i)
266  *buffer++ = _stream->readSint64LE();
267  return count;
268  }
269 
270  size_t WriteInt8(int8_t val) override {
271  return 0;
272  }
273  size_t WriteInt16(int16_t val) override {
274  return 0;
275  }
276  size_t WriteInt32(int32_t val) override {
277  return 0;
278  }
279  size_t WriteInt64(int64_t val) override {
280  return 0;
281  }
282  size_t WriteBool(bool val) override {
283  return 0;
284  }
285  size_t WriteArray(const void *buffer, size_t elem_size, size_t count) override {
286  return 0;
287  }
288  size_t WriteArrayOfInt8(const int8_t *buffer, size_t count) override {
289  return 0;
290  }
291  size_t WriteArrayOfInt16(const int16_t *buffer, size_t count) override {
292  return 0;
293  }
294  size_t WriteArrayOfInt32(const int32_t *buffer, size_t count) override {
295  return 0;
296  }
297  size_t WriteArrayOfInt64(const int64_t *buffer, size_t count) override {
298  return 0;
299  }
300 
301  soff_t Seek(soff_t offset, StreamSeek origin = kSeekCurrent) override {
302  return _stream->seek(offset, origin);
303  }
304 
305  bool GetError() const override {
306  return _stream->err();
307  }
308  bool Flush() override {
309  return true;
310  }
311 };
312 
313 } // namespace Shared
314 } // namespace AGS
315 } // namespace AGS3
316 
317 #endif
Definition: achievements_tables.h:27
uint32 read(void *dataPtr, uint32 dataSize) override
Definition: stream.h:121
virtual int64 size() const =0
uint32 read(void *dataPtr, uint32 dataSize) override
Definition: stream.h:162
virtual int64 pos() const =0
virtual bool err() const
Definition: stream.h:61
FORCEINLINE int32 readSint32LE()
Definition: stream.h:555
int64 size() const override
Definition: stream.h:129
Definition: file.h:62
Definition: iags_stream.h:53
virtual bool seek(int64 offset, int whence=SEEK_SET)=0
virtual bool eos() const =0
bool eos() const override
Definition: stream.h:158
Definition: stream.h:745
bool eos() const override
Definition: stream.h:117
byte readByte()
Definition: stream.h:434
bool seek(int64 offset, int whence=SEEK_SET) override
Definition: stream.h:133
int64 size() const override
Definition: stream.h:170
FORCEINLINE int64 readSint64LE()
Definition: stream.h:567
bool seek(int64 offset, int whence=SEEK_SET) override
Definition: stream.h:174
int64 pos() const override
Definition: stream.h:166
Definition: stream.h:179
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
Definition: string.h:62
FORCEINLINE int16 readSint16LE()
Definition: stream.h:543
int64 pos() const override
Definition: stream.h:125
Definition: stream.h:104
Definition: stream.h:52
Definition: ags.h:40
virtual uint32 read(void *dataPtr, uint32 dataSize)=0