aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorMax Horn2008-09-03 10:11:36 +0000
committerMax Horn2008-09-03 10:11:36 +0000
commit8246582f5e3007a014cc22fc2840bd951e0c9b7f (patch)
tree94457ae3f3898c31ab95560a4f5c354c40a56961 /common
parent2d36c08d9faf71a6725f73d1f7ff77070e74f0a2 (diff)
downloadscummvm-rg350-8246582f5e3007a014cc22fc2840bd951e0c9b7f.tar.gz
scummvm-rg350-8246582f5e3007a014cc22fc2840bd951e0c9b7f.tar.bz2
scummvm-rg350-8246582f5e3007a014cc22fc2840bd951e0c9b7f.zip
Added new StdioStream class, a thin wrapper around FILE
svn-id: r34300
Diffstat (limited to 'common')
-rw-r--r--common/file.cpp62
-rw-r--r--common/file.h22
2 files changed, 84 insertions, 0 deletions
diff --git a/common/file.cpp b/common/file.cpp
index fb837b9499..6083e5547d 100644
--- a/common/file.cpp
+++ b/common/file.cpp
@@ -558,4 +558,66 @@ void DumpFile::flush() {
}
+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 3adeb6ff36..86b016c294 100644
--- a/common/file.h
+++ b/common/file.h
@@ -154,6 +154,28 @@ public:
};
+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