/* */ #include "magnet.h" #include "util.h" #include "array_fun.h" namespace aria2 { namespace magnet { std::shared_ptr parse(const std::string& magnet) { std::shared_ptr dict; if(!util::startsWith(magnet, "magnet:?")) { return dict; } dict.reset(new Dict()); std::vector queries; util::splitIter(magnet.begin()+8, magnet.end(), std::back_inserter(queries), '&'); for(std::vector::const_iterator i = queries.begin(), eoi = queries.end(); i != eoi; ++i) { auto p = util::divide((*i).first, (*i).second, '='); std::string name(p.first.first, p.first.second); std::string value(util::percentDecode(p.second.first, p.second.second)); List* l = downcast(dict->get(name)); if(l) { l->append(String::g(value)); } else { std::shared_ptr l = List::g(); l->append(String::g(value)); dict->put(name, l); } } return dict; } } // namespace magnet } // namespace aria2