subfile.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "subfile.h"
  2. #include "EasyLogging++/easylogging++.h"
  3. namespace LOTRO_DAT {
  4. FILE_TYPE FileTypeFromString(std::string ext) {
  5. if (ext == ".txt")
  6. return TEXT;
  7. if (ext == ".jpg")
  8. return JPG;
  9. if (ext == ".dds")
  10. return DDS;
  11. if (ext == ".wav")
  12. return WAV;
  13. if (ext == ".ogg")
  14. return OGG;
  15. if (ext == ".fontbin")
  16. return FONT;
  17. return UNKNOWN;
  18. }
  19. FILE_TYPE FileTypeFromFileContents(int file_id, const BinaryData& file_data) {
  20. // Text check based on file_id
  21. if ((file_id >> 24) == 0x25)
  22. return TEXT;
  23. // Font check based on file_id
  24. if ((file_id >> 24) == 0x42)
  25. return FONT;
  26. // jpeg / dds check
  27. if ((file_id >> 24) == 0x41) {
  28. long long soi = file_data.ToNumber<2>(24);
  29. // long long marker = file_data.ToNumber<2>(26);
  30. //auto markerSize = header.ToNumber<short>(28);
  31. //auto four = header.ToNumber<int>(30);
  32. if (soi == 0xD8FF)
  33. return JPG;
  34. return DDS;
  35. }
  36. // Ogg and Wav check
  37. if (file_data[8] == 0x4F && file_data[9] == 0x67 && file_data[10] == 0x67 && file_data[11] == 0x53)
  38. return OGG;
  39. if (file_data[8] == 0x52 && file_data[9] == 0x49 && file_data[10] == 0x46 && file_data[11] == 0x46)
  40. return WAV;
  41. return UNKNOWN;
  42. }
  43. std::string StringFromFileType(FILE_TYPE type) {
  44. if (type == TEXT)
  45. return ".txt";
  46. if (type == JPG)
  47. return ".jpg";
  48. if (type == DDS)
  49. return ".dds";
  50. if (type == WAV)
  51. return ".wav";
  52. if (type == OGG)
  53. return ".ogg";
  54. if (type == FONT)
  55. return ".fontbin";
  56. return ".subfile";
  57. }
  58. BinaryData BuildForImport(const BinaryData& old_data, const SubfileData& outer_data) {
  59. if (!outer_data.options["ext"]) {
  60. LOG(WARNING) << "No extension established for file with id " << outer_data.options["fid"].as<std::string>();
  61. return BinaryData();
  62. }
  63. FILE_TYPE type = FileTypeFromString(outer_data.options["ext"].as<std::string>());
  64. switch (type)
  65. {
  66. case TEXT:
  67. return Subfiles::Subfile<TEXT>::BuildForImport(old_data, outer_data);
  68. case JPG:
  69. return Subfiles::Subfile<JPG>::BuildForImport(old_data, outer_data);
  70. case DDS:
  71. return Subfiles::Subfile<DDS>::BuildForImport(old_data, outer_data);
  72. case WAV:
  73. return Subfiles::Subfile<WAV>::BuildForImport(old_data, outer_data);
  74. case OGG:
  75. return Subfiles::Subfile<OGG>::BuildForImport(old_data, outer_data);
  76. case FONT:
  77. return Subfiles::Subfile<FONT>::BuildForImport(old_data, outer_data);
  78. default:
  79. return Subfiles::Subfile<UNKNOWN>::BuildForImport(old_data, outer_data);
  80. }
  81. }
  82. SubfileData BuildForExport(int file_id, const BinaryData& inner_data) {
  83. FILE_TYPE type = FileTypeFromFileContents(file_id, inner_data);
  84. SubfileData result;
  85. switch (type)
  86. {
  87. case TEXT:
  88. result = Subfiles::Subfile<TEXT>::BuildForExport(inner_data);
  89. break;
  90. case JPG:
  91. result = Subfiles::Subfile<JPG>::BuildForExport(inner_data);
  92. break;
  93. case DDS:
  94. result = Subfiles::Subfile<DDS>::BuildForExport(inner_data);
  95. break;
  96. case WAV:
  97. result = Subfiles::Subfile<WAV>::BuildForExport(inner_data);
  98. break;
  99. case OGG:
  100. result = Subfiles::Subfile<OGG>::BuildForExport(inner_data);
  101. break;
  102. case FONT:
  103. result = Subfiles::Subfile<FONT>::BuildForExport(inner_data);
  104. break;
  105. default:
  106. result = Subfiles::Subfile<UNKNOWN>::BuildForExport(inner_data);
  107. }
  108. result.options["fid"] = file_id;
  109. return result;
  110. }
  111. }; // namespace LOTRO_DAT