aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorMax Horn2004-04-17 09:57:15 +0000
committerMax Horn2004-04-17 09:57:15 +0000
commite17a15d96e46939d2ec4403ee5241baafdd562c0 (patch)
tree4e51f687eb2c57d5eba1604ad2f0d412416f64a5 /common
parent9b904682b18c4a4a7540fb1dca721544a8d448a3 (diff)
downloadscummvm-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.cpp72
-rw-r--r--common/file.h14
-rw-r--r--common/module.mk1
-rw-r--r--common/savefile.cpp59
-rw-r--r--common/savefile.h16
-rw-r--r--common/stream.cpp86
-rw-r--r--common/stream.h123
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