32#include <condition_variable>
40#include <boost/thread.hpp>
41#include <boost/algorithm/string/classification.hpp>
42#include <boost/algorithm/string/split.hpp>
48#undef MONERO_DEFAULT_LOG_CATEGORY
49#define MONERO_DEFAULT_LOG_CATEGORY "console_handler"
62 m_readline_buffer.start();
76 return m_readline_buffer;
114 m_run.store(
false, std::memory_order_relaxed);
117 ::CloseHandle(::GetStdHandle(STD_INPUT_HANDLE));
123 m_readline_buffer.stop();
168 #if defined(__OpenBSD__) || defined(__ANDROID__)
169 int stdin_fileno = fileno(stdin);
171 int stdin_fileno = ::fileno(stdin);
174 while (
m_run.load(std::memory_order_relaxed))
181 FD_SET(stdin_fileno, &read_set);
185 tv.tv_usec = 100 * 1000;
187 int retval =
::select(stdin_fileno + 1, &read_set, NULL, NULL, &tv);
194 while (
m_run.load(std::memory_order_relaxed))
199 DWORD retval = ::WaitForSingleObject(::GetStdHandle(STD_INPUT_HANDLE), 100);
229 if (
m_run.load(std::memory_order_relaxed))
232 switch (m_readline_buffer.get_line(line))
240 std::getline(std::cin, line);
242 read_ok = !std::cin.eof() && !std::cin.fail();
249 if (std::cin.eof()) {
260 if (
m_run.load(std::memory_order_relaxed))
301 template<
class t_server>
315 template<
class t_server,
class chain_handler>
316 bool run(t_server* psrv, chain_handler ch_handler, std::function<std::string(
void)> prompt,
const std::string&
usage =
"")
318 return run(prompt,
usage, [&](
const std::string& cmd) {
return ch_handler(psrv, cmd); }, [&] { psrv->send_stop_signal(); });
321 template<
class chain_handler>
322 bool run(chain_handler ch_handler, std::function<std::string(
void)> prompt,
const std::string&
usage =
"", std::function<
void(
void)> exit_handler = NULL)
324 return run(prompt,
usage, [&](
const boost::optional<std::string>& cmd) {
return ch_handler(cmd); }, exit_handler);
345 std::string color_prompt =
"\001\033[1;33m\002" + prompt;
346 if (
' ' != prompt.back())
348 color_prompt +=
"\001\033[0m\002";
353 if (
' ' != prompt.back())
362 template<
typename t_cmd_handler>
363 bool run(std::function<std::string(
void)> prompt,
const std::string&
usage,
const t_cmd_handler& cmd_handler, std::function<
void(
void)> exit_handler)
365 bool continue_handle =
true;
367 while(continue_handle)
383 MGINFO(
"EOF on stdin, exiting");
384 std::cout << std::endl;
390 MDEBUG(
"Input cancelled");
391 cmd_handler(boost::none);
397 MERROR(
"Failed to read line.");
402 LOG_PRINT_L2(
"Read command: " << command);
403 if(cmd_handler(command))
407 else if(0 == command.compare(
"exit") || 0 == command.compare(
"q"))
409 continue_handle =
false;
416 std::cout <<
"unknown command: " << command << std::endl;
420 catch (
const std::exception &ex)
422 LOG_ERROR(
"Exception at [console_handler], what=" << ex.what());
438 template<
class t_server,
class t_handler>
441 std::shared_ptr<async_console_handler> console_handler = std::make_shared<async_console_handler>();
442 boost::thread([=](){console_handler->run<t_server, t_handler>(ptsrv, handlr, prompt,
usage);}).detach();
446 template<
class t_server,
class t_handler>
452 template<
class t_server>
458 template<
class t_server,
class t_handler>
464 template<
class t_server,
class t_handler>
471 template<
class t_server,
class t_handler>
477 template<
class t_server,
class t_handler>
484 template<
class t_server,
class t_handler>
514 typedef boost::function<bool (
const std::vector<std::string> &)>
callback;
516 typedef std::map<std::string, std::pair<callback, std::pair<std::string, std::string>>>
lookup;
527 std::stringstream ss;
531 ss << x.second.second.first << ENDL;
539 return std::make_pair(
"",
"");
542 return std::make_pair(
"",
"");
543 return it->second.second;
546 std::vector<std::string>
get_command_list(
const std::vector<std::string>& keywords = std::vector<std::string>())
548 std::vector<std::string> list;
553 for(
auto const& y:keywords)
555 bool in_usage = x.second.second.first.find(y) != std::string::npos;
556 bool in_description = x.second.second.second.find(y) != std::string::npos;
557 if (!(in_usage || in_description))
565 list.push_back(x.first);
571 void set_handler(
const std::string& cmd,
const callback& hndlr,
const std::string&
usage =
"",
const std::string& description =
"")
575 vt.second.first = description.empty() ? cmd :
usage;
576 vt.second.second = description.empty() ?
usage : description;
599 if(!cmd.size() || (cmd.size() == 1 && !cmd[0].size()))
604 std::vector<std::string> cmd_local(cmd.begin()+1, cmd.end());
605 return it->second.first(cmd_local);
612 std::vector<std::string> cmd_v;
613 boost::split(cmd_v,*cmd,boost::is_any_of(
" "), boost::token_compress_on);
642 catch (
const std::exception &e) { }
645 bool start_handling(std::function<std::string(
void)> prompt,
const std::string& usage_string =
"", std::function<
void(
void)> exit_handler = NULL)
650 bool start_handling(
const std::string &prompt,
const std::string& usage_string =
"", std::function<
void(
void)> exit_handler = NULL)
652 return start_handling([prompt](){
return prompt; }, usage_string, exit_handler);
660 bool run_handling(std::function<std::string(
void)> prompt,
const std::string& usage_string, std::function<
void(
void)> exit_handler = NULL)
Definition console_handler.h:309
std::function< std::string(void)> m_prompt
Definition console_handler.h:434
void stop()
Definition console_handler.h:327
std::atomic< bool > m_running
Definition console_handler.h:432
void cancel()
Definition console_handler.h:333
bool run(chain_handler ch_handler, std::function< std::string(void)> prompt, const std::string &usage="", std::function< void(void)> exit_handler=NULL)
Definition console_handler.h:322
bool run(t_server *psrv, chain_handler ch_handler, std::function< std::string(void)> prompt, const std::string &usage="")
Definition console_handler.h:316
std::atomic< bool > m_cancel
Definition console_handler.h:433
async_stdin_reader m_stdin_reader
Definition console_handler.h:431
async_console_handler()
Definition console_handler.h:311
void print_prompt()
Definition console_handler.h:339
bool run(std::function< std::string(void)> prompt, const std::string &usage, const t_cmd_handler &cmd_handler, std::function< void(void)> exit_handler)
Definition console_handler.h:363
Definition console_handler.h:54
async_stdin_reader()
Definition console_handler.h:56
boost::mutex m_response_mutex
Definition console_handler.h:295
bool eos() const
Definition console_handler.h:108
void cancel()
Definition console_handler.h:128
bool wait_stdin_data()
Definition console_handler.h:165
boost::condition_variable m_request_cv
Definition console_handler.h:296
bool start_read()
Definition console_handler.h:137
bool wait_read()
Definition console_handler.h:148
boost::condition_variable m_response_cv
Definition console_handler.h:297
bool get_line(std::string &line)
Definition console_handler.h:81
boost::thread m_reader_thread
Definition console_handler.h:284
std::string m_line
Definition console_handler.h:290
void stop()
Definition console_handler.h:110
std::atomic< bool > m_run
Definition console_handler.h:285
boost::mutex m_request_mutex
Definition console_handler.h:294
t_state
Definition console_handler.h:275
@ state_success
Definition console_handler.h:277
@ state_eos
Definition console_handler.h:280
@ state_cancelled
Definition console_handler.h:279
@ state_error
Definition console_handler.h:278
@ state_init
Definition console_handler.h:276
t_state m_read_status
Definition console_handler.h:292
void reader_thread_func()
Definition console_handler.h:215
~async_stdin_reader()
Definition console_handler.h:67
bool m_has_read_request
Definition console_handler.h:291
boost::function< bool(void)> empty_callback
Definition console_handler.h:515
empty_callback m_empty_command_handler
Definition console_handler.h:619
std::vector< std::string > get_command_list(const std::vector< std::string > &keywords=std::vector< std::string >())
Definition console_handler.h:546
std::string get_usage()
Definition console_handler.h:525
empty_callback m_cancel_handler
Definition console_handler.h:620
void set_unknown_command_handler(const callback &hndlr)
Definition console_handler.h:582
callback m_unknown_command_handler
Definition console_handler.h:618
std::map< std::string, std::pair< callback, std::pair< std::string, std::string > > > lookup
Definition console_handler.h:516
lookup m_command_handlers
Definition console_handler.h:617
std::pair< std::string, std::string > get_documentation(const std::vector< std::string > &cmd)
Definition console_handler.h:536
void set_empty_command_handler(const empty_callback &hndlr)
Definition console_handler.h:587
command_handler()
Definition console_handler.h:518
boost::function< bool(const std::vector< std::string > &)> callback
Definition console_handler.h:514
bool process_command_vec(const std::vector< std::string > &cmd)
Definition console_handler.h:597
void set_handler(const std::string &cmd, const callback &hndlr, const std::string &usage="", const std::string &description="")
Definition console_handler.h:571
void set_cancel_handler(const empty_callback &hndlr)
Definition console_handler.h:592
bool process_command_str(const boost::optional< std::string > &cmd)
Definition console_handler.h:608
Definition console_handler.h:627
void stop_handling()
Definition console_handler.h:655
std::unique_ptr< boost::thread > m_console_thread
Definition console_handler.h:630
bool run_handling(std::function< std::string(void)> prompt, const std::string &usage_string, std::function< void(void)> exit_handler=NULL)
Definition console_handler.h:660
void print_prompt()
Definition console_handler.h:665
async_console_handler m_console_handler
Definition console_handler.h:631
command_handler::lookup command_handlers_map
Definition console_handler.h:629
bool start_handling(const std::string &prompt, const std::string &usage_string="", std::function< void(void)> exit_handler=NULL)
Definition console_handler.h:650
command_handler::callback console_command_handler
Definition console_handler.h:628
bool start_handling(std::function< std::string(void)> prompt, const std::string &usage_string="", std::function< void(void)> exit_handler=NULL)
Definition console_handler.h:645
void cancel_input()
Definition console_handler.h:670
~console_handlers_binder()
Definition console_handler.h:633
Definition readline_buffer.h:11
static void add_completion(const std::string &command)
Definition readline_buffer.cpp:104
Definition readline_buffer.h:35
const char * res
Definition hmac_keccak.cpp:42
#define const
Definition ipfrdr.c:80
static void usage(char *prog)
Definition mdb_drop.c:30
TODO: (mj-xmr) This will be reduced in an another PR.
Definition byte_slice.h:40
void set_console_color(int color, bool bright)
Definition mlog.cpp:349
bool empty_commands_handler(t_server *psrv, const std::string &command)
Definition console_handler.h:302
bool run_default_console_handler_no_srv_param(t_server *ptsrv, t_handler handlr, std::function< std::string(void)> prompt, const std::string &usage="")
Definition console_handler.h:465
bool no_srv_param_adapter(t_server *ptsrv, const std::string &cmd, t_handler handlr)
Definition console_handler.h:459
bool start_default_console(t_server *ptsrv, t_handler handlr, std::function< std::string(void)> prompt, const std::string &usage="")
Definition console_handler.h:439
void reset_console_color()
Definition mlog.cpp:471
bool start_default_console_handler_no_srv_param(t_server *ptsrv, t_handler handlr, std::function< std::string(void)> prompt, const std::string &usage="")
Definition console_handler.h:478
@ partial
Definition readline_buffer.h:9
@ full
Definition readline_buffer.h:9
@ empty
Definition readline_buffer.h:9
static void select(ge_precomp *t, int pos, signed char b)
Definition crypto-ops.c:1610