avp/3dc/win95/ENUMCHNK.CPP

132 lines
2.4 KiB
C++
Raw Normal View History

#include "enumchnk.hpp"
//#include "enumsch.hpp"
#ifdef cencon
#define new my_new
#endif
//macro for helping to force inclusion of chunks when using libraries
FORCE_CHUNK_INCLUDE_IMPLEMENT(enumchnk)
// Class Enum_Chunk functions
RIF_IMPLEMENT_DYNCREATE("REBENUMS",Enum_Chunk)
// constructor from buffer
LOCKABLE_CHUNK_WITH_CHILDREN_LOADER("REBENUMS",Enum_Chunk)
/*
Children for Enum_Chunk :
"ENUMHEAD" Enum_Header_Chunk
"BMPENUMS" BMP_Enums_Chunk
*/
// empty constructor
Enum_Chunk::Enum_Chunk (Chunk_With_Children * parent)
:Lockable_Chunk_With_Children (parent, "REBENUMS")
{
// as necessary, generated automatically
new Enum_Header_Chunk (this);
}
BOOL Enum_Chunk::file_equals (HANDLE & /*rif_file*/)
{
return(TRUE);
}
Enum_Header_Chunk * Enum_Chunk::get_header()
{
return (Enum_Header_Chunk *) this->lookup_single_child ("ENUMHEAD");
}
const char * Enum_Chunk::get_head_id()
{
Enum_Header_Chunk * hdptr = get_header();
if (!hdptr) return (0);
return(hdptr->identifier);
}
void Enum_Chunk::set_lock_user (char * user)
{
Enum_Header_Chunk * hdptr = get_header();
if (!hdptr) return;
strncpy (hdptr->lock_user, user,16);
hdptr->lock_user[16] = 0;
}
void Enum_Chunk::post_input_processing()
{
if (get_header())
if (get_header()->flags & GENERAL_FLAG_LOCKED)
external_lock = TRUE;
Chunk_With_Children::post_input_processing();
}
///////////////////////////////////////
// Class Enum_Header_Chunk functions
RIF_IMPLEMENT_DYNCREATE("ENUMHEAD",Enum_Header_Chunk)
// from buffer
Enum_Header_Chunk::Enum_Header_Chunk (Chunk_With_Children * parent, const char * hdata, size_t /*hsize*/)
: Chunk (parent, "ENUMHEAD"),
flags (0), version_no (0)
{
flags = *((int *) hdata);
strncpy (lock_user, (hdata + 4), 16);
lock_user[16] = '\0';
version_no = *((int *) (hdata + 20));
}
BOOL Enum_Header_Chunk::output_chunk (HANDLE & hand)
{
unsigned long junk;
BOOL ok;
char * data_block;
data_block = make_data_block_from_chunk();
ok = WriteFile (hand, (long *) data_block, (unsigned long) chunk_size, &junk, 0);
delete [] data_block;
if (!ok) return FALSE;
return TRUE;
}
void Enum_Header_Chunk::fill_data_block ( char * data_start)
{
strncpy (data_start, identifier, 8);
data_start += 8;
*((int *) data_start) = chunk_size;
data_start += 4;
*((int *) data_start) = flags;
strncpy ((data_start + 4), lock_user, 16);
*((int *) (data_start+20)) = version_no;
}
void Enum_Header_Chunk::prepare_for_output()
{
version_no ++;
}