12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- //
- // Created by kikab on 04.06.2018.
- //
- #ifndef LOTRO_DAT_LIBRARY_DATFILESYSTEM_H
- #define LOTRO_DAT_LIBRARY_DATFILESYSTEM_H
- #include <set>
- #include <map>
- #include <unordered_set>
- #include <unordered_map>
- #include <utility>
- #include <memory>
- #include "../DatOperationResult.h"
- #include "../SubFile.h"
- #include "../SubDirectory.h"
- extern "C++" {
- namespace LOTRO_DAT {
- class DatFile;
- class BinaryData;
- class SubDirectory;
- /*!
- * \brief Модуль файловой системы
- * \author Gi1dor
- * \date 30.06.2018
- * Класс для работы с внутренними файлами в dat-контейнере. Позволяет найти и извлечь данные необходимого файла
- * или изменить информацию о нём
- * \warning Объекты этого класса не должны создаваться отдельно! Созданием и управлением ими занимается класс DatFile
- */
- class DatFileSystem {
- public:
- DatFileSystem() = delete;
- DatFileSystem(const DatFileSystem &other) = delete;
- DatFileSystem& operator=(const DatFileSystem &other) = delete;
- ~DatFileSystem() = default;
- explicit DatFileSystem(DatFile *datFilePtr);
- DatOperationResult<> Init();
- DatOperationResult<> InitAllDirectories();
- DatOperationResult<> InitAllFiles();
- DatOperationResult<BinaryData> GetFileData(const SubFile& file, long long int offset);
- DatOperationResult<std::shared_ptr<SubFile>> GetFile(long long file_id);
- DatOperationResult<bool> CheckCorrectSubfile(const SubFile& file);
- DatOperationResult<> UpdateFileInfo(const SubFile& file);
- int GetInitialisedFilesNumber() const;
- void PrintInformaion(FILE* file);
- DatOperationResult<> DeInit();
- DatOperationResult<> PerformOperationOnAllFiles(const std::function<void (std::shared_ptr<SubFile>&)>& function);
- private:
- DatOperationResult<> InitSubFile(long long file_id);
- DatOperationResult<> InitSubDirectory(SubDirectory dir);
- DatOperationResult<> CommitDirectories();
- private:
- DatFile *dat;
- std::set<long long> subfile_pending_update;
- std::map<long long, std::shared_ptr<SubFile> > dictionary_;
- std::unordered_set<long long> visited_subdirectories_offsets_;
- std::unordered_set<long long> visited_subfiles_ids_;
- std::set<SubDirectory, SubDirectory::SubDirectoryOffsetComparator> subdir_init_queue_;
- std::unordered_map<long long, SubFile> subfile_init_map_;
- std::set<SubFile, SubFile::SubFileOffsetComparator> subfile_init_queue_;
- };
- }
- };
- #endif //LOTRO_DAT_LIBRARY_DATFILESYSTEM_H
|