فهرست منبع

Minor fix for correct writing BinaryData to file

Ivan Arkhipov 7 سال پیش
والد
کامیت
0ed10714d8
6فایلهای تغییر یافته به همراه10 افزوده شده و 7 حذف شده
  1. BIN
      bin/LotRO_dat_extractor.exe
  2. BIN
      bin/LotRO_dat_patcher.exe
  3. BIN
      lib/libLotroDat.dll.a
  4. BIN
      lib/libLotroDat_static.a
  5. 1 1
      src/BinaryData.cpp
  6. 9 6
      src/SubDirectory.cpp

BIN
bin/LotRO_dat_extractor.exe


BIN
bin/LotRO_dat_patcher.exe


BIN
lib/libLotroDat.dll.a


BIN
lib/libLotroDat_static.a


+ 1 - 1
src/BinaryData.cpp

@@ -151,7 +151,7 @@ namespace LOTRO_DAT {
 
     bool BinaryData::WriteToFile(const char *filename) const {
         FILE *f;
-        fopen_s(&f, filename, "wb");
+        f = fopen64(filename, "wb");
         if (f == nullptr) {
             throw DatException("Bad BinaryData::WriteToFile() - unable to open output file", EXPORT_EXCEPTION);
         }

+ 9 - 6
src/SubDirectory.cpp

@@ -35,7 +35,7 @@ namespace LOTRO_DAT {
             MakeSubDirectories();
         } catch (std::exception &e) {
             LOG(ERROR) << "Caught " << e.what() << " exception.";
-            LOG(DEBUG) << "Unable to initialize directory at offset " << offset << ". Initializing it as empty directory...";
+            LOG(WARNING) << "Unable to initialize directory at offset " << offset << ". Initializing it as empty directory...";
 
             subdirs_.clear();
             subfiles_.clear();
@@ -47,7 +47,7 @@ namespace LOTRO_DAT {
             MakeSubFiles();
         } catch (std::exception &e) {
             LOG(ERROR) << "Caught " << e.what() << " exception.";
-            LOG(DEBUG) << "Unable to initialize directory at offset " << offset << ". Initializing it as empty directory...";
+            LOG(WARNING) << "Unable to initialize directory at offset " << offset << ". Initializing it as empty directory...";
 
             subdirs_.clear();
             subfiles_.clear();
@@ -59,7 +59,7 @@ namespace LOTRO_DAT {
         BinaryData data(1024);
         dat_->ReadData(data, 63 * 8, offset_);
         if (data.ToNumber<4>(0) != 0 || data.ToNumber<4>(4) != 0) {
-            LOG(ERROR) << "first 8 bytes are not equal to 0 at offset " << offset_;
+            LOG(DEBUG) << "first 8 bytes are not equal to 0 at offset " << offset_;
             std::string err =
                     std::string("Bad SubDirectory::MakeSubDirectories - first 8 bytes are not equal to 0 at offset ")
                     + std::to_string(offset_);
@@ -72,7 +72,10 @@ namespace LOTRO_DAT {
 
             try {
                 SubDirectory *subdir = new SubDirectory(data.ToNumber<4>(i + 4), dat_);
-                subdirs_.push_back(subdir);
+                if (subdir->subfiles_.empty() && subdir->subdirs_.empty())
+                    LOG(WARNING) << "Cannot initialize sub-subdirectory. Dictionary offset = " << offset_ + i << ";";
+                else
+                    subdirs_.push_back(subdir);
             } catch (std::exception &e) {
                 LOG(ERROR) << "Caught " << e.what() << " exception.";
                 LOG(DEBUG) << "Making SubDirectory at offset " << data.ToNumber<4>(i + 4) << " failed, continuing";
@@ -91,8 +94,8 @@ namespace LOTRO_DAT {
 
                 BinaryData mfile_id(20);
                 dat_->ReadData(mfile_id, 20, data.ToNumber<4>(i + 12) + 8);
-                if (!mfile_id.CheckCompression() && data.ToNumber<4>(i + 8) != mfile_id.ToNumber<4>(0)) {
-                    LOG(DEBUG) << "File id in file doesn't match to file_id in dictionary";
+                if (mfile_id.Empty() || (!mfile_id.CheckCompression() && data.ToNumber<4>(i + 8) != mfile_id.ToNumber<4>(0))) {
+                    LOG(DEBUG) << "File id in file doesn't match to file_id in dictionary (offset = " << data.ToNumber<4>(i + 12) << ")";
                     continue;
                 }