Files
Leviathan/Library/Internal/source/kfile/KBinaryFiler.cpp
T
2026-06-01 12:46:52 +02:00

124 lines
2.6 KiB
C++

#include "../../include/kfile/KBinaryFiler.h"
#include "../../include/kfile/KAsciiFiler.h"
#include <assert.h>
//
// 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<int>(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<m_vectorData.size() ; ++i )
{
size_t pre_pos = stream.Tell();
stream.Seek( static_cast<long>(blockheadersize), KFileStream::seekCur );
if ( m_vectorData[i]->Save( stream, KDataObject::KDFM_BINARY ) == false )
{
assert( 0 && "KBinaryFiler::Save Failed!!!" );
return false;
}
blockheader.blocksize = static_cast<int>(stream.Tell() - (pre_pos + blockheadersize));
stream.Seek( static_cast<long>(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 ; i<header.nblocks ; ++i )
{
stream.Tell();
stream.Read( &blockheader, sizeof(blockheader) );
if ( blockheader.blockid != KFILE_BLOCK_ID )
{
assert(false && "File Error!!!!");
return false;
}
KTemplateDataObject *obj = new KTemplateDataObject( stream, KDataObject::KDFM_BINARY );
m_vectorData.push_back( obj );
m_vectorCreated.push_back( obj );
}
return true;
}
}
return false;
}
// 같은 내용의 KAsciiFiler 객체를 만들어 포인터를 리턴
KAsciiFiler* KBinaryFiler::GetAsciiFiler()
{
KAsciiFiler *pAsciiFiler = new KAsciiFiler;
for ( int i = 0; i < GetDataObjectCount(); i++ )
{
pAsciiFiler->AddDataObject( GetDataObjectAt(i) );
}
return pAsciiFiler;
}