www.pudn.com > 3DEDITOR.rar > CHUNKFILE.CPP


// ChunkFile.cpp: implementation of the ChunkFile class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
//#include "ChunkFile.h" 
//#include "3DEditor.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
ChunkFile::ChunkFile(CFile *f) 
{ 
	fp=f; 
	nc=-1; 
} 
 
ChunkFile::~ChunkFile() 
{ 
} 
 
void ChunkFile::Open(unsigned short IdP) 
{ 
	nc++; 
	SizeI[nc]=0; 
	Write(&IdP,sizeof(unsigned short)); 
	PositionI[nc]=fp->GetPosition(); 
	Write(&SizeI[nc], sizeof(unsigned long)); 
} 
 
void ChunkFile::Close() 
{ 
	DWORD pos=fp->GetPosition(); 
 
	fp->Seek(PositionI[nc], CFile::begin); 
	fp->Write(&SizeI[nc], sizeof(unsigned long)); 
	fp->Seek(pos, CFile::begin); 
	nc--; 
	if(nc>=0) 
		SizeI[nc]+=SizeI[nc+1]; 
} 
 
void ChunkFile::ReadHeader() 
{ 
	nc++; 
	fp->Read(&Id,sizeof(unsigned short)); 
	fp->Read(&SizeI[nc],sizeof(unsigned long)); 
	PositionI[nc]=fp->GetPosition(); 
} 
 
unsigned long ChunkFile::resto() 
{ 
	return SizeI[nc]-sizeof(unsigned short)-sizeof(unsigned long)-(fp->GetPosition()-PositionI[nc]); 
} 
 
void ChunkFile::Next() 
{ 
	fp->Seek(resto(), CFile::current); 
	nc--; 
} 
 
bool ChunkFile::End() 
{ 
	return resto()==0; 
} 
 
UINT ChunkFile::Read( void* lpBuf, UINT nMax ) 
{ 
	return fp->Read(lpBuf, nMax); 
} 
 
void ChunkFile::Write( const void* lpBuf, UINT nMax ) 
{ 
	SizeI[nc]+=nMax; 
	fp->Write(lpBuf, nMax); 
}