mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-20 19:21:46 +00:00
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
@ -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));
|
||||
}
|
||||
|
@ -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; }
|
||||
};
|
||||
|
||||
|
@ -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 \
|
||||
|
@ -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:
|
||||
|
@ -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
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…
x
Reference in New Issue
Block a user