/*
===========================================================================
Copyright (C) 2000 - 2013, Raven Software, Inc.
Copyright (C) 2001 - 2013, Activision, Inc.
Copyright (C) 2013 - 2015, OpenJK contributors
This file is part of the OpenJK source code.
OpenJK is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, see .
===========================================================================
*/
// BlockStream.h
#ifndef __INTERPRETED_BLOCK_STREAM__
#define __INTERPRETED_BLOCK_STREAM__
#include
typedef float vec3_t[3];
// Templates
// CBlockMember
class CBlockMember
{
public:
CBlockMember();
protected:
~CBlockMember();
public:
void Free(IGameInterface* game);
int WriteMember ( FILE * ); //Writes the member's data, in block format, to FILE *
int ReadMember( char **, long *, CIcarus* icarus ); //Reads the member's data, in block format, from FILE *
void SetID( int id ) { m_id = id; } //Set the ID member variable
void SetSize( int size ) { m_size = size; } //Set the size member variable
void GetInfo( int *, int *, void **);
//SetData overloads
void SetData( const char * ,CIcarus* icarus);
void SetData( vec3_t , CIcarus* icarus);
void SetData( void *data, int size, CIcarus* icarus);
int GetID( void ) const { return m_id; } //Get ID member variables
void *GetData( void ) const { return m_data; } //Get data member variable
int GetSize( void ) const { return m_size; } //Get size member variable
// Overloaded new operator.
inline void *operator new( size_t size )
{ // Allocate the memory.
return IGameInterface::GetGame()->Malloc( size );
}
// Overloaded delete operator.
inline void operator delete( void *pRawData )
{ // Free the Memory.
IGameInterface::GetGame()->Free( pRawData );
}
CBlockMember *Duplicate( CIcarus* icarus );
template void WriteData(T &data, CIcarus* icarus)
{
IGameInterface* game = icarus->GetGame();
if ( m_data )
{
game->Free( m_data );
}
m_data = game->Malloc( sizeof(T) );
*((T *) m_data) = data;
m_size = sizeof(T);
}
template void WriteDataPointer(const T *data, int num, CIcarus* icarus)
{
IGameInterface* game =icarus->GetGame();
if ( m_data )
{
game->Free( m_data );
}
m_data = game->Malloc( num*sizeof(T) );
memcpy( m_data, data, num*sizeof(T) );
m_size = num*sizeof(T);
}
protected:
int m_id; //ID of the value contained in data
int m_size; //Size of the data member variable
void *m_data; //Data for this member
};
//CBlock
class CBlock
{
typedef std::vector< CBlockMember * > blockMember_v;
public:
CBlock()
{
m_flags = 0;
m_id = 0;
}
~CBlock() { assert(!GetNumMembers()); }
int Init( void );
int Create( int );
int Free(CIcarus* icarus);
//Write Overloads
int Write( int, vec3_t, CIcarus* icaru );
int Write( int, float, CIcarus* icaru );
int Write( int, const char *, CIcarus* icaru );
int Write( int, int, CIcarus* icaru );
int Write( CBlockMember *, CIcarus* icaru );
//Member push / pop functions
int AddMember( CBlockMember * );
CBlockMember *GetMember( int memberNum );
void *GetMemberData( int memberNum );
CBlock *Duplicate( CIcarus* icarus );
int GetBlockID( void ) const { return m_id; } //Get the ID for the block
int GetNumMembers( void ) const { return (int)m_members.size();} //Get the number of member in the block's list
void SetFlags( unsigned char flags ) { m_flags = flags; }
void SetFlag( unsigned char flag ) { m_flags |= flag; }
int HasFlag( unsigned char flag ) const { return ( m_flags & flag ); }
unsigned char GetFlags( void ) const { return m_flags; }
// Overloaded new operator.
inline void *operator new( size_t size )
{ // Allocate the memory.
return IGameInterface::GetGame()->Malloc( size );
}
// Overloaded delete operator.
inline void operator delete( void *pRawData )
{ // Validate data.
if ( pRawData == 0 )
return;
// Free the Memory.
IGameInterface::GetGame()->Free( pRawData );
}
protected:
blockMember_v m_members; //List of all CBlockMembers owned by this list
int m_id; //ID of the block
unsigned char m_flags;
};
// CBlockStream
class CBlockStream
{
public:
CBlockStream()
{
m_stream = NULL;
m_streamPos = 0;
}
~CBlockStream() {};
int Init( void );
int Create( char * );
int Free( void );
// Stream I/O functions
int BlockAvailable( void );
int WriteBlock( CBlock *, CIcarus* icarus ); //Write the block out
int ReadBlock( CBlock *, CIcarus* icarus ); //Read the block in
int Open( char *, long ); //Open a stream for reading / writing
// Overloaded new operator.
static void *operator new( size_t size )
{ // Allocate the memory.
return IGameInterface::GetGame()->Malloc( size );
}
// Overloaded delete operator.
static void operator delete( void *pRawData )
{ // Free the Memory.
IGameInterface::GetGame()->Free( pRawData );
}
protected:
long m_fileSize; //Size of the file
FILE *m_fileHandle; //Global file handle of current I/O source
char m_fileName[CIcarus::MAX_FILENAME_LENGTH]; //Name of the current file
char *m_stream; //Stream of data to be parsed
long m_streamPos;
static char* s_IBI_EXT;
static char* s_IBI_HEADER_ID;
static const float s_IBI_VERSION;
};
#endif //__INTERPRETED_BLOCK_STREAM__