00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef KEOS_MEDIAMANAGER_H
00022 #define KEOS_MEDIAMANAGER_H
00023
00024 #include "KeosPrerequisites.h"
00025 #include "KeosSingleton.h"
00026 #include "KeosGenHierarchies.h"
00027 #include "KeosFile.h"
00028 #include "KeosUtil.h"
00029 #include "KeosLoader.h"
00030 #include "KeosException.h"
00031 #include "KeosString.h"
00032
00033 namespace Keos
00034 {
00036 typedef TYPELIST_4(CMesh, CImage, IShaderBase, CAnimatedMeshKF) MediaList;
00037
00039 template <class T>
00040 struct CMediaHolder
00041 {
00042 typedef std::map<String, CSmartPtr<ILoader<T> > > TLoadersMap;
00043 TLoadersMap m_Loaders;
00044 };
00045
00046
00050 class KEOS_EXPORT CMediaManager : public CSingleton<CMediaManager>, public CScatteredHierarchy<MediaList, CMediaHolder>
00051 {
00052 friend CSingleton<CMediaManager>;
00053
00054 public :
00055
00058 void AddSearchPath(const String& strPath);
00059
00064 template <class T> void RegisterLoader(ILoader<T>* pLoader, const String& strExtensions);
00065
00070 template <class T> T* LoadMediaFromFile(const CFile& Filename) const;
00071
00076 template <class T> void SaveMediaToFile(const T* pObject, const CFile& Filename) const;
00077
00080 CFile FindMedia(const CFile& Filename) const;
00081
00082 private :
00083
00086 CMediaManager();
00087
00090 ~CMediaManager();
00091
00096 template <class T> ILoader<T>& FindLoader(const CFile& Filename) const;
00097
00099 std::set<String> m_Paths;
00100 };
00101
00102
00103
00104
00105
00106
00107 template <class T>
00108 inline void CMediaManager::RegisterLoader(ILoader<T>* pLoader, const String& strExtensions)
00109 {
00110
00111 std::vector<String> Ext;
00112 CStringUtil::Split(strExtensions, Ext, " /\\*.,;|-_\t\n'\"");
00113
00114
00115 CSmartPtr<ILoader<T> > Ptr = pLoader;
00116 for (std::vector<std::string>::iterator i = Ext.begin(); i != Ext.end(); ++i)
00117 CMediaHolder<T>::m_Loaders[CStringUtil::ToLower(*i)] = Ptr;
00118 }
00119
00120
00121 template <class T>
00122 inline T* CMediaManager::LoadMediaFromFile(const CFile& Filename) const
00123 {
00124
00125 CFile MediaPath = FindMedia(Filename);
00126
00127
00128 return FindLoader<T>(MediaPath).LoadFromFile(MediaPath.Fullname());
00129 }
00130
00131
00132 template <class T>
00133 inline void CMediaManager::SaveMediaToFile(const T* pObject, const CFile& Filename) const
00134 {
00135
00136 FindLoader<T>(Filename).SaveToFile(pObject, Filename.Fullname());
00137 }
00138
00139
00140 template <class T>
00141 inline ILoader<T>& CMediaManager::FindLoader(const CFile& Filename) const
00142 {
00143
00144 typename CMediaHolder<T>::TLoadersMap::const_iterator It = CMediaHolder<T>::m_Loaders.find(CStringUtil::ToLower(Filename.Extension()));
00145
00146
00147 if ((It != CMediaHolder<T>::m_Loaders.end()) && It->second)
00148 return *It->second;
00149
00150 LOADINGFAILED_EXCEPT(Filename.Fullname(), "No loader takes care of this file format", "CMediaManager::FindLoader");
00151 }
00152
00153 }
00154
00155
00156 #endif // KEOS_MEDIAMANAGER_H