[Scummvm-cvs-logs] SF.net SVN: scummvm: [22546] scummvm/trunk/engines/scumm/he

eriktorbjorn at users.sourceforge.net eriktorbjorn at users.sourceforge.net
Sat May 20 07:00:03 CEST 2006


Revision: 22546
Author:   eriktorbjorn
Date:     2006-05-20 06:59:31 -0700 (Sat, 20 May 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=22546&view=rev

Log Message:
-----------
Apparently, passing a file handle directly to a function causes that file
handle (a copy of the original?) to be destroyed at the end of the function,
and that closes the internal file handle, even though we want it to stay open.

Who am I to argue with how C++ handles its parameters? I've simply changed the
functions to take pointers to file handles instead. Seems to fix crashes in the
Macintosh resource extractor for me.

Modified Paths:
--------------
    scummvm/trunk/engines/scumm/he/resource_he.cpp
    scummvm/trunk/engines/scumm/he/resource_he.h
Modified: scummvm/trunk/engines/scumm/he/resource_he.cpp
===================================================================
--- scummvm/trunk/engines/scumm/he/resource_he.cpp	2006-05-20 13:10:34 UTC (rev 22545)
+++ scummvm/trunk/engines/scumm/he/resource_he.cpp	2006-05-20 13:59:31 UTC (rev 22546)
@@ -1310,13 +1310,13 @@
 
 	// we haven't calculated it
 	if (_resOffset == -1) {
-		if (!init(in))
+		if (!init(&in))
 			error("Resource fork is missing in file '%s'", _fileName.c_str());
 		in.close();
 		in.open(_fileName);
 	}
 
-	*buf = getResource(in, "crsr", 1000 + id, &size);
+	*buf = getResource(&in, "crsr", 1000 + id, &size);
 
 	in.close();
 
@@ -1335,14 +1335,14 @@
 #define MBI_RFLEN 87
 #define MAXNAMELEN 63
 
-bool MacResExtractor::init(Common::File in) {
+bool MacResExtractor::init(Common::File *in) {
 	byte infoHeader[MBI_INFOHDR];
 	int32 data_size, rsrc_size;
 	int32 data_size_pad, rsrc_size_pad;
 	int filelen;
 
-	filelen = in.size();
-	in.read(infoHeader, MBI_INFOHDR);
+	filelen = in->size();
+	in->read(infoHeader, MBI_INFOHDR);
 
 	// Maybe we have MacBinary?
 	if (infoHeader[MBI_ZERO1] == 0 && infoHeader[MBI_ZERO2] == 0 &&
@@ -1365,12 +1365,12 @@
 	if (_resOffset == -1) // MacBinary check is failed
 		_resOffset = 0; // Maybe we have dumped fork?
 
-	in.seek(_resOffset);
+	in->seek(_resOffset);
 
-	_dataOffset = in.readUint32BE() + _resOffset;
-	_mapOffset = in.readUint32BE() + _resOffset;
-	_dataLength = in.readUint32BE();
-	_mapLength = in.readUint32BE();
+	_dataOffset = in->readUint32BE() + _resOffset;
+	_mapOffset = in->readUint32BE() + _resOffset;
+	_dataLength = in->readUint32BE();
+	_mapLength = in->readUint32BE();
 
 	// do sanity check
 	if (_dataOffset >= filelen || _mapOffset >= filelen ||
@@ -1387,8 +1387,8 @@
 	return true;
 }
 
-byte *MacResExtractor::getResource(Common::File in, const char *typeID, int16 resID, int *size) {
-	int	i;
+byte *MacResExtractor::getResource(Common::File *in, const char *typeID, int16 resID, int *size) {
+	int i;
 	int typeNum = -1;
 	int resNum = -1;
 	byte *buf;
@@ -1412,37 +1412,37 @@
 	if (resNum == -1)
 		return NULL;
 
-	in.seek(_dataOffset + _resLists[typeNum][resNum].dataOffset);
+	in->seek(_dataOffset + _resLists[typeNum][resNum].dataOffset);
 
-	len = in.readUint32BE();
+	len = in->readUint32BE();
 	buf = (byte *)malloc(len);
 
-	in.read(buf, len);
+	in->read(buf, len);
 
 	*size = len;
 
 	return buf;
 }
 
-void MacResExtractor::readMap(Common::File in) {
+void MacResExtractor::readMap(Common::File *in) {
 	int	i, j, len;
 
-	in.seek(_mapOffset + 22);
+	in->seek(_mapOffset + 22);
 
-	_resMap.resAttr = in.readUint16BE();
-	_resMap.typeOffset = in.readUint16BE();
-	_resMap.nameOffset = in.readUint16BE();
-	_resMap.numTypes = in.readUint16BE();
+	_resMap.resAttr = in->readUint16BE();
+	_resMap.typeOffset = in->readUint16BE();
+	_resMap.nameOffset = in->readUint16BE();
+	_resMap.numTypes = in->readUint16BE();
 	_resMap.numTypes++;
 
-	in.seek(_mapOffset + _resMap.typeOffset + 2);
+	in->seek(_mapOffset + _resMap.typeOffset + 2);
 	_resTypes = new ResType[_resMap.numTypes];
 
 	for (i = 0; i < _resMap.numTypes; i++) {
-		in.read(_resTypes[i].id, 4);
+		in->read(_resTypes[i].id, 4);
 		_resTypes[i].id[4] = 0;
-		_resTypes[i].items = in.readUint16BE();
-		_resTypes[i].offset = in.readUint16BE();
+		_resTypes[i].items = in->readUint16BE();
+		_resTypes[i].offset = in->readUint16BE();
 		_resTypes[i].items++;
 	}
 
@@ -1450,15 +1450,15 @@
 
 	for (i = 0; i < _resMap.numTypes; i++) {
 		_resLists[i] = new Resource[_resTypes[i].items];
-		in.seek(_resTypes[i].offset + _mapOffset + _resMap.typeOffset);
+		in->seek(_resTypes[i].offset + _mapOffset + _resMap.typeOffset);
 
 		for (j = 0; j < _resTypes[i].items; j++) {
 			ResPtr resPtr = _resLists[i] + j;
 
-			resPtr->id = in.readUint16BE();
-			resPtr->nameOffset = in.readUint16BE();
-			resPtr->dataOffset = in.readUint32BE();
-			in.readUint32BE();
+			resPtr->id = in->readUint16BE();
+			resPtr->nameOffset = in->readUint16BE();
+			resPtr->dataOffset = in->readUint32BE();
+			in->readUint32BE();
 			resPtr->name = 0;
 
 			resPtr->attr = resPtr->dataOffset >> 24;
@@ -1467,12 +1467,12 @@
 
 		for (j = 0; j < _resTypes[i].items; j++) {
 			if (_resLists[i][j].nameOffset != -1) {
-				in.seek(_resLists[i][j].nameOffset + _mapOffset + _resMap.nameOffset);
+				in->seek(_resLists[i][j].nameOffset + _mapOffset + _resMap.nameOffset);
 
-				len = in.readByte();
+				len = in->readByte();
 				_resLists[i][j].name = new byte[len + 1];
 				_resLists[i][j].name[len] = 0;
-				in.read(_resLists[i][j].name, len);
+				in->read(_resLists[i][j].name, len);
 			}
 		}
 	}

Modified: scummvm/trunk/engines/scumm/he/resource_he.h
===================================================================
--- scummvm/trunk/engines/scumm/he/resource_he.h	2006-05-20 13:10:34 UTC (rev 22545)
+++ scummvm/trunk/engines/scumm/he/resource_he.h	2006-05-20 13:59:31 UTC (rev 22546)
@@ -511,9 +511,9 @@
 
 private:
 	int extractResource(int id, byte **buf);
-	bool init(Common::File in);
-	void readMap(Common::File in);
-	byte *getResource(Common::File in, const char *typeID, int16 resID, int *size);
+	bool init(Common::File *in);
+	void readMap(Common::File *in);
+	byte *getResource(Common::File *in, const char *typeID, int16 resID, int *size);
 	int convertIcons(byte *data, int datasize, byte **cursor, int *w, int *h,
 			 int *hotspot_x, int *hotspot_y, int *keycolor, byte **palette, int *palSize);
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.





More information about the Scummvm-git-logs mailing list