Bläddra i källkod

Refactoring. BinaryData::FromNumber and FromNumberRAW are now static functions

Ivan Arkhipov 6 år sedan
förälder
incheckning
bf12032247

+ 2 - 2
include/BinaryData.h

@@ -36,10 +36,10 @@ namespace LOTRO_DAT
         long long ToNumberRAW(const long long &pos) const;
 
         template <int T>
-        void FromNumber(const long long &number);
+        static BinaryData FromNumber(const long long &number);
 
         template <int T>
-        void FromNumberRAW(const long long &number);
+        static BinaryData FromNumberRAW(const long long &number);
 
         size_t size() const;
         unsigned char* data() const;

BIN
lib/libLotroDat.dll.a


BIN
lib/libLotroDat_static.a


+ 19 - 22
src/BinaryData.cpp

@@ -94,36 +94,33 @@ namespace LOTRO_DAT {
 
     // Makes data from specified T bytes of number in Little Endian encoding
     template<int T>
-    void BinaryData::FromNumber(const long long &number) {
+    BinaryData BinaryData::FromNumber(const long long &number) {
         if (T < 0)
             throw DatException("Bad BinaryData::FromNumber() - trying to make data from amount of bytes < 0");
+        BinaryData data(T);
         try {
-            delete[] data_;
-
-            size_ = size_t(T);
-            data_ = new unsigned char[size_];
-
-            for (size_t i = 0; i < size_; i++)
-            {
-                data_[i] = (unsigned char)((number >> (8 * i)) & 0xFF);
-            }
-
+            for (size_t i = 0; i < T; i++)
+                data.data_[i] = (unsigned char)((number >> (8 * i)) & 0xFF);
         } catch (...) {
             throw DatException("Bad BinaryData::ToNumber(). Error in using template function", DATA_EXCEPTION);
         }
+        return data;
     }
 
     // Makes data from specified T bytes of number in raw
     template<int T>
-    void BinaryData::FromNumberRAW(const long long &number) {
+    BinaryData BinaryData::FromNumberRAW(const long long &number) {
         if (T <= 0)
             throw DatException("Bad BinaryData::FromNumber() - trying to make data from amount of bytes <= 0");
+
+        BinaryData data = FromNumber<T>(number);
+
         try {
-            FromNumber<T>(number);
-            std::reverse(data_, data_ + size());
+            std::reverse(data.data_, data.data_ + data.size());
         } catch (...) {
             throw DatException("Bad BinaryData::ToNumber(). Error in using template function", DATA_EXCEPTION);
         }
+        return data;
     }
 
     BinaryData &BinaryData::operator=(const BinaryData &data) {
@@ -261,19 +258,19 @@ namespace LOTRO_DAT {
     template long long BinaryData::ToNumber<4>(long long const&) const;
     template long long BinaryData::ToNumber<8>(long long const&) const;
 
-    template void BinaryData::FromNumber<1>(const long long &);
-    template void BinaryData::FromNumber<2>(const long long &);
-    template void BinaryData::FromNumber<4>(const long long &);
-    template void BinaryData::FromNumber<8>(const long long &);
+    template BinaryData BinaryData::FromNumber<1>(const long long &);
+    template BinaryData BinaryData::FromNumber<2>(const long long &);
+    template BinaryData BinaryData::FromNumber<4>(const long long &);
+    template BinaryData BinaryData::FromNumber<8>(const long long &);
 
     template long long BinaryData::ToNumberRAW<1>(long long const&) const;
     template long long BinaryData::ToNumberRAW<2>(long long const&) const;
     template long long BinaryData::ToNumberRAW<4>(long long const&) const;
     template long long BinaryData::ToNumberRAW<8>(long long const&) const;
 
-    template void BinaryData::FromNumberRAW<1>(const long long &);
-    template void BinaryData::FromNumberRAW<2>(const long long &);
-    template void BinaryData::FromNumberRAW<4>(const long long &);
-    template void BinaryData::FromNumberRAW<8>(const long long &);
+    template BinaryData BinaryData::FromNumberRAW<1>(const long long &);
+    template BinaryData BinaryData::FromNumberRAW<2>(const long long &);
+    template BinaryData BinaryData::FromNumberRAW<4>(const long long &);
+    template BinaryData BinaryData::FromNumberRAW<8>(const long long &);
 }
 }

+ 19 - 35
src/DatFile.cpp

@@ -494,7 +494,7 @@ namespace LOTRO_DAT {
         }
 
         BinaryData fragments_count(4);
-        fragments_count.FromNumber<4>(0);
+        fragments_count = BinaryData::FromNumber<4>(0);
 
         BinaryData file_data = fragments_count + data.CutData(4);
 
@@ -526,28 +526,13 @@ namespace LOTRO_DAT {
     }
 
     void DatFile::UpdateHeader() {
-        BinaryData data(4);
-
-        data.FromNumber<4>(constant1_);
-        WriteData(data, 4, 0x100);
-
-        data.FromNumber<4>(constant2_);
-        WriteData(data, 4, 0x140);
-
-        data.FromNumber<4>(file_size_);
-        WriteData(data, 4, 0x148);
-
-        data.FromNumber<4>(version1_);
-        WriteData(data, 4, 0x14C);
-
-        data.FromNumber<4>(version2_);
-        WriteData(data, 4, 0x150);
-
-        data.FromNumber<4>(fragmentation_journal_offset_);
-        WriteData(data, 4, 0x154);
-
-        data.FromNumber<4>(root_directory_offset_);
-        WriteData(data, 4, 0x160);
+        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>(version1_), 4, 0x14C);
+        WriteData(BinaryData::FromNumber<4>(version2_), 4, 0x150);
+        WriteData(BinaryData::FromNumber<4>(fragmentation_journal_offset_), 4, 0x154);
+        WriteData(BinaryData::FromNumber<4>(root_directory_offset_), 4, 0x160);
     }
 
     void DatFile::UpdateFragmentationJournal(const std::vector<std::pair<long long, long long> > &journal) {
@@ -555,12 +540,8 @@ namespace LOTRO_DAT {
             long long size = journal[i].first;
             long long offset = journal[i].second;
 
-            BinaryData data(4);
-            data.FromNumber<4>(size);
-            WriteData(data, 4, fragmentation_journal_offset_ + 8 * (i + 1));
-
-            data.FromNumber<4>(offset);
-            WriteData(data, 4, fragmentation_journal_offset_ + 8 * (i + 1) + 4);
+            WriteData(BinaryData::FromNumber<4>(size), 4, fragmentation_journal_offset_ + 8 * (i + 1));
+            WriteData(BinaryData::FromNumber<4>(offset), 4, fragmentation_journal_offset_ + 8 * (i + 1) + 4);
         }
     }
 
@@ -663,16 +644,19 @@ namespace LOTRO_DAT {
             if (dictionary_[file.first]->MakeHeaderData().CutData(8, 16) == file.second->MakeHeaderData().CutData(8, 16))
                 continue;
 
-            dictionary_[file.first]->file_offset_ = file.second->file_offset_;
-            dictionary_[file.first]->file_size_ = file.second->file_size_;
-            dictionary_[file.first]->block_size_= file.second->block_size_;
-            dictionary_[file.first]->timestamp_ = file.second->timestamp_;
-            dictionary_[file.first]->version_ = file.second->version_;
+            long long file_id = file.first;
+            Subfile* new_file = file.second;
+
+            dictionary_[file_id]->file_offset_ = new_file->file_offset_;
+            dictionary_[file_id]->file_size_ = new_file->file_size_;
+            dictionary_[file_id]->block_size_= new_file->block_size_;
+            dictionary_[file_id]->timestamp_ = new_file->timestamp_;
+            dictionary_[file_id]->version_ = new_file->version_;
 
-            dictionary_[file.first] = file.second;
             patched_list.insert(file.first);
             dat_state_ = UPDATED;
         }
+
         current_locale_ = locale;
         CommitChanges();
     }

+ 4 - 9
src/SubDirectory.cpp

@@ -128,16 +128,11 @@ namespace LOTRO_DAT {
                 BinaryData data(32);
                 dat_->ReadData(data, 32, subfiles_[i]->dictionary_offset());
 
-                BinaryData write_data(4);
+                auto subfile = dict[file_id];
 
-                write_data.FromNumber<4>(dict[file_id]->file_offset());
-                dat_->WriteData(write_data, 4, subfiles_[i]->dictionary_offset() + 12);
-
-                write_data.FromNumber<4>(dict[file_id]->file_size());
-                dat_->WriteData(write_data, 4, subfiles_[i]->dictionary_offset() + 16);
-
-                write_data.FromNumber<4>(dict[file_id]->block_size());
-                dat_->WriteData(write_data, 4, subfiles_[i]->dictionary_offset() + 28);
+                dat_->WriteData(BinaryData::FromNumber<4>(subfile->file_offset()), 4, subfiles_[i]->dictionary_offset() + 12);
+                dat_->WriteData(BinaryData::FromNumber<4>(subfile->file_size()), 4, subfiles_[i]->dictionary_offset() + 16);
+                dat_->WriteData(BinaryData::FromNumber<4>(subfile->block_size()), 4, subfiles_[i]->dictionary_offset() + 28);
             }
         }
 

