| 29 | #include "net/ChecksumValidator.h" |
| 30 | |
| 31 | ResourceDownloadTask::ResourceDownloadTask(ModPlatform::IndexedPack::Ptr pack, |
| 32 | ModPlatform::IndexedVersion version, |
| 33 | const std::shared_ptr<ResourceFolderModel> packs, |
| 34 | bool is_indexed, |
| 35 | QString custom_target_folder) |
| 36 | : m_pack(std::move(pack)), m_pack_version(std::move(version)), m_pack_model(packs), m_custom_target_folder(custom_target_folder) |
| 37 | { |
| 38 | if (auto model = dynamic_cast<ModFolderModel*>(m_pack_model.get()); model && is_indexed) { |
| 39 | m_update_task.reset(new LocalModUpdateTask(model->indexDir(), *m_pack, m_pack_version)); |
| 40 | connect(m_update_task.get(), &LocalModUpdateTask::hasOldMod, this, &ResourceDownloadTask::hasOldResource); |
| 41 | |
| 42 | addTask(m_update_task); |
| 43 | } |
| 44 | |
| 45 | m_filesNetJob.reset(new NetJob(tr("Resource download"), APPLICATION->network())); |
| 46 | m_filesNetJob->setStatus(tr("Downloading resource:\n%1").arg(m_pack_version.downloadUrl)); |
| 47 | |
| 48 | QDir dir{ m_pack_model->dir() }; |
| 49 | { |
| 50 | // FIXME: Make this more generic. May require adding additional info to IndexedVersion, |
| 51 | // or adquiring a reference to the base instance. |
| 52 | if (!m_custom_target_folder.isEmpty()) { |
| 53 | dir.cdUp(); |
| 54 | dir.cd(m_custom_target_folder); |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | auto action = Net::ApiDownload::makeFile(m_pack_version.downloadUrl, dir.absoluteFilePath(getFilename())); |
| 59 | if (!m_pack_version.hash_type.isEmpty() && !m_pack_version.hash.isEmpty()) { |
| 60 | switch (Hashing::algorithmFromString(m_pack_version.hash_type)) { |
| 61 | case Hashing::Algorithm::Md4: |
| 62 | action->addValidator(new Net::ChecksumValidator(QCryptographicHash::Algorithm::Md4, m_pack_version.hash)); |
| 63 | break; |
| 64 | case Hashing::Algorithm::Md5: |
| 65 | action->addValidator(new Net::ChecksumValidator(QCryptographicHash::Algorithm::Md5, m_pack_version.hash)); |
| 66 | break; |
| 67 | case Hashing::Algorithm::Sha1: |
| 68 | action->addValidator(new Net::ChecksumValidator(QCryptographicHash::Algorithm::Sha1, m_pack_version.hash)); |
| 69 | break; |
| 70 | case Hashing::Algorithm::Sha256: |
| 71 | action->addValidator(new Net::ChecksumValidator(QCryptographicHash::Algorithm::Sha256, m_pack_version.hash)); |
| 72 | break; |
| 73 | case Hashing::Algorithm::Sha512: |
| 74 | action->addValidator(new Net::ChecksumValidator(QCryptographicHash::Algorithm::Sha512, m_pack_version.hash)); |
| 75 | break; |
| 76 | default: |
| 77 | break; |
| 78 | } |
| 79 | } |
| 80 | m_filesNetJob->addNetAction(action); |
| 81 | connect(m_filesNetJob.get(), &NetJob::succeeded, this, &ResourceDownloadTask::downloadSucceeded); |
| 82 | connect(m_filesNetJob.get(), &NetJob::progress, this, &ResourceDownloadTask::downloadProgressChanged); |
| 83 | connect(m_filesNetJob.get(), &NetJob::stepProgress, this, &ResourceDownloadTask::propagateStepProgress); |
| 84 | connect(m_filesNetJob.get(), &NetJob::failed, this, &ResourceDownloadTask::downloadFailed); |
| 85 | |
| 86 | addTask(m_filesNetJob); |
| 87 | } |
| 88 |
nothing calls this directly
no test coverage detected