31 #include <boost/filesystem/path.hpp> 32 #include <boost/filesystem/operations.hpp> 33 #include <boost/format.hpp> 44 #undef ELECTRONEUM_DEFAULT_LOG_CATEGORY 45 #define ELECTRONEUM_DEFAULT_LOG_CATEGORY "wallet.wallet2" 49 #define DEFAULT_MAX_CONCURRENCY 1 51 #define DEFAULT_MAX_CONCURRENCY 0 59 Print(
const std::function<
void(
const std::string&,
bool)> &p,
bool em =
false): print(p), emphasis(em) {}
60 ~Print() { print(ss.str(), emphasis); }
61 template<
typename T> std::ostream &
operator<<(
const T &t) { ss << t;
return ss; }
63 const std::function<void(const std::string&, bool)> &print;
74 return {
"generate-from-json",
wallet_args::tr(
"Generate wallet from JSON format file"),
""};
81 const char*
tr(
const char* str)
86 std::pair<boost::optional<boost::program_options::variables_map>,
bool>
main(
87 int argc,
char** argv,
88 const char*
const usage,
89 const char*
const notice,
90 boost::program_options::options_description desc_params,
91 const boost::program_options::positional_options_description& positional_options,
92 const std::function<
void(
const std::string&,
bool)> &print,
93 const char *default_log_name,
97 namespace bf = boost::filesystem;
98 namespace po = boost::program_options;
100 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
120 po::options_description desc_general(
wallet_args::tr(
"General options"));
133 po::options_description desc_all;
134 desc_all.add(desc_general).add(desc_params);
135 po::variables_map vm;
136 bool should_terminate =
false;
139 auto parser = po::command_line_parser(argc, argv).options(desc_all).positional(positional_options);
140 po::store(parser.run(), vm);
145 Print(print) <<
wallet_args::tr(
"This is the command line electroneum wallet. It needs to connect to a electroneum\n" 146 "daemon to work correctly.") <<
ENDL;
148 Print(print) << desc_all;
149 should_terminate =
true;
155 should_terminate =
true;
162 bf::path config_path(
config);
163 boost::system::error_code ec;
164 if (bf::exists(config_path, ec))
166 po::store(po::parse_config_file<char>(config_path.string<
std::string>().c_str(), desc_params), vm);
179 return {boost::none,
true};
181 if (should_terminate)
182 return {
std::move(vm), should_terminate};
194 else if (!log_to_console)
202 Print(print) <<
wallet_args::tr(
"This is the command line electroneum wallet. It needs to connect to a electroneum\n" 203 "daemon to work correctly.") <<
ENDL;
205 Print(print) << desc_all;
206 return {boost::none,
true};
211 return {boost::none,
true};
215 Print(print) << notice <<
ENDL;
225 MINFO(
"Setting log levels = " << getenv(
"ELECTRONEUM_LOGS"));
228 Print(print) << boost::format(
wallet_args::tr(
"Logging to %s")) % log_path;
231 if (lockable_memory >= 0 && lockable_memory < 256 * 4096)
232 Print(print) <<
tr(
"WARNING: You may not have a high enough lockable memory limit")
234 <<
", " <<
tr(
"see ulimit -l")
238 return {
std::move(vm), should_terminate};
const char *const ELECTRONEUM_RELEASE_NAME
command_line::arg_descriptor< std::string > arg_wallet_file()
void mlog_set_log(const char *log)
std::string mlog_get_default_log_path(const char *default_filename)
void mlog_configure(const std::string &filename_base, bool console, const std::size_t max_log_file_size=MAX_LOG_FILE_SIZE, const std::size_t max_log_files=MAX_LOG_FILES)
std::string i18n_get_language()
const arg_descriptor< bool > arg_help
const command_line::arg_descriptor< std::string, false, true, 2 > arg_log_file
const char * tr(const char *str)
const char * i18n_translate(const char *s, const std::string &context)
const command_line::arg_descriptor< std::size_t > arg_max_log_file_size
void mlog_set_categories(const char *categories)
const command_line::arg_descriptor< unsigned > arg_max_concurrency
#define MAX_LOG_FILE_SIZE
const char *const ELECTRONEUM_VERSION_FULL
bool handle_error_helper(const boost::program_options::options_description &desc, F parser)
std::enable_if<!std::is_same< T, bool >::value, bool >::type has_arg(const boost::program_options::variables_map &vm, const arg_descriptor< T, required, dependent, NUM_DEPS > &arg)
int i18n_set_language(const char *directory, const char *base, std::string language)
const command_line::arg_descriptor< std::string > arg_log_level
std::stringstream & operator<<(std::stringstream &out, const std::wstring &ws)
command_line::arg_descriptor< std::string > arg_generate_from_json()
#define DEFAULT_MAX_CONCURRENCY
void add_arg(boost::program_options::options_description &description, const arg_descriptor< T, required, dependent, NUM_DEPS > &arg, bool unique=true)
const command_line::arg_descriptor< std::string, false, true, 2 > arg_config_file
std::pair< boost::optional< boost::program_options::variables_map >, bool > main(int argc, char **argv, const char *const usage, const char *const notice, boost::program_options::options_description desc_params, const boost::program_options::positional_options_description &positional_options, const std::function< void(const std::string &, bool)> &print, const char *default_log_name, bool log_to_console)
const T & move(const T &t)
T get_arg(const boost::program_options::variables_map &vm, const arg_descriptor< T, false, true > &arg)
const arg_descriptor< bool > arg_version
const command_line::arg_descriptor< std::size_t > arg_max_log_files
bool is_arg_defaulted(const boost::program_options::variables_map &vm, const arg_descriptor< T, required, dependent, NUM_DEPS > &arg)