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

namespace ker
{
	inline FileManager::FileManager()
	{
		
	};

	inline FileManager::~FileManager()
	{
		file_to_loader.clear();
		loaders.clear();
		filenames.clear();
		listeners.clear();
	};

	inline void FileManager::registerNewLoader(const shared_ptr<BaseFileLoader>& loader)
	{
		if(loader == NULL)
		{
			lwar << "Try to register NULL file loader";
			return;
		};
		loaders.push_back(loader);
	};

	inline bool FileManager::open(const std::string& filename, FileData* data)
	{
		std::vector<shared_ptr<BaseFileLoader> >::iterator it;
		bool opened = false;
		unsigned int i = 0;
		for(it = loaders.begin(); it != loaders.end(); ++it)
		{
			if((*it)->open(filename, data))
			{
				opened = true;
				file_to_loader.insert(std::pair<DFHANDLE, unsigned int>(data->id, i));
				break;
			};
			++i;
		};
		if(!opened)
		{
			lwar << "Cannot load file: " << filename;
			return false;
		};
		return true;
	};

	inline bool FileManager::close(const DFHANDLE id)
	{
		map_iter it = file_to_loader.find(id);
		if(it == file_to_loader.end())
		{
			lwar << "Try to close file with invalid handle";
			return false;
		};
		return loaders[it->second]->close(id);
	};

	inline bool FileManager::skip(const DFHANDLE id, const unsigned int size)
	{
		map_iter it = file_to_loader.find(id);
		if(it == file_to_loader.end())
		{
			lwar << "Try to skip some bytes in file with invalid file handle";
			return false;
		};
		return loaders[it->second]->skip(id, size);
	};

	inline bool FileManager::read(const DFHANDLE id, const unsigned int size, void* data)
	{
		map_iter it = file_to_loader.find(id);
		if(it == file_to_loader.end())
		{
			lwar << "Try to read some bytes from file with invalid file handle";
			return false;
		};
		return loaders[it->second]->read(id, size, data);
	};

	inline void FileManager::addListener(const boost::function1<void, const std::set<std::string>&>& bf)
	{
		listeners.push_back(bf);
	};

	inline void FileManager::reportToAllListeners()
	{
		if(filenames.size() == 0)
			return;
		std::vector<boost::function1<void, const std::set<std::string>&> >::iterator it2;
		for(it2 = listeners.begin(); it2 != listeners.end(); ++it2)
		{
			(*it2)(filenames);
		};
		filenames.clear();
	};

	inline void FileManager::sendSetOfChanges(const std::set<std::string>& s)
	{
		CriticalSection section;
		section.enter();
		filenames.insert(s.begin(), s.end());
		section.leave();
	};
};