diff options
-rw-r--r-- | backends/fs/abstract-fs.cpp | 6 | ||||
-rw-r--r-- | backends/fs/posix/posix-fs-factory.cpp | 1 | ||||
-rw-r--r-- | backends/fs/stdiostream.cpp | 193 | ||||
-rw-r--r-- | backends/fs/stdiostream.h | 55 | ||||
-rw-r--r-- | backends/module.mk | 1 | ||||
-rw-r--r-- | common/file.cpp | 63 | ||||
-rw-r--r-- | common/file.h | 23 |
7 files changed, 253 insertions, 89 deletions
diff --git a/backends/fs/abstract-fs.cpp b/backends/fs/abstract-fs.cpp index db2baee6ca..80ff2b05c5 100644 --- a/backends/fs/abstract-fs.cpp +++ b/backends/fs/abstract-fs.cpp @@ -23,7 +23,7 @@ */ #include "backends/fs/abstract-fs.h" -#include "common/file.h" +#include "backends/fs/stdiostream.h" const char *AbstractFilesystemNode::lastPathComponent(const Common::String &str, const char sep) { if(str.empty()) @@ -44,7 +44,7 @@ Common::SeekableReadStream *AbstractFilesystemNode::openForReading() { // implementations, we provide this "generic" one, using Common::File. FILE *handle = fopen(getPath().c_str(), "rb"); if (handle) - return new Common::StdioStream(handle); + return new StdioStream(handle); return 0; } @@ -53,6 +53,6 @@ Common::WriteStream *AbstractFilesystemNode::openForWriting() { // implementations, we provide this "generic" one. FILE *handle = fopen(getPath().c_str(), "wb"); if (handle) - return new Common::StdioStream(handle); + return new StdioStream(handle); return 0; } diff --git a/backends/fs/posix/posix-fs-factory.cpp b/backends/fs/posix/posix-fs-factory.cpp index da73738287..3d6e9a65d9 100644 --- a/backends/fs/posix/posix-fs-factory.cpp +++ b/backends/fs/posix/posix-fs-factory.cpp @@ -37,6 +37,7 @@ AbstractFilesystemNode *POSIXFilesystemFactory::makeCurrentDirectoryFileNode() c } AbstractFilesystemNode *POSIXFilesystemFactory::makeFileNodePath(const Common::String &path) const { + assert(!path.empty()); return new POSIXFilesystemNode(path, true); } #endif diff --git a/backends/fs/stdiostream.cpp b/backends/fs/stdiostream.cpp new file mode 100644 index 0000000000..8fde1b1eb8 --- /dev/null +++ b/backends/fs/stdiostream.cpp @@ -0,0 +1,193 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "backends/fs/stdiostream.h" + +#include <errno.h> + +#if defined(MACOSX) || defined(IPHONE) +#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) + #define fclose(a) ps2_fclose(a) + #define fseek(a, b, c) ps2_fseek(a, b, c) + #define ftell(a) ps2_ftell(a) + #define feof(a) ps2_feof(a) + #define fread(a, b, c, d) ps2_fread(a, b, c, d) + #define fwrite(a, b, c, d) ps2_fwrite(a, b, c, d) + + //#define fprintf ps2_fprintf // used in common/util.cpp + //#define fflush(a) ps2_fflush(a) // used in common/util.cpp + + //#define fgetc(a) ps2_fgetc(a) // not used + //#define fgets(a, b, c) ps2_fgets(a, b, c) // not used + //#define fputc(a, b) ps2_fputc(a, b) // not used + //#define fputs(a, b) ps2_fputs(a, b) // not used + + //#define fsize(a) ps2_fsize(a) // not used -- and it is not a standard function either +#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!) + #undef feof + #undef clearerr + //#undef getc + //#undef ferror + + #include "backends/fs/ds/ds-fs.h" + + + //void std_fprintf(FILE* handle, const char* fmt, ...); // used in common/util.cpp + //void std_fflush(FILE* handle); // used in common/util.cpp + + //char* std_fgets(char* str, int size, FILE* file); // not used + //int std_getc(FILE* handle); // not used + //char* std_getcwd(char* dir, int dunno); // not used + //void std_cwd(char* dir); // not used + //int std_ferror(FILE* handle); // not used + + // Only functions used in the ScummVM source have been defined here! + #define fopen(name, mode) DS::std_fopen(name, mode) + #define fclose(handle) DS::std_fclose(handle) + #define fread(ptr, size, items, file) DS::std_fread(ptr, size, items, file) + #define fwrite(ptr, size, items, file) DS::std_fwrite(ptr, size, items, file) + #define feof(handle) DS::std_feof(handle) + #define ftell(handle) DS::std_ftell(handle) + #define fseek(handle, offset, whence) DS::std_fseek(handle, offset, whence) + #define clearerr(handle) DS::std_clearerr(handle) + + //#define printf(fmt, ...) consolePrintf(fmt, ##__VA_ARGS__) + + //#define fprintf(file, fmt, ...) { char str[128]; sprintf(str, fmt, ##__VA_ARGS__); DS::std_fwrite(str, strlen(str), 1, file); } + //#define fflush(file) DS::std_fflush(file) // used in common/util.cpp + + //#define fgets(str, size, file) DS::std_fgets(str, size, file) // not used + //#define getc(handle) DS::std_getc(handle) // not used + //#define getcwd(dir, dunno) DS::std_getcwd(dir, dunno) // not used + #define ferror(handle) DS::std_ferror(handle) + +#endif + +#ifdef __SYMBIAN32__ + #undef feof + #undef clearerr + + #define FILE void + + FILE* symbian_fopen(const char* name, const char* mode); + void symbian_fclose(FILE* handle); + size_t symbian_fread(const void* ptr, size_t size, size_t numItems, FILE* handle); + size_t symbian_fwrite(const void* ptr, size_t size, size_t numItems, FILE* handle); + bool symbian_feof(FILE* handle); + long int symbian_ftell(FILE* handle); + int symbian_fseek(FILE* handle, long int offset, int whence); + void symbian_clearerr(FILE* handle); + + // Only functions used in the ScummVM source have been defined here! + #define fopen(name, mode) symbian_fopen(name, mode) + #define fclose(handle) symbian_fclose(handle) + #define fread(ptr, size, items, file) symbian_fread(ptr, size, items, file) + #define fwrite(ptr, size, items, file) symbian_fwrite(ptr, size, items, file) + #define feof(handle) symbian_feof(handle) + #define ftell(handle) symbian_ftell(handle) + #define fseek(handle, offset, whence) symbian_fseek(handle, offset, whence) + #define clearerr(handle) symbian_clearerr(handle) +#endif + + +StdioStream::StdioStream(void *handle) : _handle(handle) { + assert(handle); +} + +StdioStream::~StdioStream() { + fclose((FILE *)_handle); +} + +bool StdioStream::ioFailed() const { + return ferror((FILE *)_handle) != 0; +} + +void StdioStream::clearIOFailed() { + clearerr((FILE *)_handle); +} + +bool StdioStream::eos() const { + return feof((FILE *)_handle) != 0; +} + +uint32 StdioStream::pos() const { + // FIXME: ftell can return -1 to indicate an error (in which case errno gets set) + // Maybe we should support that, too? + return ftell((FILE *)_handle); +} + +uint32 StdioStream::size() const { + uint32 oldPos = ftell((FILE *)_handle); + fseek((FILE *)_handle, 0, SEEK_END); + uint32 length = ftell((FILE *)_handle); + fseek((FILE *)_handle, oldPos, SEEK_SET); + + return length; +} + +void StdioStream::seek(int32 offs, int whence) { + assert(_handle); + + if (fseek((FILE *)_handle, offs, whence) != 0) + clearerr((FILE *)_handle); // FIXME: why do we call clearerr here? + + // FIXME: fseek has a return value to indicate errors; + // Maybe we should support that, too? +} + +uint32 StdioStream::read(void *ptr, uint32 len) { + return (uint32)fread((byte *)ptr, 1, len, (FILE *)_handle); +} + +uint32 StdioStream::write(const void *ptr, uint32 len) { + return (uint32)fwrite(ptr, 1, len, (FILE *)_handle); +} + +void StdioStream::flush() { + // TODO: Should check the return value of fflush, and if it is non-zero, + // check errno and set an error flag. + fflush((FILE *)_handle); +} diff --git a/backends/fs/stdiostream.h b/backends/fs/stdiostream.h new file mode 100644 index 0000000000..fc2d68d7b3 --- /dev/null +++ b/backends/fs/stdiostream.h @@ -0,0 +1,55 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef BACKENDS_FS_STDIOSTREAM_H +#define BACKENDS_FS_STDIOSTREAM_H + +#include "common/scummsys.h" +#include "common/noncopyable.h" +#include "common/stream.h" + +class StdioStream : public Common::SeekableReadStream, public Common::WriteStream, public Common::NonCopyable { +protected: + /** File handle to the actual file. */ + void *_handle; + +public: + StdioStream(void *handle); + virtual ~StdioStream(); + + bool ioFailed() const; + void clearIOFailed(); + bool eos() const; + + virtual uint32 write(const void *dataPtr, uint32 dataSize); + virtual void flush(); + + virtual uint32 pos() const; + virtual uint32 size() const; + void seek(int32 offs, int whence = SEEK_SET); + uint32 read(void *dataPtr, uint32 dataSize); +}; + +#endif diff --git a/backends/module.mk b/backends/module.mk index 9e66fba4af..8944e9a3db 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -2,6 +2,7 @@ MODULE := backends MODULE_OBJS := \ fs/abstract-fs.o \ + fs/stdiostream.o \ fs/amigaos4/amigaos4-fs-factory.o \ fs/ds/ds-fs-factory.o \ fs/palmos/palmos-fs-factory.o \ diff --git a/common/file.cpp b/common/file.cpp index 6083e5547d..cc9ae01baf 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -557,67 +557,4 @@ void DumpFile::flush() { fflush((FILE *)_handle); } - -StdioStream::StdioStream(void *handle) : _handle(handle) { - assert(handle); -} - -StdioStream::~StdioStream() { - fclose((FILE *)_handle); -} - -bool StdioStream::ioFailed() const { - return ferror((FILE *)_handle) != 0; -} - -void StdioStream::clearIOFailed() { - clearerr((FILE *)_handle); -} - -bool StdioStream::eos() const { - return feof((FILE *)_handle) != 0; -} - -uint32 StdioStream::pos() const { - // FIXME: ftell can return -1 to indicate an error (in which case errno gets set) - // Maybe we should support that, too? - return ftell((FILE *)_handle); -} - -uint32 StdioStream::size() const { - uint32 oldPos = ftell((FILE *)_handle); - fseek((FILE *)_handle, 0, SEEK_END); - uint32 length = ftell((FILE *)_handle); - fseek((FILE *)_handle, oldPos, SEEK_SET); - - return length; -} - -void StdioStream::seek(int32 offs, int whence) { - assert(_handle); - - if (fseek((FILE *)_handle, offs, whence) != 0) - clearerr((FILE *)_handle); // FIXME: why do we call clearerr here? - - // FIXME: fseek has a return value to indicate errors; - // Maybe we should support that, too? -} - -uint32 StdioStream::read(void *ptr, uint32 len) { - return (uint32)fread((byte *)ptr, 1, len, (FILE *)_handle); -} - -uint32 StdioStream::write(const void *ptr, uint32 len) { - return (uint32)fwrite(ptr, 1, len, (FILE *)_handle); -} - -void StdioStream::flush() { - // TODO: Should check the return value of fflush, and if it is non-zero, - // check errno and set an error flag. - fflush((FILE *)_handle); -} - - - - } // End of namespace Common diff --git a/common/file.h b/common/file.h index 6f18edbeb4..240835b5b9 100644 --- a/common/file.h +++ b/common/file.h @@ -154,29 +154,6 @@ public: virtual void flush(); }; - -class StdioStream : public SeekableReadStream, public WriteStream, public NonCopyable { -protected: - /** File handle to the actual file. */ - void *_handle; - -public: - StdioStream(void *handle); - virtual ~StdioStream(); - - bool ioFailed() const; - void clearIOFailed(); - bool eos() const; - - virtual uint32 write(const void *dataPtr, uint32 dataSize); - virtual void flush(); - - virtual uint32 pos() const; - virtual uint32 size() const; - void seek(int32 offs, int whence = SEEK_SET); - uint32 read(void *dataPtr, uint32 dataSize); -}; - } // End of namespace Common #endif |