/* */ #include "MetalinkEntry.h" #include #include "MetalinkResource.h" #include "MetalinkMetaurl.h" #include "FileEntry.h" #include "util.h" #include "a2functional.h" #ifdef ENABLE_MESSAGE_DIGEST # include "Checksum.h" # include "ChunkChecksum.h" #endif // ENABLE_MESSAGE_DIGEST #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::random_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