//    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
//    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, write to the Free Software
//    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//

#include "cfile.h"

CFile::CFile()
{
	m_bOpened = FALSE;
	m_hFile = 0;
	m_bIsDirty = FALSE;
}

CFile::~CFile()
{
	Close();
}

//opens file for reading, binary
BOOL CFile::Open( char* szName )
{
	if ( m_bOpened )
		return FALSE;

	m_hFile = open( szName, O_BINARY | O_RDONLY );

	if ( m_hFile == -1 )
	{
		m_hFile = 0;

		//printf( "CFile::Open %s Err:%d\n", szName, errno );

		return FALSE;
	}

	m_bOpened = TRUE;

	m_lLength = lseek( m_hFile, 0, SEEK_END );
	lseek( m_hFile, 0, SEEK_SET );

	return TRUE;

}

//creates new file, opened  for rdwr, binary, deletes existing
BOOL CFile::Create( char* szName )
{
	if ( m_bOpened )
		return FALSE;

	m_bIsDirty = FALSE;
	m_hFile = open( szName, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, 0666 );

	if ( m_hFile == -1 )
	{
		m_hFile = 0;
		return FALSE;
	}

	m_bOpened = TRUE;

	m_lLength = lseek( m_hFile, 0, SEEK_END );
	lseek( m_hFile, 0, SEEK_SET );

	return TRUE;

}

//reads iBytesToRead bytes to buffer
BOOL CFile::Read( void* pBuff, int iBytesToRead, int* piBytesRead )
{
	if ( !m_bOpened )
		return FALSE;

	m_bIsDirty = FALSE;
	int iBytesRead = read( m_hFile, pBuff, iBytesToRead );

	if ( piBytesRead )
		*piBytesRead = iBytesRead;

	if ( -1 == iBytesRead )
		return FALSE;
	
	m_lCurrPtr = tell( m_hFile );

	return TRUE;
}

//writes iBytesToWrite from buffer
//TODO:check for file being opened for writing
BOOL CFile::Write( void* pBuff, int iBytesToWrite, int* piBytesWritten )
{
	if ( !m_bOpened )
		return FALSE;

	int iBytesWritten = write( m_hFile, pBuff, iBytesToWrite );

	if ( piBytesWritten )
		*piBytesWritten = iBytesWritten;

	if ( -1 == iBytesWritten )
		return FALSE;

	m_lCurrPtr = tell( m_hFile );
	m_bIsDirty = TRUE;

	return TRUE;
}

//seek
BOOL CFile::Seek( long lPos, int iType )
{
	m_lCurrPtr = lseek( m_hFile, lPos, iType );

	return TRUE;
}

//closes the file
void CFile::Close()
{
	if ( m_hFile )
		close( m_hFile );

	m_bIsDirty = FALSE;
	m_hFile = 0;
	m_bOpened = FALSE;
}

