DatIO.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //
  2. // Created by kikab on 04.06.2018.
  3. //
  4. #ifndef LOTRO_DAT_LIBRARY_DATIO_H
  5. #define LOTRO_DAT_LIBRARY_DATIO_H
  6. #include <utility>
  7. #include "../DatOperationResult.h"
  8. extern "C++" {
  9. namespace LOTRO_DAT {
  10. class BinaryData;
  11. class DatFile;
  12. class SubDirectory;
  13. class SubFile;
  14. /*!
  15. * \brief Модуль ввода/вывода
  16. * \author Gi1dor
  17. * \date 30.06.2018
  18. * Класс для работы с вводом-выводом данных в dat-контейнере. Предоставляет функции чтения/записи данных, а также
  19. * информацию об основных параметрах dat файла
  20. * \warning Объекты этого класса не должны создаваться отдельно! Созданием и управлением ими занимается класс DatFile
  21. */
  22. class DatIO {
  23. public:
  24. DatIO() = delete;
  25. DatIO(const DatIO &other) = delete;
  26. DatIO& operator=(const DatIO &other) = delete;
  27. ~DatIO();
  28. explicit DatIO(DatFile *datFilePtr);
  29. DatOperationResult<> Init(const std::string &filename);
  30. DatOperationResult<> ReadData(BinaryData &data, long long size, long long offset = 0, long long data_offset = 0) const;
  31. DatOperationResult<> WriteData(const BinaryData &data, long long size, long long offset = 0, long long data_offset = 0);
  32. DatOperationResult<long long> GetActualDatSize();
  33. DatOperationResult<std::string> GetFilename();
  34. void PrintInformaion(FILE* file);
  35. DatOperationResult<> DeInit();
  36. unsigned int getHeaderHash();
  37. private:
  38. void ClearData();
  39. //------------------------------------------------//
  40. // PRIVATE INIT SECTION
  41. //------------------------------------------------//
  42. DatOperationResult<> OpenDatFile();
  43. DatOperationResult<> ReadSuperBlock();
  44. //------------------------------------------------//
  45. // PRIVATE READ-WRITE SECTION
  46. //------------------------------------------------//
  47. void UpdateBufferIfNeeded(long long size_to_write);
  48. //------------------------------------------------//
  49. // PRIVATE DEINIT SECTION
  50. //------------------------------------------------//
  51. DatOperationResult<> ModifyFragmentationJournal();
  52. DatOperationResult<> UpdateHeader();
  53. private:
  54. DatFile *dat;
  55. FILE *file_handler_;
  56. std::string filename_;
  57. public:
  58. /// Header values
  59. long long constant1;
  60. long long constant2;
  61. long long file_size;
  62. long long version1;
  63. long long version2;
  64. long long fragmentation_journal_size;
  65. long long fragmentation_journal_end;
  66. long long root_directory_offset;
  67. long long fragmentation_journal_offset;
  68. long long free_dat_size;
  69. private:
  70. long long actual_dat_size_;
  71. 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
  72. };
  73. }
  74. };
  75. #endif //LOTRO_DAT_LIBRARY_DATIO_H