2
0

CFilesystemLoader.cpp 2.5 KB

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