/*
* 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 : OFILE.CPP
//Description : Object File
#include
#include
#include
#include
#include
//--------- Define static variables -----------//
static char *path_array[] = { "" }; // multiple search path
//-------- Begin of function File::file_open ----------//
//
// Open an existing file for reading
// If the file is not found, call err.run()
//
// fileName = name of the file
// [int] handleError = handle error
// ( if 1, when error happen, err.run() will be called
// immediately )
// ( default : 1 )
// [int] allowVarySize = allow the writing size and the read size to be different
// ( default : 0 )
//
// return : 1-success, 0-fail
//
int File::file_open(char* fileName, int handleError, int allowVarySize)
{
if( strlen(fileName) > MAX_PATH )
err.run( "File : file name is too long." );
if( file_handle != INVALID_HANDLE_VALUE )
file_close();
strcpy( file_name, fileName );
handle_error = handleError;
allow_vary_size = allowVarySize;
//--------- search all path to open the file ------//
for( int i=0 ; i fileName = name of the file
// [int] handleError = handle error
// ( if 1, when error happen, err.run() will be called
// immediately )
// ( default : 1 )
// [int] allowVarySize = allow the writing size and the read size to be different
// ( default : 0 )
//
//
// return : 1-success, 0-fail
//
int File::file_create(char* fileName, int handleError, int allowVarySize)
{
if( strlen(fileName) > MAX_PATH )
err.run( "File : file name is too long." );
strcpy( file_name, fileName );
handle_error = handleError;
allow_vary_size = allowVarySize;
// cannot use creat() because it can't specify Binary file type
file_handle = CreateFile(fileName,
GENERIC_WRITE,
0,
(LPSECURITY_ATTRIBUTES) NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
if( file_handle == INVALID_HANDLE_VALUE)
err.run( "Error creating file %s", file_name );
return TRUE;
}
//---------- End of function File::file_create ----------//
//### begin alex 24/7 ###//
//-------- Begin of function File::file_append ----------//
//
// Open an existing file for reading
// If the file is not found, call err.run()
//
// fileName = name of the file
// [int] handleError = handle error
// ( if 1, when error happen, err.run() will be called
// immediately )
// ( default : 1 )
// [int] allowVarySize = allow the writing size and the read size to be different
// ( default : 0 )
//
// return : 1-success, 0-fail
//
int File::file_append(char* fileName, int handleError, int allowVarySize)
{
if( strlen(fileName) > MAX_PATH )
err.run( "File : file name is too long." );
if( file_handle != INVALID_HANDLE_VALUE )
file_close();
strcpy( file_name, fileName );
handle_error = handleError;
allow_vary_size = allowVarySize;
//--------- search all path to open the file ------//
for( int i=0 ; i dataBuf = pointer to data buffer to be written to the file
// dataSize = length of the data (must < 64K)
//
// return : 1-success, 0-fail
//
int File::file_write(void* dataBuf, unsigned dataSize)
{
err_when( file_handle == INVALID_HANDLE_VALUE ); // not initialized
if( allow_vary_size ) // allow the writing size and the read size to be different
{
if( dataSize > 0xFFFF )
file_put_unsigned_short(0); // if exceed the unsigned short limit, don't write it
else
file_put_unsigned_short( dataSize );
}
DWORD actualWritten;
int rc = WriteFile( file_handle, dataBuf, dataSize, &actualWritten, NULL);
if( !rc && handle_error )
err.run( "Error writing file %s", file_name );
return rc;
}
//---------- End of function File::file_write ----------//
//-------- Begin of function File::file_read ----------//
//
// Read a block of data from the file
//
// dataBuf = pointer to data buffer to be written to the file
// dataSize = length of the data (must < 64K)
//
// return : 1-success, 0-fail
//
int File::file_read(void* dataBuf, unsigned dataSize)
{
#define MAX_READ_SIZE 0xFFF0
err_when( file_handle == INVALID_HANDLE_VALUE ); // not initialized
int curPos=file_pos();
start_read:
unsigned readSize=dataSize, writtenSize=dataSize;
if( allow_vary_size ) // allow the writing size and the read size to be different
{
writtenSize = file_get_unsigned_short();
if( writtenSize ) // writtenSize==0, if the size > 0xFFFF
readSize = min(dataSize, writtenSize); // the read size is the minimum of the written size and the supposed read size
}
DWORD actualRead;
int rc=ReadFile( file_handle, dataBuf, dataSize, &actualRead, NULL);
//-------- if the data size has been reduced ----------//
if( readSize < writtenSize )
file_seek( writtenSize-readSize, FILE_CURRENT );
//---- if the data size has been increased, reset the unread area ---//
if( readSize < dataSize )
memset( (char*)dataBuf+readSize, 0, dataSize-readSize );
//----- if reading error, popup box and ask for retry -----//
if( !rc && handle_error )
{
char msgStr[100];
sprintf( msgStr, "Error reading file %s, Retry ?", file_name );
if( box.ask(msgStr) )
{
file_seek( curPos );
goto start_read;
}
}
return rc;
}
//---------- End of function File::file_read ----------//
//-------- Begin of function File::file_put_short ----------//
//
// Put a short integer to the file
//
// = the short integer
//
// return : 1-success, 0-fail
//
int File::file_put_short(short value)
{
err_when( file_handle == INVALID_HANDLE_VALUE ); // not initialized
DWORD actualWritten;
if( WriteFile( file_handle, &value, sizeof(short), &actualWritten, NULL ) )
return TRUE;
else
{
if( handle_error )
err.run( "Error writing file %s", file_name );
return FALSE;
}
}
//---------- End of function File::file_put_short ----------//
//-------- Begin of function File::file_get_short ----------//
//
// Get a short integer from the file
//
// return : the short integer
//
short File::file_get_short()
{
err_when( file_handle == INVALID_HANDLE_VALUE ); // not initialized
DWORD actualRead;
short value;
if( ReadFile( file_handle, &value, sizeof(short), &actualRead, NULL ) )
return value;
else
{
if( handle_error )
err.run( "Error reading file %s", file_name );
return FALSE;
}
}
//---------- End of function File::file_get_short ----------//
//-------- Begin of function File::file_put_unsigned_short ----------//
//
// Put a unsigned short integer to the file
//
// = the short integer
//
// return : 1-success, 0-fail
//
int File::file_put_unsigned_short(unsigned short value)
{
err_when( file_handle == INVALID_HANDLE_VALUE ); // not initialized
DWORD actualWritten;
if( WriteFile( file_handle, &value, sizeof(unsigned short), &actualWritten, NULL ) )
return TRUE;
else
{
if( handle_error )
err.run( "Error writing file %s", file_name );
return FALSE;
}
}
//---------- End of function File::file_put_unsigned_short ----------//
//-------- Begin of function File::file_get_unsigned_short ----------//
//
// Get a short integer from the file
//
// return : the short integer
//
unsigned short File::file_get_unsigned_short()
{
err_when( file_handle == INVALID_HANDLE_VALUE ); // not initialized
DWORD actualRead;
unsigned short value;
if( ReadFile( file_handle, &value, sizeof(unsigned short), &actualRead, NULL ) )
return value;
else
{
if( handle_error )
err.run( "Error reading file %s", file_name );
return 0;
}
}
//---------- End of function File::file_get_unsigned_short ----------//
//-------- Begin of function File::file_put_long ----------//
//
// Put a long integer to the file
//
// = the long integer
//
// return : 1-success, 0-fail
//
int File::file_put_long(long value)
{
err_when( file_handle == INVALID_HANDLE_VALUE ); // not initialized
DWORD actualWritten;
if( WriteFile( file_handle, &value, sizeof(long), &actualWritten, NULL ) )
return TRUE;
else
{
if( handle_error )
err.run( "Error writing file %s", file_name );
return FALSE;
}
}
//---------- End of function File::file_put_long ----------//
//-------- Begin of function File::file_get_long ----------//
//
// Get a long integer from the file
//
// return : the long integer
//
long File::file_get_long()
{
err_when( file_handle == INVALID_HANDLE_VALUE ); // not initialized
DWORD actualRead;
long value;
if( ReadFile( file_handle, &value, sizeof(long), &actualRead, NULL ) )
return value;
else
{
if( handle_error )
err.run( "Error reading file %s", file_name );
return FALSE;
}
}
//---------- End of function File::file_get_long ----------//
//---------- Start of function File::file_seek ---------//
//
// offset = seek offset
// [int] whence = FILE_BEGIN, FILE_CURRENT, FILE_END
// (default : FILE_BEGIN)
//
// return : the offset of the pointer's new position, measured in
// bytes from the file beginning.
//
long File::file_seek(long offset, int whence)
{
if( whence == -1 )
whence = FILE_BEGIN;
return SetFilePointer( file_handle, offset, NULL, whence );
}
//------------ End of function File::file_seek ----------//
//---------- Start of function File::file_pos ---------//
//
// Get the position of current file pointer
//
// return : the position of current file pointer
//
long File::file_pos()
{
return SetFilePointer( file_handle, 0, NULL, FILE_CURRENT );
}
//------------ End of function File::file_pos ----------//
//---------- Start of function File::file_size ---------//
long File::file_size()
{
return GetFileSize(file_handle, NULL);
}
//------------ End of function File::file_size ----------//