diff options
| author | Sven Hesse | 2007-07-30 15:53:38 +0000 | 
|---|---|---|
| committer | Sven Hesse | 2007-07-30 15:53:38 +0000 | 
| commit | f06f150c76f43f1dc97eadea5af7bf46ddba9ba4 (patch) | |
| tree | 9efcaf3b3a29f8548b20792b6c073b3c336d38a6 /engines/gob/dataio.cpp | |
| parent | c8aae376a92c9fbb6d37b81c35de6d030a37319a (diff) | |
| download | scummvm-rg350-f06f150c76f43f1dc97eadea5af7bf46ddba9ba4.tar.gz scummvm-rg350-f06f150c76f43f1dc97eadea5af7bf46ddba9ba4.tar.bz2 scummvm-rg350-f06f150c76f43f1dc97eadea5af7bf46ddba9ba4.zip  | |
Restructured and cleaned-up IMD playing
svn-id: r28327
Diffstat (limited to 'engines/gob/dataio.cpp')
| -rw-r--r-- | engines/gob/dataio.cpp | 99 | 
1 files changed, 98 insertions, 1 deletions
diff --git a/engines/gob/dataio.cpp b/engines/gob/dataio.cpp index 7ded953427..73318adc14 100644 --- a/engines/gob/dataio.cpp +++ b/engines/gob/dataio.cpp @@ -33,6 +33,83 @@  namespace Gob { +DataStream::DataStream(DataIO &io, int16 handle, uint32 dSize, bool dispose) { +	_io = &io; +	_handle = handle; +	_size = dSize; +	_dispose = dispose; + +	_data = 0; +	_stream = 0; +} + +DataStream::DataStream(byte *buf, uint32 dSize, bool dispose) { +	_data = buf; +	_size = dSize; +	_stream = new Common::MemoryReadStream(_data, _size); +	_dispose = dispose; + +	_io = 0; +	_handle = -1; +} + +DataStream::~DataStream() { +	delete _stream; + +	if (_dispose) { +		delete[] _data; +		if ((_handle >= 0) && _io) +			_io->closeData(_handle); +	} +} + +uint32 DataStream::pos() const { +	if (_stream) +		return _stream->pos(); + +	uint32 resPos = _io->getChunkPos(_handle); +	if (resPos != 0xFFFFFFFF) +		return resPos; + +	return _io->file_getHandle(_handle)->pos(); +} + +uint32 DataStream::size() const { +	if (_stream) +		return _stream->size(); + +	return _size; +} + +void DataStream::seek(int32 offset, int whence) { +	if (_stream) +		_stream->seek(offset, whence); + +	int32 resPos = _io->seekChunk(_handle, offset, whence); +	if (resPos != -1) +		return; + +	_io->file_getHandle(_handle)->seek(offset, whence); +} + +bool DataStream::eos() const { +	if (_stream) +		return _stream->eos(); + +	return pos() >= size(); +} + +uint32 DataStream::read(void *dataPtr, uint32 dataSize) { +	if (_stream) +		return _stream->read(dataPtr, dataSize); + +	int32 res = _io->readChunk(_handle, (byte *) dataPtr, dataSize); +	if (res >= 0) +		return res; + +	return _io->file_getHandle(_handle)->read((byte *) dataPtr, dataSize); +} +  DataIO::DataIO(GobEngine *vm) : _vm(vm) {  	for (int i = 0; i < MAX_DATA_FILES; i++) {  		_dataFiles[i] = 0; @@ -115,6 +192,10 @@ Common::File *DataIO::file_getHandle(int16 handle) {  	return &_filesHandles[handle];  } +const Common::File *DataIO::file_getHandle(int16 handle) const { +	return &_filesHandles[handle]; +} +  int16 DataIO::file_open(const char *path, Common::File::AccessMode mode) {  	int16 i; @@ -226,7 +307,7 @@ int16 DataIO::seekChunk(int16 handle, int32 pos, int16 from) {  	return _chunkPos[file * MAX_SLOT_COUNT + slot];  } -uint32 DataIO::getChunkPos(int16 handle) { +uint32 DataIO::getChunkPos(int16 handle) const {  	int16 file;  	int16 slot; @@ -390,6 +471,15 @@ int16 DataIO::openData(const char *path, Common::File::AccessMode mode) {  	return file_open(path, mode);  } +DataStream *DataIO::openAsStream(int16 handle, bool dispose) { +	uint32 curPos = getPos(handle); +	seekData(handle, 0, SEEK_END); +	uint32 size = getPos(handle); +	seekData(handle, curPos, SEEK_SET); + +	return new DataStream(*this, handle, size, dispose); +} +  int32 DataIO::readData(int16 handle, byte *buf, uint16 size) {  	int32 res; @@ -492,4 +582,11 @@ byte *DataIO::getData(const char *path) {  	return data;  } +DataStream *DataIO::getDataStream(const char *path) { +	uint32 size = getDataSize(path); +	byte *data = getData(path); + +	return new DataStream(data, size); +} +  } // End of namespace Gob  | 
