Преглед на файлове

Minor fixes and improvements

Ivan Arkhipov преди 6 години
родител
ревизия
d8eb0a4bee
променени са 6 файла, в които са добавени 72 реда и са изтрити 57 реда
  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. 41 32
      src/DatFile.cpp
  6. 31 25
      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


+ 41 - 32
src/DatFile.cpp

@@ -39,7 +39,7 @@ namespace LOTRO_DAT {
         defaultConf.setGlobally(el::ConfigurationType::MaxLogFileSize, "5242880"); // 5MB
         defaultConf.setGlobally(el::ConfigurationType::LogFlushThreshold, "1"); // Flush after every one log
 
-        defaultConf.set(el::Level::Debug, el::ConfigurationType::Enabled, "true");
+        defaultConf.set(el::Level::Debug, el::ConfigurationType::Enabled, "false");
         defaultConf.set(el::Level::Debug, el::ConfigurationType::Filename, "dat_library_debug.log");
 
         el::Loggers::reconfigureAllLoggers(defaultConf);
@@ -48,7 +48,7 @@ namespace LOTRO_DAT {
     }
 
     DAT_RESULT DatFile::InitDatFile(const std::string &filename, int dat_id) {
-        LOG(INFO) << "Started initialisation of DatFile " << filename;
+        LOG(DEBUG) << "Started initialisation of DatFile " << filename;
         if (dat_state_ != CLOSED && filename == filename_) {
             LOG(DEBUG) << "Trying to reopen the same file: " << filename << ". Doing nothing.";
             return SUCCESS;
@@ -397,38 +397,44 @@ namespace LOTRO_DAT {
     // TODO: ASSERTS
     BinaryData DatFile::GetFileData(const Subfile *file, long long int offset) {
         LOG(DEBUG) << "Getting file " << file->file_id() << " data";
-        BinaryData mfile_id(20);
-        ReadData(mfile_id, 20, file->file_offset() + 8);
-        if (!mfile_id.CheckCompression() && file->file_id() != mfile_id.ToNumber<4>(0))
-            throw DatException("Bad DatFile::GetFileData() - file_id in Subfile doesn't match to file_id in DatFile.", READ_EXCEPTION);
-
-        BinaryData data((unsigned)(file->file_size() + (8 - offset)));
-        if (file->block_size() >= file->file_size() + 8) {
-            ReadData(data, file->file_size() + (8 - offset), file->file_offset() + offset);
-            return data;
-        }
+        try {
+            BinaryData mfile_id(20);
+            ReadData(mfile_id, 20, file->file_offset() + 8);
 
-        BinaryData fragments_count(4);
-        ReadData(fragments_count, 4, file->file_offset());
+            if (!mfile_id.CheckCompression() && file->file_id() != mfile_id.ToNumber<4>(0))
+                throw DatException("Bad DatFile::GetFileData() - file_id in Subfile doesn't match to file_id in DatFile.", READ_EXCEPTION);
+
+            BinaryData data((unsigned)(file->file_size() + (8 - offset)));
+            if (file->block_size() >= file->file_size() + 8) {
+                ReadData(data, file->file_size() + (8 - offset), file->file_offset() + offset);
+                return data;
+            }
+
+            BinaryData fragments_count(4);
+            ReadData(fragments_count, 4, file->file_offset());
 
-        long long fragments_number = fragments_count.ToNumber<4>(0);
+            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;
 
-        ReadData(data, current_block_size , file->file_offset() + offset);
+            ReadData(data, current_block_size , file->file_offset() + offset);
 
-        BinaryData FragmentsDictionary(8 * unsigned(fragments_number));
-        ReadData(FragmentsDictionary, 8 * unsigned(fragments_number), file->file_offset() + file->block_size() - 8 * fragments_number);
+            BinaryData FragmentsDictionary(8 * unsigned(fragments_number));
+            ReadData(FragmentsDictionary, 8 * unsigned(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);
-            ReadData(data, std::min(fragment_size, file->file_size() - current_block_size), fragment_offset, current_block_size );
-            current_block_size += fragment_size;
+            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);
+                ReadData(data, std::min(fragment_size, file->file_size() - current_block_size), fragment_offset, current_block_size );
+                current_block_size += fragment_size;
+            }
+            LOG(DEBUG) << "Successfully got file " << file->file_id() << " data";
+            return data;
+        } catch (std::exception &e) {
+            LOG(ERROR) << "Caught " << e.what() << "exception";
         }
-        LOG(DEBUG) << "Successfully got file " << file->file_id() << " data";
-        return data;
+        return BinaryData(0);
     }
 
     /// DatFile special functions for opening and reading/writing raw data.
@@ -440,7 +446,7 @@ namespace LOTRO_DAT {
             CloseDatFile();
         }
 
-        fopen_s(&file_handler_, dat_name, "r+b");
+        file_handler_ = fopen(dat_name, "r+b");
 
         if (file_handler_ == nullptr) {
             LOG(ERROR) << "Unable to open file " << dat_name;
@@ -527,17 +533,17 @@ namespace LOTRO_DAT {
     DAT_RESULT DatFile::ReadData(BinaryData &data, long long size, long long offset, long long data_offset) {
         if (dat_state_ == CLOSED) {
             LOG(ERROR) << "Dat state is CLOSED. Cannot read data.";
-            return INCORRECT_STATE_ERROR;
+            throw DatException("", READ_EXCEPTION);
         }
 
         if (data_offset + size > data.size()) {
             LOG(ERROR) << "Trying to read more than BinaryData size: Reading " << size << " bytes from " << offset << " position.";
-            return DAT_READ_ERROR;
+            throw DatException("", READ_EXCEPTION);
         }
 
         if (offset + size > file_size_) {
             LOG(ERROR) << "Trying to read more than DatFile size elapsed: Reading " << size << " bytes from " << offset << " position.";
-            return DAT_READ_ERROR;
+            throw DatException("", READ_EXCEPTION);
         }
 
         fseek(file_handler_, offset, SEEK_SET);
@@ -656,8 +662,12 @@ namespace LOTRO_DAT {
     std::vector<std::pair<long long, long long> > DatFile::GetFragmentationJournal() {
         LOG(DEBUG) << "Getting fragmentation journal";
         BinaryData data(8);
-        ReadData(data, 8, fragmentation_journal_offset_ + 8);
+        DAT_RESULT res = ReadData(data, 8, fragmentation_journal_offset_ + 8);
         std::vector<std::pair<long long, long long> > result;
+        if (res != SUCCESS) {
+            LOG(ERROR) << "Error " << res << " while reading data";
+            return result;
+        }
         result.emplace_back(std::make_pair(data.ToNumber<4>(0), data.ToNumber<4>(4)));
         LOG(DEBUG) << "Finished getting fragmentation journal";
         return result;
@@ -730,7 +740,6 @@ namespace LOTRO_DAT {
 
         if (file_handler_ != nullptr)
             fclose(file_handler_);
-        delete file_handler_;
 
         delete root_directory_;
 

+ 31 - 25
src/SubDirectory.cpp

@@ -81,32 +81,38 @@ namespace LOTRO_DAT {
     }
 
     void SubDirectory::MakeSubFiles() {
-        BinaryData data(2048);
-        dat_->ReadData(data, 64 * 32, offset_ + 63 * 8);
-
-        for (unsigned int i = 0; i < 61 * 32; i += 32) {
-            if (data.ToNumber<4>(i + 8) < 0x32 || data.ToNumber<4>(i + 12) < 0x32)
-                continue;
-
-            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)) {
-                continue;
+        try {
+            BinaryData data(2048);
+            dat_->ReadData(data, 64 * 32, offset_ + 63 * 8);
+
+            for (unsigned int i = 0; i < 61 * 32; i += 32) {
+                if (data.ToNumber<4>(i + 8) < 0x32 || data.ToNumber<4>(i + 12) < 0x32)
+                    continue;
+
+                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)) {
+                    continue;
+                }
+
+                subfiles_.push_back(
+                        MakeSubfile(
+                                offset_ + 63 * 8 + i,
+                                data.ToNumber<4>(i), // fragments_count
+                                data.ToNumber<4>(i + 4), // unknown1
+                                data.ToNumber<4>(i + 8), // file_id
+                                data.ToNumber<4>(i + 12), // file_offset
+                                data.ToNumber<4>(i + 16), // block_size
+                                data.ToNumber<4>(i + 20), // timestamp
+                                data.ToNumber<4>(i + 24), // version
+                                data.ToNumber<4>(i + 28) // block_size
+                        )
+                );
             }
-
-            subfiles_.push_back(
-                    MakeSubfile(
-                            offset_ + 63 * 8 + i,
-                            data.ToNumber<4>(i), // fragments_count
-                            data.ToNumber<4>(i + 4), // unknown1
-                            data.ToNumber<4>(i + 8), // file_id
-                            data.ToNumber<4>(i + 12), // file_offset
-                            data.ToNumber<4>(i + 16), // block_size
-                            data.ToNumber<4>(i + 20), // timestamp
-                            data.ToNumber<4>(i + 24), // version
-                            data.ToNumber<4>(i + 28) // block_size
-                    )
-            );
+        } catch (std::exception &e) {
+            LOG(ERROR) << "Caught exception " << e.what();
+            subdirs_.clear();
+            subfiles_.clear();
         }
     }