// This file is under GNU General Public License 3.0 // see LICENSE.txt #include "pEpLog.hh" #include #include #include #include #include #include "std_utils.hh" #ifdef ANDROID #include #endif using namespace std; namespace pEp { namespace Adapter { namespace pEpLog { int line_width = 120; // NON CLASS mutex mtx; atomic_bool is_enabled{ false }; void set_enabled(const bool& enabled) { is_enabled.store(enabled); } bool get_enabled() { return is_enabled.load(); } // Common "print" function implementing the actual "backends" void _log(const string& msg, Utils::Color col = Utils::Color::WHITE) { lock_guard l(mtx); #ifdef ANDROID __android_log_print(ANDROID_LOG_DEBUG, "pEpDebugLog", "%s", msg.c_str()); #else cerr << Utils::to_termcol(col) << msg << Utils::to_termcol(Utils::Color::RESET) << endl; //endl also flushes, but cerr is unbuffered anyways #endif } void log(const string& msg, Utils::Color col) { _log(msg, col); } void logH1(const string& msg, Utils::Color col) { log(decorate_three_lines(msg, '='), col); } void logH2(const string& msg, Utils::Color col) { log( "\n" +decorate_centered(msg, '='), col); } void logH3(const string& msg, Utils::Color col) { log( decorate_centered(msg, '-'), col); } string decorate_three_lines(const string& msg, char decoration) { stringstream tmp; tmp << std::string(line_width, decoration) << endl << msg << endl << std::string(line_width, decoration); return tmp.str(); } string decorate_centered(const string& msg, char decoration) { stringstream tmp; size_t max_len = line_width - 10; // truncate msg string msg_truncated = msg; if (msg.length() >= max_len) { msg_truncated = msg.substr(0, max_len); msg_truncated += "..."; } // define decolen int decolen = static_cast( floor((double(line_width - msg_truncated.length()))) / 2.0); tmp << std::string(decolen, decoration) << ' ' << msg_truncated << ' ' << std::string(decolen, decoration); return tmp.str(); } } // namespace pEpLog } // namespace Adapter } // namespace pEp namespace pEp { namespace Adapter { namespace pEpLog { // Class pEpLogger int pEpLogger::auto_instance_nr = 0; pEpLogger::pEpLogger(const string& classname, const bool& enabled) : classname(classname), is_enabled(enabled) { auto_instance_nr++; this->set_instancename(to_string(auto_instance_nr)); } void pEpLogger::log(const string& msg, Utils::Color col) const { std::stringstream msg_; msg_ << "[" << _getpid() << " " << std::this_thread::get_id() << "]"; msg_ << " - "; msg_ << this->get_classname() << "[" << this->get_instancename() << "]"; msg_ << " - " << msg; this->logRaw(msg_.str(), col); } void pEpLogger::logRaw(const string& msg, Utils::Color col) const { if (this->is_enabled) { _log(msg, col); } } void pEpLogger::set_enabled(const bool& enabled) { this->is_enabled = enabled; } bool pEpLogger::get_enabled() const { return this->is_enabled; } string pEpLogger::get_classname() const { return this->classname; } void pEpLogger::set_instancename(const string& name) { this->instancename = name; } string pEpLogger::get_instancename() const { return this->instancename; } } // namespace pEpLog } // namespace Adapter } // namespace pEp