diff options
Diffstat (limited to 'engines/gargoyle/streams.h')
-rw-r--r-- | engines/gargoyle/streams.h | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/engines/gargoyle/streams.h b/engines/gargoyle/streams.h new file mode 100644 index 0000000000..db21d58867 --- /dev/null +++ b/engines/gargoyle/streams.h @@ -0,0 +1,227 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef GARGOYLE_STREAMS_H +#define GARGOYLE_STREAMS_H + +#include "common/scummsys.h" +#include "gargoyle/glk_types.h" + +namespace Gargoyle { + +class GargoyleEngine; +class Window; +class Streams; + +struct StreamResult { + uint32 _readCount; + uint32 _writeCount; +}; + +/** + * Base class for streams + */ +class Stream { +public: + Streams *_streams; + Stream *_prev; + Stream *_next; + uint32 _rock; + bool _unicode; + uint32 _readCount; + uint32 _writeCount; + bool _readable, _writable; +public: + /** + * Constructor + */ + Stream(Streams *streams, bool readable, bool writable, uint32 rock, bool unicode); + + /** + * Destructor + */ + virtual ~Stream(); + + /** + * Get the next stream + */ + Stream *getNext(uint32 *rock) const; + + /** + * Get the rock value for the stream + */ + uint32 getRock() const { return _rock; } + + /** + * Fill out the total amount read and/or written + */ + void fillResult(StreamResult *result); + + /** + * Close and delete the stream + */ + void close(StreamResult *result = nullptr); + + /** + * Write a character + */ + virtual void writeChar(unsigned char ch) = 0; + + /** + * Write a unicode character + */ + virtual void writeCharUni(uint32 ch) = 0; +}; +typedef Stream *strid_t; + +/** + * Implements the stream for writing text to a window + */ +class WindowStream : public Stream { +private: + Window *_window; +public: + /** + * Constructor + */ + WindowStream(Streams *streams, Window *window, uint32 rock = 0, bool unicode = true) : + Stream(streams, true, false, rock, unicode), _window(window) {} + + /** + * Close the stream + */ + virtual void close(StreamResult *result = nullptr); + + /** + * Write a character + */ + virtual void writeChar(unsigned char ch) override; + + /** + * Write a unicode character + */ + virtual void writeCharUni(uint32 ch) override; +}; + +/** + * Implements an in-memory stream + */ +class MemoryStream : public Stream { +private: + void *_buf; ///< unsigned char* for latin1, glui32* for unicode + void *_bufptr; + void *_bufend; + void *_bufeof; + size_t _buflen; ///< # of bytes for latin1, # of 4-byte words for unicode +public: + /** + * Constructor + */ + MemoryStream(Streams *streams, void *buf, size_t buflen, FileMode mode, uint32 rock = 0, bool unicode = true); + + /** + * Write a character + */ + virtual void writeChar(unsigned char ch); + + /** + * Write a unicode character + */ + virtual void writeCharUni(uint32 ch); +}; + +/** + * Streams manager + */ +class Streams { + friend class Stream; +private: + GargoyleEngine *_engine; + Stream *_streamList; + Stream *_currentStream; +private: + /** + * Adds a created stream to the list + */ + void addStream(Stream *stream); + + /** + * Remove a stream + */ + void removeStream(Stream *stream); +public: + /** + * Constructor + */ + Streams(GargoyleEngine *engine); + + /** + * Destructor + */ + ~Streams(); + + /** + * Add a window stream + */ + WindowStream *addWindowStream(Window *window); + + /** + * Add a memory stream + */ + MemoryStream *addMemoryStream(void *buf, size_t buflen, FileMode mode, uint32 rock = 0, bool unicode = true); + + /** + * Delete a stream + */ + void deleteStream(Stream *stream) { + delete stream; + } + + /** + * Start an Iteration through streams + */ + Stream *getFirst(uint32 *rock); + + /** + * Set the current output stream + */ + void setCurrent(Stream *stream) { + assert(stream->_writable); + _currentStream = stream; + } + + /** + * Gets the current output stream + */ + Stream *getCurrent() const { return _currentStream; } +}; + + + +/* + * Get the length of a unicode string + */ +size_t strlen_uni(const uint32 *s); + +} // End of namespace Gargoyle + +#endif |