|
|
|
@ -41,7 +41,7 @@
|
|
|
|
|
#include "date/date.h" |
|
|
|
|
#include "utf8/utf8.h" |
|
|
|
|
|
|
|
|
|
#ifdef PT_HAS_MORM |
|
|
|
|
#ifdef PT_HAS_MORM_LIBRARY |
|
|
|
|
#include "morm.h" |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
@ -54,113 +54,156 @@ Log::Log()
|
|
|
|
|
{ |
|
|
|
|
buffer = nullptr; |
|
|
|
|
file_log = nullptr; |
|
|
|
|
|
|
|
|
|
current_level = 4; |
|
|
|
|
max_buffer_length = 2 * 1024 * 1024; // 2MB
|
|
|
|
|
max_buffer_length = 2 * 1024 * 1024; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log::~Log() |
|
|
|
|
{ |
|
|
|
|
// IMPROVE ME
|
|
|
|
|
// I am not sure if this is a correct behaviour
|
|
|
|
|
// the log buffer and file logger may not exist now
|
|
|
|
|
// (life time of objects)
|
|
|
|
|
// may would be better to have a flag 'clear_at_the_end'
|
|
|
|
|
// and if true then call this method?
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
save_log_and_clear(); |
|
|
|
|
|
|
|
|
|
bool Log::can_put_log() |
|
|
|
|
{ |
|
|
|
|
return (buffer && file_log && current_level <= file_log->get_log_level()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Log::SetLogBuffer(WTextStream * buffer) |
|
|
|
|
bool Log::is_char_stream() const |
|
|
|
|
{ |
|
|
|
|
this->buffer = buffer; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WTextStream * Log::GetLogBuffer() |
|
|
|
|
bool Log::is_wchar_stream() const |
|
|
|
|
{ |
|
|
|
|
return buffer; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Log::SetMaxBufferLength(size_t max_buffer_length) |
|
|
|
|
|
|
|
|
|
void Log::clear() |
|
|
|
|
{ |
|
|
|
|
this->max_buffer_length = max_buffer_length; |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
buffer->clear(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
size_t Log::GetMaxBufferLength() |
|
|
|
|
bool Log::empty() const |
|
|
|
|
{ |
|
|
|
|
return max_buffer_length; |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
return buffer->empty(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Log::SetFileLog(FileLog * file_log) |
|
|
|
|
size_t Log::size() const |
|
|
|
|
{ |
|
|
|
|
this->file_log = file_log; |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
buffer->size(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FileLog * Log::GetFileLog() |
|
|
|
|
void Log::reserve(size_t len) |
|
|
|
|
{ |
|
|
|
|
return file_log; |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
buffer->reserve(len); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::IntMinWidth(size_t min_width) |
|
|
|
|
size_t Log::capacity() const |
|
|
|
|
{ |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
buffer->int_min_width(min_width); |
|
|
|
|
buffer->capacity(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const void * s) |
|
|
|
|
|
|
|
|
|
void Log::to_str(std::string & str, bool clear_string) const |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << s; |
|
|
|
|
buffer->to_str(str, clear_string); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
|
|
|
|
|
void Log::to_str(std::wstring & str, bool clear_string) const |
|
|
|
|
{ |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
buffer->to_str(str, clear_string); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const char * s) |
|
|
|
|
std::string Log::to_str() const |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && s && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
utf8_to_wide(s, *buffer, false); |
|
|
|
|
return buffer->to_str(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
return std::string(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring Log::to_wstr() const |
|
|
|
|
{ |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
return buffer->to_wstr(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const std::string & s) |
|
|
|
|
return std::wstring(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char Log::get_char(size_t index) const |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
utf8_to_wide(s, *buffer, false); |
|
|
|
|
return buffer->get_char(index); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wchar_t Log::get_wchar(size_t index) const |
|
|
|
|
{ |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
return buffer->get_wchar(index); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const std::string * s) |
|
|
|
|
Log & Log::operator<<(const char * s) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
utf8_to_wide(*s, *buffer, false); |
|
|
|
|
(*buffer) << s; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
@ -168,12 +211,20 @@ Log & Log::operator<<(const std::string * s)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const std::string & s) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << s; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const wchar_t * s) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && s && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << s; |
|
|
|
|
} |
|
|
|
@ -182,10 +233,9 @@ Log & Log::operator<<(const wchar_t * s)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const std::wstring & s) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << s; |
|
|
|
|
} |
|
|
|
@ -194,49 +244,67 @@ Log & Log::operator<<(const std::wstring & s)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const std::wstring * s) |
|
|
|
|
Log & Log::operator<<(char val) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && s && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << *s; |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(unsigned char val) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(int s) |
|
|
|
|
Log & Log::operator<<(wchar_t val) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << s; |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(bool val) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(long s) |
|
|
|
|
Log & Log::operator<<(short val) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << s; |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(long long s) |
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(int val) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << s; |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
@ -244,29 +312,85 @@ Log & Log::operator<<(long long s)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(char s) |
|
|
|
|
Log & Log::operator<<(long val) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << s; |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(wchar_t s) |
|
|
|
|
Log & Log::operator<<(long long val) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << s; |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(size_t s) |
|
|
|
|
Log & Log::operator<<(unsigned short val) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(unsigned int val) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(unsigned long val) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(unsigned long long val) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(float val) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(double s) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
{ |
|
|
|
@ -277,10 +401,20 @@ Log & Log::operator<<(size_t s)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(long double val) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(double s) |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const void * s) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << s; |
|
|
|
|
} |
|
|
|
@ -289,10 +423,20 @@ Log & Log::operator<<(double s)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const Stream & stream) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << stream; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const Space & s) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << s; |
|
|
|
|
} |
|
|
|
@ -301,10 +445,9 @@ Log & Log::operator<<(const Space & s)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(const Date & date) |
|
|
|
|
{ |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << date; |
|
|
|
|
} |
|
|
|
@ -313,7 +456,7 @@ Log & Log::operator<<(const Date & date)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef PT_HAS_MORM |
|
|
|
|
#ifdef PT_HAS_MORM_LIBRARY |
|
|
|
|
Log & Log::operator<<(morm::Model & model) |
|
|
|
|
{ |
|
|
|
|
operator<<(model.to_string()); |
|
|
|
@ -322,13 +465,35 @@ Log & Log::operator<<(morm::Model & model)
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::write(const char * buf, size_t len) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
buffer->write(buf, len); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::write(const wchar_t * buf, size_t len) |
|
|
|
|
{ |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
buffer->write(buf, len); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::operator<<(Manipulators m) |
|
|
|
|
{ |
|
|
|
|
switch(m) |
|
|
|
|
{ |
|
|
|
|
case lend: |
|
|
|
|
case logend: |
|
|
|
|
if( buffer && file_log && current_level <= file_log->get_log_level() ) |
|
|
|
|
if( can_put_log() ) |
|
|
|
|
{ |
|
|
|
|
(*buffer) << '\n'; |
|
|
|
|
|
|
|
|
@ -337,27 +502,22 @@ Log & Log::operator<<(Manipulators m)
|
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case lsave: |
|
|
|
|
case logsave: |
|
|
|
|
save_log_and_clear(); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case l1: |
|
|
|
|
case log1: |
|
|
|
|
current_level = 1; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case l2: |
|
|
|
|
case log2: |
|
|
|
|
current_level = 2; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case l3: |
|
|
|
|
case log3: |
|
|
|
|
current_level = 3; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case l4: |
|
|
|
|
case log4: |
|
|
|
|
current_level = 4; |
|
|
|
|
break; |
|
|
|
@ -370,18 +530,63 @@ Log & Log::operator<<(Manipulators m)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::LogString(const std::string & value, size_t max_size) |
|
|
|
|
void Log::set_log_buffer(WTextStream * buffer) |
|
|
|
|
{ |
|
|
|
|
return log_string_generic(value, max_size); |
|
|
|
|
this->buffer = buffer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WTextStream * Log::get_log_buffer() |
|
|
|
|
{ |
|
|
|
|
return buffer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Log::set_max_buffer_length(size_t max_buffer_length) |
|
|
|
|
{ |
|
|
|
|
this->max_buffer_length = max_buffer_length; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
size_t Log::get_max_buffer_length() |
|
|
|
|
{ |
|
|
|
|
return max_buffer_length; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Log::set_file_log(FileLog * file_log) |
|
|
|
|
{ |
|
|
|
|
this->file_log = file_log; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FileLog * Log::get_file_log() |
|
|
|
|
{ |
|
|
|
|
return file_log; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::int_min_width(size_t min_width) |
|
|
|
|
{ |
|
|
|
|
if( buffer ) |
|
|
|
|
{ |
|
|
|
|
buffer->int_min_width(min_width); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log & Log::LogString(const std::wstring & value, size_t max_size) |
|
|
|
|
Log & Log::put_string(const std::string & value, size_t max_size) |
|
|
|
|
{ |
|
|
|
|
return log_string_generic(value, max_size); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|