[Scummvm-git-logs] scummvm master -> 98eddcda1d4ec6b6e839ce0abdf09c55394474b2
dreammaster
paulfgilbert at gmail.com
Sun Oct 6 04:03:04 CEST 2019
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
8ab36786a4 GLK: Splitting bulk of FileStream up into an IOStream base class
98eddcda1d GLK: Add Streams methods for encapsulating ScummVM streams
Commit: 8ab36786a4caa4033d9bb6d27b5fd8e0224fbdf2
https://github.com/scummvm/scummvm/commit/8ab36786a4caa4033d9bb6d27b5fd8e0224fbdf2
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2019-10-05T18:39:23-07:00
Commit Message:
GLK: Splitting bulk of FileStream up into an IOStream base class
Changed paths:
engines/glk/streams.cpp
engines/glk/streams.h
diff --git a/engines/glk/streams.cpp b/engines/glk/streams.cpp
index 4d517a2..a2d5ca2 100644
--- a/engines/glk/streams.cpp
+++ b/engines/glk/streams.cpp
@@ -775,60 +775,28 @@ uint MemoryStream::getLineUni(uint32 *ubuf, uint len) {
/*--------------------------------------------------------------------------*/
-FileStream::FileStream(Streams *streams, frefid_t fref, uint fmode, uint rock, bool unicode) :
- Stream(streams, fmode == filemode_Read, fmode != filemode_Read, rock, unicode), _lastOp(0),
- _textFile(fref->_textMode), _inFile(nullptr), _outFile(nullptr), _inStream(nullptr) {
- Common::String fname = fref->_slotNumber == -1 ? fref->_filename : fref->getSaveName();
-
- if (fmode == filemode_Write || fmode == filemode_ReadWrite || fmode == filemode_WriteAppend) {
- _outFile = g_system->getSavefileManager()->openForSaving(fname, false);
- if (!_outFile)
- error("Could open file for writing - %s", fname.c_str());
-
- } else if (fmode == filemode_Read) {
- if (_file.open(fname)) {
- _inStream = &_file;
- } else {
- _inFile = g_system->getSavefileManager()->openForLoading(fname);
- _inStream = _inFile;
- }
-
- if (!_inStream)
- error("Could not open for reading - %s", fname.c_str());
- }
-}
-
-FileStream::~FileStream() {
- _file.close();
- delete _inFile;
- if (_outFile) {
- _outFile->finalize();
- delete _outFile;
- }
-}
-
-void FileStream::ensureOp(FileMode mode) {
+void IOStream::ensureOp(FileMode mode) {
// No implementation
}
-void FileStream::putChar(unsigned char ch) {
+void IOStream::putChar(unsigned char ch) {
if (!_writable)
return;
++_writeCount;
ensureOp(filemode_Write);
if (!_unicode) {
- _outFile->writeByte(ch);
+ _outStream->writeByte(ch);
} else if (_textFile) {
putCharUtf8((uint)ch);
} else {
- _outFile->writeUint32BE(ch);
+ _outStream->writeUint32BE(ch);
}
- _outFile->flush();
+ _outStream->flush();
}
-void FileStream::putCharUni(uint32 ch) {
+void IOStream::putCharUni(uint32 ch) {
if (!_writable)
return;
++_writeCount;
@@ -837,17 +805,17 @@ void FileStream::putCharUni(uint32 ch) {
if (!_unicode) {
if (ch >= 0x100)
ch = '?';
- _outFile->writeByte(ch);
+ _outStream->writeByte(ch);
} else if (_textFile) {
putCharUtf8(ch);
} else {
- _outFile->writeUint32BE(ch);
+ _outStream->writeUint32BE(ch);
}
- _outFile->flush();
+ _outStream->flush();
}
-void FileStream::putBuffer(const char *buf, size_t len) {
+void IOStream::putBuffer(const char *buf, size_t len) {
if (!_writable)
return;
_writeCount += len;
@@ -856,18 +824,18 @@ void FileStream::putBuffer(const char *buf, size_t len) {
for (size_t lx = 0; lx < len; lx++) {
unsigned char ch = ((const unsigned char *)buf)[lx];
if (!_unicode) {
- _outFile->writeByte(ch);
+ _outStream->writeByte(ch);
} else if (_textFile) {
putCharUtf8((uint)ch);
} else {
- _outFile->writeUint32BE(ch);
+ _outStream->writeUint32BE(ch);
}
}
- _outFile->flush();
+ _outStream->flush();
}
-void FileStream::putBufferUni(const uint32 *buf, size_t len) {
+void IOStream::putBufferUni(const uint32 *buf, size_t len) {
if (!_writable)
return;
_writeCount += len;
@@ -879,38 +847,38 @@ void FileStream::putBufferUni(const uint32 *buf, size_t len) {
if (!_unicode) {
if (ch >= 0x100)
ch = '?';
- _outFile->writeByte(ch);
+ _outStream->writeByte(ch);
} else if (_textFile) {
putCharUtf8(ch);
} else {
- _outFile->writeUint32BE(ch);
+ _outStream->writeUint32BE(ch);
}
}
- _outFile->flush();
+ _outStream->flush();
}
-void FileStream::putCharUtf8(uint val) {
+void IOStream::putCharUtf8(uint val) {
if (val < 0x80) {
- _outFile->writeByte(val);
+ _outStream->writeByte(val);
} else if (val < 0x800) {
- _outFile->writeByte((0xC0 | ((val & 0x7C0) >> 6)));
- _outFile->writeByte((0x80 | (val & 0x03F)));
+ _outStream->writeByte((0xC0 | ((val & 0x7C0) >> 6)));
+ _outStream->writeByte((0x80 | (val & 0x03F)));
} else if (val < 0x10000) {
- _outFile->writeByte((0xE0 | ((val & 0xF000) >> 12)));
- _outFile->writeByte((0x80 | ((val & 0x0FC0) >> 6)));
- _outFile->writeByte((0x80 | (val & 0x003F)));
+ _outStream->writeByte((0xE0 | ((val & 0xF000) >> 12)));
+ _outStream->writeByte((0x80 | ((val & 0x0FC0) >> 6)));
+ _outStream->writeByte((0x80 | (val & 0x003F)));
} else if (val < 0x200000) {
- _outFile->writeByte((0xF0 | ((val & 0x1C0000) >> 18)));
- _outFile->writeByte((0x80 | ((val & 0x03F000) >> 12)));
- _outFile->writeByte((0x80 | ((val & 0x000FC0) >> 6)));
- _outFile->writeByte((0x80 | (val & 0x00003F)));
+ _outStream->writeByte((0xF0 | ((val & 0x1C0000) >> 18)));
+ _outStream->writeByte((0x80 | ((val & 0x03F000) >> 12)));
+ _outStream->writeByte((0x80 | ((val & 0x000FC0) >> 6)));
+ _outStream->writeByte((0x80 | (val & 0x00003F)));
} else {
- _outFile->writeByte('?');
+ _outStream->writeByte('?');
}
}
-int FileStream::getCharUtf8() {
+int IOStream::getCharUtf8() {
uint res;
uint val0, val1, val2, val3;
@@ -998,11 +966,11 @@ int FileStream::getCharUtf8() {
return '?';
}
-uint FileStream::getPosition() const {
- return _outFile ? _outFile->pos() : _inStream->pos();
+uint IOStream::getPosition() const {
+ return _outStream ? _outStream->pos() : _inStream->pos();
}
-void FileStream::setPosition(int pos, uint seekMode) {
+void IOStream::setPosition(int pos, uint seekMode) {
_lastOp = 0;
if (_unicode)
pos *= 4;
@@ -1014,7 +982,7 @@ void FileStream::setPosition(int pos, uint seekMode) {
}
}
-int FileStream::getChar() {
+int IOStream::getChar() {
if (!_readable)
return -1;
@@ -1054,7 +1022,7 @@ int FileStream::getChar() {
}
}
-int FileStream::getCharUni() {
+int IOStream::getCharUni() {
if (!_readable)
return -1;
@@ -1092,7 +1060,7 @@ int FileStream::getCharUni() {
}
}
-uint FileStream::getBuffer(char *buf, uint len) {
+uint IOStream::getBuffer(char *buf, uint len) {
ensureOp(filemode_Read);
if (!_unicode) {
uint res;
@@ -1142,7 +1110,7 @@ uint FileStream::getBuffer(char *buf, uint len) {
}
}
-uint FileStream::getBufferUni(uint32 *buf, uint len) {
+uint IOStream::getBufferUni(uint32 *buf, uint len) {
if (!_readable)
return 0;
@@ -1199,7 +1167,7 @@ uint FileStream::getBufferUni(uint32 *buf, uint len) {
}
}
-uint FileStream::getLine(char *buf, uint len) {
+uint IOStream::getLine(char *buf, uint len) {
uint lx;
bool gotNewline;
@@ -1269,7 +1237,7 @@ uint FileStream::getLine(char *buf, uint len) {
}
}
-uint FileStream::getLineUni(uint32 *ubuf, uint len) {
+uint IOStream::getLineUni(uint32 *ubuf, uint len) {
bool gotNewline;
int lx;
@@ -1340,6 +1308,43 @@ uint FileStream::getLineUni(uint32 *ubuf, uint len) {
/*--------------------------------------------------------------------------*/
+FileStream::FileStream(Streams *streams, frefid_t fref, uint fmode, uint rock, bool unicode) :
+ IOStream(streams, fmode == filemode_Read, fmode != filemode_Read, rock, unicode),
+ _inSave(nullptr), _outSave(nullptr) {
+
+ _textFile = fref->_textMode;
+ Common::String fname = fref->_slotNumber == -1 ? fref->_filename : fref->getSaveName();
+
+ if (fmode == filemode_Write || fmode == filemode_ReadWrite || fmode == filemode_WriteAppend) {
+ _outSave = g_system->getSavefileManager()->openForSaving(fname, false);
+ if (!_outSave)
+ error("Could open file for writing - %s", fname.c_str());
+ setStream(_outSave);
+
+ } else if (fmode == filemode_Read) {
+ if (_file.open(fname)) {
+ setStream(&_file);
+ } else {
+ _inSave = g_system->getSavefileManager()->openForLoading(fname);
+ setStream(_inSave);
+
+ if (!_inSave)
+ error("Could not open for reading - %s", fname.c_str());
+ }
+ }
+}
+
+FileStream::~FileStream() {
+ _file.close();
+ delete _inSave;
+ if (_outSave) {
+ _outSave->finalize();
+ delete _outSave;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
Streams::Streams() : _streamList(nullptr), _currentStream(nullptr) {
}
diff --git a/engines/glk/streams.h b/engines/glk/streams.h
index 2d6d48f..df0d5df 100644
--- a/engines/glk/streams.h
+++ b/engines/glk/streams.h
@@ -432,16 +432,13 @@ public:
};
/**
- * Implements a file stream
+ * Base class for I/O streams
*/
-class FileStream : public Stream {
+class IOStream : public Stream {
private:
- Common::File _file;
- Common::OutSaveFile *_outFile;
- Common::InSaveFile *_inFile;
Common::SeekableReadStream *_inStream;
+ Common::WriteStream *_outStream;
uint _lastOp; ///< 0, filemode_Write, or filemode_Read
- bool _textFile;
private:
/**
* Ensure the stream is ready for the given operation
@@ -457,16 +454,40 @@ private:
* Get a UTF8 character
*/
int getCharUtf8();
+protected:
+ bool _textFile;
public:
/**
* Constructor
*/
- FileStream(Streams *streams, frefid_t fref, uint fmode, uint rock, bool unicode);
+ IOStream(Streams *streams, bool readable, bool writable, uint rock, bool unicode) :
+ Stream(streams, readable, writable, rock, unicode) {}
+ IOStream(Streams *streams, uint rock = 0) : Stream(streams, false, false, rock, false),
+ _inStream(nullptr), _outStream(nullptr), _lastOp(0), _textFile(false) {}
+ IOStream(Streams *streams, Common::SeekableReadStream *inStream, uint rock = 0) :
+ Stream(streams, true, false, rock, false), _inStream(inStream), _outStream(nullptr), _lastOp(0), _textFile(false) {}
+ IOStream(Streams *streams, Common::WriteStream *outStream, uint rock = 0) :
+ Stream(streams, false, true, rock, false), _inStream(nullptr), _outStream(outStream), _lastOp(0), _textFile(false) {}
+
+ /**
+ * Sets the stream to use
+ */
+ void setStream(Common::SeekableReadStream *rs) {
+ _inStream = rs;
+ _outStream = nullptr;
+ _readable = true;
+ _writable = false;
+ }
/**
- * Destructor
+ * Sets the stream to use
*/
- virtual ~FileStream();
+ void setStream(Common::WriteStream *ws) {
+ _inStream = nullptr;
+ _outStream = ws;
+ _readable = false;
+ _writable = true;
+ }
/**
* Write a character
@@ -525,7 +546,7 @@ public:
/**
* Cast a stream to a ScummVM write stream
*/
- virtual operator Common::WriteStream *() const override { return _outFile; }
+ virtual operator Common::WriteStream *() const override { return _outStream; }
/**
* Cast a stream to a ScummVM read stream
@@ -534,6 +555,26 @@ public:
};
/**
+ * Implements a file stream
+ */
+class FileStream : public IOStream {
+private:
+ Common::File _file;
+ Common::InSaveFile *_inSave;
+ Common::OutSaveFile *_outSave;
+public:
+ /**
+ * Constructor
+ */
+ FileStream(Streams *streams, frefid_t fref, uint fmode, uint rock, bool unicode);
+
+ /**
+ * Destructor
+ */
+ virtual ~FileStream();
+};
+
+/**
* Streams manager
*/
class Streams {
Commit: 98eddcda1d4ec6b6e839ce0abdf09c55394474b2
https://github.com/scummvm/scummvm/commit/98eddcda1d4ec6b6e839ce0abdf09c55394474b2
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2019-10-05T19:02:48-07:00
Commit Message:
GLK: Add Streams methods for encapsulating ScummVM streams
Changed paths:
engines/glk/streams.cpp
engines/glk/streams.h
diff --git a/engines/glk/streams.cpp b/engines/glk/streams.cpp
index a2d5ca2..37cac44 100644
--- a/engines/glk/streams.cpp
+++ b/engines/glk/streams.cpp
@@ -1361,6 +1361,18 @@ FileStream *Streams::openFileStream(frefid_t fref, uint fmode, uint rock, bool u
return stream;
}
+IOStream *Streams::openStream(Common::SeekableReadStream *rs, uint rock) {
+ IOStream *stream = new IOStream(this, rs, rock);
+ addStream(stream);
+ return stream;
+}
+
+IOStream *Streams::openStream(Common::WriteStream *ws, uint rock) {
+ IOStream *stream = new IOStream(this, ws, rock);
+ addStream(stream);
+ return stream;
+}
+
WindowStream *Streams::openWindowStream(Window *window) {
WindowStream *stream = new WindowStream(this, window);
addStream(stream);
diff --git a/engines/glk/streams.h b/engines/glk/streams.h
index df0d5df..e4cce4a 100644
--- a/engines/glk/streams.h
+++ b/engines/glk/streams.h
@@ -610,6 +610,16 @@ public:
FileStream *openFileStream(frefid_t fref, uint fmode, uint rock = 0, bool unicode = false);
/**
+ * Open a ScummVM read stream
+ */
+ IOStream *openStream(Common::SeekableReadStream *rs, uint rock = 0);
+
+ /**
+ * Open a ScummVM write stream
+ */
+ IOStream *openStream(Common::WriteStream *ws, uint rock = 0);
+
+ /**
* Open a window stream
*/
WindowStream *openWindowStream(Window *window);
More information about the Scummvm-git-logs
mailing list