Avoid RageFileObj::Seek; handle rewinds in Seek().

This commit is contained in:
Glenn Maynard
2004-12-09 10:38:42 +00:00
parent 7ae0ad1533
commit ea820c77b2
+30 -4
View File
@@ -579,11 +579,11 @@ void RageFileObjZipDeflated::Rewind()
UFilePos = 0; UFilePos = 0;
} }
int RageFileObjZipDeflated::Seek( int offset ) int RageFileObjZipDeflated::Seek( int iPos )
{ {
/* Optimization: if offset is the end of the file, it's a lseek(0,SEEK_END). Don't /* Optimization: if offset is the end of the file, it's a lseek(0,SEEK_END). Don't
* decode anything. */ * decode anything. */
if( offset == (int) info.uncompr_size ) if( iPos >= (int) info.uncompr_size )
{ {
UFilePos = info.uncompr_size; UFilePos = info.uncompr_size;
CFilePos = info.compr_size; CFilePos = info.compr_size;
@@ -591,11 +591,37 @@ int RageFileObjZipDeflated::Seek( int offset )
decomp_buf_ptr = decomp_buf; decomp_buf_ptr = decomp_buf;
decomp_buf_avail = 0; decomp_buf_avail = 0;
inflateReset( &dstrm ); inflateReset( &dstrm );
return offset; return info.uncompr_size;
} }
if( iPos < UFilePos )
{
inflateReset( &dstrm );
decomp_buf_ptr = decomp_buf;
decomp_buf_avail = 0;
zip.Seek( info.data_offset );
CFilePos = 0;
UFilePos = 0;
}
int iOffset = iPos - UFilePos;
/* Can this be optimized? */ /* Can this be optimized? */
return RageFileObj::Seek( offset ); char buf[1024*4];
while( iOffset )
{
/* Must call parent.Read: */
int got = Read( buf, min( (int) sizeof(buf), iOffset ) );
if( got == -1 )
return -1;
if( got == 0 )
break;
iOffset -= got;
}
return UFilePos;
} }
RageFileObjZipStored::RageFileObjZipStored( const RageFile &f, const FileInfo &info_, RageFile &p ): RageFileObjZipStored::RageFileObjZipStored( const RageFile &f, const FileInfo &info_, RageFile &p ):