Browse Source

Changed args in DatFileSystem::GetFileData and DatFileSystem::CheckCorrectSubfile from file_id to SubFile class object

Ivan Arkhipov 5 years ago
parent
commit
3e39e6ced1

+ 2 - 2
include/DatSubsystems/DatFileSystem.h

@@ -48,11 +48,11 @@ namespace LOTRO_DAT {
 
         DatOperationResult<> InitAllFiles();
 
-        DatOperationResult<BinaryData> GetFileData(long long file_id, long long int offset);
+        DatOperationResult<BinaryData> GetFileData(const SubFile& file, long long int offset);
 
         DatOperationResult<std::shared_ptr<SubFile>> GetFile(long long file_id);
 
-        DatOperationResult<bool> CheckCorrectSubfile(const std::shared_ptr<SubFile> &file);
+        DatOperationResult<bool> CheckCorrectSubfile(const SubFile& file);
 
         DatOperationResult<> UpdateFileInfo(const SubFile& file);
 

+ 8 - 10
src/DatSubsystems/DatExporter.cpp

@@ -39,7 +39,7 @@ namespace LOTRO_DAT {
             if ((file->FileType() & type) == NO_TYPE)
                 return;
 
-            SubfileData export_file = file->PrepareForExport(dat->GetFileSystem().GetFileData(file->file_id(), 8).value);
+            SubfileData export_file = file->PrepareForExport(dat->GetFileSystem().GetFileData(*file, 8).value);
             dat->GetStatusModule().SetDebugMessage("Extracting file " + std::to_string(file->file_id()) + " (Files by type -> directory)");
 
             if (export_file.Empty())
@@ -75,21 +75,19 @@ namespace LOTRO_DAT {
         dat->GetStatusModule().SetPercentage(0);
         dat->GetStatusModule().SetDebugMessage("Extracting file " + std::to_string(file_id) + " to file " + output_filename);
 
-        auto operation_GetFileData = dat->GetFileSystem().GetFileData(file_id, 8);
-        if (operation_GetFileData.result == ERROR) {
+        auto operation_GetFile = dat->GetFileSystem().GetFile(file_id);
+        if (operation_GetFile.result == ERROR) {
             dat->GetStatusModule().ClearAll();
-            return DatOperationResult<>(ERROR, "EXTRACTFILEBYID: Can't get data for id = " + std::to_string(file_id));
+            return DatOperationResult<>(ERROR, "EXTRACTFILEBYID: File not found! id = " + std::to_string(file_id));
         }
+        std::shared_ptr<SubFile> file = operation_GetFile.value;
 
-        auto operation_GetFilePointer = dat->GetFileSystem().GetFile(file_id);
+        auto operation_GetFileData = dat->GetFileSystem().GetFileData(*file, 8);
         if (operation_GetFileData.result == ERROR) {
             dat->GetStatusModule().ClearAll();
-            return DatOperationResult<>(ERROR,
-                                        "EXTRACTFILEBYID: Can't get pointer for id = " + std::to_string(file_id));
+            return DatOperationResult<>(ERROR, "EXTRACTFILEBYID: Can't get data for id = " + std::to_string(file_id));
         }
 
-        std::shared_ptr<SubFile> file = operation_GetFilePointer.value;
-
         SubfileData export_data = file->PrepareForExport(operation_GetFileData.value);
 
         bool result;
@@ -139,7 +137,7 @@ namespace LOTRO_DAT {
 
             dat->GetStatusModule().SetDebugMessage("Extracting file " + std::to_string(file->file_id()) + " (Files by type -> database)");
 
-            SubfileData export_file = file->PrepareForExport(dat->GetFileSystem().GetFileData(file->file_id(), 8).value);
+            SubfileData export_file = file->PrepareForExport(dat->GetFileSystem().GetFileData(*file, 8).value);
 
             bool result = db->PushFile(export_file);
 

+ 17 - 26
src/DatSubsystems/DatFileSystem.cpp

@@ -30,51 +30,42 @@ namespace LOTRO_DAT {
      * \return Возвращает result = ERROR и value = BinaryData, если файл не найден или информаци в словаре некорректная
      */
 
-    DatOperationResult<BinaryData> DatFileSystem::GetFileData(long long file_id, long long int offset) {
+    DatOperationResult<BinaryData> DatFileSystem::GetFileData(const SubFile& file, long long int offset) {
         if (!dat)
             return DatOperationResult<BinaryData>(BinaryData(), ERROR,
                                                   "DatFileSystem error: no connection with Dat (dat is nullptr)");
 
-
-        auto getfile_operation = GetFile(file_id);
-        if (getfile_operation.result == ERROR)
-            return DatOperationResult<BinaryData>(BinaryData(), ERROR,
-                                                  "DATFSGETFILEDATA: no file with id = " + std::to_string(file_id));
-
-        auto& file = getfile_operation.value;
-
-
         BinaryData mfile_id(20);
         auto operation = CheckCorrectSubfile(file);
         if (operation.result == ERROR || !operation.value)
             return DatOperationResult<BinaryData>(BinaryData(), ERROR,
-                                                  "DATFSGETFILEDATA: Incorrect file" + std::to_string(file_id));
+                                                  "DATFSGETFILEDATA: Incorrect file" + std::to_string(file.file_id()));
 
 
-        BinaryData data((unsigned) (file->file_size() + (8 - offset)));
-        if (file->block_size() >= file->file_size() + 8) {
-            dat->GetIO().ReadData(data, file->file_size() + (8 - offset), file->file_offset() + offset);
+        BinaryData data((unsigned) (file.file_size() + (8 - offset)));
+        if (file.block_size() >= file.file_size() + 8) {
+            dat->GetIO().ReadData(data, file.file_size() + (8 - offset), file.file_offset() + offset);
             return DatOperationResult<BinaryData>(data, SUCCESS);
         }
 
         BinaryData fragments_count(4);
-        dat->GetIO().ReadData(fragments_count, 4, file->file_offset());
+        dat->GetIO().ReadData(fragments_count, 4, file.file_offset());
 
         long long fragments_number = fragments_count.ToNumber<4>(0);
 
-        long long current_block_size = file->block_size() - offset - 8 * fragments_number;
+        long long current_block_size = file.block_size() - offset - 8 * fragments_number;
 
-        dat->GetIO().ReadData(data, current_block_size, file->file_offset() + offset);
+        dat->GetIO().ReadData(data, current_block_size, file.file_offset() + offset);
 
         BinaryData FragmentsDictionary(8 * unsigned(fragments_number));
         dat->GetIO().ReadData(FragmentsDictionary, 8 * unsigned(fragments_number),
-                              file->file_offset() + file->block_size() - 8 * fragments_number);
+                              file.file_offset() + file.block_size() - 8 * fragments_number);
 
 
         for (long long i = 0; i < fragments_number; i++) {
             long long fragment_size = FragmentsDictionary.ToNumber<4>(8 * i);
             long long fragment_offset = FragmentsDictionary.ToNumber<4>(8 * i + 4);
-            dat->GetIO().ReadData(data, std::min(fragment_size, file->file_size() - current_block_size),
+            dat->GetIO().ReadData(data, std::min(fragment_size, file.file_size() - current_block_size),
                                   fragment_offset,
                                   current_block_size);
             current_block_size += fragment_size;
@@ -144,20 +135,20 @@ namespace LOTRO_DAT {
      * \return Объект DatOperationResult<bool> для которого value = true, если файл корректный, и false - иначе.
      */
 
-    DatOperationResult<bool> DatFileSystem::CheckCorrectSubfile(const std::shared_ptr<SubFile> &file) {
+    DatOperationResult<bool> DatFileSystem::CheckCorrectSubfile(const SubFile& file) {
         if (!dat)
             return DatOperationResult<bool>(false, ERROR,
                                             "DATFSCORRECTSUBFILE: no connection with Dat (dat is nullptr)");
-        if (file->file_size() < 16)
+        if (file.file_size() < 16)
             return DatOperationResult<bool>(false, SUCCESS);
 
         BinaryData mfile_id(20);
-        auto operation = dat->GetIO().ReadData(mfile_id, 20, file->file_offset() + 8);
+        auto operation = dat->GetIO().ReadData(mfile_id, 20, file.file_offset() + 8);
         if (operation.result == ERROR)
             return DatOperationResult<bool>(false, ERROR, "DATFSCORRECTSUBFILE: cannot read file header data");
 
-        return DatOperationResult<bool>((mfile_id.CheckCompression() || file->file_id() == mfile_id.ToNumber<4>(0)) &&
-                                        file->file_size() < 50ll * 1024ll * 1024ll, SUCCESS);
+        return DatOperationResult<bool>((mfile_id.CheckCompression() || file.file_id() == mfile_id.ToNumber<4>(0)) &&
+                                        file.file_size() < 50ll * 1024ll * 1024ll, SUCCESS);
     }
 
 
@@ -317,14 +308,14 @@ namespace LOTRO_DAT {
         if (!initialised_file)
             return DatOperationResult<>(ERROR, "DATFSINITSUBFILE: initialised subfile pointer is empty");
 
-        if (!CheckCorrectSubfile(initialised_file).value)
+        if (!CheckCorrectSubfile(*initialised_file).value)
             return DatOperationResult<>(ERROR, "DATFSINITSUBFILE: initialised file " + std::to_string(file.file_id()) + " is incorrect");
 
         if (dictionary_.count(file_id) > 0) {
             LOG(WARNING) << "Dublicate files id = " << file_id << "dictionary offsets = "
                          << dictionary_[file_id]->dictionary_offset() << " and "
                          << initialised_file->dictionary_offset();
-            if (CheckCorrectSubfile(dictionary_[file_id]).value)
+            if (CheckCorrectSubfile(*dictionary_[file_id]).value)
                 LOG(ERROR) << "    FILE IN DICTIONARY IS ALREADY CORRECT!";
 
             dictionary_[file_id] = initialised_file;

+ 1 - 1
src/DatSubsystems/DatPatcher.cpp

@@ -54,7 +54,7 @@ namespace LOTRO_DAT {
         else
             file->category = 1;
 
-        auto getdata_operation = dat->GetFileSystem().GetFileData(file_id, 0);
+        auto getdata_operation = dat->GetFileSystem().GetFileData(*file, 0);
 
         if (getdata_operation.result == ERROR) {
             if (single_file)