#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;
	bool _closed = false;
	//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
	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
	return true;
}

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;
	bool _closed = false;
	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
}
