123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- //
- // Created by kikab on 04.06.2018.
- //
- #ifndef LOTRO_DAT_LIBRARY_DATIO_H
- #define LOTRO_DAT_LIBRARY_DATIO_H
- #include <utility>
- #include "../DatOperationResult.h"
- extern "C++" {
- namespace LOTRO_DAT {
- class BinaryData;
- class DatFile;
- class SubDirectory;
- class SubFile;
- /*!
- * \brief Модуль ввода/вывода
- * \author Gi1dor
- * \date 30.06.2018
- * Класс для работы с вводом-выводом данных в dat-контейнере. Предоставляет функции чтения/записи данных, а также
- * информацию об основных параметрах dat файла
- * \warning Объекты этого класса не должны создаваться отдельно! Созданием и управлением ими занимается класс DatFile
- */
- class DatIO {
- public:
- DatIO() = delete;
- DatIO(const DatIO &other) = delete;
- DatIO& operator=(const DatIO &other) = delete;
- ~DatIO();
- explicit DatIO(DatFile *datFilePtr);
- DatOperationResult<> Init(const std::string &filename);
- DatOperationResult<> ReadData(BinaryData &data, long long size, long long offset = 0, long long data_offset = 0) const;
- DatOperationResult<> WriteData(const BinaryData &data, long long size, long long offset = 0, long long data_offset = 0);
- DatOperationResult<long long> GetActualDatSize();
- DatOperationResult<std::string> GetFilename();
- void PrintInformaion(FILE* file);
- DatOperationResult<> DeInit();
- unsigned int GetHeaderHash();
- private:
- void ClearData();
- //------------------------------------------------//
- // PRIVATE INIT SECTION
- //------------------------------------------------//
- DatOperationResult<> OpenDatFile();
- DatOperationResult<> ReadSuperBlock();
- //------------------------------------------------//
- // PRIVATE READ-WRITE SECTION
- //------------------------------------------------//
- void UpdateBufferIfNeeded(long long size_to_write);
- //------------------------------------------------//
- // PRIVATE DEINIT SECTION
- //------------------------------------------------//
- DatOperationResult<> ModifyFragmentationJournal();
- DatOperationResult<> UpdateHeader();
- private:
- DatFile *dat;
- FILE *file_handler_;
- std::string filename_;
- public:
- /// Header values
- long long constant1;
- long long constant2;
- long long file_size;
- long long version1;
- long long version2;
- long long fragmentation_journal_size;
- long long fragmentation_journal_end;
- long long root_directory_offset;
- long long fragmentation_journal_offset;
- long long free_dat_size;
- private:
- long long actual_dat_size_;
- const unsigned MAX_EOF_BUFFER = 15 * 1024 * 1024; /// Maximal size of buffer, which is written to the end of dat file to improve write speed of small fragments
- };
- }
- };
- #endif //LOTRO_DAT_LIBRARY_DATIO_H
|