/* */ #include "MetalinkEntry.h" #include "MetalinkResource.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 namespace aria2 { MetalinkEntry::MetalinkEntry(): file(0), maxConnections(-1) {} MetalinkEntry::~MetalinkEntry() {} class AddLocationPreference { private: std::deque _locations; int _preferenceToAdd; public: AddLocationPreference(const std::deque& locations, int preferenceToAdd): _locations(locations), _preferenceToAdd(preferenceToAdd) { std::transform(_locations.begin(), _locations.end(), _locations.begin(), Util::toUpper); std::sort(_locations.begin(), _locations.end()); } void operator()(SharedHandle& res) { if(std::binary_search(_locations.begin(), _locations.end(), res->location)) { res->preference += _preferenceToAdd; } } }; MetalinkEntry& MetalinkEntry::operator=(const MetalinkEntry& metalinkEntry) { if(this != &metalinkEntry) { this->file = metalinkEntry.file; this->version = metalinkEntry.version; this->language = metalinkEntry.language; this->os = metalinkEntry.os; 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::setLocationPreference(const std::deque& locations, int preferenceToAdd) { std::for_each(resources.begin(), resources.end(), AddLocationPreference(locations, preferenceToAdd)); } class AddProtocolPreference { private: std::string _protocol; int _preferenceToAdd; public: AddProtocolPreference(const std::string& protocol, int prefToAdd): _protocol(protocol), _preferenceToAdd(prefToAdd) {} void operator()(const SharedHandle& res) const { if(_protocol == MetalinkResource::getTypeString(res->type)) { res->preference += _preferenceToAdd; } } }; void MetalinkEntry::setProtocolPreference(const std::string& protocol, int preferenceToAdd) { std::for_each(resources.begin(), resources.end(), AddProtocolPreference(protocol, preferenceToAdd)); } class PrefOrder { public: bool operator()(const SharedHandle& res1, const SharedHandle& res2) { return res1->preference > res2->preference; } }; void MetalinkEntry::reorderResourcesByPreference() { std::random_shuffle(resources.begin(), resources.end()); std::sort(resources.begin(), resources.end(), PrefOrder()); } 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)); } SharedHandle MetalinkEntry::getFile() const { return file; } void MetalinkEntry::setSignature(const SharedHandle& signature) { _signature = signature; } SharedHandle MetalinkEntry::getSignature() const { return _signature; } } // namespace aria2