GunzipFile: delete file
This commit is contained in:
@@ -310,33 +310,35 @@ int RageFileObjDeflate::FlushInternal()
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse a .gz file, check the header CRC16 if present, and return the data
|
* Parse a .gz file, check the header CRC16 if present, and return the data
|
||||||
* CRC32 and a decompressor.
|
* CRC32 and a decompressor. pFile will be deleted.
|
||||||
*/
|
*/
|
||||||
RageFileObjInflate *GunzipFile( RageFileBasic &file, RString &sError, uint32_t *iCRC32 )
|
RageFileObjInflate *GunzipFile( RageFileBasic *pFile_, RString &sError, uint32_t *iCRC32 )
|
||||||
{
|
{
|
||||||
|
auto_ptr<RageFileBasic> pFile(pFile_);
|
||||||
|
|
||||||
sError = "";
|
sError = "";
|
||||||
|
|
||||||
file.Seek(0);
|
pFile->Seek(0);
|
||||||
file.EnableCRC32( true );
|
pFile->EnableCRC32( true );
|
||||||
|
|
||||||
{
|
{
|
||||||
char magic[2];
|
char magic[2];
|
||||||
FileReading::ReadBytes( file, magic, 2, sError );
|
FileReading::ReadBytes( *pFile, magic, 2, sError );
|
||||||
if( sError != "" )
|
if( sError != "" )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if( magic[0] != '\x1f' || magic[1] != '\x8b' )
|
if( magic[0] != '\x1f' || magic[1] != '\x8b' )
|
||||||
{
|
{
|
||||||
sError = "Not a gzip file";
|
sError = "Not a gzipped file";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t iCompressionMethod = FileReading::read_8( file, sError );
|
uint8_t iCompressionMethod = FileReading::read_8( *pFile, sError );
|
||||||
uint8_t iFlags = FileReading::read_8( file, sError );
|
uint8_t iFlags = FileReading::read_8( *pFile, sError );
|
||||||
FileReading::read_32_le( file, sError ); /* time */
|
FileReading::read_32_le( *pFile, sError ); /* time */
|
||||||
FileReading::read_8( file, sError ); /* xfl */
|
FileReading::read_8( *pFile, sError ); /* xfl */
|
||||||
FileReading::read_8( file, sError ); /* os */
|
FileReading::read_8( *pFile, sError ); /* os */
|
||||||
if( sError != "" )
|
if( sError != "" )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -362,15 +364,15 @@ RageFileObjInflate *GunzipFile( RageFileBasic &file, RString &sError, uint32_t *
|
|||||||
|
|
||||||
if( iFlags & FEXTRA )
|
if( iFlags & FEXTRA )
|
||||||
{
|
{
|
||||||
int16_t iSize = FileReading::read_16_le( file, sError );
|
int16_t iSize = FileReading::read_16_le( *pFile, sError );
|
||||||
FileReading::SkipBytes( file, iSize, sError );
|
FileReading::SkipBytes( *pFile, iSize, sError );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( iFlags & FNAME )
|
if( iFlags & FNAME )
|
||||||
while( sError == "" && FileReading::read_8( file, sError ) != 0 )
|
while( sError == "" && FileReading::read_8( *pFile, sError ) != 0 )
|
||||||
;
|
;
|
||||||
if( iFlags & FCOMMENT )
|
if( iFlags & FCOMMENT )
|
||||||
while( sError == "" && FileReading::read_8( file, sError ) != 0 )
|
while( sError == "" && FileReading::read_8( *pFile, sError ) != 0 )
|
||||||
;
|
;
|
||||||
|
|
||||||
if( iFlags & FHCRC )
|
if( iFlags & FHCRC )
|
||||||
@@ -378,10 +380,10 @@ RageFileObjInflate *GunzipFile( RageFileBasic &file, RString &sError, uint32_t *
|
|||||||
/* Get the CRC of the data read so far. Be sure to do this before
|
/* Get the CRC of the data read so far. Be sure to do this before
|
||||||
* reading iExpectedCRC16. */
|
* reading iExpectedCRC16. */
|
||||||
uint32_t iActualCRC32;
|
uint32_t iActualCRC32;
|
||||||
bool bOK = file.GetCRC32( &iActualCRC32 );
|
bool bOK = pFile->GetCRC32( &iActualCRC32 );
|
||||||
ASSERT( bOK );
|
ASSERT( bOK );
|
||||||
|
|
||||||
uint16_t iExpectedCRC16 = FileReading::read_u16_le( file, sError );
|
uint16_t iExpectedCRC16 = FileReading::read_u16_le( *pFile, sError );
|
||||||
uint16_t iActualCRC16 = int16_t( iActualCRC32 & 0xFFFF );
|
uint16_t iActualCRC16 = int16_t( iActualCRC32 & 0xFFFF );
|
||||||
if( sError != "" )
|
if( sError != "" )
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -395,29 +397,30 @@ RageFileObjInflate *GunzipFile( RageFileBasic &file, RString &sError, uint32_t *
|
|||||||
|
|
||||||
/* We only need CRC checking on the raw data for the header, so disable
|
/* We only need CRC checking on the raw data for the header, so disable
|
||||||
* it. */
|
* it. */
|
||||||
file.EnableCRC32( false );
|
pFile->EnableCRC32( false );
|
||||||
|
|
||||||
if( sError != "" )
|
if( sError != "" )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
int iDataPos = file.Tell();
|
int iDataPos = pFile->Tell();
|
||||||
|
|
||||||
/* Seek to the end, and grab the uncompressed flie size and CRC. */
|
/* Seek to the end, and grab the uncompressed flie size and CRC. */
|
||||||
int iFooterPos = file.GetFileSize() - 8;
|
int iFooterPos = pFile->GetFileSize() - 8;
|
||||||
|
|
||||||
FileReading::Seek( file, iFooterPos, sError );
|
FileReading::Seek( *pFile, iFooterPos, sError );
|
||||||
|
|
||||||
uint32_t iExpectedCRC32 = FileReading::read_u32_le( file, sError );
|
uint32_t iExpectedCRC32 = FileReading::read_u32_le( *pFile, sError );
|
||||||
uint32_t iUncompressedSize = FileReading::read_u32_le( file, sError );
|
uint32_t iUncompressedSize = FileReading::read_u32_le( *pFile, sError );
|
||||||
if( iCRC32 != NULL )
|
if( iCRC32 != NULL )
|
||||||
*iCRC32 = iExpectedCRC32;
|
*iCRC32 = iExpectedCRC32;
|
||||||
|
|
||||||
FileReading::Seek( file, iDataPos, sError );
|
FileReading::Seek( *pFile, iDataPos, sError );
|
||||||
|
|
||||||
if( sError != "" )
|
if( sError != "" )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
RageFileDriverSlice *pSliceFile = new RageFileDriverSlice( &file, iDataPos, iFooterPos-iDataPos );
|
RageFileDriverSlice *pSliceFile = new RageFileDriverSlice( pFile.release(), iDataPos, iFooterPos-iDataPos );
|
||||||
|
pSliceFile->DeleteFileWhenFinished();
|
||||||
RageFileObjInflate *pInflateFile = new RageFileObjInflate( pSliceFile, iUncompressedSize );
|
RageFileObjInflate *pInflateFile = new RageFileObjInflate( pSliceFile, iUncompressedSize );
|
||||||
pInflateFile->DeleteFileWhenFinished();
|
pInflateFile->DeleteFileWhenFinished();
|
||||||
|
|
||||||
@@ -525,8 +528,8 @@ void GzipString( const RString &sIn, RString &sOut )
|
|||||||
|
|
||||||
bool GunzipString( const RString &sIn, RString &sOut, RString &sError )
|
bool GunzipString( const RString &sIn, RString &sOut, RString &sError )
|
||||||
{
|
{
|
||||||
RageFileObjMem mem;
|
RageFileObjMem *mem = new RageFileObjMem;
|
||||||
mem.PutString( sIn );
|
mem->PutString( sIn );
|
||||||
|
|
||||||
uint32_t iCRC32;
|
uint32_t iCRC32;
|
||||||
RageFileBasic *pFile = GunzipFile( mem, sError, &iCRC32 );
|
RageFileBasic *pFile = GunzipFile( mem, sError, &iCRC32 );
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ private:
|
|||||||
int m_iDataStartOffset;
|
int m_iDataStartOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
RageFileObjInflate *GunzipFile( RageFileBasic &file, RString &sError, uint32_t *iCRC32 );
|
RageFileObjInflate *GunzipFile( RageFileBasic *pFile, RString &sError, uint32_t *iCRC32 );
|
||||||
|
|
||||||
/* Quick helpers: */
|
/* Quick helpers: */
|
||||||
void GzipString( const RString &sIn, RString &sOut );
|
void GzipString( const RString &sIn, RString &sOut );
|
||||||
|
|||||||
Reference in New Issue
Block a user