diff options
| author | Eugene Sandulenko | 2005-02-04 16:34:08 +0000 | 
|---|---|---|
| committer | Eugene Sandulenko | 2005-02-04 16:34:08 +0000 | 
| commit | b33963b452cfead1cefcdafe03b9eecc13235c0e (patch) | |
| tree | bc144bf1f7d5fa198824ace1ad73af560138643f | |
| parent | 99c022d6a388987a3a7fd413d1778333cd4b7430 (diff) | |
| download | scummvm-rg350-b33963b452cfead1cefcdafe03b9eecc13235c0e.tar.gz scummvm-rg350-b33963b452cfead1cefcdafe03b9eecc13235c0e.tar.bz2 scummvm-rg350-b33963b452cfead1cefcdafe03b9eecc13235c0e.zip  | |
Some HFS dumpinf programs write files with resource fork to .bin file.
Support that. Also support separately dumped resource forks. File name for
those has .rsrc extension.
svn-id: r16735
| -rw-r--r-- | scumm/resource_v7he.cpp | 56 | 
1 files changed, 39 insertions, 17 deletions
diff --git a/scumm/resource_v7he.cpp b/scumm/resource_v7he.cpp index 945ea692e3..2a5ce3f495 100644 --- a/scumm/resource_v7he.cpp +++ b/scumm/resource_v7he.cpp @@ -1,3 +1,4 @@ +  /* ScummVM - Scumm Interpreter   * Copyright (C) 2004-2005 The ScummVM project   * @@ -1272,6 +1273,7 @@ void MacResExtractor::setCursor(int id) {  	int cursorsize;  	int w = 0, h = 0, hotspot_x = 0, hotspot_y = 0;  	int keycolor; +	File f;  	if (!_fileName[0]) // We are running for the first time  		if (_vm->_heMacFileNameIndex > 0) { @@ -1279,6 +1281,21 @@ void MacResExtractor::setCursor(int id) {  			snprintf(buf1, 128, "%s.he3", _vm->getGameName());  			_vm->generateMacFileName(buf1, _fileName, 128, 0, _vm->_heMacFileNameIndex); + +			// Some programs write it as .bin. Try that too +			if (!f.exists(_fileName)) { +				strcpy(buf1, _fileName); +				snprintf(_fileName, 128, "%s.bin", buf1); + +				if (!f.exists(_fileName)) { +					// And finally check if we have dumped resource fork +					snprintf(_fileName, 128, "%s.rsrc", buf1); +					if (!f.exists(_fileName)) { +						error("Cannot open file any of files '%s', '%s.bin', '%s.rsrc",  +							  buf1, buf1, buf1); +					} +				} +			}  		}  	cursorsize = extractResource(id, &cursorRes); @@ -1331,28 +1348,26 @@ bool MacResExtractor::init(File in) {  	filelen = in.size();  	in.read(infoHeader, MBI_INFOHDR); -	// Following should be 0 bytes -	if(infoHeader[MBI_ZERO1] != 0) return false; - -	if(infoHeader[MBI_ZERO2] != 0) return false; +	// Maybe we have MacBinary? +	if (infoHeader[MBI_ZERO1] == 0 && infoHeader[MBI_ZERO2] == 0 && +		infoHeader[MBI_ZERO3] == 0 && infoHeader[MBI_NAMELEN] <= MAXNAMELEN) { -	if(infoHeader[MBI_ZERO3] != 0) return false; +		// Pull out fork lengths +		data_size = READ_BE_UINT32(infoHeader + MBI_DFLEN); +		rsrc_size = READ_BE_UINT32(infoHeader + MBI_RFLEN); -	// Filename has a length range -	if(infoHeader[MBI_NAMELEN] > MAXNAMELEN) return false; +		data_size_pad = (((data_size + 127) >> 7) << 7); +		rsrc_size_pad = (((rsrc_size + 127) >> 7) << 7); -	// Pull out fork lengths -	data_size = READ_BE_UINT32(infoHeader + MBI_DFLEN); -	rsrc_size = READ_BE_UINT32(infoHeader + MBI_RFLEN); +		// Length check +		int sumlen =  MBI_INFOHDR + data_size_pad + rsrc_size_pad; -	data_size_pad = (((data_size + 127) >> 7) << 7); -	rsrc_size_pad = (((rsrc_size + 127) >> 7) << 7); - -	// Length check -	int sumlen =  MBI_INFOHDR + data_size_pad + rsrc_size_pad; -	if(sumlen != filelen) return false; +		if(sumlen == filelen) +			_resOffset = MBI_INFOHDR + data_size_pad; +	} -	_resOffset = MBI_INFOHDR + data_size_pad; +	if (_resOffset == -1) // MacBinary check is failed +		_resOffset = 0; // Maybe we have dumped fork?  	in.seek(_resOffset); @@ -1361,6 +1376,13 @@ bool MacResExtractor::init(File in) {  	_dataLength = in.readUint32BE();  	_mapLength = in.readUint32BE(); +	// do sanity check +	if (_dataOffset >= filelen || _mapOffset >= filelen || +		_dataLength + _mapLength  > filelen) { +		_resOffset = -1; +		return false; +	} +  	debug(7, "got header: data %d [%d] map %d [%d]",   		_dataOffset, _dataLength, _mapOffset, _mapLength);  | 
