Introduce ReadStream and WriteStream (as explained in my File class design mails on scummvm-devel)

svn-id: r13595
This commit is contained in:
Max Horn 2004-04-17 09:57:15 +00:00
parent 9b904682b1
commit e17a15d96e
7 changed files with 218 additions and 153 deletions

View File

@ -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));
}

View File

@ -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; }
};

View File

@ -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 \

View File

@ -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:

View File

@ -25,28 +25,16 @@
#include "stdafx.h"
#include "common/scummsys.h"
#include <stdio.h>
#include <string.h>
#include "common/stream.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;

86
common/stream.cpp Normal file
View File

@ -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

123
common/stream.h Normal file
View File

@ -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