/* */ #include "OptionParser.h" #include "Util.h" #include "OptionHandlerImpl.h" #include "Option.h" #include "A2STR.h" #include "a2functional.h" #include #include namespace aria2 { void OptionParser::parse(Option* option, std::istream& is) { std::string line; int32_t linenum = 0; while(getline(is, line)) { ++linenum; if(Util::startsWith(line, A2STR::SHARP_C)) { continue; } std::pair nv = Util::split(line, A2STR::EQUAL_C); OptionHandlerHandle handler = getOptionHandlerByName(nv.first); handler->parse(option, nv.second); } } OptionHandlerHandle OptionParser::getOptionHandlerByName(const std::string& optName) { for(OptionHandlers::iterator itr = _optionHandlers.begin(); itr != _optionHandlers.end(); ++itr) { if((*itr)->canHandle(optName)) { return *itr; } } return SharedHandle(new NullOptionHandler()); } void OptionParser::setOptionHandlers(const std::deque >& optionHandlers) { _optionHandlers = optionHandlers; } void OptionParser::addOptionHandler (const SharedHandle& optionHandler) { _optionHandlers.push_back(optionHandler); } void OptionParser::parseDefaultValues(Option* option) const { for(std::deque >::const_iterator i = _optionHandlers.begin(); i != _optionHandlers.end(); ++i) { if(!(*i)->getDefaultValue().empty()) { (*i)->parse(option, (*i)->getDefaultValue()); } } } class FindByTag : public std::unary_function, bool> { private: std::string _tag; public: FindByTag(const std::string& tag):_tag(tag) {} bool operator()(const SharedHandle& optionHandler) const { return !optionHandler->isHidden() && optionHandler->hasTag(_tag); } }; std::deque > OptionParser::findByTag(const std::string& tag) const { std::deque > result; std::remove_copy_if(_optionHandlers.begin(), _optionHandlers.end(), std::back_inserter(result), std::not1(FindByTag(tag))); return result; } class FindByNameSubstring : public std::unary_function , bool> { private: std::string _substring; public: FindByNameSubstring(const std::string& substring):_substring(substring) {} bool operator()(const SharedHandle& optionHandler) const { return !optionHandler->isHidden() && optionHandler->getName().find(_substring) != std::string::npos; } }; std::deque > OptionParser::findByNameSubstring(const std::string& substring) const { std::deque > result; std::remove_copy_if(_optionHandlers.begin(), _optionHandlers.end(), std::back_inserter(result), std::not1(FindByNameSubstring(substring))); return result; } class FindByName : public std::unary_function , bool> { private: std::string _name; public: FindByName(const std::string& name):_name(name) {} bool operator()(const SharedHandle& optionHandler) const { return !optionHandler->isHidden() && optionHandler->getName() == _name; } }; std::deque > OptionParser::findAll() const { std::deque > result; std::remove_copy_if(_optionHandlers.begin(), _optionHandlers.end(), std::back_inserter(result), mem_fun_sh(&OptionHandler::isHidden)); return result; } SharedHandle OptionParser::findByName(const std::string& name) const { std::deque >::const_iterator i = std::find_if(_optionHandlers.begin(), _optionHandlers.end(), FindByName(name)); if(i == _optionHandlers.end()) { return SharedHandle(); } else { return *i; } } const std::deque >& OptionParser::getOptionHandlers() const { return _optionHandlers; } } // namespace aria2