diff options
author | Max Horn | 2004-04-17 09:57:15 +0000 |
---|---|---|
committer | Max Horn | 2004-04-17 09:57:15 +0000 |
commit | e17a15d96e46939d2ec4403ee5241baafdd562c0 (patch) | |
tree | 4e51f687eb2c57d5eba1604ad2f0d412416f64a5 /common | |
parent | 9b904682b18c4a4a7540fb1dca721544a8d448a3 (diff) | |
download | scummvm-rg350-e17a15d96e46939d2ec4403ee5241baafdd562c0.tar.gz scummvm-rg350-e17a15d96e46939d2ec4403ee5241baafdd562c0.tar.bz2 scummvm-rg350-e17a15d96e46939d2ec4403ee5241baafdd562c0.zip |
Introduce ReadStream and WriteStream (as explained in my File class design mails on scummvm-devel)
svn-id: r13595
Diffstat (limited to 'common')
-rw-r--r-- | common/file.cpp | 72 | ||||
-rw-r--r-- | common/file.h | 14 | ||||
-rw-r--r-- | common/module.mk | 1 | ||||
-rw-r--r-- | common/savefile.cpp | 59 | ||||
-rw-r--r-- | common/savefile.h | 16 | ||||
-rw-r--r-- | common/stream.cpp | 86 | ||||
-rw-r--r-- | common/stream.h | 123 |
7 files changed, 218 insertions, 153 deletions
diff --git a/common/file.cpp b/common/file.cpp index cbb2b58189..b9f097c986 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -273,45 +273,6 @@ uint32 File::read(void *ptr, uint32 len) { return real_len; } -byte File::readByte() { - byte b; - - if (_handle == NULL) { - error("File is not open!"); - return 0; - } - - if (fread(&b, 1, 1, _handle) != 1) { - clearerr(_handle); - _ioFailed = true; - } - return b ^ _encbyte; -} - -uint16 File::readUint16LE() { - uint16 a = readByte(); - uint16 b = readByte(); - return a | (b << 8); -} - -uint32 File::readUint32LE() { - uint32 a = readUint16LE(); - uint32 b = readUint16LE(); - return (b << 16) | a; -} - -uint16 File::readUint16BE() { - uint16 b = readByte(); - uint16 a = readByte(); - return a | (b << 8); -} - -uint32 File::readUint32BE() { - uint32 b = readUint16BE(); - uint32 a = readUint16BE(); - return (b << 16) | a; -} - uint32 File::write(const void *ptr, uint32 len) { byte *tmp = 0; @@ -345,36 +306,3 @@ uint32 File::write(const void *ptr, uint32 len) { return len; } - -void File::writeByte(byte value) { - value ^= _encbyte; - - if (_handle == NULL) { - error("File is not open!"); - } - - if (fwrite(&value, 1, 1, _handle) != 1) { - clearerr(_handle); - _ioFailed = true; - } -} - -void File::writeUint16LE(uint16 value) { - writeByte((byte)(value & 0xff)); - writeByte((byte)(value >> 8)); -} - -void File::writeUint32LE(uint32 value) { - writeUint16LE((uint16)(value & 0xffff)); - writeUint16LE((uint16)(value >> 16)); -} - -void File::writeUint16BE(uint16 value) { - writeByte((byte)(value >> 8)); - writeByte((byte)(value & 0xff)); -} - -void File::writeUint32BE(uint32 value) { - writeUint16BE((uint16)(value >> 16)); - writeUint16BE((uint16)(value & 0xffff)); -} diff --git a/common/file.h b/common/file.h index a298acab0b..42d521495f 100644 --- a/common/file.h +++ b/common/file.h @@ -25,8 +25,9 @@ #include "stdafx.h" #include "common/scummsys.h" #include "common/str.h" +#include "common/stream.h" -class File { +class File : public Common::ReadStream, public Common::WriteStream { private: FILE * _handle; @@ -60,17 +61,8 @@ public: const char *name() const { return _name; } void seek(int32 offs, int whence = SEEK_SET); uint32 read(void *ptr, uint32 size); - byte readByte(); - uint16 readUint16LE(); - uint32 readUint32LE(); - uint16 readUint16BE(); - uint32 readUint32BE(); uint32 write(const void *ptr, uint32 size); - void writeByte(byte value); - void writeUint16LE(uint16 value); - void writeUint32LE(uint32 value); - void writeUint16BE(uint16 value); - void writeUint32BE(uint32 value); + void setEnc(byte value) { _encbyte = value; } }; diff --git a/common/module.mk b/common/module.mk index 694128f8f6..715b735882 100644 --- a/common/module.mk +++ b/common/module.mk @@ -6,6 +6,7 @@ MODULE_OBJS := \ common/md5.o \ common/scaler.o \ common/str.o \ + common/stream.o \ common/timer.o \ common/util.o \ common/savefile.o \ diff --git a/common/savefile.cpp b/common/savefile.cpp index 4084fd01c7..3aba3fdc36 100644 --- a/common/savefile.cpp +++ b/common/savefile.cpp @@ -23,6 +23,9 @@ #include "common/util.h" #include "common/savefile.h" +#include <stdio.h> +#include <string.h> + #ifdef USE_ZLIB #include <zlib.h> #endif @@ -31,66 +34,10 @@ uint32 SaveFile::read(void *ptr, uint32 size) { return fread(ptr, 1, size); } -byte SaveFile::readByte() { - byte b; - // TODO: Proper error handling - if (fread(&b, 1, 1) != 1) - return 0; - return b; -} - -uint16 SaveFile::readUint16LE() { - uint16 a = readByte(); - uint16 b = readByte(); - return a | (b << 8); -} - -uint32 SaveFile::readUint32LE() { - uint32 a = readUint16LE(); - uint32 b = readUint16LE(); - return (b << 16) | a; -} - -uint16 SaveFile::readUint16BE() { - uint16 b = readByte(); - uint16 a = readByte(); - return a | (b << 8); -} - -uint32 SaveFile::readUint32BE() { - uint32 b = readUint16BE(); - uint32 a = readUint16BE(); - return (b << 16) | a; -} - uint32 SaveFile::write(const void *ptr, uint32 size) { return fwrite(ptr, 1, size); } -void SaveFile::writeByte(byte value) { - fwrite(&value, 1, 1); -} - -void SaveFile::writeUint16LE(uint16 value) { - writeByte((byte)(value & 0xff)); - writeByte((byte)(value >> 8)); -} - -void SaveFile::writeUint32LE(uint32 value) { - writeUint16LE((uint16)(value & 0xffff)); - writeUint16LE((uint16)(value >> 16)); -} - -void SaveFile::writeUint16BE(uint16 value) { - writeByte((byte)(value >> 8)); - writeByte((byte)(value & 0xff)); -} - -void SaveFile::writeUint32BE(uint32 value) { - writeUint16BE((uint16)(value >> 16)); - writeUint16BE((uint16)(value & 0xffff)); -} - class StdioSaveFile : public SaveFile { private: diff --git a/common/savefile.h b/common/savefile.h index 1188b46c51..83e09ad9c1 100644 --- a/common/savefile.h +++ b/common/savefile.h @@ -25,28 +25,16 @@ #include "stdafx.h" #include "common/scummsys.h" +#include "common/stream.h" -#include <stdio.h> -#include <string.h> - -class SaveFile { +class SaveFile : public Common::ReadStream, public Common::WriteStream { public: virtual ~SaveFile() {} /* Compatible with File API */ uint32 read(void *ptr, uint32 size); - byte readByte(); - uint16 readUint16LE(); - uint32 readUint32LE(); - uint16 readUint16BE(); - uint32 readUint32BE(); uint32 write(const void *ptr, uint32 size); - void writeByte(byte value); - void writeUint16LE(uint16 value); - void writeUint32LE(uint32 value); - void writeUint16BE(uint16 value); - void writeUint32BE(uint32 value); virtual bool isOpen() const = 0; diff --git a/common/stream.cpp b/common/stream.cpp new file mode 100644 index 0000000000..c4fdb29f09 --- /dev/null +++ b/common/stream.cpp @@ -0,0 +1,86 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2002-2004 The ScummVM project + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#include "stdafx.h" +#include "common/stream.h" + +namespace Common { + +/* TODO: + * - The ReadStream / WriteStream should provide some error handling + */ + +byte ReadStream::readByte() { + byte b = 0; + read(&b, 1); + return b; +} + +uint16 ReadStream::readUint16LE() { + uint16 a = readByte(); + uint16 b = readByte(); + return a | (b << 8); +} + +uint32 ReadStream::readUint32LE() { + uint32 a = readUint16LE(); + uint32 b = readUint16LE(); + return (b << 16) | a; +} + +uint16 ReadStream::readUint16BE() { + uint16 b = readByte(); + uint16 a = readByte(); + return a | (b << 8); +} + +uint32 ReadStream::readUint32BE() { + uint32 b = readUint16BE(); + uint32 a = readUint16BE(); + return (b << 16) | a; +} + + +void WriteStream::writeByte(byte value) { + write(&value, 1); +} + +void WriteStream::writeUint16LE(uint16 value) { + writeByte((byte)(value & 0xff)); + writeByte((byte)(value >> 8)); +} + +void WriteStream::writeUint32LE(uint32 value) { + writeUint16LE((uint16)(value & 0xffff)); + writeUint16LE((uint16)(value >> 16)); +} + +void WriteStream::writeUint16BE(uint16 value) { + writeByte((byte)(value >> 8)); + writeByte((byte)(value & 0xff)); +} + +void WriteStream::writeUint32BE(uint32 value) { + writeUint16BE((uint16)(value >> 16)); + writeUint16BE((uint16)(value & 0xffff)); +} + +} // End of namespace Common diff --git a/common/stream.h b/common/stream.h new file mode 100644 index 0000000000..bd20bdbc20 --- /dev/null +++ b/common/stream.h @@ -0,0 +1,123 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001/2002 The ScummVM project + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#ifndef COMMON_STREAM_H +#define COMMON_STREAM_H + +#include "stdafx.h" +#include "common/scummsys.h" + + +namespace Common { + +class WriteStream { +public: + virtual uint32 write(const void *ptr, uint32 size) = 0; + + // The remaining methods all have default implementations + + void writeByte(byte value); + + void writeUint16LE(uint16 value); + void writeUint32LE(uint32 value); + + void writeUint16BE(uint16 value); + void writeUint32BE(uint32 value); + +/* + void writeSint16LE(int16 value); + void writeSint32LE(int32 value); + + void writeSint16BE(int16 value); + void writeSint32BE(int32 value); +*/ +}; + + +class ReadStream { +public: + virtual uint32 read(void *ptr, uint32 size) = 0; + + // The remaining methods all have default implementations + + byte readByte(); + + uint16 readUint16LE(); + uint32 readUint32LE(); + + uint16 readUint16BE(); + uint32 readUint32BE(); + +/* + int16 readSint16LE(); + int32 readSint32LE(); + + int16 readSint16BE(); + int32 readSint32BE(); +*/ +}; + +/** + * XORReadStream is a wrapper around an arbitrary other ReadStream, + * which 'decrypts' the data being read by XORing all data bytes with the given + * encryption 'key'. + */ +class XORReadStream : public ReadStream { +private: + byte _encbyte; + ReadStream *_realStream; +public: + XORReadStream(ReadStream *in, byte enc = 0) : _realStream(in), _encbyte(enc) {} + void setEnc(byte value) { _encbyte = value; } + + uint32 read(void *ptr, uint32 size) { + uint32 len = _realStream->read(ptr, size); + if (_encbyte) { + byte *p = (byte *)ptr; + byte *end = p + len; + while (p < end) + *p++ ^= _encbyte; + } + return len; + } +}; + +class MemoryReadStream : public ReadStream { +private: + const byte *_ptr; + uint32 _size; +public: + MemoryReadStream(const byte *ptr, uint32 size) : _ptr(ptr), _size(size) {} + + uint32 read(void *ptr, uint32 size) { + if (size > _size) + size = _size; + memcpy(ptr, _ptr, size); + _size -= size; + _ptr += size; + return size; + } +}; + +} // End of namespace Common + +#endif |