// // Created by loki on 5/30/19. // #include "process.h" #include #include #include #include #include #include #include #include "nvhttp.h" #include "stream.h" #include "config.h" #include "thread_pool.h" #include "platform/common.h" extern "C" { #include } using namespace std::literals; namespace bl = boost::log; util::ThreadPool task_pool; bl::sources::severity_logger verbose(0); // Dominating output bl::sources::severity_logger debug(1); // Follow what is happening bl::sources::severity_logger info(2); // Should be informed about bl::sources::severity_logger warning(3); // Strange events bl::sources::severity_logger error(4); // Recoverable errors bl::sources::severity_logger fatal(5); // Unrecoverable errors bool display_cursor; using text_sink = bl::sinks::asynchronous_sink; boost::shared_ptr sink; struct NoDelete { void operator()(void *) {} }; BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", int) void log_flush() { sink->flush(); } int main(int argc, char *argv[]) { if(argc > 1) { if(!std::filesystem::exists(argv[1])) { std::cout << "Fatal Error: Couldn't find configuration file ["sv << argv[1] << ']' << std::endl; return 7; } config::parse_file(argv[1]); } sink = boost::make_shared(); boost::shared_ptr stream { &std::cout, NoDelete {} }; sink->locked_backend()->add_stream(stream); sink->set_filter(severity >= config::sunshine.min_log_level); sink->set_formatter([severity="Severity"s](const bl::record_view &view, bl::formatting_ostream &os) { auto log_level = view.attribute_values()[severity].extract().get(); std::string_view log_type; switch(log_level) { case 0: log_type = "Verbose: "sv; break; case 1: log_type = "Debug: "sv; break; case 2: log_type = "Info: "sv; break; case 3: log_type = "Warning: "sv; break; case 4: log_type = "Error: "sv; break; case 5: log_type = "Fatal: "sv; break; }; os << log_type << view.attribute_values()["Message"].extract(); }); bl::core::get()->add_sink(sink); auto fg = util::fail_guard(log_flush); auto proc_opt = proc::parse(config::stream.file_apps); if(!proc_opt) { return 7; } proc::proc = std::move(*proc_opt); reed_solomon_init(); task_pool.start(1); std::thread httpThread { nvhttp::start }; stream::rtpThread(); httpThread.join(); return 0; }