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>
318 return run(prompt,
usage, [&](
const std::string&
cmd) {
return ch_handler(psrv,
cmd); }, [&] { psrv->send_stop_signal(); });
321 template<
class chain_handler>
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>
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>
468 return console_handler.
run(ptsrv, std::bind<bool>(no_srv_param_adapter<t_server, t_handler>, std::placeholders::_1, std::placeholders::_2, handlr), prompt,
usage);
471 template<
class t_server,
class t_handler>
477 template<
class t_server,
class t_handler>
480 boost::thread( boost::bind(run_default_console_handler_no_srv_param<t_server, t_handler>, ptsrv, handlr, prompt,
usage) );
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);
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) { }
652 return start_handling([prompt](){
return prompt; }, usage_string, exit_handler);
const char * res
Definition: hmac_keccak.cpp:42
boost::condition_variable m_request_cv
Definition: console_handler.h:296
Definition: console_handler.h:280
description
Definition: setupmingw32.py:29
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
void cancel_input()
Definition: console_handler.h:670
static void add_completion(const std::string &command)
Definition: readline_buffer.cpp:104
void stop_handling()
Definition: console_handler.h:655
std::string m_line
Definition: console_handler.h:290
void print_prompt()
Definition: console_handler.h:665
callback m_unknown_command_handler
Definition: console_handler.h:618
~console_handlers_binder()
Definition: console_handler.h:633
boost::mutex m_request_mutex
Definition: console_handler.h:294
::std::string string
Definition: gtest-port.h:1097
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::map< std::string, std::pair< callback, std::pair< std::string, std::string > > > lookup
Definition: console_handler.h:516
void set_handler(const std::string &cmd, const callback &hndlr, const std::string &usage="", const std::string &description="")
Definition: console_handler.h:571
t_state
Definition: console_handler.h:274
Definition: console_handler.h:278
std::string get_usage()
Definition: console_handler.h:525
Definition: console_handler.h:512
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
Definition: readline_buffer.h:10
Definition: console_handler.h:277
bool get_line(std::string &line)
Definition: console_handler.h:81
static void select(ge_precomp *t, int pos, signed char b)
Definition: crypto-ops.c:1610
~async_stdin_reader()
Definition: console_handler.h:67
command_handler::lookup command_handlers_map
Definition: console_handler.h:629
void reader_thread_func()
Definition: console_handler.h:215
bool eos() const
Definition: console_handler.h:108
Definition: readline_buffer.h:34
bool m_has_read_request
Definition: console_handler.h:291
cmd
Definition: functional_tests_rpc.py:143
e
Definition: pymoduletest.py:79
void reset_console_color()
Definition: mlog.cpp:471
std::function< std::string(void)> m_prompt
Definition: console_handler.h:434
async_stdin_reader m_stdin_reader
Definition: console_handler.h:431
Definition: readline_buffer.h:9
async_stdin_reader()
Definition: console_handler.h:56
Definition: console_handler.h:279
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
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
Definition: console_handler.h:276
Definition: readline_buffer.h:9
std::pair< std::string, std::string > get_documentation(const std::vector< std::string > &cmd)
Definition: console_handler.h:536
bool wait_stdin_data()
Definition: console_handler.h:165
empty_callback m_empty_command_handler
Definition: console_handler.h:619
void cancel()
Definition: console_handler.h:128
bool wait_read()
Definition: console_handler.h:148
lookup m_command_handlers
Definition: console_handler.h:617
static void usage(char *prog)
Definition: mdb_drop.c:30
std::unique_ptr< boost::thread > m_console_thread
Definition: console_handler.h:630
#define false
Definition: stdbool.h:37
boost::function< bool(const std::vector< std::string > &)> callback
Definition: console_handler.h:514
bool process_command_str(const boost::optional< std::string > &cmd)
Definition: console_handler.h:608
Definition: console_handler.h:308
boost::function< bool(void)> empty_callback
Definition: console_handler.h:515
boost::mutex m_response_mutex
Definition: console_handler.h:295
std::vector< std::string > get_command_list(const std::vector< std::string > &keywords=std::vector< std::string >())
Definition: console_handler.h:546
void set_console_color(int color, bool bright)
Definition: mlog.cpp:349
async_console_handler()
Definition: console_handler.h:311
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
bool start_read()
Definition: console_handler.h:137
boost::condition_variable m_response_cv
Definition: console_handler.h:297
void stop()
Definition: console_handler.h:327
TODO: (mj-xmr) This will be reduced in an another PR.
Definition: byte_slice.h:39
bool empty_commands_handler(t_server *psrv, const std::string &command)
Definition: console_handler.h:302
const T & move(const T &t)
Definition: gtest-port.h:1317
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
command_handler::callback console_command_handler
Definition: console_handler.h:628
void set_empty_command_handler(const empty_callback &hndlr)
Definition: console_handler.h:587
void set_unknown_command_handler(const callback &hndlr)
Definition: console_handler.h:582
Definition: readline_buffer.h:9
std::atomic< bool > m_run
Definition: console_handler.h:285
Definition: console_handler.h:626
bool process_command_vec(const std::vector< std::string > &cmd)
Definition: console_handler.h:597
void set_cancel_handler(const empty_callback &hndlr)
Definition: console_handler.h:592
empty_callback m_cancel_handler
Definition: console_handler.h:620
void print_prompt()
Definition: console_handler.h:339
bool no_srv_param_adapter(t_server *ptsrv, const std::string &cmd, t_handler handlr)
Definition: console_handler.h:459
std::atomic< bool > m_running
Definition: console_handler.h:432
async_console_handler m_console_handler
Definition: console_handler.h:631
void stop()
Definition: console_handler.h:110
void cancel()
Definition: console_handler.h:333
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
command_handler()
Definition: console_handler.h:518
boost::thread m_reader_thread
Definition: console_handler.h:284
line
Definition: check.py:23
t_state m_read_status
Definition: console_handler.h:292
#define const
Definition: ipfrdr.c:80
#define true
Definition: stdbool.h:36
Definition: console_handler.h:53
std::atomic< bool > m_cancel
Definition: console_handler.h:433
bool start_handling(const std::string &prompt, const std::string &usage_string="", std::function< void(void)> exit_handler=NULL)
Definition: console_handler.h:650