X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Flog.cc;h=efea9f6b55bc704535d07d64d7c7dd48030826c1;hb=77f7f3be256f81d2977bccdb236582e18a625ba7;hp=52dff2982222620d81a9b7426c13c2a32beb523e;hpb=3574212ee42b2bd924eb95d5c0f4f69ec9e0a2f0;p=dcpomatic.git diff --git a/src/lib/log.cc b/src/lib/log.cc index 52dff2982..efea9f6b5 100644 --- a/src/lib/log.cc +++ b/src/lib/log.cc @@ -21,11 +21,12 @@ * @brief A very simple logging class. */ -#include -#include #include "log.h" #include "cross.h" #include "config.h" +#include "safe_stringstream.h" +#include +#include #include "i18n.h" @@ -34,12 +35,13 @@ using namespace std; int const Log::TYPE_GENERAL = 0x1; int const Log::TYPE_WARNING = 0x2; int const Log::TYPE_ERROR = 0x4; -int const Log::TYPE_TIMING = 0x8; +int const Log::TYPE_DEBUG = 0x8; +int const Log::TYPE_TIMING = 0x10; Log::Log () : _types (0) { - Config::instance()->Changed.connect (boost::bind (&Log::config_changed, this)); + _config_connection = Config::instance()->Changed.connect (boost::bind (&Log::config_changed, this)); config_changed (); } @@ -63,7 +65,7 @@ Log::log (string message, int type) time (&t); string a = ctime (&t); - stringstream s; + SafeStringStream s; s << a.substr (0, a.length() - 1) << N_(": "); if (type & TYPE_ERROR) { @@ -90,10 +92,26 @@ Log::microsecond_log (string m, int t) struct timeval tv; gettimeofday (&tv, 0); - stringstream s; + SafeStringStream s; s << tv.tv_sec << N_(":") << tv.tv_usec << N_(" ") << m; do_log (s.str ()); -} +} + +void +Log::dcp_log (dcp::NoteType type, string m) +{ + switch (type) { + case dcp::DCP_PROGRESS: + log (m, TYPE_GENERAL); + break; + case dcp::DCP_ERROR: + log (m, TYPE_ERROR); + break; + case dcp::DCP_NOTE: + log (m, TYPE_WARNING); + break; + } +} void Log::set_types (int t) @@ -122,3 +140,45 @@ FileLog::do_log (string m) fclose (f); } +string +FileLog::head_and_tail (int amount) const +{ + boost::mutex::scoped_lock lm (_mutex); + + uintmax_t head_amount = amount; + uintmax_t tail_amount = amount; + uintmax_t size = boost::filesystem::file_size (_file); + + if (size < (head_amount + tail_amount)) { + head_amount = size; + tail_amount = 0; + } + + FILE* f = fopen_boost (_file, "r"); + if (!f) { + return ""; + } + + string out; + + char* buffer = new char[max(head_amount, tail_amount) + 1]; + + int N = fread (buffer, 1, head_amount, f); + buffer[N] = '\0'; + out += string (buffer); + + if (tail_amount > 0) { + out += "\n .\n .\n .\n"; + + fseek (f, - tail_amount - 1, SEEK_END); + + N = fread (buffer, 1, tail_amount, f); + buffer[N] = '\0'; + out += string (buffer) + "\n"; + } + + delete[] buffer; + fclose (f); + + return out; +}