// File.cpp

#include <windows.h>

#include "File.h"


CFile::CFile()
{
	File = NULL;
}


CFile::~CFile()
{
	if (File)
	{
		CloseHandle( File );
		File = NULL;
	}
}


s32 CFile::Create( const char *filename )
{
	Close();

	File = CreateFile( filename,
										 GENERIC_WRITE | GENERIC_READ,
										 0,
										 NULL,
										 CREATE_ALWAYS,
										 FILE_ATTRIBUTE_NORMAL,
										 NULL );

	if (File == INVALID_HANDLE_VALUE)
		return( FALSE );

	return( TRUE );
}


s32 CFile::Open( const char *filename )
{
	Close();

	File = CreateFile( filename,
										 GENERIC_READ,
										 FILE_SHARE_READ,
										 NULL,
										 OPEN_EXISTING,
										 FILE_ATTRIBUTE_NORMAL,
										 NULL );

	if (File == INVALID_HANDLE_VALUE)
		return( FALSE );

	return( TRUE );
}


void CFile::Close()
{
	if (File)
	{
		CloseHandle( File );
		File = NULL;
	}
}


void CFile::Read( void *data, s32 size )
{
	DWORD
		done;

	ReadFile( File, data, size, &done, NULL );
}


void CFile::Write( const void *data, s32 size )
{
	DWORD
		done;

	WriteFile( File, data, size, &done, NULL );
}


s32 CFile::GetPos()
{
	return( SetFilePointer( File, 0, NULL, FILE_CURRENT ) );
}


s32 CFile::GetSize()
{
	s32
		pos,
		size;

	pos = SetFilePointer( File, 0, NULL, FILE_CURRENT );
	size = SetFilePointer( File, 0, NULL, FILE_END );
	SetFilePointer( File, pos, NULL, FILE_BEGIN );
	return( size );
}


void CFile::Seek( s32 pos )
{
	SetFilePointer( File, pos, NULL, pos >= 0 ? FILE_BEGIN : FILE_END );
}


void CFile::Skip( s32 skip )
{
	SetFilePointer( File, skip, NULL, FILE_CURRENT );
}


void CFile::End()
{
	SetFilePointer( File, 0, NULL, FILE_END );
}
