#include "telnet_connection.h" #include "commands.h" #include #include #include #include #include telnet::Connection::Connection(boost::asio::io_service& io_service) : socket(io_service) { } void telnet::Connection::handle_read(const boost::system::error_code& error, size_t bytes_transferred) { if(error) { return; } std::string line; std::istream is(&buf); std::getline(is, line); boost::trim(line); if(line == "exit") { return; } std::vector args = parse_args(line); // no arguments, i.e. empty line if(!args.size()) { start(); return; } std::vector r; try { commands::Commands cmd(socket.get_io_service(), args); r = cmd(); } catch(commands::CommandException& ce) { std::string s(ce.what()); s += '\n'; boost::asio::write(socket, boost::asio::buffer(s)); start(); return; } for(std::vector::iterator it = r.begin(); it != r.end(); it++) { boost::asio::write(socket, boost::asio::buffer(*it + "\n")); } start(); } std::vector telnet::Connection::parse_args(std::string& line) { std::string::const_iterator begin = line.begin(); std::string::const_iterator end = line.end(); boost::regex re("(\")?((?(1)[^\"]|[^ ])+)(?(1)\")"); boost::match_results what; boost::match_flag_type flags = boost::match_default; std::vector args; while(boost::regex_search(begin, end, what, re, flags)) { std::string s = std::string(what[2].first, what[2].second); boost::algorithm::trim(s); // avoid empty strings when parsing multi-word arguments (a "b c") if(s.size()) { args.push_back(s); } begin = what[0].second; } return args; } void telnet::Connection::start() { boost::asio::async_read_until(socket, buf, "\n", boost::bind(&Connection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); }