Browse Source

Fixed bugs with incorrect writing .dat file header and incorrect locale change

Ivan Arkhipov 7 years ago
parent
commit
81970c1e31

+ 1 - 2
include/DatFile.h

@@ -72,7 +72,7 @@ namespace LOTRO_DAT {
     public:
         DatFile();
 
-        void InitDatFile(const char *filename, int dat_id);
+        void InitDatFile(const std::string &filename, int dat_id);
 
         DAT_STATE DatFileState() const;
 
@@ -152,7 +152,6 @@ namespace LOTRO_DAT {
 
     private:
         LOCALE current_locale_;
-        FILE* db_blocker_;
 
         std::string filename_;
 

BIN
lib/libLotroDat.dll.a


BIN
lib/libLotroDat_static.a


+ 15 - 9
src/DatFile.cpp

@@ -16,17 +16,19 @@
 extern "C++"
 {
 namespace LOTRO_DAT {
-    DatFile::DatFile() : dat_state_(CLOSED) {}
+    DatFile::DatFile() : dat_state_(CLOSED), root_directory_(nullptr), file_handler_(nullptr) {}
 
-    void DatFile::InitDatFile(const char *filename, int dat_id) {
+    void DatFile::InitDatFile(const std::string &filename, int dat_id) {
         if (dat_state_ != CLOSED)
             CloseDatFile();
 
         dat_id_ = dat_id;
         dat_state_ = CLOSED;
+        root_directory_ = nullptr;
 
-        filename_ = std::string(filename);
-        OpenDatFile(filename);
+        filename_ = filename;
+
+        OpenDatFile(filename.c_str());
         ReadSuperBlock();
         MakeDirectories();
 
@@ -38,10 +40,10 @@ namespace LOTRO_DAT {
             return;
         }
 
-        InitLocale(PATCHED, (std::string(filename) + std::string("patched.dbgm")).c_str());
-        InitLocale(ORIGINAL,(std::string(filename) + std::string("original.dbgm")).c_str());
+        InitLocale(PATCHED, (filename + "patched.dbgm").c_str());
+        InitLocale(ORIGINAL,(filename + "original.dbgm").c_str());
 
-        FILE *locale = fopen((std::string(filename) + ".dbgm").c_str(), "r");
+        FILE *locale = fopen((filename + ".dbgm").c_str(), "r");
         if (locale == nullptr)
             current_locale_ = ORIGINAL;
         else {
@@ -528,7 +530,7 @@ namespace LOTRO_DAT {
     void DatFile::UpdateHeader() {
         WriteData(BinaryData::FromNumber<4>(constant1_), 4, 0x100);
         WriteData(BinaryData::FromNumber<4>(constant2_), 4, 0x140);
-        WriteData(BinaryData::FromNumber<4>(constant2_), 4, 0x148);
+        WriteData(BinaryData::FromNumber<4>(file_size_), 4, 0x148);
         WriteData(BinaryData::FromNumber<4>(version1_), 4, 0x14C);
         WriteData(BinaryData::FromNumber<4>(version2_), 4, 0x150);
         WriteData(BinaryData::FromNumber<4>(fragmentation_journal_offset_), 4, 0x154);
@@ -565,9 +567,10 @@ namespace LOTRO_DAT {
         UpdateSubdirectories();
         std::cout << "Updated subdirectories..." << std::endl << std::flush;
         std::cout << "Changed " << patched_list.size() << " files..." << std::endl << std::flush;
-        patched_list.clear();
         std::cout << "Updating locales..." << std::endl;
         CommitLocales();
+        std::cout << "Done!" << std::endl;
+        patched_list.clear();
         dat_state_ = READY;
     }
 
@@ -582,9 +585,11 @@ namespace LOTRO_DAT {
         if (file_handler_ != nullptr)
             fclose(file_handler_);
         delete file_handler_;
+
         delete root_directory_;
         dat_state_ = CLOSED;
     }
+
     // LOCALE MANAGING SECTION
 
     void DatFile::InitLocale(LOCALE locale, const char* filename) {
@@ -599,6 +604,7 @@ namespace LOTRO_DAT {
                     (*dict)[file.first] = new Subfile(this, file.second->MakeHeaderData());
                 }
             }
+            fprintf(stderr, "WARNING!!! DatFile::InitLocale() - cannot open .dat locale file %s\n", filename);
             return;
         }
 

+ 1 - 1
src/Examples/extractor_example.cpp

@@ -59,7 +59,7 @@ int main() {
     try {
         std::cout << "Starting search...\n" << std::flush;
         DatFile a;
-        a.InitDatFile((path + filename).c_str(), 0);
+        a.InitDatFile(path + filename, 0);
         std::cout << "Total files found: " << a.files_number() << std::endl << std::flush;
         a.WriteUnorderedDictionary(output_dir);
         std::cout << "Beginning unpacking... Please, wait for some minutes."

+ 4 - 2
src/Examples/patcher_example.cpp

@@ -36,9 +36,11 @@ int main() {
             try {
                 std::cout << "Using .dat file from dat_file_path.txt...\n";
                 std::cout << "Opening file " << filename << std::endl;
-                file.InitDatFile(filename.c_str(), 0);
+                file.InitDatFile(filename, 0);
             } catch (DatException &e) {
-                std::cout << "Dat file path from dat_file_path.txt - " << filename << " may be incorrect (cannot open DatFile there)\n";
+                std::cout << "Dat file path from dat_file_path.txt - " << filename << " may be incorrect (cannot open "
+                        "DatFile due to error. See it in errors.log)\n";
+                file.CloseDatFile();
             }
         }