#include "BsaPackerWorker.h" #include #include #include namespace BsaPacker { BsaPackerWorker::BsaPackerWorker( const ISettingsService* settingsService, const IModDtoFactory* modDtoFactory, const IArchiveBuilderFactory* archiveBuilderFactory, const IArchiveAutoService* archiveAutoService, const IDummyPluginServiceFactory* dummyPluginServiceFactory, const IHideLooseAssetService* hideLooseAssetService, const IArchiveNameService* archiveNameService, const IOverrideFileService* overrideFileService) : m_SettingsService(settingsService), m_ModDtoFactory(modDtoFactory), m_ArchiveBuilderFactory(archiveBuilderFactory), m_ArchiveAutoService(archiveAutoService), m_DummyPluginServiceFactory(dummyPluginServiceFactory), m_HideLooseAssetService(hideLooseAssetService), m_ArchiveNameService(archiveNameService), m_OverrideFileService(overrideFileService) { } void BsaPackerWorker::DoWork() const { QStringList createdArchives; const std::unique_ptr modDto = this->m_ModDtoFactory->Create(); // handles PackerDialog and validation, implements Null Object pattern const std::vector types = this->m_ArchiveBuilderFactory->GetArchiveTypes(modDto.get()); for (auto&& type : types) { const std::unique_ptr builder = this->m_ArchiveBuilderFactory->Create(type, modDto.get()); ArchiveBuildDirector director(this->m_SettingsService, builder.get()); director.Construct(); // must check if cancelled const std::vector> archives = builder->getArchives(); for (const auto& archive : archives) { if (archive) { const QFileInfo fileInfo(this->m_ArchiveNameService->GetArchiveFullPath(type, modDto.get())); bool res = this->m_ArchiveAutoService->CreateBSA( archive.get(), fileInfo.absoluteFilePath(), type, modDto->Directory(), modDto->NexusId()); if (res) { createdArchives.append(fileInfo.completeBaseName()); } } } } if (!createdArchives.isEmpty()) { QMessageBox::information(nullptr, "", QObject::tr("Created archive(s):") + "\n" + createdArchives.join(modDto->ArchiveExtension() +",\n") + modDto->ArchiveExtension()); this->m_OverrideFileService->CreateOverrideFile(modDto->NexusId(), modDto->Directory(), createdArchives); } const std::unique_ptr pluginService = this->m_DummyPluginServiceFactory->Create(); pluginService->CreatePlugin(modDto->Directory(), modDto->ArchiveName()); if (!modDto->Directory().isEmpty()) { this->m_HideLooseAssetService->HideLooseAssets(modDto->Directory()); } } }