AdapterLoaders.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * AdapterLoaders.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "ISimpleResourceLoader.h"
  12. #include "ResourceID.h"
  13. VCMI_LIB_NAMESPACE_BEGIN
  14. class CInputStream;
  15. class JsonNode;
  16. /**
  17. * Class that implements file mapping (aka *nix symbolic links)
  18. * Uses json file as input, content is map:
  19. * "fileA.txt" : "fileB.txt"
  20. * Note that extension is necessary, but used only to determine type
  21. *
  22. * fileA - file which will be replaced
  23. * fileB - file which will be used as replacement
  24. */
  25. class DLL_LINKAGE CMappedFileLoader : public ISimpleResourceLoader
  26. {
  27. public:
  28. /**
  29. * Ctor.
  30. *
  31. * @param config Specifies filesystem configuration
  32. */
  33. explicit CMappedFileLoader(const std::string &mountPoint, const JsonNode & config);
  34. /// Interface implementation
  35. /// @see ISimpleResourceLoader
  36. std::unique_ptr<CInputStream> load(const ResourceID & resourceName) const override;
  37. bool existsResource(const ResourceID & resourceName) const override;
  38. std::string getMountPoint() const override;
  39. std::optional<boost::filesystem::path> getResourceName(const ResourceID & resourceName) const override;
  40. void updateFilteredFiles(std::function<bool(const std::string &)> filter) const override {}
  41. std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
  42. private:
  43. /** A list of files in this map
  44. * key = ResourceID for resource loader
  45. * value = ResourceID to which file this request will be redirected
  46. */
  47. std::unordered_map<ResourceID, ResourceID> fileList;
  48. };
  49. class DLL_LINKAGE CFilesystemList : public ISimpleResourceLoader
  50. {
  51. std::vector<std::unique_ptr<ISimpleResourceLoader> > loaders;
  52. std::set<ISimpleResourceLoader *> writeableLoaders;
  53. //FIXME: this is only compile fix, should be removed in the end
  54. CFilesystemList(CFilesystemList &) = delete;
  55. CFilesystemList &operator=(CFilesystemList &) = delete;
  56. public:
  57. CFilesystemList();
  58. ~CFilesystemList();
  59. /// Interface implementation
  60. /// @see ISimpleResourceLoader
  61. std::unique_ptr<CInputStream> load(const ResourceID & resourceName) const override;
  62. bool existsResource(const ResourceID & resourceName) const override;
  63. std::string getMountPoint() const override;
  64. std::optional<boost::filesystem::path> getResourceName(const ResourceID & resourceName) const override;
  65. std::set<boost::filesystem::path> getResourceNames(const ResourceID & resourceName) const override;
  66. void updateFilteredFiles(std::function<bool(const std::string &)> filter) const override;
  67. std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
  68. bool createResource(std::string filename, bool update = false) override;
  69. std::vector<const ISimpleResourceLoader *> getResourcesWithName(const ResourceID & resourceName) const override;
  70. /**
  71. * Adds a resource loader to the loaders list
  72. * Passes loader ownership to this object
  73. *
  74. * @param loader The simple resource loader object to add
  75. * @param writeable - resource shall be treated as writeable
  76. */
  77. void addLoader(ISimpleResourceLoader * loader, bool writeable);
  78. /**
  79. * Removes loader from the loader list
  80. * Take care about memory deallocation
  81. *
  82. * @param loader The simple resource loader object to remove
  83. *
  84. * @return if loader was successfully removed
  85. */
  86. bool removeLoader(ISimpleResourceLoader * loader);
  87. };
  88. VCMI_LIB_NAMESPACE_END