aboutsummaryrefslogtreecommitdiff
path: root/engines/scumm
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2009-07-20 20:55:28 +0000
committerWillem Jan Palenstijn2009-07-20 20:55:28 +0000
commitf9208f1bb0e083a4e7ebc30051599cdbfbcf9d26 (patch)
tree459333eb2d5a132a7b921214f9c21c0f803752f9 /engines/scumm
parentb40dc424b3ec2121b6cc62f3648d014f25583256 (diff)
downloadscummvm-rg350-f9208f1bb0e083a4e7ebc30051599cdbfbcf9d26.tar.gz
scummvm-rg350-f9208f1bb0e083a4e7ebc30051599cdbfbcf9d26.tar.bz2
scummvm-rg350-f9208f1bb0e083a4e7ebc30051599cdbfbcf9d26.zip
Make ScummFile::eos() consistent with Stream::eos().
Remove usage of ioFailed from SCUMM engine. Fix reading up to the end of a SCUMM SubFile. This hopefully fixes #2820957. svn-id: r42632
Diffstat (limited to 'engines/scumm')
-rw-r--r--engines/scumm/file.cpp9
-rw-r--r--engines/scumm/file.h5
-rw-r--r--engines/scumm/he/cup_player_he.cpp23
-rw-r--r--engines/scumm/resource.cpp9
-rw-r--r--engines/scumm/resource_v4.cpp9
5 files changed, 29 insertions, 26 deletions
diff --git a/engines/scumm/file.cpp b/engines/scumm/file.cpp
index 3f101691c7..6dc31b09ef 100644
--- a/engines/scumm/file.cpp
+++ b/engines/scumm/file.cpp
@@ -126,7 +126,7 @@ bool ScummFile::openSubFile(const Common::String &filename) {
bool ScummFile::eos() const {
- return _subFileLen ? (pos() >= _subFileLen) : File::eos(); // FIXME
+ return _subFileLen ? _myEos : File::eos();
}
int32 ScummFile::pos() const {
@@ -154,7 +154,10 @@ bool ScummFile::seek(int32 offs, int whence) {
assert((int32)_subFileStart <= offs && offs <= (int32)(_subFileStart + _subFileLen));
whence = SEEK_SET;
}
- return File::seek(offs, whence);
+ bool ret = File::seek(offs, whence);
+ if (ret)
+ _myEos = false;
+ return ret;
}
uint32 ScummFile::read(void *dataPtr, uint32 dataSize) {
@@ -167,7 +170,7 @@ uint32 ScummFile::read(void *dataPtr, uint32 dataSize) {
int32 newPos = curPos + dataSize;
if (newPos > _subFileLen) {
dataSize = _subFileLen - curPos;
- _myIoFailed = true;
+ _myEos = true;
}
}
diff --git a/engines/scumm/file.h b/engines/scumm/file.h
index aa52dd069f..c37c2f036e 100644
--- a/engines/scumm/file.h
+++ b/engines/scumm/file.h
@@ -55,7 +55,7 @@ private:
byte _encbyte;
int32 _subFileStart;
int32 _subFileLen;
- bool _myIoFailed;
+ bool _myEos; // Have we read past the end of the subfile?
void setSubfileRange(int32 start, int32 len);
void resetSubfile();
@@ -67,8 +67,7 @@ public:
bool open(const Common::String &filename);
bool openSubFile(const Common::String &filename);
- bool ioFailed() const { return _myIoFailed || BaseScummFile::ioFailed(); }
- void clearIOFailed() { _myIoFailed = false; BaseScummFile::clearIOFailed(); }
+ void clearErr() { _myEos = false; BaseScummFile::clearErr(); }
bool eos() const;
int32 pos() const;
diff --git a/engines/scumm/he/cup_player_he.cpp b/engines/scumm/he/cup_player_he.cpp
index 51176c5df9..39615edb6a 100644
--- a/engines/scumm/he/cup_player_he.cpp
+++ b/engines/scumm/he/cup_player_he.cpp
@@ -91,20 +91,19 @@ void CUP_Player::close() {
}
void CUP_Player::play() {
- while (parseNextHeaderTag(_fileStream)) {
- if (_fileStream.ioFailed()) {
- return;
- }
- }
+ while (parseNextHeaderTag(_fileStream)) { }
+
+ if (_fileStream.eos() || _fileStream.err())
+ return;
+
debug(1, "rate %d width %d height %d", _playbackRate, _width, _height);
int ticks = _system->getMillis();
while (_dataSize != 0 && !_vm->shouldQuit()) {
- while (parseNextBlockTag(_fileStream)) {
- if (_fileStream.ioFailed()) {
- return;
- }
- }
+ while (parseNextBlockTag(_fileStream)) { }
+ if (_fileStream.eos() || _fileStream.err())
+ return;
+
int diff = _system->getMillis() - ticks;
if (diff >= 0 && diff <= _playbackRate) {
_system->delayMillis(_playbackRate - diff);
@@ -200,6 +199,10 @@ void CUP_Player::waitForSfxChannel(int channel) {
bool CUP_Player::parseNextHeaderTag(Common::SeekableReadStream &dataStream) {
uint32 tag = dataStream.readUint32BE();
uint32 size = dataStream.readUint32BE() - 8;
+
+ if (dataStream.eos())
+ return false;
+
uint32 next = dataStream.pos() + size;
debug(1, "New header tag %s %d dataSize %d", tag2str(tag), size, _dataSize);
switch (tag) {
diff --git a/engines/scumm/resource.cpp b/engines/scumm/resource.cpp
index 88802a205f..d7ee0a74aa 100644
--- a/engines/scumm/resource.cpp
+++ b/engines/scumm/resource.cpp
@@ -253,10 +253,10 @@ void ScummEngine::readIndexFile() {
if (_game.version <= 5) {
// Figure out the sizes of various resources
- while (!_fileHandle->eos()) {
+ while (true) {
blocktype = _fileHandle->readUint32BE();
itemsize = _fileHandle->readUint32BE();
- if (_fileHandle->ioFailed())
+ if (_fileHandle->eos() || _fileHandle->err())
break;
switch (blocktype) {
case MKID_BE('DOBJ'):
@@ -285,7 +285,6 @@ void ScummEngine::readIndexFile() {
}
_fileHandle->seek(itemsize - 8, SEEK_CUR);
}
- _fileHandle->clearIOFailed();
_fileHandle->seek(0, SEEK_SET);
}
@@ -300,7 +299,7 @@ void ScummEngine::readIndexFile() {
blocktype = _fileHandle->readUint32BE();
itemsize = _fileHandle->readUint32BE();
- if (_fileHandle->ioFailed())
+ if (_fileHandle->eos() || _fileHandle->err())
break;
numblock++;
@@ -689,7 +688,7 @@ int ScummEngine::loadResource(int type, int idx) {
dumpResource("script-", idx, getResourceAddress(rtScript, idx));
}
- if (!_fileHandle->ioFailed()) {
+ if (!_fileHandle->err() && !_fileHandle->eos()) {
return 1;
}
diff --git a/engines/scumm/resource_v4.cpp b/engines/scumm/resource_v4.cpp
index 28e0fb05b5..75858f7b42 100644
--- a/engines/scumm/resource_v4.cpp
+++ b/engines/scumm/resource_v4.cpp
@@ -61,11 +61,11 @@ void ScummEngine_v4::readIndexFile() {
closeRoom();
openRoom(0);
- while (!_fileHandle->eos()) {
+ while (true) {
// Figure out the sizes of various resources
itemsize = _fileHandle->readUint32LE();
blocktype = _fileHandle->readUint16LE();
- if (_fileHandle->ioFailed())
+ if (_fileHandle->eos() || _fileHandle->err())
break;
switch (blocktype) {
@@ -95,16 +95,15 @@ void ScummEngine_v4::readIndexFile() {
_fileHandle->seek(itemsize - 8, SEEK_CUR);
}
- _fileHandle->clearIOFailed();
_fileHandle->seek(0, SEEK_SET);
readMAXS(0);
allocateArrays();
- while (1) {
+ while (true) {
itemsize = _fileHandle->readUint32LE();
- if (_fileHandle->ioFailed())
+ if (_fileHandle->eos() || _fileHandle->err())
break;
blocktype = _fileHandle->readUint16LE();