+ 9 - 21
src/Subfile.cpp

@@ -20,6 +20,7 @@ namespace LOTRO_DAT {
 
     Subfile::Subfile(DatFile *dat, const BinaryData &header) {
         dat_ = dat;
+
         fragments_count_ = header.ToNumber<4>(0); // fragments_count
         unknown1_ = header.ToNumber<4>(4); // unknown1
         file_id_ = header.ToNumber<4>(8); // file_id
@@ -49,7 +50,6 @@ namespace LOTRO_DAT {
         return dictionary_offset_;
     }
 
-
     long long Subfile::fragments_count() const {
         return fragments_count_;
     }
@@ -125,26 +125,14 @@ namespace LOTRO_DAT {
     }
 
     BinaryData Subfile::MakeHeaderData() const {
-        BinaryData header;
-
-        BinaryData data(4);
-        data.FromNumber<4>(fragments_count_);
-        header = header + data;
-        data.FromNumber<4>(unknown1_);
-        header = header + data;
-        data.FromNumber<4>(file_id_);
-        header = header + data;
-        data.FromNumber<4>(file_offset_);
-        header = header + data;
-        data.FromNumber<4>(file_size_);
-        header = header + data;
-        data.FromNumber<4>(timestamp_);
-        header = header + data;
-        data.FromNumber<4>(version_);
-        header = header + data;
-        data.FromNumber<4>(block_size_);
-        header = header + data;
+        BinaryData header = BinaryData::FromNumber<4>(fragments_count_)
+                            + BinaryData::FromNumber<4>(unknown1_)
+                            + BinaryData::FromNumber<4>(file_id_)
+                            + BinaryData::FromNumber<4>(file_offset_)
+                            + BinaryData::FromNumber<4>(file_size_)
+                            + BinaryData::FromNumber<4>(timestamp_)
+                            + BinaryData::FromNumber<4>(version_)
+                            + BinaryData::FromNumber<4>(block_size_);
         return header;
     }
-
 };

+ 1 - 2
src/Subfiles/DdsSubfile.cpp

@@ -152,8 +152,7 @@ namespace LOTRO_DAT {
             return old_data.CutData(0, 4) +
                    (old_data.DecompressData(12).CutData(12, 16) + data.binary_data.CutData(128)).CompressData();
         else {
-            BinaryData file_size;
-            file_size.FromNumber<4>(data.binary_data.size() - 128);
+            BinaryData file_size = BinaryData::FromNumber<4>(data.binary_data.size() - 128);
             return old_data.CutData(0, 28) + file_size + data.binary_data.CutData(128);
         }
     }

+ 1 - 2
src/Subfiles/JpgSubfile.cpp

@@ -40,8 +40,7 @@ namespace LOTRO_DAT {
             !data.options["fid"] || data.options["fid"].as<long long>() != file_id()) {
             throw DatException("Bad DdsSubfile::MakeForImport() - invalid options data!", IMPORT_EXCEPTION);
         }
-        BinaryData file_size;
-        file_size.FromNumber<4>(data.binary_data.size());
+        BinaryData file_size = BinaryData::FromNumber<4>(data.binary_data.size());
         return old_data.CutData(0, 28) + file_size + data.binary_data;
     }
 };

