Introduce ReadStream and WriteStream (as explained in my File class design mails on scummvm-devel)
svn-id: r13595
This commit is contained in:
parent
9b904682b1
commit
e17a15d96e
7 changed files with 218 additions and 153 deletions
|
@ -273,45 +273,6 @@ uint32 File::read(void *ptr, uint32 len) {
|
||||||
return real_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) {
|
uint32 File::write(const void *ptr, uint32 len) {
|
||||||
byte *tmp = 0;
|
byte *tmp = 0;
|
||||||
|
|
||||||
|
@ -345,36 +306,3 @@ uint32 File::write(const void *ptr, uint32 len) {
|
||||||
|
|
||||||
return 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));
|
|
||||||
}
|
|
||||||
|
|
|
@ -25,8 +25,9 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "common/scummsys.h"
|
#include "common/scummsys.h"
|
||||||
#include "common/str.h"
|
#include "common/str.h"
|
||||||
|
#include "common/stream.h"
|
||||||
|
|
||||||
class File {
|
class File : public Common::ReadStream, public Common::WriteStream {
|
||||||
private:
|
private:
|
||||||
|
|
||||||
FILE * _handle;
|
FILE * _handle;
|
||||||
|
@ -60,17 +61,8 @@ public:
|
||||||
const char *name() const { return _name; }
|
const char *name() const { return _name; }
|
||||||
void seek(int32 offs, int whence = SEEK_SET);
|
void seek(int32 offs, int whence = SEEK_SET);
|
||||||
uint32 read(void *ptr, uint32 size);
|
uint32 read(void *ptr, uint32 size);
|
||||||
byte readByte();
|
|
||||||
uint16 readUint16LE();
|
|
||||||
uint32 readUint32LE();
|
|
||||||
uint16 readUint16BE();
|
|
||||||
uint32 readUint32BE();
|
|
||||||
uint32 write(const void *ptr, uint32 size);
|
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; }
|
void setEnc(byte value) { _encbyte = value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ MODULE_OBJS := \
|
||||||
common/md5.o \
|
common/md5.o \
|
||||||
common/scaler.o \
|
common/scaler.o \
|
||||||
common/str.o \
|
common/str.o \
|
||||||
|
common/stream.o \
|
||||||
common/timer.o \
|
common/timer.o \
|
||||||
common/util.o \
|
common/util.o \
|
||||||
common/savefile.o \
|
common/savefile.o \
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
#include "common/util.h"
|
#include "common/util.h"
|
||||||
#include "common/savefile.h"
|
#include "common/savefile.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef USE_ZLIB
|
#ifdef USE_ZLIB
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -31,66 +34,10 @@ uint32 SaveFile::read(void *ptr, uint32 size) {
|
||||||
return fread(ptr, 1, 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) {
|
uint32 SaveFile::write(const void *ptr, uint32 size) {
|
||||||
return fwrite(ptr, 1, 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 {
|
class StdioSaveFile : public SaveFile {
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -25,28 +25,16 @@
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "common/scummsys.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:
|
public:
|
||||||
virtual ~SaveFile() {}
|
virtual ~SaveFile() {}
|
||||||
|
|
||||||
/* Compatible with File API */
|
/* Compatible with File API */
|
||||||
uint32 read(void *ptr, uint32 size);
|
uint32 read(void *ptr, uint32 size);
|
||||||
byte readByte();
|
|
||||||
uint16 readUint16LE();
|
|
||||||
uint32 readUint32LE();
|
|
||||||
uint16 readUint16BE();
|
|
||||||
uint32 readUint32BE();
|
|
||||||
uint32 write(const void *ptr, uint32 size);
|
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;
|
virtual bool isOpen() const = 0;
|
||||||
|
|
||||||
|
|
86
common/stream.cpp
Normal file
86
common/stream.cpp
Normal 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
123
common/stream.h
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue