DatFileSystem.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //
  2. // Created by kikab on 04.06.2018.
  3. //
  4. #ifndef LOTRO_DAT_LIBRARY_DATFILESYSTEM_H
  5. #define LOTRO_DAT_LIBRARY_DATFILESYSTEM_H
  6. #include <set>
  7. #include <map>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include <utility>
  11. #include <memory>
  12. #include "../DatOperationResult.h"
  13. #include "../SubFile.h"
  14. #include "../SubDirectory.h"
  15. extern "C++" {
  16. namespace LOTRO_DAT {
  17. class DatFile;
  18. class BinaryData;
  19. class SubDirectory;
  20. /*!
  21. * \brief Модуль файловой системы
  22. * \author Gi1dor
  23. * \date 30.06.2018
  24. * Класс для работы с внутренними файлами в dat-контейнере. Позволяет найти и извлечь данные необходимого файла
  25. * или изменить информацию о нём
  26. * \warning Объекты этого класса не должны создаваться отдельно! Созданием и управлением ими занимается класс DatFile
  27. */
  28. class DatFileSystem {
  29. public:
  30. DatFileSystem() = delete;
  31. DatFileSystem(const DatFileSystem &other) = delete;
  32. DatFileSystem& operator=(const DatFileSystem &other) = delete;
  33. ~DatFileSystem() = default;
  34. explicit DatFileSystem(DatFile *datFilePtr);
  35. DatOperationResult<> Init();
  36. DatOperationResult<> InitAllDirectories();
  37. DatOperationResult<> InitAllFiles();
  38. DatOperationResult<BinaryData> GetFileData(const SubFile& file, long long int offset);
  39. DatOperationResult<std::shared_ptr<SubFile>> GetFile(long long file_id);
  40. DatOperationResult<bool> CheckCorrectSubfile(const SubFile& file);
  41. DatOperationResult<> UpdateFileInfo(const SubFile& file);
  42. int GetInitialisedFilesNumber() const;
  43. void PrintInformaion(FILE* file);
  44. DatOperationResult<> DeInit();
  45. DatOperationResult<> PerformOperationOnAllFiles(const std::function<void (std::shared_ptr<SubFile>&)>& function);
  46. DatOperationResult<> CommitDirectories();
  47. private:
  48. DatOperationResult<> InitSubFile(long long file_id);
  49. DatOperationResult<> InitSubDirectory(SubDirectory dir);
  50. private:
  51. DatFile *dat;
  52. std::set<long long> subfile_pending_update;
  53. std::map<long long, std::shared_ptr<SubFile> > dictionary_;
  54. std::unordered_set<long long> visited_subdirectories_offsets_;
  55. std::unordered_set<long long> visited_subfiles_ids_;
  56. std::set<SubDirectory, SubDirectory::SubDirectoryOffsetComparator> subdir_init_queue_;
  57. std::unordered_map<long long, SubFile> subfile_init_map_;
  58. std::set<SubFile, SubFile::SubFileOffsetComparator> subfile_init_queue_;
  59. public:
  60. long long patched_file_end;
  61. };
  62. }
  63. };
  64. #endif //LOTRO_DAT_LIBRARY_DATFILESYSTEM_H