/* */ #include "MetalinkEntry.h" #include #include "MetalinkResource.h" #include "MetalinkMetaurl.h" #include "FileEntry.h" #include "util.h" #include "a2functional.h" #include "Checksum.h" #include "ChunkChecksum.h" #include "Signature.h" #include "SimpleRandomizer.h" namespace aria2 { MetalinkEntry::MetalinkEntry() : sizeKnown(false), maxConnections(-1) {} MetalinkEntry::~MetalinkEntry() {} const std::string& MetalinkEntry::getPath() const { return file->getPath(); } int64_t MetalinkEntry::getLength() const { return file->getLength(); } void MetalinkEntry::setLocationPriority( const std::vector& locations, int priorityToAdd) { for (auto& res : resources) { if (std::find(std::begin(locations), std::end(locations), res->location) != std::end(locations)) { res->priority += priorityToAdd; } } } void MetalinkEntry::setProtocolPriority(const std::string& protocol, int priorityToAdd) { for (auto& res : resources) { if (protocol == MetalinkResource::getTypeString(res->type)) { res->priority += priorityToAdd; } } } namespace { template class PriorityHigher { public: bool operator()(const T& res1, const T& res2) { return res1->priority < res2->priority; } }; } // namespace void MetalinkEntry::reorderResourcesByPriority() { std::shuffle(std::begin(resources), std::end(resources), *SimpleRandomizer::getInstance()); std::sort(std::begin(resources), std::end(resources), PriorityHigher>{}); } void MetalinkEntry::reorderMetaurlsByPriority() { std::sort(std::begin(metaurls), std::end(metaurls), PriorityHigher>{}); } namespace { class Supported : public std::unary_function, bool> { public: bool operator()(const std::shared_ptr& res) const { switch (res->type) { case MetalinkResource::TYPE_FTP: case MetalinkResource::TYPE_HTTP: #ifdef ENABLE_SSL case MetalinkResource::TYPE_HTTPS: #endif // ENABLE_SSL #ifdef ENABLE_BITTORRENT case MetalinkResource::TYPE_BITTORRENT: #endif // ENABLE_BITTORRENT return true; default: return false; } } }; } // namespace void MetalinkEntry::dropUnsupportedResource() { resources.erase( std::remove_if(std::begin(resources), std::end(resources), [](const std::unique_ptr& res) { switch (res->type) { case MetalinkResource::TYPE_FTP: case MetalinkResource::TYPE_HTTP: #ifdef ENABLE_SSL case MetalinkResource::TYPE_HTTPS: #endif // ENABLE_SSL #ifdef ENABLE_BITTORRENT case MetalinkResource::TYPE_BITTORRENT: #endif // ENABLE_BITTORRENT return false; default: return true; } }), std::end(resources)); } std::vector> MetalinkEntry::toFileEntry( std::vector> metalinkEntries) { std::vector> res; res.reserve(metalinkEntries.size()); for (auto& entry : metalinkEntries) { res.push_back(entry->popFile()); } return res; } void MetalinkEntry::setSignature(std::unique_ptr signature) { signature_ = std::move(signature); } bool MetalinkEntry::containsLanguage(const std::string& lang) const { return std::find(languages.begin(), languages.end(), lang) != languages.end(); } bool MetalinkEntry::containsOS(const std::string& os) const { return std::find(oses.begin(), oses.end(), os) != oses.end(); } std::unique_ptr MetalinkEntry::popSignature() { return std::move(signature_); } std::unique_ptr MetalinkEntry::popFile() { return std::move(file); } } // namespace aria2