diff options
| -rw-r--r-- | common/file.cpp | 89 | 
1 files changed, 18 insertions, 71 deletions
| diff --git a/common/file.cpp b/common/file.cpp index a69034ea87..11dbdb569f 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -28,7 +28,6 @@  #include "common/hashmap.h"  #include "common/util.h"  #include "common/hash-str.h" -#include <errno.h>  #include "backends/fs/stdiostream.h" @@ -36,41 +35,6 @@  #include "CoreFoundation/CoreFoundation.h"  #endif -#ifdef __PLAYSTATION2__ -	// for those replaced fopen/fread/etc functions -	typedef unsigned long	uint64; -	typedef signed long	int64; -	#include "backends/platform/ps2/fileio.h" - -	#define fopen(a, b)			ps2_fopen(a, b) -#endif - -#ifdef __DS__ - -	// These functions replease the standard library functions of the same name. -	// As this header is included after the standard one, I have the chance to #define -	// all of these to my own code. -	// -	// A #define is the only way, as redefinig the functions would cause linker errors. - -	// These functions need to be #undef'ed, as their original definition -	// in devkitarm is done with #includes (ugh!) - -	#include "backends/fs/ds/ds-fs.h" - -	// Only functions used in the ScummVM source have been defined here! -	#define fopen(name, mode)					DS::std_fopen(name, mode) - -#endif - -#ifdef __SYMBIAN32__ - -	#define FILE void - -	FILE*	symbian_fopen(const char* name, const char* mode); -	#define fopen(name, mode)					symbian_fopen(name, mode) -#endif -  namespace Common {  typedef HashMap<String, int> StringIntMap; @@ -81,8 +45,8 @@ typedef HashMap<String, int> StringIntMap;  static StringIntMap *_defaultDirectories;  static StringMap *_filesMap; -static FILE *fopenNoCase(const String &filename, const String &directory, const char *mode) { -	FILE *file; +static SeekableReadStream *fopenNoCase(const String &filename, const String &directory) { +	SeekableReadStream *handle;  	String dirBuf(directory);  	String fileBuf(filename); @@ -102,50 +66,37 @@ static FILE *fopenNoCase(const String &filename, const String &directory, const  	//  	// Try to open the file normally  	// -	file = fopen(pathBuf.c_str(), mode); +	handle = StdioStream::makeFromPath(pathBuf, false);  	//  	// Try again, with file name converted to upper case  	// -	if (!file) { +	if (!handle) {  		fileBuf.toUppercase();  		pathBuf = dirBuf + fileBuf; -		file = fopen(pathBuf.c_str(), mode); +		handle = StdioStream::makeFromPath(pathBuf, false);  	}  	//  	// Try again, with file name converted to lower case  	// -	if (!file) { +	if (!handle) {  		fileBuf.toLowercase();  		pathBuf = dirBuf + fileBuf; -		file = fopen(pathBuf.c_str(), mode); +		handle = StdioStream::makeFromPath(pathBuf, false);  	}  	//  	// Try again, with file name capitalized  	// -	if (!file) { +	if (!handle) {  		fileBuf.toLowercase();  		fileBuf.setChar(toupper(fileBuf[0]),0);  		pathBuf = dirBuf + fileBuf; -		file = fopen(pathBuf.c_str(), mode); -	} - -#ifdef __amigaos4__ -	// -	// Work around for possibility that someone uses AmigaOS "newlib" build -	// with SmartFileSystem (blocksize 512 bytes), leading to buffer size -	// being only 512 bytes. "Clib2" sets the buffer size to 8KB, resulting -	// smooth movie playback. This forces the buffer to be enough also when -	// using "newlib" compile on SFS. -	// -	if (file) { -		setvbuf(file, NULL, _IOFBF, 8192); +		handle = StdioStream::makeFromPath(pathBuf, false);  	} -#endif -	return file; +	return handle;  }  void File::addDefaultDirectory(const String &directory) { @@ -218,7 +169,6 @@ File::~File() {  bool File::open(const String &filename) { -	FILE *file = 0;  	assert(!filename.empty());  	assert(!_handle); @@ -231,36 +181,36 @@ bool File::open(const String &filename) {  	if (_filesMap && _filesMap->contains(fname)) {  		fname = (*_filesMap)[fname];  		debug(3, "Opening hashed: %s", fname.c_str()); -		file = fopen(fname.c_str(), "rb"); +		_handle = StdioStream::makeFromPath(fname, false);  	} else if (_filesMap && _filesMap->contains(fname + ".")) {  		// WORKAROUND: Bug #1458388: "SIMON1: Game Detection fails"  		// sometimes instead of "GAMEPC" we get "GAMEPC." (note trailing dot)  		fname = (*_filesMap)[fname + "."];  		debug(3, "Opening hashed: %s", fname.c_str()); -		file = fopen(fname.c_str(), "rb"); +		_handle = StdioStream::makeFromPath(fname, false);  	} else {  		if (_defaultDirectories) {  			// Try all default directories  			StringIntMap::const_iterator x(_defaultDirectories->begin()); -			for (; file == NULL && x != _defaultDirectories->end(); ++x) { -				file = fopenNoCase(filename, x->_key, "rb"); +			for (; _handle == NULL && x != _defaultDirectories->end(); ++x) { +				_handle = fopenNoCase(filename, x->_key);  			}  		}  		// Last resort: try the current directory -		if (file == NULL) -			file = fopenNoCase(filename, "", "rb"); +		if (_handle == NULL) +			_handle = fopenNoCase(filename, "");  		// Last last (really) resort: try looking inside the application bundle on Mac OS X for the lowercase file.  #if defined(MACOSX) || defined(IPHONE) -		if (!file) { +		if (!_handle) {  			CFStringRef cfFileName = CFStringCreateWithBytes(NULL, (const UInt8 *)filename.c_str(), filename.size(), kCFStringEncodingASCII, false);  			CFURLRef fileUrl = CFBundleCopyResourceURL(CFBundleGetMainBundle(), cfFileName, NULL, NULL);  			if (fileUrl) {  				UInt8 buf[256];  				if (CFURLGetFileSystemRepresentation(fileUrl, false, (UInt8 *)buf, 256)) { -					file = fopen((char *)buf, "rb"); +					_handle = StdioStream::makeFromPath((char *)buf, false);  				}  				CFRelease(fileUrl);  			} @@ -270,9 +220,6 @@ bool File::open(const String &filename) {  	} -	if (file) -		_handle = new StdioStream(file); -  	if (_handle == NULL)  		debug(2, "File %s not opened", filename.c_str());  	else | 
