CFilesystemLoader.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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, bool update)
  35. {
  36. ResourceID res(filename);
  37. if (fileList.find(res) != fileList.end())
  38. return false;
  39. fileList[res] = filename;
  40. if (!update)
  41. std::ofstream newfile (baseDirectory + "/" + filename);
  42. return true;
  43. }
  44. boost::unordered_map<ResourceID, std::string> CFilesystemLoader::listFiles(size_t depth, bool initial) const
  45. {
  46. std::set<EResType::Type> initialTypes;
  47. initialTypes.insert(EResType::DIRECTORY);
  48. initialTypes.insert(EResType::TEXT);
  49. initialTypes.insert(EResType::ARCHIVE_LOD);
  50. initialTypes.insert(EResType::ARCHIVE_VID);
  51. initialTypes.insert(EResType::ARCHIVE_SND);
  52. assert(boost::filesystem::is_directory(baseDirectory));
  53. boost::unordered_map<ResourceID, std::string> fileList;
  54. std::vector<std::string> path;//vector holding relative path to our file
  55. boost::filesystem::recursive_directory_iterator enddir;
  56. boost::filesystem::recursive_directory_iterator it(baseDirectory, boost::filesystem::symlink_option::recurse);
  57. for(; it != enddir; ++it)
  58. {
  59. EResType::Type type;
  60. if (boost::filesystem::is_directory(it->status()))
  61. {
  62. path.resize(it.level()+1);
  63. path.back() = it->path().leaf().string();
  64. it.no_push(depth <= it.level()); // don't iterate into directory if depth limit reached
  65. type = EResType::DIRECTORY;
  66. }
  67. else
  68. type = EResTypeHelper::getTypeFromExtension(boost::filesystem::extension(*it));
  69. if (!initial || vstd::contains(initialTypes, type))
  70. {
  71. //reconstruct relative filename (not possible via boost AFAIK)
  72. std::string filename;
  73. for (size_t i=0; i<it.level() && i<path.size(); i++)
  74. filename += path[i] + '/';
  75. filename += it->path().leaf().string();
  76. fileList[ResourceID(filename, type)] = filename;
  77. }
  78. }
  79. return fileList;
  80. }