#include "../../include/kfile/KBinaryFiler.h" #include "../../include/kfile/KAsciiFiler.h" #include // // Binary Filer // const int KFILE_MASTER_ID = 'KFID'; const int KFILE_TYPE_BINARY = 'KBIN'; const int KFILE_BLOCK_ID = 'KBLK'; #pragma pack(push) #pragma pack(1) struct KFILEHEADER { int masterid; int type; int master_version; int sub_version; int nblocks; char reserved[108]; }; struct KFILEBLOCK { int blockid; int blocksize; char reserved[24]; }; #pragma pack(pop) KBinaryFiler::KBinaryFiler() { } KBinaryFiler::~KBinaryFiler() { } bool KBinaryFiler::Save( KStream &stream ) { KFILEHEADER header; memset( &header, 0, sizeof(header) ); header.masterid = KFILE_MASTER_ID; header.type = KFILE_TYPE_BINARY; header.master_version = 1; header.sub_version = 0; header.nblocks = static_cast(m_vectorData.size()); stream.Write( &header, sizeof(header) ); size_t blockheadersize = sizeof(KFILEBLOCK); KFILEBLOCK blockheader; memset( &blockheader, 0, sizeof(blockheader) ); blockheader.blockid = KFILE_BLOCK_ID; for ( unsigned i=0 ; i(blockheadersize), KFileStream::seekCur ); if ( m_vectorData[i]->Save( stream, KDataObject::KDFM_BINARY ) == false ) { assert( 0 && "KBinaryFiler::Save Failed!!!" ); return false; } blockheader.blocksize = static_cast(stream.Tell() - (pre_pos + blockheadersize)); stream.Seek( static_cast(pre_pos), KFileStream::seekSet ); stream.Write( &blockheader, sizeof(blockheader) ); stream.Seek( blockheader.blocksize, KFileStream::seekCur ); } return true; } bool KBinaryFiler::Load( KStream &stream ) { KFILEHEADER header; KFILEBLOCK blockheader; stream.Read( &header, sizeof(header) ); if ( header.masterid == KFILE_MASTER_ID && header.type == KFILE_TYPE_BINARY ) { if ( header.master_version >= 1 && header.sub_version >= 0 ) { for( int i=0 ; iAddDataObject( GetDataObjectAt(i) ); } return pAsciiFiler; }