danicoin/src/Logging/LoggerMessage.cpp
2016-01-18 15:33:29 +00:00

101 lines
2.5 KiB
C++

// Copyright (c) 2011-2016 The Cryptonote developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "LoggerMessage.h"
namespace Logging {
LoggerMessage::LoggerMessage(ILogger& logger, const std::string& category, Level level, const std::string& color)
: std::ostream(this)
, std::streambuf()
, logger(logger)
, category(category)
, logLevel(level)
, message(color)
, timestamp(boost::posix_time::microsec_clock::local_time())
, gotText(false) {
}
LoggerMessage::~LoggerMessage() {
if (gotText) {
(*this) << std::endl;
}
}
#ifndef __linux__
LoggerMessage::LoggerMessage(LoggerMessage&& other)
: std::ostream(std::move(other))
, std::streambuf(std::move(other))
, category(other.category)
, logLevel(other.logLevel)
, logger(other.logger)
, message(other.message)
, timestamp(boost::posix_time::microsec_clock::local_time())
, gotText(false) {
this->set_rdbuf(this);
}
#else
LoggerMessage::LoggerMessage(LoggerMessage&& other)
: std::ostream(nullptr)
, std::streambuf()
, category(other.category)
, logLevel(other.logLevel)
, logger(other.logger)
, message(other.message)
, timestamp(boost::posix_time::microsec_clock::local_time())
, gotText(false) {
if (this != &other) {
_M_tie = nullptr;
_M_streambuf = nullptr;
//ios_base swap
std::swap(_M_streambuf_state, other._M_streambuf_state);
std::swap(_M_exception, other._M_exception);
std::swap(_M_flags, other._M_flags);
std::swap(_M_precision, other._M_precision);
std::swap(_M_width, other._M_width);
std::swap(_M_callbacks, other._M_callbacks);
std::swap(_M_ios_locale, other._M_ios_locale);
//ios_base swap
//streambuf swap
char *_Pfirst = pbase();
char *_Pnext = pptr();
char *_Pend = epptr();
char *_Gfirst = eback();
char *_Gnext = gptr();
char *_Gend = egptr();
setp(other.pbase(), other.epptr());
other.setp(_Pfirst, _Pend);
setg(other.eback(), other.gptr(), other.egptr());
other.setg(_Gfirst, _Gnext, _Gend);
std::swap(_M_buf_locale, other._M_buf_locale);
//streambuf swap
std::swap(_M_fill, other._M_fill);
std::swap(_M_tie, other._M_tie);
}
_M_streambuf = this;
}
#endif
int LoggerMessage::sync() {
logger(category, logLevel, timestamp, message);
gotText = false;
message = DEFAULT;
return 0;
}
int LoggerMessage::overflow(int c) {
gotText = true;
message += static_cast<char>(c);
return 0;
}
}