CFilesystemLoader.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "StdInc.h"
  2. #include "CFilesystemLoader.h"
  3. #include "CFileInfo.h"
  4. #include "CFileInputStream.h"
  5. CFilesystemLoader::CFilesystemLoader(const std::string & baseDirectory, size_t depth, bool initial):
  6. baseDirectory(baseDirectory),
  7. fileList(listFiles(depth, initial))
  8. {
  9. }
  10. std::unique_ptr<CInputStream> CFilesystemLoader::load(const std::string & resourceName) const
  11. {
  12. std::unique_ptr<CInputStream> stream(new CFileInputStream(getOrigin() + '/' + resourceName));
  13. return stream;
  14. }
  15. bool CFilesystemLoader::existsEntry(const std::string & resourceName) const
  16. {
  17. for(auto it = fileList.begin(); it != fileList.end(); ++it)
  18. {
  19. if(it->second == resourceName)
  20. {
  21. return true;
  22. }
  23. }
  24. return false;
  25. }
  26. boost::unordered_map<ResourceID, std::string> CFilesystemLoader::getEntries() const
  27. {
  28. return fileList;
  29. }
  30. std::string CFilesystemLoader::getOrigin() const
  31. {
  32. return baseDirectory;
  33. }
  34. bool CFilesystemLoader::createEntry(std::string filename)
  35. {
  36. ResourceID res(filename);
  37. if (fileList.find(res) != fileList.end())
  38. return false;
  39. fileList[res] = filename;
  40. std::ofstream newfile (baseDirectory + "/" + filename);
  41. return true;
  42. }
  43. boost::unordered_map<ResourceID, std::string> CFilesystemLoader::listFiles(size_t depth, bool initial) const
  44. {
  45. std::set<EResType::Type> initialTypes;
  46. initialTypes.insert(EResType::DIRECTORY);
  47. initialTypes.insert(EResType::TEXT);
  48. initialTypes.insert(EResType::ARCHIVE_LOD);
  49. initialTypes.insert(EResType::ARCHIVE_VID);
  50. initialTypes.insert(EResType::ARCHIVE_SND);
  51. assert(boost::filesystem::is_directory(baseDirectory));
  52. boost::unordered_map<ResourceID, std::string> fileList;
  53. std::vector<std::string> path;//vector holding relative path to our file
  54. boost::filesystem::recursive_directory_iterator enddir;
  55. boost::filesystem::recursive_directory_iterator it(baseDirectory, boost::filesystem::symlink_option::recurse);
  56. for(; it != enddir; ++it)
  57. {
  58. EResType::Type type;
  59. if (boost::filesystem::is_directory(it->status()))
  60. {
  61. path.resize(it.level()+1);
  62. path.back() = it->path().leaf().string();
  63. it.no_push(depth <= it.level()); // don't iterate into directory if depth limit reached
  64. type = EResType::DIRECTORY;
  65. }
  66. else
  67. type = EResTypeHelper::getTypeFromExtension(boost::filesystem::extension(*it));
  68. if (!initial || vstd::contains(initialTypes, type))
  69. {
  70. //reconstruct relative filename (not possible via boost AFAIK)
  71. std::string filename;
  72. for (size_t i=0; i<it.level() && i<path.size(); i++)
  73. filename += path[i] + '/';
  74. filename += it->path().leaf().string();
  75. fileList[ResourceID(filename, type)] = filename;
  76. }
  77. }
  78. return fileList;
  79. }