//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2007)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: dfile.inl
//      Краткое описание: класс - файл. Обертка над менеджером файлов
//

namespace ker
{
	inline DFile::DFile()
	{
		data.id = NULL;
		data.size = 0;
		cur_file_pointer = 0;
	};

	inline DFile::DFile(const std::string& filename)
	{
		data.id = NULL;
		data.size = 0;
		cur_file_pointer = 0;
		open(filename);
	};

	inline DFile::~DFile()
	{
		if(!data.id)
			return;
		close();
	};

	inline bool DFile::open(const std::string& filename)
	{
		if(data.id)
		{
			lwar << "Try to open file without close previous " << filename;
			return false;
		};
		if(!FileManager::ptr()->open(filename, &data))
		{
			lwar << "Cannot load file: " << filename;
			data.id = NULL;
			return false;
		};
		return true;
	};

	inline bool DFile::close()
	{
		if(!FileManager::ptr()->close(data.id))
		{
			lwar << "Cannot close file: " << data.filename;
			return false;
		};
		data.id = NULL;
		data.size = 0;
		data.filename = "";
		cur_file_pointer = 0;
		return true;
	};

	inline bool DFile::skip(const unsigned int num_bytes)
	{
#ifdef _NOTFINAL
		if(cur_file_pointer + num_bytes > data.size)
			lwar << "During skipping in file: " << data.filename << " pointer out beyond file";
#endif
		if(!FileManager::ptr()->skip(data.id, num_bytes))
		{
			lwar << "Cannot skip bytes in file: " << data.filename;
			return false;
		};
		cur_file_pointer += num_bytes;
		return true;
	};

	inline bool DFile::read(const unsigned int num_bytes, void* data)
	{
#ifdef _NOTFINAL
		if(cur_file_pointer > this->data.size)
		{
			lwar << "Current file pointer in file " << this->data.filename << " greater than file size";
			return false;
		};
		if(cur_file_pointer + num_bytes > this->data.size)
		{
			lwar << "During skipping in file: " << this->data.filename << " pointer turn beyond file";
			return false;
		};
#endif
		if(!FileManager::ptr()->read(this->data.id, num_bytes, data))
		{
			lwar << "Cannot read " << num_bytes << " bytes from file: " << this->data.filename;
			return false;
		};
		cur_file_pointer += num_bytes;
		return true;
	};

	inline unsigned int DFile::getSize() const
	{
		return data.size;
	};

	inline const std::string& DFile::getFilename() const
	{
		return data.filename;
	};

	inline bool DFile::getIsLoaded() const
	{
		return data.id != NULL;
	};

	inline bool DFile::getIsEOF() const
	{
		return cur_file_pointer >= data.size;
	};

	inline const shared_ptr<SystemTime>& DFile::getLastWriteTime() const
	{
		return data.last_write_time;
	};

	inline const std::string& DFile::getFullPath() const
	{
		return data.full_path;
	};

	inline const std::string& DFile::getPath() const
	{
		return data.path;
	};
};

