/* */ #include "MetalinkEntry.h" #include "Util.h" #include MetalinkEntry::MetalinkEntry() #ifdef ENABLE_MESSAGE_DIGEST :checksum(0), chunkChecksum(0) #endif // ENABLE_MESSAGE_DIGEST {} MetalinkEntry::~MetalinkEntry() {} class AddLocationPreference { private: string location; int32_t preferenceToAdd; public: AddLocationPreference(const string& location, int32_t preferenceToAdd): location(location), preferenceToAdd(preferenceToAdd) {} void operator()(MetalinkResourceHandle& res) { if(res->location == location) { res->preference += preferenceToAdd; } } }; void MetalinkEntry::setLocationPreference(const string& location, int32_t preferenceToAdd) { for_each(resources.begin(), resources.end(), AddLocationPreference(location, preferenceToAdd)); } class PrefOrder { public: bool operator()(const MetalinkResourceHandle& res1, const MetalinkResourceHandle& res2) { return res1->preference > res2->preference; } }; void MetalinkEntry::reorderResourcesByPreference() { random_shuffle(resources.begin(), resources.end()); sort(resources.begin(), resources.end(), PrefOrder()); } class Supported { public: bool operator()(const MetalinkResourceHandle& res) { switch(res->type) { case MetalinkResource::TYPE_FTP: case MetalinkResource::TYPE_HTTP: case MetalinkResource::TYPE_HTTPS: #ifdef ENABLE_BITTORRENT case MetalinkResource::TYPE_BITTORRENT: #endif // ENABLE_BITTORRENT return true; default: return false; } } }; void MetalinkEntry::dropUnsupportedResource() { MetalinkResources::iterator split = partition(resources.begin(), resources.end(), Supported()); resources.erase(split, resources.end()); } FileEntries MetalinkEntry::toFileEntry(const MetalinkEntries& metalinkEntries) { FileEntries entries; for(MetalinkEntries::const_iterator itr = metalinkEntries.begin(); itr != metalinkEntries.end(); ++itr) { entries.push_back((*itr)->file); } return entries; }