2
0

CResourceLoader.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. #include "StdInc.h"
  2. #include "CResourceLoader.h"
  3. #include "CFileInfo.h"
  4. #include "CLodArchiveLoader.h"
  5. CResourceLoader * CResourceLoaderFactory::resourceLoader = nullptr;
  6. ResourceIdentifier::ResourceIdentifier() : type(EResType::OTHER)
  7. {
  8. }
  9. ResourceIdentifier::ResourceIdentifier(const std::string & name, EResType type) : name(name), type(type)
  10. {
  11. boost::to_upper(this->name);
  12. }
  13. std::string ResourceIdentifier::getName() const
  14. {
  15. return name;
  16. }
  17. EResType ResourceIdentifier::getType() const
  18. {
  19. return type;
  20. }
  21. void ResourceIdentifier::setName(const std::string & name)
  22. {
  23. this->name = name;
  24. boost::to_upper(this->name);
  25. }
  26. void ResourceIdentifier::setType(EResType type)
  27. {
  28. this->type = type;
  29. }
  30. CResourceLoader::CResourceLoader()
  31. {
  32. }
  33. CResourceLoader::~CResourceLoader()
  34. {
  35. // Delete all loader objects
  36. for(auto it = loaders.begin(); it != loaders.end(); ++it)
  37. {
  38. delete *it;
  39. }
  40. }
  41. std::unique_ptr<CInputStream> CResourceLoader::load(const ResourceIdentifier & resourceIdent) const
  42. {
  43. if(!existsResource(resourceIdent))
  44. {
  45. throw std::runtime_error("Resource with name " + resourceIdent.getName() + " and type "
  46. + EResTypeHelper::getEResTypeAsString(resourceIdent.getType()) + " wasn't found.");
  47. }
  48. // get the last added resource(most overriden)
  49. const ResourceLocator & locator = resources.at(resourceIdent).back();
  50. // load the resource and return it
  51. return locator.getLoader()->load(locator.getResourceName());
  52. }
  53. bool CResourceLoader::existsResource(const ResourceIdentifier & resourceIdent) const
  54. {
  55. // Check if resource is registered
  56. if(resources.find(resourceIdent) != resources.end())
  57. {
  58. return true;
  59. }
  60. else
  61. {
  62. return false;
  63. }
  64. }
  65. void CResourceLoader::addLoader(ISimpleResourceLoader * loader)
  66. {
  67. loaders.push_back(loader);
  68. // Get entries and add them to the resources list
  69. const std::list<std::string> & entries = loader->getEntries();
  70. for(auto it = entries.begin(); it != entries.end(); ++it)
  71. {
  72. std::string entry = *it;
  73. CFileInfo file(entry);
  74. // Create identifier and locator and add them to the resources list
  75. ResourceIdentifier ident(file.getStem(), file.getType());
  76. ResourceLocator locator(loader, entry);
  77. resources[ident].push_back(locator);
  78. }
  79. }
  80. CResourceLoader * CResourceLoaderFactory::getInstance()
  81. {
  82. if(resourceLoader != nullptr)
  83. {
  84. return resourceLoader;
  85. }
  86. else
  87. {
  88. std::stringstream string;
  89. string << "Error: Resource loader wasn't initialized. "
  90. << "Make sure that you set one via CResourceLoaderFactory::setInstance";
  91. throw std::runtime_error(string.str());
  92. }
  93. }
  94. void CResourceLoaderFactory::setInstance(CResourceLoader * resourceLoader)
  95. {
  96. CResourceLoaderFactory::resourceLoader = resourceLoader;
  97. }
  98. ResourceLocator::ResourceLocator(ISimpleResourceLoader * loader, const std::string & resourceName)
  99. : loader(loader), resourceName(resourceName)
  100. {
  101. }
  102. ISimpleResourceLoader * ResourceLocator::getLoader() const
  103. {
  104. return loader;
  105. }
  106. std::string ResourceLocator::getResourceName() const
  107. {
  108. return resourceName;
  109. }
  110. EResType EResTypeHelper::getTypeFromExtension(std::string extension)
  111. {
  112. boost::to_upper(extension);
  113. if(extension == ".TXT" || extension == ".JSON")
  114. {
  115. return EResType::TEXT;
  116. }
  117. else if(extension == ".DEF" || extension == ".JSON")
  118. {
  119. return EResType::ANIMATION;
  120. }
  121. else if(extension == ".MSK" || extension == ".MSG")
  122. {
  123. return EResType::MASK;
  124. }
  125. else if(extension == ".H3C")
  126. {
  127. return EResType::CAMPAIGN;
  128. }
  129. else if(extension == ".H3M")
  130. {
  131. return EResType::MAP;
  132. }
  133. else if(extension == ".FNT")
  134. {
  135. return EResType::FONT;
  136. }
  137. else if(extension == ".BMP" || extension == ".JPG" || extension == ".PCX" || extension == ".PNG" || extension == ".TGA")
  138. {
  139. return EResType::IMAGE;
  140. }
  141. else if(extension == ".WAV")
  142. {
  143. return EResType::SOUND;
  144. }
  145. else if(extension == ".SMK" || extension == ".BIK")
  146. {
  147. return EResType::VIDEO;
  148. }
  149. else if(extension == ".MP3" || extension == ".OGG")
  150. {
  151. return EResType::MUSIC;
  152. }
  153. else if(extension == ".ZIP" || extension == ".TAR.GZ" || extension == ".LOD" || extension == ".VID" || extension == ".SND")
  154. {
  155. return EResType::ARCHIVE;
  156. }
  157. else if(extension == ".VLGM1")
  158. {
  159. return EResType::SAVEGAME;
  160. }
  161. else
  162. {
  163. return EResType::OTHER;
  164. }
  165. }
  166. std::string EResTypeHelper::getEResTypeAsString(EResType type)
  167. {
  168. if(type == EResType::ANIMATION)
  169. {
  170. return "ANIMATION";
  171. }
  172. else if(type == EResType::ANY)
  173. {
  174. return "ANY";
  175. }
  176. else if(type == EResType::ARCHIVE)
  177. {
  178. return "ARCHIVE";
  179. }
  180. else if(type == EResType::CAMPAIGN)
  181. {
  182. return "CAMPAIGN";
  183. }
  184. else if(type == EResType::FONT)
  185. {
  186. return "FONT";
  187. }
  188. else if(type == EResType::IMAGE)
  189. {
  190. return "IMAGE";
  191. }
  192. else if(type == EResType::MAP)
  193. {
  194. return "MAP";
  195. }
  196. else if(type == EResType::MASK)
  197. {
  198. return "MASK";
  199. }
  200. else if(type == EResType::MUSIC)
  201. {
  202. return "MUSIC";
  203. }
  204. else if(type == EResType::OTHER)
  205. {
  206. return "OTHER";
  207. }
  208. else if(type == EResType::SAVEGAME)
  209. {
  210. return "SAVEGAME";
  211. }
  212. else if(type == EResType::SOUND)
  213. {
  214. return "SOUND";
  215. }
  216. else if(type == EResType::TEXT)
  217. {
  218. return "TEXT";
  219. }
  220. else if(type == EResType::VIDEO)
  221. {
  222. return "VIDEO";
  223. }
  224. return "";
  225. }