|
@@ -14,18 +14,29 @@ namespace LOTRO_DAT {
|
|
* Обновление файла. Записывает данные файла в dat контейнер, используя информацию в SubfileData. Если ранее файл не существовал - он не будет создан (вернёт ошибку).
|
|
* Обновление файла. Записывает данные файла в dat контейнер, используя информацию в SubfileData. Если ранее файл не существовал - он не будет создан (вернёт ошибку).
|
|
* \warning В процессе применения локаль будет автоматически переключена в положение PATCHED
|
|
* \warning В процессе применения локаль будет автоматически переключена в положение PATCHED
|
|
* \param[in] data Новые данные файла
|
|
* \param[in] data Новые данные файла
|
|
|
|
+ * \param[in] single_file Флаг, который означает, что применяемый патч состоит из одного файла.
|
|
|
|
+ * Если true, то функция будет управлять состоянием DatStatus и обновлять его.
|
|
|
|
+ * Иначе эта обязанность делегируется вызывающей функции
|
|
*/
|
|
*/
|
|
|
|
|
|
- DatOperationResult<> DatPatcher::PatchFile(const SubfileData &data) {
|
|
|
|
|
|
+ DatOperationResult<> DatPatcher::PatchFile(const SubfileData &data, bool single_file) {
|
|
auto file_id = data.options["fid"].as<long long>();
|
|
auto file_id = data.options["fid"].as<long long>();
|
|
|
|
|
|
- dat->GetStatusModule().UpdateStatusText("Применение патча");
|
|
|
|
- dat->GetStatusModule().UpdateAdditionalMessage("Применение файла " + std::to_string(file_id));
|
|
|
|
|
|
+ if (single_file) {
|
|
|
|
+ dat->GetStatusModule().SetStatus(DatStatus::E_PATCHING);
|
|
|
|
+ dat->GetStatusModule().SetPercentage(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dat->GetStatusModule().SetDebugMessage("Patching file with id " + std::to_string(file_id));
|
|
|
|
|
|
auto getfile_operation = dat->GetFileSystem().GetFile(file_id);
|
|
auto getfile_operation = dat->GetFileSystem().GetFile(file_id);
|
|
- if (getfile_operation.result == ERROR)
|
|
|
|
|
|
+ if (getfile_operation.result == ERROR) {
|
|
|
|
+ if (single_file)
|
|
|
|
+ dat->GetStatusModule().ClearAll();
|
|
|
|
+
|
|
return DatOperationResult<>(ERROR,
|
|
return DatOperationResult<>(ERROR,
|
|
"PATCHSUBFILEDATA: Unable to find file with id " + std::to_string(file_id));
|
|
"PATCHSUBFILEDATA: Unable to find file with id " + std::to_string(file_id));
|
|
|
|
+ }
|
|
|
|
|
|
auto &file = getfile_operation.value;
|
|
auto &file = getfile_operation.value;
|
|
|
|
|
|
@@ -44,20 +55,28 @@ namespace LOTRO_DAT {
|
|
file->category = 1;
|
|
file->category = 1;
|
|
|
|
|
|
auto getdata_operation = dat->GetFileSystem().GetFileData(file_id, 0);
|
|
auto getdata_operation = dat->GetFileSystem().GetFileData(file_id, 0);
|
|
- if (getdata_operation.result == ERROR)
|
|
|
|
|
|
+
|
|
|
|
+ if (getdata_operation.result == ERROR) {
|
|
|
|
+ if (single_file)
|
|
|
|
+ dat->GetStatusModule().ClearAll();
|
|
|
|
+
|
|
return DatOperationResult<>(ERROR,
|
|
return DatOperationResult<>(ERROR,
|
|
"PATCHSUBFILEDATA: can't get file data for id = " + std::to_string(file_id));
|
|
"PATCHSUBFILEDATA: can't get file data for id = " + std::to_string(file_id));
|
|
|
|
+ }
|
|
|
|
+
|
|
auto &file_data = getdata_operation.value;
|
|
auto &file_data = getdata_operation.value;
|
|
|
|
|
|
BinaryData patch_data = file->MakeForImport(file_data, data);
|
|
BinaryData patch_data = file->MakeForImport(file_data, data);
|
|
|
|
|
|
auto result = ApplyFilePatch(file, patch_data);
|
|
auto result = ApplyFilePatch(file, patch_data);
|
|
|
|
+
|
|
|
|
+ if (single_file)
|
|
|
|
+ dat->GetStatusModule().ClearAll();
|
|
|
|
+
|
|
if (result.result == ERROR)
|
|
if (result.result == ERROR)
|
|
return DatOperationResult<>(ERROR,
|
|
return DatOperationResult<>(ERROR,
|
|
"PATCHSUBFILEDATA: applyfilepatch failed for id = " + std::to_string(file_id));
|
|
"PATCHSUBFILEDATA: applyfilepatch failed for id = " + std::to_string(file_id));
|
|
|
|
|
|
- dat->GetStatusModule().UpdateAdditionalMessage("Применение файла " + std::to_string(file_id) + " завершено");
|
|
|
|
-
|
|
|
|
return DatOperationResult<>(SUCCESS);
|
|
return DatOperationResult<>(SUCCESS);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -74,7 +93,9 @@ namespace LOTRO_DAT {
|
|
if (!db)
|
|
if (!db)
|
|
return DatOperationResult<int>(0, ERROR, "PATCHALLDATABASE: db is nullptr");
|
|
return DatOperationResult<int>(0, ERROR, "PATCHALLDATABASE: db is nullptr");
|
|
|
|
|
|
- dat->GetStatusModule().UpdateStatusText("Применение патча");
|
|
|
|
|
|
+ dat->GetStatusModule().SetStatus(DatStatus::E_PATCHING);
|
|
|
|
+ dat->GetStatusModule().SetPercentage(0);
|
|
|
|
+ dat->GetStatusModule().SetDebugMessage("Patching database...");
|
|
|
|
|
|
SubfileData data;
|
|
SubfileData data;
|
|
data = db->GetNextFile();
|
|
data = db->GetNextFile();
|
|
@@ -83,22 +104,19 @@ namespace LOTRO_DAT {
|
|
unsigned db_rows = db->CountRows();
|
|
unsigned db_rows = db->CountRows();
|
|
|
|
|
|
for (unsigned i = 0; i < db_rows; ++i) {
|
|
for (unsigned i = 0; i < db_rows; ++i) {
|
|
- auto operation = PatchFile(data);
|
|
|
|
|
|
+ auto operation = PatchFile(data, false);
|
|
if (operation.result == SUCCESS)
|
|
if (operation.result == SUCCESS)
|
|
successfully_patched++;
|
|
successfully_patched++;
|
|
|
|
|
|
- if (dat->GetStatusModule().GetPercentage() != i * 100 / db_rows)
|
|
|
|
- dat->GetStatusModule().UpdatePercentage(i * 100 / db_rows);
|
|
|
|
|
|
+ dat->GetStatusModule().SetPercentage(i * 100 / db_rows);
|
|
|
|
|
|
data = db->GetNextFile();
|
|
data = db->GetNextFile();
|
|
}
|
|
}
|
|
|
|
|
|
- dat->GetStatusModule().RemoveStatusText();
|
|
|
|
- dat->GetStatusModule().UpdateAdditionalMessage("Применение патча закончено. Успешно применено " +
|
|
|
|
- std::to_string(successfully_patched) + " из " +
|
|
|
|
- std::to_string(db_rows) + " файлов");
|
|
|
|
|
|
+ LOG(INFO) << "Database import success: patched " + std::to_string(successfully_patched) + " out of " +
|
|
|
|
+ std::to_string(db_rows) + " files";
|
|
|
|
|
|
- LOG(INFO) << "Successfully patched whole database";
|
|
|
|
|
|
+ dat->GetStatusModule().ClearAll();
|
|
return DatOperationResult<int>(successfully_patched, SUCCESS);
|
|
return DatOperationResult<int>(successfully_patched, SUCCESS);
|
|
}
|
|
}
|
|
|
|
|