aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2008-09-03 10:40:46 +0000
committerMax Horn2008-09-03 10:40:46 +0000
commitc350ffabf3d589722b1bee95f63a783fbf39cc1b (patch)
tree128a1ad81917fee118ebd0174f52717cbd6d3391
parent8246582f5e3007a014cc22fc2840bd951e0c9b7f (diff)
downloadscummvm-rg350-c350ffabf3d589722b1bee95f63a783fbf39cc1b.tar.gz
scummvm-rg350-c350ffabf3d589722b1bee95f63a783fbf39cc1b.tar.bz2
scummvm-rg350-c350ffabf3d589722b1bee95f63a783fbf39cc1b.zip
Added new AbstractFilesystemNode::openForReading & ::openForWriting method, based on StdioStream; changed FilesystemNode to use them
svn-id: r34301
-rw-r--r--backends/fs/abstract-fs.cpp19
-rw-r--r--backends/fs/abstract-fs.h21
-rw-r--r--common/fs.cpp40
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