/* */ #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(): file(0), maxConnections(-1) {} MetalinkEntry::~MetalinkEntry() {} class AddLocationPriority { private: std::deque _locations; int _priorityToAdd; public: AddLocationPriority (const std::deque& 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; } } }; 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; } std::string MetalinkEntry::getPath() const { return file->getPath(); } uint64_t MetalinkEntry::getLength() const { return file->getLength(); } void MetalinkEntry::setLocationPriority (const std::deque& locations, int priorityToAdd) { std::for_each(resources.begin(), resources.end(), AddLocationPriority(locations, priorityToAdd)); } 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; } } }; void MetalinkEntry::setProtocolPriority(const std::string& protocol, int priorityToAdd) { std::for_each(resources.begin(), resources.end(), AddProtocolPriority(protocol, priorityToAdd)); } template class PriorityHigher { public: bool operator()(const SharedHandle& res1, const SharedHandle& res2) { return res1->priority < res2->priority; } }; 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()); } 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; } } }; void MetalinkEntry::dropUnsupportedResource() { resources.erase(std::remove_if(resources.begin(), resources.end(), std::not1(Supported())), resources.end()); } void MetalinkEntry::toFileEntry (std::deque >& fileEntries, const std::deque >& metalinkEntries) { std::transform(metalinkEntries.begin(), metalinkEntries.end(), std::back_inserter(fileEntries), mem_fun_sh(&MetalinkEntry::getFile)); } void MetalinkEntry::setSignature(const SharedHandle& signature) { _signature = signature; } } // namespace aria2