/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* 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 .
*
*/
//Filename : ORESDB.CPP
//Description : Resource library with database index reading object
#include
#include
#include
#include
//-------------------------------------------------------//
//
// Resource library reading object
//
// Files required :
//
// - A resource file build by LIBDB.EXE, it is always in .RES extension
// - A database file with Index Pointer field, the values of the field
// are automatically calculated by LIBDB.EXE
//
//-------------------------------------------------------//
//---------- Begin of function ResourceDb::init ---------//
//
// resName = name of the resource file (e.g. "GIF.RES")
// dbObj = name of the database (e.g. Database db("PFILE.DBF"))
// indexOffset = offset of the index field
// [int] useCommonBuf = whether use the vga common buffer to store the data or not
// (default:0)
//
void ResourceDb::init(char* resName, Database* dbObj, int indexOffset, int useCommonBuf)
{
deinit();
file_open( resName );
db_obj = dbObj;
index_field_offset = indexOffset;
use_common_buf = useCommonBuf;
if( use_common_buf )
data_buf = sys.common_data_buf;
else
data_buf = NULL;
err_if( db_obj == NULL )
err_now("db_obj is NULL");
init_flag = 1;
}
//----------- End of function ResourceDb::init ------------//
//---------- Begin of function ResourceDb::deinit ---------//
//
void ResourceDb::deinit()
{
if( init_flag )
{
if( !use_common_buf && data_buf )
{
mem_del(data_buf);
data_buf = NULL;
}
if( !read_all )
file_close();
init_flag=0;
}
}
//----------- End of function ResourceDb::deinit ----------//
//---------- Begin of function ResourceDb::read ----------//
//
// Read in data from the resource file and store in an the buffer of this class
//
// The index field of the current record in the database object is
// used to locate the data in the resource file.
//
// Syntax : read(int recNo)
//
// [int] recNo = the record no. in the database.
// (default : current record no.)
//
// Return : data pointer
// NULL if the record has not index to data
//
char* ResourceDb::read(int recNo)
{
err_when( !init_flag || !db_obj );
long* indexFieldPtr;
char* recPtr;
if( (recPtr = db_obj->read(recNo)) == NULL )
return NULL;
indexFieldPtr = (long*) (recPtr+index_field_offset);
if( memcmp( indexFieldPtr, " ", 4 ) == 0 )
return NULL; // no sample screen for this file
file_seek( *indexFieldPtr );
data_buf_size = file_get_long();
err_when( use_common_buf && data_buf_size > COMMON_DATA_BUF_SIZE );
if( !use_common_buf )
data_buf = mem_resize( data_buf, data_buf_size );
file_read( data_buf, data_buf_size );
return data_buf;
}
//----------- End of function ResourceDb::read -------------//
//---------- Begin of function ResourceDb::get_file ----------//
//
// Position the file pointer to the beginning of the data and
// return the file stream
//
// Syntax : get_file()
//
// Return : the file stream
// NULL if the record has not index to data
//
File* ResourceDb::get_file()
{
err_when( !init_flag || !db_obj );
long* indexFieldPtr;
char emptyField[] = " ";
char* recPtr;
if( (recPtr = db_obj->read()) == NULL )
return NULL;
indexFieldPtr = (long*) (recPtr+index_field_offset);
if( memcmp( indexFieldPtr, emptyField, 8 ) == 0 )
return NULL; // no sample screen for this file
file_seek( *indexFieldPtr + sizeof(long) );
return this;
}
//----------- End of function ResourceDb::get_file -------------//
//---------- Begin of function ResourceDb::init_imported ----------//
//
// If the whole database has been read into memory, then only no need to
// tell ResourceDb the database name and the index offset
//
// resName = name of the resource file (e.g. "GIF.RES")
// readAll = whether read all data into the buffer or read one each time
// [int] useCommonBuf = whether use the vga common buffer to store the data or not
// (default:0)
//
void ResourceDb::init_imported(char* resName, int readAll, int useCommonBuf)
{
deinit();
db_obj = NULL;
index_field_offset = NULL;
read_all = readAll;
file_open( resName );
if( read_all )
{
data_buf_size = file_size();
data_buf = mem_add( data_buf_size );
file_read( data_buf, data_buf_size );
file_close();
use_common_buf = 0; // don't use vga buffer if read all
}
else
{
use_common_buf = useCommonBuf;
if( use_common_buf )
data_buf = sys.common_data_buf;
else
data_buf = NULL;
}
init_flag = 1;
}
//----------- End of function ResourceDb::init_imported -------------//
//---------- Begin of function ResourceDb::read_imported ----------//
//
// If ResourceDb is initialized using init_imported(),
// then use read_imported to read the record
//
// offset = offset to the data in the resource file
//
// Return : data pointer
// NULL if the record has not index to data
//
char* ResourceDb::read_imported(long offset)
{
err_when( !init_flag );
// #### begin Gilbert 4/10 ######//
// err_if( offset<0 || offset>=data_buf_size )
// err_here();
// #### end Gilbert 4/10 ######//
//-------- read from buffer ---------//
// ##### begin Gilbert 4/10 #######//
if( read_all )
{
err_when( offset<0 || offset>=data_buf_size );
return data_buf + offset + sizeof(long); // by pass the long parameters which is the size of the data
}
// ##### end Gilbert 4/10 #######//
//---------- read from file ---------//
// ##### begin Gilbert 2/10 ######//
err_when( offset >= file_size() );
// ##### end Gilbert 2/10 ######//
file_seek( offset );
data_buf_size = file_get_long();
err_when( use_common_buf && data_buf_size > COMMON_DATA_BUF_SIZE);
if( !use_common_buf )
data_buf = mem_resize( data_buf, data_buf_size );
file_read( data_buf, data_buf_size );
return data_buf;
}
//----------- End of function ResourceDb::read_imported -------------//