TextSubFile.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. //
  2. // Created by Иван_Архипов on 24.11.2017.
  3. //
  4. #ifndef LOTRO_DAT_LIBRARY_TEXTSUBFILE_H
  5. #define LOTRO_DAT_LIBRARY_TEXTSUBFILE_H
  6. #include "SubFile.h"
  7. #include "SubfileData.h"
  8. #include "BinaryData.h"
  9. #include <vector>
  10. #include <unordered_map>
  11. namespace LOTRO_DAT {
  12. struct TextFragment {
  13. long long fragment_id;
  14. std::u16string text;
  15. std::string args;
  16. bool operator < (const TextFragment &other) const {
  17. return fragment_id < other.fragment_id;
  18. }
  19. };
  20. class TextSubFile : public SubFile {
  21. public:
  22. TextSubFile() = delete;
  23. explicit TextSubFile(const TextSubFile &other) = delete;
  24. SubFile &operator =(const TextSubFile &other) = delete;
  25. TextSubFile(DatFile &dat, long long dictionary_offset, long long fragments_count, long long unknown1,
  26. long long file_id, long long file_offset, long long file_size, long long timestamp,
  27. long long version, long long block_size);
  28. FILE_TYPE FileType() const override;
  29. std::string Extension() const override;
  30. SubfileData PrepareForExport(const BinaryData &file_data) override;
  31. BinaryData MakeForImport(const BinaryData &old_data, const SubfileData &data) override;
  32. private:
  33. std::vector<TextFragment> patch_fragments_;
  34. std::vector<std::u16string> text_pieces_;
  35. std::vector<long long> argument_references_;
  36. std::vector<std::vector<BinaryData>> argument_strings_;
  37. static BinaryData buffer_;
  38. private:
  39. void MakePieces(const BinaryData &data, long long &offset);
  40. void MakeArgumentReferences(const BinaryData &data, long long &offset);
  41. void MakeArgumentStrings(const BinaryData &data, long long &offset);
  42. void ParsePatchFragments(const SubfileData &data);
  43. BinaryData BuildPieces(const BinaryData &data, const TextFragment &new_data, long long &offset);
  44. BinaryData BuildArgumentReferences(const BinaryData &data, const TextFragment &new_data, long long &offset);
  45. BinaryData BuildArgumentStrings(const BinaryData &data, const TextFragment &new_data, long long &offset);
  46. BinaryData GetPieceData(const BinaryData &data, long long &offset) const;
  47. BinaryData GetArgumentReferenceData(const BinaryData &data, long long &offset) const;
  48. BinaryData GetArgumentStringsData(const BinaryData &data, long long &offset) const;
  49. };
  50. };
  51. #endif //LOTRO_DAT_LIBRARY_TEXTSUBFILE_H