+ 3 - 4
src/Subfiles/OggSubfile.cpp

@@ -40,10 +40,9 @@ namespace LOTRO_DAT {
             !data.options["fid"] || data.options["fid"].as<long long>() != file_id()) {
             throw DatException("Bad DdsSubfile::MakeForImport() - invalid options data!", IMPORT_EXCEPTION);
         }
-        BinaryData file_size;
-        file_size.FromNumber<4>(data.binary_data.size() - 8);
-        BinaryData file_id;
-        file_id.FromNumber<4>(this->file_id());
+        BinaryData file_size = BinaryData::FromNumber<4>(data.binary_data.size() - 8);
+        BinaryData file_id = BinaryData::FromNumber<4>(this->file_id());
+
         return old_data.CutData(0, 8) + file_id + file_size + data.binary_data;
     }
 };

+ 7 - 11
src/Subfiles/TextSubfile.cpp

@@ -332,22 +332,20 @@ namespace LOTRO_DAT {
 
         // Building BinaryData from pieces
         BinaryData result;
-        BinaryData temp_data(4);
-
-        temp_data.FromNumber<4>(pieces.size());
+        BinaryData temp_data = BinaryData::FromNumber<4>(pieces.size());
         result = result + temp_data;
 
         for (long long i = 0; i < pieces.size(); i++) {
             long long piece_size = pieces[i].length();
             if (piece_size < 128) {
-                temp_data.FromNumber<1>(piece_size);
+                temp_data = BinaryData::FromNumber<1>(piece_size);
             } else {
-                temp_data.FromNumberRAW<2>((piece_size | 32768));
+                temp_data = BinaryData::FromNumberRAW<2>((piece_size | 32768));
             }
             result = result + temp_data;
 
             for (long long j = 0; j < piece_size; j++) {
-                temp_data.FromNumber<2>(short(pieces[i][j]));
+                temp_data = BinaryData::FromNumber<2>(short(pieces[i][j]));
                 result = result + temp_data;
             }
         }
@@ -361,8 +359,7 @@ namespace LOTRO_DAT {
 
         // If there are no args - making 4 null-bytes and return;
         if (!new_data.options["args"]) {
-            BinaryData result;
-            result.FromNumber<4>(0);
+            BinaryData result = BinaryData::FromNumber<4>(0);
             return result;
         }
 
@@ -382,11 +379,10 @@ namespace LOTRO_DAT {
         arguments.push_back(std::stoll(argument));
 
         BinaryData result;
-        BinaryData temp_data(4);
-        temp_data.FromNumber<4>(arguments.size());
+        BinaryData temp_data = BinaryData::FromNumber<4>(arguments.size());
         result = result + temp_data;
         for (auto arg_reference : arguments) {
-            temp_data.FromNumber<4>(arg_reference);
+            temp_data = BinaryData::FromNumber<4>(arg_reference);
             result = result + temp_data;
         }
         return result;