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

#ifndef DSE_KERNEL_FILESYSTEM_FILEMANAGER_HPP
#define DSE_KERNEL_FILESYSTEM_FILEMANAGER_HPP

#include <Darkstar/Kernel/FileSystem/baseFileLoader.hpp>
#include <Darkstar/Kernel/Misc/singleton.hpp>
#include <Darkstar/Kernel/threads.hpp>
#include <Darkstar/common.hpp>
#include <Darkstar/Kernel/logh.hpp>

namespace ker
{
	class FileManager : public SingletonHolder<FileManager>
	{
	private:
		std::vector<shared_ptr<BaseFileLoader> > loaders;
		std::map<DFHANDLE, unsigned int> file_to_loader;

		typedef std::map<DFHANDLE, unsigned int>::const_iterator map_iter;

		std::set<std::string> filenames;
		std::vector<boost::function1<void, const std::set<std::string>&> > listeners;
	public:
		FileManager();
		~FileManager();

		void registerNewLoader(const shared_ptr<BaseFileLoader>& loader);
		
		bool open(const std::string& filename, FileData* data);
		bool close(const DFHANDLE id);
		bool read(const DFHANDLE id, const unsigned int size, void* data);
		bool skip(const DFHANDLE id, const unsigned int size);

		void addListener(const boost::function1<void, const std::set<std::string>&>& bf);
		void reportToAllListeners();

		void sendSetOfChanges(const std::set<std::string>& s);
	};
};

#include <Darkstar/Kernel/FileSystem/fileManager.inl>

#endif