124 lines
4.2 KiB
C++
124 lines
4.2 KiB
C++
/*
|
|
* Copyright Andrey Semashev 2007 - 2015.
|
|
* Distributed under the Boost Software License, Version 1.0.
|
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
|
* http://www.boost.org/LICENSE_1_0.txt)
|
|
*/
|
|
|
|
#include <cstdlib>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <stdexcept>
|
|
#include <boost/smart_ptr/shared_ptr.hpp>
|
|
#include <boost/phoenix.hpp>
|
|
#include <boost/log/trivial.hpp>
|
|
#include <boost/log/core.hpp>
|
|
#include <boost/log/expressions.hpp>
|
|
#include <boost/log/attributes/current_process_name.hpp>
|
|
#include <boost/log/sinks/sync_frontend.hpp>
|
|
#include <boost/log/sinks/basic_sink_backend.hpp>
|
|
#include <boost/log/sources/record_ostream.hpp>
|
|
#include <boost/log/utility/value_ref.hpp>
|
|
#include <boost/log/utility/formatting_ostream.hpp>
|
|
#include <boost/log/utility/manipulators/add_value.hpp>
|
|
|
|
namespace logging = boost::log;
|
|
namespace attrs = boost::log::attributes;
|
|
namespace src = boost::log::sources;
|
|
namespace expr = boost::log::expressions;
|
|
namespace sinks = boost::log::sinks;
|
|
namespace keywords = boost::log::keywords;
|
|
|
|
//[ example_extension_app_launcher_definition
|
|
// The backend starts an external application to display notifications
|
|
class app_launcher :
|
|
public sinks::basic_formatted_sink_backend<
|
|
char, /*< target character type >*/
|
|
sinks::synchronized_feeding /*< in order not to spawn too many application instances we require records to be processed serial >*/
|
|
>
|
|
{
|
|
public:
|
|
// The function consumes the log records that come from the frontend
|
|
void consume(logging::record_view const& rec, string_type const& command_line);
|
|
};
|
|
//]
|
|
|
|
//[ example_extension_app_launcher_consume
|
|
// The function consumes the log records that come from the frontend
|
|
void app_launcher::consume(logging::record_view const& rec, string_type const& command_line)
|
|
{
|
|
std::system(command_line.c_str());
|
|
}
|
|
//]
|
|
|
|
//[ example_extension_app_launcher_formatting
|
|
BOOST_LOG_ATTRIBUTE_KEYWORD(process_name, "ProcessName", std::string)
|
|
BOOST_LOG_ATTRIBUTE_KEYWORD(caption, "Caption", std::string)
|
|
|
|
// Custom severity level formatting function
|
|
std::string severity_level_as_urgency(
|
|
logging::value_ref< logging::trivial::severity_level, logging::trivial::tag::severity > const& level)
|
|
{
|
|
if (!level || level.get() == logging::trivial::info)
|
|
return "normal";
|
|
logging::trivial::severity_level lvl = level.get();
|
|
if (lvl < logging::trivial::info)
|
|
return "low";
|
|
else
|
|
return "critical";
|
|
}
|
|
|
|
// The function initializes the logging library
|
|
void init_logging()
|
|
{
|
|
boost::shared_ptr< logging::core > core = logging::core::get();
|
|
|
|
typedef sinks::synchronous_sink< app_launcher > sink_t;
|
|
boost::shared_ptr< sink_t > sink(new sink_t());
|
|
|
|
const std::pair< const char*, const char* > shell_decorations[] =
|
|
{
|
|
std::pair< const char*, const char* >("\"", "\\\""),
|
|
std::pair< const char*, const char* >("$", "\\$"),
|
|
std::pair< const char*, const char* >("!", "\\!")
|
|
};
|
|
|
|
// Make the formatter generate the command line for notify-send
|
|
sink->set_formatter
|
|
(
|
|
expr::stream << "notify-send -t 2000 -u "
|
|
<< boost::phoenix::bind(&severity_level_as_urgency, logging::trivial::severity.or_none())
|
|
<< expr::if_(expr::has_attr(process_name))
|
|
[
|
|
expr::stream << " -a '" << process_name << "'"
|
|
]
|
|
<< expr::if_(expr::has_attr(caption))
|
|
[
|
|
expr::stream << " \"" << expr::char_decor(shell_decorations)[ expr::stream << caption ] << "\""
|
|
]
|
|
<< " \"" << expr::char_decor(shell_decorations)[ expr::stream << expr::message ] << "\""
|
|
);
|
|
|
|
core->add_sink(sink);
|
|
|
|
// Add attributes that we will use
|
|
core->add_global_attribute("ProcessName", attrs::current_process_name());
|
|
}
|
|
//]
|
|
|
|
//[ example_extension_app_launcher_logging
|
|
void test_notifications()
|
|
{
|
|
BOOST_LOG_TRIVIAL(debug) << "Hello, it's a simple notification";
|
|
BOOST_LOG_TRIVIAL(info) << logging::add_value(caption, "Caption text") << "And this notification has caption as well";
|
|
}
|
|
//]
|
|
|
|
int main(int, char*[])
|
|
{
|
|
init_logging();
|
|
test_notifications();
|
|
|
|
return 0;
|
|
}
|