[Scummvm-cvs-logs] SF.net SVN: scummvm:[34300] scummvm/trunk/common

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Wed Sep 3 12:11:37 CEST 2008


Revision: 34300
          http://scummvm.svn.sourceforge.net/scummvm/?rev=34300&view=rev
Author:   fingolfin
Date:     2008-09-03 10:11:36 +0000 (Wed, 03 Sep 2008)

Log Message:
-----------
Added new StdioStream class, a thin wrapper around FILE

Modified Paths:
--------------
    scummvm/trunk/common/file.cpp
    scummvm/trunk/common/file.h

Modified: scummvm/trunk/common/file.cpp
===================================================================
--- scummvm/trunk/common/file.cpp	2008-09-03 10:10:45 UTC (rev 34299)
+++ scummvm/trunk/common/file.cpp	2008-09-03 10:11:36 UTC (rev 34300)
@@ -558,4 +558,66 @@
 }
 
 
+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

Modified: scummvm/trunk/common/file.h
===================================================================
--- scummvm/trunk/common/file.h	2008-09-03 10:10:45 UTC (rev 34299)
+++ scummvm/trunk/common/file.h	2008-09-03 10:11:36 UTC (rev 34300)
@@ -154,6 +154,28 @@
 };
 
 
+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


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list