diff --git a/stepmania/src/RageFileDriverSlice.cpp b/stepmania/src/RageFileDriverSlice.cpp index 9bfabdc141..1e94f7b4be 100644 --- a/stepmania/src/RageFileDriverSlice.cpp +++ b/stepmania/src/RageFileDriverSlice.cpp @@ -7,16 +7,19 @@ RageFileDriverSlice::RageFileDriverSlice( RageFileBasic *pFile, int iOffset, int m_iOffset = iOffset; m_iFileSize = iFileSize; m_iFilePos = 0; + m_bFileOwned = false; } RageFileDriverSlice::~RageFileDriverSlice() { - delete m_pFile; + if( m_bFileOwned ) + delete m_pFile; } RageFileBasic *RageFileDriverSlice::Copy() const { RageFileDriverSlice *pRet = new RageFileDriverSlice( m_pFile->Copy(), m_iOffset, m_iFileSize ); + pRet->m_bFileOwned = true; pRet->m_iFilePos = m_iFilePos; return pRet; } diff --git a/stepmania/src/RageFileDriverSlice.h b/stepmania/src/RageFileDriverSlice.h index 117807d95e..363f5a32e5 100644 --- a/stepmania/src/RageFileDriverSlice.h +++ b/stepmania/src/RageFileDriverSlice.h @@ -13,6 +13,8 @@ public: ~RageFileDriverSlice(); RageFileBasic *Copy() const; + void DeleteFileWhenFinished() { m_bFileOwned = true; } + int ReadInternal( void *pBuffer, size_t iBytes ); int WriteInternal( const void *pBuffer, size_t iBytes ) { SetError( "Not implemented" ); return -1; } int SeekInternal( int iOffset ); @@ -22,6 +24,7 @@ private: RageFileBasic *m_pFile; int m_iFilePos; int m_iOffset, m_iFileSize; + bool m_bFileOwned; }; #endif diff --git a/stepmania/src/RageFileDriverZip.cpp b/stepmania/src/RageFileDriverZip.cpp index a5460cef36..a04ed3d600 100644 --- a/stepmania/src/RageFileDriverZip.cpp +++ b/stepmania/src/RageFileDriverZip.cpp @@ -366,7 +366,9 @@ RageFileBasic *RageFileDriverZip::Open( const CString &path, int mode, int &err zip.Seek( info->data_offset ); - RageFileBasic *pFile = new RageFileDriverSlice( zip.Copy(), info->data_offset, info->compr_size ); + RageFileDriverSlice *pFile = new RageFileDriverSlice( zip.Copy(), info->data_offset, info->compr_size ); + pFile->DeleteFileWhenFinished(); + switch( info->compression_method ) { case STORED: