/* */ #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() {} namespace { class AddLocationPriority { private: std::vector locations_; int priorityToAdd_; public: AddLocationPriority (const std::vector& locations, int priorityToAdd): locations_(locations), priorityToAdd_(priorityToAdd) { std::sort(locations_.begin(), locations_.end()); } void operator()(SharedHandle& res) { if(std::binary_search (locations_.begin(), locations_.end(), res->location)) { res->priority += priorityToAdd_; } } }; } // namespace MetalinkEntry& MetalinkEntry::operator=(const MetalinkEntry& metalinkEntry) { if(this != &metalinkEntry) { this->file = metalinkEntry.file; this->version = metalinkEntry.version; this->languages = metalinkEntry.languages; this->oses = metalinkEntry.oses; this->maxConnections = metalinkEntry.maxConnections; #ifdef ENABLE_MESSAGE_DIGEST this->checksum = metalinkEntry.checksum; this->chunkChecksum = metalinkEntry.chunkChecksum; #endif // ENABLE_MESSAGE_DIGEST this->signature_ = metalinkEntry.signature_; } return *this; } 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) { std::for_each(resources.begin(), resources.end(), AddLocationPriority(locations, priorityToAdd)); } namespace { class AddProtocolPriority { private: std::string protocol_; int priorityToAdd_; public: AddProtocolPriority(const std::string& protocol, int prefToAdd): protocol_(protocol), priorityToAdd_(prefToAdd) {} void operator()(const SharedHandle& res) const { if(protocol_ == MetalinkResource::getTypeString(res->type)) { res->priority += priorityToAdd_; } } }; } // namespace void MetalinkEntry::setProtocolPriority(const std::string& protocol, int priorityToAdd) { std::for_each(resources.begin(), resources.end(), AddProtocolPriority(protocol, priorityToAdd)); } namespace { template class PriorityHigher { public: bool operator()(const SharedHandle& res1, const SharedHandle& res2) { return res1->priority < res2->priority; } }; } // namespace void MetalinkEntry::reorderResourcesByPriority() { std::random_shuffle(resources.begin(), resources.end(), *(SimpleRandomizer::getInstance().get())); std::sort(resources.begin(), resources.end(), PriorityHigher()); } void MetalinkEntry::reorderMetaurlsByPriority() { std::sort(metaurls.begin(), metaurls.end(),PriorityHigher()); } namespace { class Supported:public std::unary_function, bool> { public: bool operator()(const SharedHandle& 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(resources.begin(), resources.end(), std::not1(Supported())), resources.end()); } void MetalinkEntry::toFileEntry (std::vector >& fileEntries, const std::vector >& metalinkEntries) { std::transform(metalinkEntries.begin(), metalinkEntries.end(), std::back_inserter(fileEntries), mem_fun_sh(&MetalinkEntry::getFile)); } void MetalinkEntry::setSignature(const SharedHandle& signature) { signature_ = 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(); } } // namespace aria2