/* */ #include "magnet.h" #include "util.h" #include "array_fun.h" namespace aria2 { namespace magnet { std::unique_ptr parse(const std::string& magnet) { if (!util::startsWith(magnet, "magnet:?")) { return nullptr; } auto dict = Dict::g(); 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 { auto l = List::g(); l->append(String::g(value)); dict->put(name, std::move(l)); } } return dict; } } // namespace magnet } // namespace aria2