DatFileSystem.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. class DatFileSystem {
  21. public:
  22. DatFileSystem() = delete;
  23. DatFileSystem(const DatFileSystem &other) = delete;
  24. DatFileSystem& operator=(const DatFileSystem &other) = delete;
  25. ~DatFileSystem() = default;
  26. explicit DatFileSystem(DatFile *datFilePtr);
  27. DatOperationResult<> Init();
  28. DatOperationResult<BinaryData> GetFileData(long long file_id, long long int offset);
  29. DatOperationResult<std::shared_ptr<SubFile>> GetFile(long long file_id);
  30. DatOperationResult<bool> CheckCorrectSubfile(const std::shared_ptr<SubFile> &file);
  31. DatOperationResult<> UpdateFileInfo(const SubFile& file);
  32. void PrintInformaion(FILE* file);
  33. DatOperationResult<> DeInit();
  34. private:
  35. //------------------------------------------------//
  36. // PRIVATE INIT SECTION
  37. //------------------------------------------------//
  38. DatOperationResult<> InitSubFile(long long file_id);
  39. DatOperationResult<> InitSubDirectory(SubDirectory dir);
  40. DatOperationResult<> InitAllDirectories();
  41. DatOperationResult<> InitAllFiles();
  42. //------------------------------------------------//
  43. // PRIVATE DEINIT SECTION
  44. //------------------------------------------------//
  45. DatOperationResult<> CommitDirectories();
  46. private:
  47. DatFile *dat;
  48. std::set<long long> subfile_pending_update;
  49. std::map<long long, std::shared_ptr<SubFile> > dictionary_;
  50. std::unordered_set<long long> visited_subdirectories_offsets_;
  51. std::unordered_set<long long> visited_subfiles_ids_;
  52. std::set<SubDirectory, SubDirectory::SubDirectoryOffsetComparator> subdir_init_queue_;
  53. std::unordered_map<long long, SubFile> subfile_init_map_;
  54. std::set<SubFile, SubFile::SubFileOffsetComparator> subfile_init_queue_;
  55. };
  56. }
  57. };
  58. #endif //LOTRO_DAT_LIBRARY_DATFILESYSTEM_H