diff options
author | cutealien <cutealien@dfc29bdd-3216-0410-991c-e03cc46cb475> | 2020-01-03 19:05:16 +0000 |
---|---|---|
committer | cutealien <cutealien@dfc29bdd-3216-0410-991c-e03cc46cb475> | 2020-01-03 19:05:16 +0000 |
commit | 2ae2a551a6290f46734307bbfdafea4b1a2cf2ba (patch) | |
tree | ba2f0b468640e44899fed3df2d4cc58795f4a003 /source/Irrlicht/CMemoryFile.cpp | |
download | irrlicht-2ae2a551a6290f46734307bbfdafea4b1a2cf2ba.tar.xz |
Merging r5975 through r6036 from trunk to ogl-es branch.
GLES drivers adapted, but only did make compile-tests.
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@6038 dfc29bdd-3216-0410-991c-e03cc46cb475
Diffstat (limited to 'source/Irrlicht/CMemoryFile.cpp')
-rw-r--r-- | source/Irrlicht/CMemoryFile.cpp | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/source/Irrlicht/CMemoryFile.cpp b/source/Irrlicht/CMemoryFile.cpp new file mode 100644 index 0000000..22c57e6 --- /dev/null +++ b/source/Irrlicht/CMemoryFile.cpp @@ -0,0 +1,187 @@ +// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#include "CMemoryFile.h"
+#include "irrString.h"
+
+namespace irr
+{
+namespace io
+{
+
+
+CMemoryReadFile::CMemoryReadFile(const void* memory, long len, const io::path& fileName, bool d)
+: Buffer(memory), Len(len), Pos(0), Filename(fileName), deleteMemoryWhenDropped(d)
+{
+ #ifdef _DEBUG
+ setDebugName("CMemoryReadFile");
+ #endif
+}
+
+
+CMemoryReadFile::~CMemoryReadFile()
+{
+ if (deleteMemoryWhenDropped)
+ delete [] (c8*)Buffer;
+}
+
+
+//! returns how much was read
+size_t CMemoryReadFile::read(void* buffer, size_t sizeToRead)
+{
+ long amount = static_cast<long>(sizeToRead);
+ if (Pos + amount > Len)
+ amount -= Pos + amount - Len;
+
+ if (amount <= 0)
+ return 0;
+
+ c8* p = (c8*)Buffer;
+ memcpy(buffer, p + Pos, amount);
+
+ Pos += amount;
+
+ return static_cast<size_t>(amount);
+}
+
+//! changes position in file, returns true if successful
+//! if relativeMovement==true, the pos is changed relative to current pos,
+//! otherwise from begin of file
+bool CMemoryReadFile::seek(long finalPos, bool relativeMovement)
+{
+ if (relativeMovement)
+ {
+ if (Pos + finalPos > Len)
+ return false;
+
+ Pos += finalPos;
+ }
+ else
+ {
+ if (finalPos > Len)
+ return false;
+
+ Pos = finalPos;
+ }
+
+ return true;
+}
+
+
+//! returns size of file
+long CMemoryReadFile::getSize() const
+{
+ return Len;
+}
+
+
+//! returns where in the file we are.
+long CMemoryReadFile::getPos() const
+{
+ return Pos;
+}
+
+
+//! returns name of file
+const io::path& CMemoryReadFile::getFileName() const
+{
+ return Filename;
+}
+
+
+CMemoryWriteFile::CMemoryWriteFile(void* memory, long len, const io::path& fileName, bool d)
+: Buffer(memory), Len(len), Pos(0), Filename(fileName), deleteMemoryWhenDropped(d)
+{
+ #ifdef _DEBUG
+ setDebugName("CMemoryWriteFile");
+ #endif
+}
+
+
+CMemoryWriteFile::~CMemoryWriteFile()
+{
+ if (deleteMemoryWhenDropped)
+ delete [] (c8*)Buffer;
+}
+
+
+//! returns how much was written
+size_t CMemoryWriteFile::write(const void* buffer, size_t sizeToWrite)
+{
+ long amount = (long)sizeToWrite;
+ if (Pos + amount > Len)
+ amount -= Pos + amount - Len;
+
+ if (amount <= 0)
+ return 0;
+
+ c8* p = (c8*)Buffer;
+ memcpy(p + Pos, buffer, amount);
+
+ Pos += amount;
+
+ return (size_t)amount;
+}
+
+
+
+//! changes position in file, returns true if successful
+//! if relativeMovement==true, the pos is changed relative to current pos,
+//! otherwise from begin of file
+bool CMemoryWriteFile::seek(long finalPos, bool relativeMovement)
+{
+ if (relativeMovement)
+ {
+ if (Pos + finalPos > Len)
+ return false;
+
+ Pos += finalPos;
+ }
+ else
+ {
+ if (finalPos > Len)
+ return false;
+
+ Pos = finalPos;
+ }
+
+ return true;
+}
+
+
+//! returns where in the file we are.
+long CMemoryWriteFile::getPos() const
+{
+ return Pos;
+}
+
+
+//! returns name of file
+const io::path& CMemoryWriteFile::getFileName() const
+{
+ return Filename;
+}
+
+bool CMemoryWriteFile::flush()
+{
+ return true; // no buffering, so nothing to do
+}
+
+IReadFile* createMemoryReadFile(const void* memory, long size, const io::path& fileName, bool deleteMemoryWhenDropped)
+{
+ CMemoryReadFile* file = new CMemoryReadFile(memory, size, fileName, deleteMemoryWhenDropped);
+ return file;
+}
+
+
+IWriteFile* createMemoryWriteFile(void* memory, long size, const io::path& fileName, bool deleteMemoryWhenDropped)
+{
+ CMemoryWriteFile* file = new CMemoryWriteFile(memory, size, fileName, deleteMemoryWhenDropped);
+ return file;
+}
+
+
+} // end namespace io
+} // end namespace irr
+
|