// // Copyright 2011 Ettus Research LLC // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #include #include #include #include #include #include #include #include /*********************************************************************** * Helper functions **********************************************************************/ #define tokenizer(inp, sep) \ boost::tokenizer > \ (inp, boost::char_separator(sep)) static void msg_to_cout(const std::string &msg){ std::stringstream ss; BOOST_FOREACH(const std::string &line, tokenizer(msg, "\n")){ ss << "-- " << line << std::endl; } std::cout << ss.str(); } static void msg_to_cerr(const std::string &title, const std::string &msg){ std::stringstream ss; ss << std::endl << title << ":" << std::endl; BOOST_FOREACH(const std::string &line, tokenizer(msg, "\n")){ ss << " " << line << std::endl; } std::cerr << ss.str(); } /*********************************************************************** * Global settings for the messenger **********************************************************************/ static boost::mutex msg_mutex; static std::ostringstream msg_ss; static uhd::msg::type_t msg_type; static uhd::msg::handler_t msg_handler; /*********************************************************************** * Setup the message handlers **********************************************************************/ void uhd::msg::register_handler(const handler_t &handler){ msg_mutex.lock(); msg_handler = handler; msg_mutex.unlock(); } static void default_msg_handler(uhd::msg::type_t type, const std::string &msg){ switch(type){ case uhd::msg::status: msg_to_cout(msg); break; case uhd::msg::warning: msg_to_cerr("UHD Warning", msg); break; case uhd::msg::error: msg_to_cerr("UHD Error", msg); break; } } UHD_STATIC_BLOCK(msg_register_default_handler){ uhd::msg::register_handler(&default_msg_handler); } /*********************************************************************** * The message object implementation **********************************************************************/ uhd::msg::_msg::_msg(const type_t type){ msg_mutex.lock(); msg_type = type; } uhd::msg::_msg::~_msg(void){ msg_handler(msg_type, msg_ss.str()); UHD_LOG << "Message " << char(msg_type) << std::endl << msg_ss.str(); msg_ss.str(""); //clear for next call msg_mutex.unlock(); } std::ostream & uhd::msg::_msg::get(void){ return msg_ss; }