aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordi Vilalta Prat2010-05-20 13:46:18 +0000
committerJordi Vilalta Prat2010-05-20 13:46:18 +0000
commit474b804e33aec7d0aa9600fa6b210e50c0d13c85 (patch)
treec243efde22d18eed14c80b120bd5acb2fb3d9088
parent23eae4e139507f31bc81f4896b71814f9db860de (diff)
downloadscummvm-rg350-474b804e33aec7d0aa9600fa6b210e50c0d13c85.tar.gz
scummvm-rg350-474b804e33aec7d0aa9600fa6b210e50c0d13c85.tar.bz2
scummvm-rg350-474b804e33aec7d0aa9600fa6b210e50c0d13c85.zip
Make the MacResManager opening more robust to failed tries and plug its memory leaks
svn-id: r49116
-rw-r--r--common/macresman.cpp63
-rw-r--r--common/macresman.h10
2 files changed, 48 insertions, 25 deletions
diff --git a/common/macresman.cpp b/common/macresman.cpp
index cb3f1c5b8a..de78cedf61 100644
--- a/common/macresman.cpp
+++ b/common/macresman.cpp
@@ -110,6 +110,7 @@ bool MacResManager::open(Common::String filename) {
_baseFileName = filename;
return true;
}
+ delete macResForkRawStream;
#endif
Common::File *file = new Common::File();
@@ -119,18 +120,21 @@ bool MacResManager::open(Common::String filename) {
_baseFileName = filename;
return true;
}
+ file->close();
// Check .bin too
if (file->open(filename + ".bin") && loadFromMacBinary(*file)) {
_baseFileName = filename;
return true;
}
-
+ file->close();
+
// Maybe we have a dumped fork?
if (file->open(filename + ".rsrc") && loadFromRawFork(*file)) {
_baseFileName = filename;
return true;
}
+ file->close();
// Fine, what about just the data fork?
if (file->open(filename)) {
@@ -138,13 +142,15 @@ bool MacResManager::open(Common::String filename) {
if (isMacBinary(*file)) {
file->seek(0, SEEK_SET);
- loadFromMacBinary(*file);
- } else {
- _stream = file;
+ if (loadFromMacBinary(*file))
+ return true;
}
+
+ file->seek(0, SEEK_SET);
+ _stream = file;
return true;
}
-
+
delete file;
// The file doesn't exist
@@ -163,39 +169,56 @@ bool MacResManager::open(Common::FSNode path, Common::String filename) {
_baseFileName = filename;
return true;
}
+ delete macResForkRawStream;
#endif
// First, let's try to see if the Mac converted name exists
Common::FSNode fsNode = path.getChild("._" + filename);
- if (fsNode.exists() && !fsNode.isDirectory() && loadFromAppleDouble(*fsNode.createReadStream())) {
- _baseFileName = filename;
- return true;
+ if (fsNode.exists() && !fsNode.isDirectory()) {
+ SeekableReadStream *stream = fsNode.createReadStream();
+ if (loadFromAppleDouble(*stream)) {
+ _baseFileName = filename;
+ return true;
+ }
+ delete stream;
}
// Check .bin too
fsNode = path.getChild(filename + ".bin");
- if (fsNode.exists() && !fsNode.isDirectory() && loadFromMacBinary(*fsNode.createReadStream())) {
- _baseFileName = filename;
- return true;
+ if (fsNode.exists() && !fsNode.isDirectory()) {
+ SeekableReadStream *stream = fsNode.createReadStream();
+ if (loadFromMacBinary(*stream)) {
+ _baseFileName = filename;
+ return true;
+ }
+ delete stream;
}
-
+
// Maybe we have a dumped fork?
fsNode = path.getChild(filename + ".rsrc");
- if (fsNode.exists() && !fsNode.isDirectory() && loadFromRawFork(*fsNode.createReadStream())) {
- _baseFileName = filename;
- return true;
+ if (fsNode.exists() && !fsNode.isDirectory()) {
+ SeekableReadStream *stream = fsNode.createReadStream();
+ if (loadFromRawFork(*stream)) {
+ _baseFileName = filename;
+ return true;
+ }
+ delete stream;
}
// Fine, what about just the data fork?
fsNode = path.getChild(filename);
if (fsNode.exists() && !fsNode.isDirectory()) {
+ SeekableReadStream *stream = fsNode.createReadStream();
_baseFileName = filename;
- if (isMacBinary(*fsNode.createReadStream())) {
- loadFromMacBinary(*fsNode.createReadStream());
- } else {
- _stream = fsNode.createReadStream();
+ if (isMacBinary(*stream)) {
+ stream->seek(0, SEEK_SET);
+ if (loadFromMacBinary(*stream))
+ return true;
}
+
+ stream->seek(0, SEEK_SET);
+ _stream = stream;
return true;
}
@@ -313,7 +336,7 @@ bool MacResManager::load(Common::SeekableReadStream &stream) {
debug(7, "got header: data %d [%d] map %d [%d]",
_dataOffset, _dataLength, _mapOffset, _mapLength);
-
+
_stream = &stream;
readMap();
diff --git a/common/macresman.h b/common/macresman.h
index 613c26625b..c067b6d2b8 100644
--- a/common/macresman.h
+++ b/common/macresman.h
@@ -45,7 +45,7 @@ class MacResManager {
public:
MacResManager();
~MacResManager();
-
+
bool open(Common::String filename);
bool open(Common::FSNode path, Common::String filename);
void close();
@@ -53,7 +53,7 @@ public:
bool hasDataFork();
bool hasResFork();
- bool isMacBinary(Common::SeekableReadStream &stream);
+ static bool isMacBinary(Common::SeekableReadStream &stream);
/**
* Read resource from the Mac Binary file
@@ -76,7 +76,7 @@ public:
bool getResForkMD5(char *md5str, uint32 length);
Common::String getBaseFileName() { return _baseFileName; }
-
+
/**
* Convert cursor from crsr format to format suitable for feeding to CursorMan
* @param data Pointer to the cursor data
@@ -125,7 +125,7 @@ private:
} _mode;
void readMap();
-
+
struct ResMap {
uint16 resAttr;
uint16 typeOffset;
@@ -148,7 +148,7 @@ private:
};
typedef Resource *ResPtr;
-
+
int32 _resForkOffset;
uint32 _resForkSize;