From c350ffabf3d589722b1bee95f63a783fbf39cc1b Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 3 Sep 2008 10:40:46 +0000 Subject: Added new AbstractFilesystemNode::openForReading & ::openForWriting method, based on StdioStream; changed FilesystemNode to use them svn-id: r34301 --- backends/fs/abstract-fs.cpp | 19 +++++++++++++++++++ backends/fs/abstract-fs.h | 21 ++++++++++++++++++--- common/fs.cpp | 40 +++++++++++++++------------------------- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/backends/fs/abstract-fs.cpp b/backends/fs/abstract-fs.cpp index f6dc8f1891..db2baee6ca 100644 --- a/backends/fs/abstract-fs.cpp +++ b/backends/fs/abstract-fs.cpp @@ -23,6 +23,7 @@ */ #include "backends/fs/abstract-fs.h" +#include "common/file.h" const char *AbstractFilesystemNode::lastPathComponent(const Common::String &str, const char sep) { if(str.empty()) @@ -37,3 +38,21 @@ const char *AbstractFilesystemNode::lastPathComponent(const Common::String &str, return cur + 1; } + +Common::SeekableReadStream *AbstractFilesystemNode::openForReading() { + // FIXME: Until openForReading is supported by all AbstractFilesystemNode + // implementations, we provide this "generic" one, using Common::File. + FILE *handle = fopen(getPath().c_str(), "rb"); + if (handle) + return new Common::StdioStream(handle); + return 0; +} + +Common::WriteStream *AbstractFilesystemNode::openForWriting() { + // FIXME: Until openForWriting is supported by all AbstractFilesystemNode + // implementations, we provide this "generic" one. + FILE *handle = fopen(getPath().c_str(), "wb"); + if (handle) + return new Common::StdioStream(handle); + return 0; +} diff --git a/backends/fs/abstract-fs.h b/backends/fs/abstract-fs.h index d81e7f36b0..73fae24373 100644 --- a/backends/fs/abstract-fs.h +++ b/backends/fs/abstract-fs.h @@ -162,9 +162,24 @@ public: */ virtual bool isWritable() const = 0; - /* TODO: - bool isFile(); - */ + + /** + * Creates a SeekableReadStream instance corresponding to the file + * referred by this node. This assumes that the node actually refers + * to a readable file. If this is not the case, 0 is returned. + * + * @return pointer to the stream object, 0 in case of a failure + */ + virtual Common::SeekableReadStream *openForReading(); + + /** + * Creates a WriteStream instance corresponding to the file + * referred by this node. This assumes that the node actually refers + * to a readable file. If this is not the case, 0 is returned. + * + * @return pointer to the stream object, 0 in case of a failure + */ + virtual Common::WriteStream *openForWriting(); }; diff --git a/common/fs.cpp b/common/fs.cpp index 429d388ad1..fb34509d6a 100644 --- a/common/fs.cpp +++ b/common/fs.cpp @@ -23,7 +23,6 @@ */ #include "common/util.h" -#include "common/file.h" #include "common/system.h" #include "backends/fs/abstract-fs.h" #include "backends/fs/fs-factory.h" @@ -177,37 +176,28 @@ bool FilesystemNode::lookupFile(FSList &results, const Common::String &p, bool h Common::SeekableReadStream *FilesystemNode::openForReading() { if (_realNode == 0) return 0; -#if 0 - return _realNode->openForReading(); -#else - // FIXME: Until we support openForReading in AbstractFilesystemNode, - // we just use Common::File. - Common::File *confFile = new Common::File(); - assert(confFile); - if (!confFile->open(*this)) { - delete confFile; - confFile = 0; + + if (!_realNode->exists()) { + warning("File::open: Trying to open a FilesystemNode which does not exist"); + return false; + } else if (_realNode->isDirectory()) { + warning("File::open: Trying to open a FilesystemNode which is a directory"); + return false; } - return confFile; -#endif + + return _realNode->openForReading(); } Common::WriteStream *FilesystemNode::openForWriting() { if (_realNode == 0) return 0; -#if 0 - return _realNode->openForWriting(); -#else - // FIXME: Until we support openForWriting in AbstractFilesystemNode, - // we just use Common::DumpFile. - Common::DumpFile *confFile = new Common::DumpFile(); - assert(confFile); - if (!confFile->open(*this)) { - delete confFile; - confFile = 0; + + if (_realNode->isDirectory()) { + warning("File::open: Trying to open a FilesystemNode which is a directory"); + return 0; } - return confFile; -#endif + + return _realNode->openForWriting(); } //} // End of namespace Common -- cgit v1.2.3