|
@@ -39,7 +39,7 @@ namespace LOTRO_DAT {
|
|
|
defaultConf.setGlobally(el::ConfigurationType::MaxLogFileSize, "5242880");
|
|
|
defaultConf.setGlobally(el::ConfigurationType::LogFlushThreshold, "1");
|
|
|
|
|
|
- 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 {
|
|
|
|
|
|
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);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -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_;
|
|
|
|