diff --git a/source/Irrlicht/CFileSystem.cpp b/source/Irrlicht/CFileSystem.cpp index d0bc7c9c2..5432182a2 100644 --- a/source/Irrlicht/CFileSystem.cpp +++ b/source/Irrlicht/CFileSystem.cpp @@ -125,12 +125,12 @@ IReadFile* CFileSystem::createAndOpenFile(const io::path& filename) //! Creates an IReadFile interface for treating memory like a file. IReadFile* CFileSystem::createMemoryReadFile(const void* memory, s32 len, - const io::path& fileName, bool deleteMemoryWhenDropped) + const io::path& fileName, bool deleteMemoryWhenDropped, bool makeLocalCopy) { if (!memory) return 0; else - return new CMemoryReadFile(memory, len, fileName, deleteMemoryWhenDropped); + return new CMemoryReadFile(memory, len, fileName, deleteMemoryWhenDropped, makeLocalCopy); } @@ -147,12 +147,12 @@ IReadFile* CFileSystem::createLimitReadFile(const io::path& fileName, //! Creates an IReadFile interface for treating memory like a file. IWriteFile* CFileSystem::createMemoryWriteFile(void* memory, s32 len, - const io::path& fileName, bool deleteMemoryWhenDropped) + const io::path& fileName, bool deleteMemoryWhenDropped, bool makeLocalCopy) { if (!memory) return 0; else - return new CMemoryWriteFile(memory, len, fileName, deleteMemoryWhenDropped); + return new CMemoryWriteFile(memory, len, fileName, deleteMemoryWhenDropped, makeLocalCopy); } diff --git a/source/Irrlicht/CFileSystem.h b/source/Irrlicht/CFileSystem.h index 5c542b363..6a43f4bcb 100644 --- a/source/Irrlicht/CFileSystem.h +++ b/source/Irrlicht/CFileSystem.h @@ -34,13 +34,13 @@ class CFileSystem : public IFileSystem virtual IReadFile* createAndOpenFile(const io::path& filename) _IRR_OVERRIDE_; //! Creates an IReadFile interface for accessing memory like a file. - virtual IReadFile* createMemoryReadFile(const void* memory, s32 len, const io::path& fileName, bool deleteMemoryWhenDropped = false) _IRR_OVERRIDE_; + virtual IReadFile* createMemoryReadFile(const void* memory, s32 len, const io::path& fileName, bool deleteMemoryWhenDropped = false, bool makeLocalCopy=false) _IRR_OVERRIDE_; //! Creates an IReadFile interface for accessing files inside files virtual IReadFile* createLimitReadFile(const io::path& fileName, IReadFile* alreadyOpenedFile, long pos, long areaSize) _IRR_OVERRIDE_; //! Creates an IWriteFile interface for accessing memory like a file. - virtual IWriteFile* createMemoryWriteFile(void* memory, s32 len, const io::path& fileName, bool deleteMemoryWhenDropped=false) _IRR_OVERRIDE_; + virtual IWriteFile* createMemoryWriteFile(void* memory, s32 len, const io::path& fileName, bool deleteMemoryWhenDropped=false, bool makeLocalCopy=false) _IRR_OVERRIDE_; //! Opens a file for write access. virtual IWriteFile* createAndWriteFile(const io::path& filename, bool append=false) _IRR_OVERRIDE_; diff --git a/source/Irrlicht/CMemoryFile.cpp b/source/Irrlicht/CMemoryFile.cpp index be2794f7a..97e5f56ef 100644 --- a/source/Irrlicht/CMemoryFile.cpp +++ b/source/Irrlicht/CMemoryFile.cpp @@ -10,9 +10,26 @@ namespace irr namespace io { +//! copy routine to allow for local allocator to hold memory +const void * dupe(const void *m, long len, bool clone) { + if (clone) { + c8* b = new c8[len]; + if (m) memcpy(b, m, len); + return b; + } + return m; +} +void * dupe(void *m, long len, bool clone) { + if (clone) { + c8* b = new c8[len]; + if (m) memcpy(b, m, len); + return b; + } + return m; +} -CMemoryReadFile::CMemoryReadFile(const void* memory, long len, const io::path& fileName, bool d) -: Buffer(memory), Len(len), Pos(0), Filename(fileName), deleteMemoryWhenDropped(d) +CMemoryReadFile::CMemoryReadFile(const void* memory, long len, const io::path& fileName, bool d, bool c) +: Buffer(dupe(memory,len,c)), Len(len), Pos(0), Filename(fileName), deleteMemoryWhenDropped(d||c) { #ifdef _DEBUG setDebugName("CMemoryReadFile"); @@ -90,8 +107,8 @@ const io::path& CMemoryReadFile::getFileName() const } -CMemoryWriteFile::CMemoryWriteFile(void* memory, long len, const io::path& fileName, bool d) -: Buffer(memory), Len(len), Pos(0), Filename(fileName), deleteMemoryWhenDropped(d) +CMemoryWriteFile::CMemoryWriteFile(void* memory, long len, const io::path& fileName, bool d, bool c) +: Buffer(dupe(memory,len,c)), Len(len), Pos(0), Filename(fileName), deleteMemoryWhenDropped(d||c) { #ifdef _DEBUG setDebugName("CMemoryWriteFile"); diff --git a/source/Irrlicht/CMemoryFile.h b/source/Irrlicht/CMemoryFile.h index 028e3e15a..c59c0f7d8 100644 --- a/source/Irrlicht/CMemoryFile.h +++ b/source/Irrlicht/CMemoryFile.h @@ -23,7 +23,7 @@ namespace io public: //! Constructor - CMemoryReadFile(const void* memory, long len, const io::path& fileName, bool deleteMemoryWhenDropped); + CMemoryReadFile(const void* memory, long len, const io::path& fileName, bool deleteMemoryWhenDropped, bool makeLocalCopy = false); //! Destructor virtual ~CMemoryReadFile(); @@ -60,7 +60,7 @@ namespace io public: //! Constructor - CMemoryWriteFile(void* memory, long len, const io::path& fileName, bool deleteMemoryWhenDropped); + CMemoryWriteFile(void* memory, long len, const io::path& fileName, bool deleteMemoryWhenDropped, bool makeLocalCopy = false); //! Destructor virtual ~CMemoryWriteFile();