123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #include <DatFile.h>
- #include <DatSubsystems/DatBackupManager.h>
- #include "DatSubsystems/DatBackupManager.h"
- #include "EasyLogging++/easylogging++.h"
- namespace LOTRO_DAT {
- DatBackupManager::DatBackupManager(DatFile *datFilePtr): dat(datFilePtr) {}
-
- bool DatBackupManager::CheckIfBackupAvailable(const std::string &backup_datname) {
- DatFile file;
- bool result = file.Initialise(backup_datname, 0).result == SUCCESS && file.Initialized();
- file.Deinitialize();
- return result;
- }
-
- DatOperationResult<> DatBackupManager::CreateBackup(const std::string &backup_datname) {
- FILE* file = fopen(backup_datname.c_str(), "w+b");
- if (!file)
- return DatOperationResult<>(ERROR, "CREATEBACKUP: cannot open file " + backup_datname);
- dat->GetStatusModule().SetStatus(DatStatus::E_BACKUP_CREATING);
- dat->GetStatusModule().SetDebugMessage("Creating backup " + backup_datname + " from " + dat->GetIO().GetFilename().value);
- auto operation = CopyDatFile(*dat, file);
- dat->GetStatusModule().SetDefaultStatus();
- fclose(file);
- if (operation.result != SUCCESS)
- return DatOperationResult<>(ERROR, "CREATEBACKUP: Error in copy dat file");
- return DatOperationResult<>(SUCCESS);
- }
-
- DatOperationResult<> DatBackupManager::RestoreFromBackup(const std::string &backup_datname) {
- if (!CheckIfBackupAvailable(backup_datname))
- return DatOperationResult<>(ERROR, "RESTOREFROMBACKUP: incorrect backup file " + backup_datname);
- DatFile backup_file;
- backup_file.Initialise(backup_datname, 0);
- std::string dat_filename = dat->GetIO().GetFilename().value;
- dat->Deinitialize();
- FILE* file = fopen(backup_datname.c_str(), "w+b");
- if (!file)
- return DatOperationResult<>(ERROR, "RESTOREFROMBACKUP: cannot open file " + backup_datname);
- dat->GetStatusModule().SetStatus(DatStatus::E_BACKUP_RESTORING);
- dat->GetStatusModule().SetFinishedParts(0);
- dat->GetStatusModule().SetDebugMessage("Restoring file " + dat->GetIO().GetFilename().value + " from backup " + backup_datname);
- auto operation = CopyDatFile(backup_file, file);
- dat->GetStatusModule().SetDefaultStatus();
- fclose(file);
- if (operation.result == ERROR)
- return DatOperationResult<>(ERROR, "RESTOREFROMBACKUP: error in copy dat file");
- dat->Initialise(dat_filename, dat->GetDatID());
- return DatOperationResult<>(SUCCESS);
- }
-
- DatOperationResult<> DatBackupManager::RemoveBackup(const std::string &backup_datname) {
- dat->GetStatusModule().SetStatus(DatStatus::E_BACKUP_REMOVING);
- dat->GetStatusModule().SetFinishedParts(0);
- dat->GetStatusModule().SetTotalParts(1);
- dat->GetStatusModule().SetDebugMessage("Removing backup file " + backup_datname);
- if (remove(backup_datname.c_str()) != 0)
- LOG(INFO) << "Removed backup file " << backup_datname;
- dat->GetStatusModule().SetDefaultStatus();
- return DatOperationResult<>(SUCCESS);
- }
-
- DatOperationResult<> DatBackupManager::CopyDatFile(DatFile &source, FILE *target) {
- long long parts_count =
- source.GetIO().GetActualDatSize().value / COPY_BLOCK_SIZE + (source.GetIO().GetActualDatSize().value % COPY_BLOCK_SIZE != 0);
- long long newfile_size = 0;
- unsigned elapsed_size = unsigned(source.GetIO().GetActualDatSize().value - newfile_size);
-
- dat->GetStatusModule().SetTotalParts(parts_count);
- BinaryData data(COPY_BLOCK_SIZE);
- for (unsigned i = 0; i < parts_count; i++) {
- dat->GetStatusModule().SetFinishedParts(i);
- auto operation = source.GetIO().ReadData(data, std::min(COPY_BLOCK_SIZE, elapsed_size), newfile_size);
- if (operation.result == ERROR)
- return DatOperationResult<>(ERROR, "Copy failed. Read data error");
- fwrite(data.data(), std::min(COPY_BLOCK_SIZE, elapsed_size), 1, target);
- newfile_size += std::min(COPY_BLOCK_SIZE, elapsed_size);
- elapsed_size -= std::min(COPY_BLOCK_SIZE, elapsed_size);
- }
- return DatOperationResult<>(SUCCESS);
- }
- }
|