Browse Source

Minor DatStatus fixes, changed FILE_TYPE structure

Now extract and functions support multiple types via &
ex: FONT & TEXT
Ivan Arkhipov 5 years ago
parent
commit
cce73781cc

+ 7 - 7
include/DatFile.h

@@ -26,13 +26,13 @@ extern "C++"
 {
 namespace LOTRO_DAT {
     enum FILE_TYPE : int {
-        TEXT = 0,
-        JPG = 1,
-        DDS = 2,
-        WAV = 3,
-        OGG = 4,
-        FONT = 5,
-        UNKNOWN = 6
+        TEXT = 1,
+        JPG = 2,
+        DDS = 4,
+        WAV = 8,
+        OGG = 16,
+        FONT = 32,
+        UNKNOWN = 64
     };
 
     class DatFile {

+ 1 - 0
include/DatSubsystems/DatStatus.h

@@ -27,6 +27,7 @@ namespace LOTRO_DAT {
             E_BACKUP_CREATING,
             E_BACKUP_RESTORING,
             E_BACKUP_REMOVING,
+            E_GATHERING_INFO,
             E_FREE
         };
 

+ 27 - 7
src/DatFile.cpp

@@ -92,6 +92,8 @@ namespace LOTRO_DAT {
     }
 
     DatOperationResult<> DatFile::Initialise(const std::string &filename, long long dat_id) {
+        status_->SetStatus(DatStatus::E_INITIALISING);
+
         dat_id_ = dat_id;
 
         if (initialized_ && io_->GetFilename().result == SUCCESS && io_->GetFilename().value == filename)
@@ -99,18 +101,25 @@ namespace LOTRO_DAT {
 
 
         auto operation = io_->Init(filename);
-        if (operation.result != SUCCESS)
+        if (operation.result != SUCCESS) {
+            status_->ClearAll();
             return DatOperationResult<>(ERROR, "DATINIT: Error, cannot initialize dat");
+        }
 
         operation = fileSystem_->Init();
-        if (operation.result != SUCCESS)
+        if (operation.result != SUCCESS) {
+            status_->ClearAll();
             return DatOperationResult<>(ERROR, "DATINIT: Error, cannot initialize dat");
+        }
 
         operation = localeManager_->Init();
-        if (operation.result != SUCCESS)
+        if (operation.result != SUCCESS) {
+            status_->ClearAll();
             return DatOperationResult<>(ERROR, "DATINIT: Error, cannot initialize dat");
+        }
 
         initialized_ = true;
+        status_->ClearAll();
         return DatOperationResult<>();
     }
 
@@ -119,6 +128,8 @@ namespace LOTRO_DAT {
         if (!out)
             return DatOperationResult<>(ERROR, "GATHERDATINFO: Cannot open file " + output_filename);
 
+        status_->SetStatus(DatStatus::E_GATHERING_INFO);
+
         fprintf(out, "########################################################################################\n"
                      "# LOTRO Dat library version: %8s                                                  #\n"
                      "# Author: Gi1dor (e1.gildor@gmail.com)                                                 #\n"
@@ -132,6 +143,7 @@ namespace LOTRO_DAT {
         localeManager_->PrintInformaion(out);
 
         fclose(out);
+        status_->ClearAll();
         return DatOperationResult<>(SUCCESS);
     }
 
@@ -139,20 +151,28 @@ namespace LOTRO_DAT {
         if (!initialized_)
             return DatOperationResult<>();
 
+        status_->SetStatus(DatStatus::E_COMMITING);
+
         auto operation = localeManager_->DeInit();
-        if (operation.result != SUCCESS)
+        if (operation.result != SUCCESS) {
+            status_->ClearAll();
             return DatOperationResult<>(ERROR, "DATDEINIT: Error, cannot deinitialize. msg: " + operation.msg);
+        }
 
         operation = fileSystem_->DeInit();
-        if (operation.result != SUCCESS)
+        if (operation.result != SUCCESS) {
+            status_->ClearAll();
             return DatOperationResult<>(ERROR, "DATDEINIT: Error, cannot deinitialize. msg: " + operation.msg);
+        }
 
         operation = io_->DeInit();
-        if (operation.result != SUCCESS)
+        if (operation.result != SUCCESS) {
+            status_->ClearAll();
             return DatOperationResult<>(ERROR, "DATDEINIT: Error, cannot deinitialize. msg: " + operation.msg);
+        }
 
         initialized_ = false;
-
+        status_->ClearAll();
         return DatOperationResult<>();
     }
 

+ 3 - 2
src/DatSubsystems/DatExporter.cpp

@@ -35,8 +35,9 @@ namespace LOTRO_DAT {
         auto operation = dat->GetFileSystem().PerformOperationOnAllFiles([&iterated_files, &success_exported, this, type, &output_directory_path](std::shared_ptr<SubFile>& file) -> void {
             iterated_files++;
             dat->GetStatusModule().SetPercentage(iterated_files * 100u / dat->GetFileSystem().GetInitialisedFilesNumber());
-            if (file->FileType() != type)
+            if ((file->FileType() & type) == 0)
                 return;
+
             SubfileData export_file = file->PrepareForExport(dat->GetFileSystem().GetFileData(file->file_id(), 8).value);
             dat->GetStatusModule().SetDebugMessage("Extracting file " + std::to_string(file->file_id()) + " (Files by type -> directory)");
 
@@ -130,7 +131,7 @@ namespace LOTRO_DAT {
             iterated_files++;
             dat->GetStatusModule().SetPercentage(iterated_files * 100u / dat->GetFileSystem().GetInitialisedFilesNumber());
 
-            if (file->FileType() != type)
+            if ((file->FileType() & type) == 0)
                 return;
 
             dat->GetStatusModule().SetDebugMessage("Extracting file " + std::to_string(file->file_id()) + " (Files by type -> directory)");

+ 2 - 11
src/DatSubsystems/DatLocaleManager.cpp

@@ -222,10 +222,6 @@ namespace LOTRO_DAT {
      */
 
     DatOperationResult<> DatLocaleManager::DeInit() {
-        dat->GetStatusModule().SetStatus(DatStatus::E_COMMITING);
-        dat->GetStatusModule().SetDebugMessage("Unitinialising... (LocaleManager)");
-
-
         LOG(INFO) << "Committing locales...";
         if (!dat)
             return DatOperationResult<>(ERROR, "LOCALEDEINIT: no connection with Dat (dat is nullptr)");
@@ -292,10 +288,8 @@ namespace LOTRO_DAT {
             binary_data.Append(BinaryData::FromNumber<4>(dat->GetIO().file_size + binary_data.size() + 20 * 1024 * 1024), 8);
 
             auto operation = dat->GetIO().WriteData(binary_data, binary_data.size(), new_dict_offset);
-            if (operation.result != SUCCESS) {
-                dat->GetStatusModule().ClearAll();
+            if (operation.result != SUCCESS)
                 return DatOperationResult<>(ERROR, "LOCALEDEINIT: Cannot write locales");
-            }
 
             dat->GetIO().WriteData(BinaryData::FromNumber<4>(new_dict_offset), 4, 300);
             dat->GetIO().WriteData(BinaryData::FromNumber<4>(current_locale_), 4, 296);
@@ -314,16 +308,13 @@ namespace LOTRO_DAT {
             dat->GetIO().WriteData(BinaryData::FromNumber<4>(current_locale_), 4, 296, 0);
             auto operation = dat->GetIO().WriteData(binary_data, binary_data.size(), dict_offset);
 
-            if (operation.result != SUCCESS) {
-                dat->GetStatusModule().ClearAll();
+            if (operation.result != SUCCESS)
                 return DatOperationResult<>(ERROR, "LOCALEDEINIT: Cannot write locales. ERRMSG: " + operation.msg);
-            }
         }
 
         LOG(INFO) << "Locales commited successfully";
 
 
-        dat->GetStatusModule().ClearAll();
         return DatOperationResult<>(SUCCESS);
     }