GunzipFile: delete file

This commit is contained in:
Glenn Maynard
2007-01-23 07:31:47 +00:00
parent 61c2cb479b
commit 976497f388
2 changed files with 31 additions and 28 deletions
+30 -27
View File
@@ -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 );
+1 -1
View File
@@ -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 );