#include "File.h"
#include <stdio.h>

#ifdef WINDOWS
File::File(STRING filePath, bool read)
#else
File::File(STRING filePath, const char* mode)
#endif
{
	_closed = false;
	STRING fileFolder = Path::GetFileFolder(filePath);
#ifdef WINDOWS
	
	SHCreateDirectoryExA (0, fileFolder, 0);
	//must return ERROR_SUCCESS
#else
	STRING str = (STRING)System::SafeAllocMemory(strlen(fileFolder) + 20);
	strcpy(str,"mkdir -p ");
	strcat(str, fileFolder);
	system(str);
	System::SafeFreeMemory(str);
#endif

	System::SafeFreeMemory(fileFolder);
#ifdef WINDOWS
	if (read)
		_file = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); 
	else
		_file = CreateFileA(filePath, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
#else
	_file = fopen(filePath, mode);
#endif
	
}

File::~File(void)
{
	if ( ! _closed)
	#ifdef WINDOWS
		CloseHandle(_file);
	#else
		fclose(_file);
	#endif
		
}

File* File::Open(STRING filePath)
{
	if ( 0 == filePath)
		return 0;

	//STRING fileFolder = Path::GetFileFolder(filePath);
	File* file = (File*) System::SafeAllocMemory(sizeof(File));
#ifdef WINDOWS
	//File* file = new File(filePath, false);
	//SHCreateDirectoryExA (0, fileFolder, 0);
	file->_closed = false;
	file->_file = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
#else
	file->_closed = false;
	file->_file = fopen(filePath, "rb");
#endif
	if ( 0 >= file->_file)
		return 0;

	return file;
}

bool File::Seek(File* file,long position, int origin)
{
	if ( 0 >= _file || _closed )
		return false;
#ifdef WINDOWS
	return INVALID_SET_FILE_POINTER != SetFilePointer(file->_file, position, 0, origin);
#else
	int seek = (origin == SEEK__BEGIN ? SEEK_SET : (origin == SEEK__CURRENT ? SEEK_CUR : SEEK_END));
	int result = fseek(_file, position, seek);
	return ! result;
#endif
}

bool File::Write(File* file,BYTE* buffer, UINT bytesToWrite)
{
	if ( 0 >= _file || _closed )
		return false;
#ifdef WINDOWS
	DWORD dwWritten = 0;
	WriteFile(file->_file, buffer, bytesToWrite,&dwWritten, 0);
	return dwWritten == bytesToWrite;
#else
	 return bytesToWrite == fwrite(buffer, 1, bytesToWrite, _file);
#endif
}
BOOL File::Close(File* file){

	if ( true == file->_closed )
		return false;
#ifdef WINDOWS
	BOOL result = CloseHandle(file->_file);
	file->_file = 0;
	file->_closed = true;
	return result;
#else
	if ( EOF != fclose(_file) )
	{
		_closed = true;
		_file = 0;
		return true;
	}
	else
		return false;
#endif
}
UINT File::Read(File* file, BYTE* buffer, UINT bytesToRead)
{
	if ( 0 == bytesToRead )
		return 0;
	if ( 0 == buffer )
		return bytesToRead + 1;
	if ( 0 >= file->_file ||  file->_closed )
		return bytesToRead + 2;
#ifdef WINDOWS
	DWORD dwRead = 0;
	ReadFile(file->_file,buffer, bytesToRead, &dwRead, 0);
	return dwRead;
#else
	return (UINT)fread(buffer, 1, bytesToRead, _file);
#endif
}

File* File::Create(STRING filePath)
{
	if ( 0 == filePath)
		return 0;
	STRING fileFolder = Path::GetFileFolder(filePath);
	File* file = (File*) System::SafeAllocMemory(sizeof(File));
	file->_closed = false;
	File::CreateDirectory(fileFolder);
#ifdef WINDOWS
	file->_file = CreateFileA(filePath, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
#else
	file->_file = fopen(filePath, "wb");
#endif
	if ( 0 >= file->_file)
	{
		file->_closed = true;
		return 0;
	}

	return file;
}


// return current position in file
UINT File::GetCurentPos(File* file)
{
	if ( 0 >= _file || _closed )
		return (UINT)-1;
#ifdef WINDOWS
	return SetFilePointer(file->_file, 0, 0,FILE_CURRENT);
#else
	return ftell(_file);
#endif
}

UINT File::ReadUINT(File* file)
{
	if ( 0 == _file || _closed )
		return (UINT)-1;
	BYTE buffer[4];
	Read(file,buffer,4);
	return MAKE_UINT(buffer[0],buffer[1],buffer[2],buffer[3]);
}

bool File::Skip(File* file,long bytesToSkip)
{
	return Seek(file,bytesToSkip,SEEK__CURRENT);
}

bool File::CreateDirectory(STRING name)
{
#ifdef WINDOWS
	int result = SHCreateDirectoryExA (0, name, 0);
	//ignore already exitant folders
	return  ( result == ERROR_SUCCESS || result == ERROR_ALREADY_EXISTS || result == ERROR_FILE_EXISTS);
#else
	STRING str = (STRING)System::SafeAllocMemory(strlen(name) + 20);
	strcpy(str,"mkdir -p ");
	strcat(str, name);
	system(str);
	System::SafeFreeMemory(str);
	return true;
#endif
}
