From 3c1b239453936128d1711ffa063ad4e1617b3e40 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 18 Sep 2012 02:07:59 +0100 Subject: [PATCH] Sort of working log window. --- src/lib/dcp_video_frame.cc | 4 +-- src/lib/film.cc | 2 +- src/lib/log.cc | 29 +++++++++++++------ src/lib/log.h | 27 ++++++++++++------ src/lib/server.cc | 6 ++-- src/lib/server.h | 4 +-- src/tools/servomatic_cli.cc | 3 +- src/tools/servomatic_gui.cc | 55 +++++++++++++++++++++++++++++++------ src/wx/config_dialog.cc | 4 +++ 9 files changed, 99 insertions(+), 35 deletions(-) diff --git a/src/lib/dcp_video_frame.cc b/src/lib/dcp_video_frame.cc index 91c441543..b128f6fa0 100644 --- a/src/lib/dcp_video_frame.cc +++ b/src/lib/dcp_video_frame.cc @@ -277,7 +277,7 @@ DCPVideoFrame::encode_locally () { stringstream s; - s << "Finished locally-encoded frame " << _frame << " length " << cio_tell (_cio); + s << "Finished locally-encoded frame " << _frame; _log->log (s.str ()); } @@ -342,7 +342,7 @@ DCPVideoFrame::encode_remotely (ServerDescription const * serv) { stringstream s; - s << "Finished remotely-encoded frame " << _frame << " length " << e->size(); + s << "Finished remotely-encoded frame " << _frame; _log->log (s.str ()); } diff --git a/src/lib/film.cc b/src/lib/film.cc index f8a3b192d..3b74f1888 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -88,7 +88,7 @@ Film::Film (string d, bool must_exist) read_metadata (); - _log = new Log (_state.file ("log")); + _log = new FileLog (_state.file ("log")); } /** Copy constructor */ diff --git a/src/lib/log.cc b/src/lib/log.cc index accf3694d..7f1eea206 100644 --- a/src/lib/log.cc +++ b/src/lib/log.cc @@ -27,10 +27,8 @@ using namespace std; -/** @param f Filename to write log to */ -Log::Log (string f) - : _file (f) - , _level (VERBOSE) +Log::Log () + : _level (VERBOSE) { } @@ -45,13 +43,13 @@ Log::log (string m, Level l) return; } - ofstream f (_file.c_str(), fstream::app); - time_t t; time (&t); string a = ctime (&t); - - f << a.substr (0, a.length() - 1) << ": " << m << "\n"; + + stringstream s; + s << a.substr (0, a.length() - 1) << ": " << m; + do_log (s.str ()); } void @@ -61,3 +59,18 @@ Log::set_level (Level l) _level = l; } + +/** @param file Filename to write log to */ +FileLog::FileLog (string file) + : _file (file) +{ + +} + +void +FileLog::do_log (string m) +{ + ofstream f (_file.c_str(), fstream::app); + f << m << "\n"; +} + diff --git a/src/lib/log.h b/src/lib/log.h index d32b368f5..2a242e24c 100644 --- a/src/lib/log.h +++ b/src/lib/log.h @@ -29,15 +29,11 @@ /** @class Log * @brief A very simple logging class. - * - * This class simply accepts log messages and writes them to a file. - * Its single nod to complexity is that it has a mutex to prevent - * multi-thread logging from clashing. */ class Log { public: - Log (std::string f); + Log (); enum Level { STANDARD = 0, @@ -48,13 +44,26 @@ public: void set_level (Level l); -private: - /** mutex to prevent simultaneous writes to the file */ +protected: + /** mutex to protect the log */ boost::mutex _mutex; - /** filename to write to */ - std::string _file; + +private: + virtual void do_log (std::string m) = 0; + /** level above which to ignore log messages */ Level _level; }; +class FileLog : public Log +{ +public: + FileLog (std::string file); + +private: + void do_log (std::string m); + /** filename to write to */ + std::string _file; +}; + #endif diff --git a/src/lib/server.cc b/src/lib/server.cc index f4aaa25e1..9e43601c4 100644 --- a/src/lib/server.cc +++ b/src/lib/server.cc @@ -62,8 +62,8 @@ ServerDescription::as_metadata () const return s.str (); } -Server::Server () - : _log ("servomatic.log") +Server::Server (Log* log) + : _log (log) { } @@ -129,7 +129,7 @@ Server::process (shared_ptr socket) image->hash ("Image for encoding (as received by server)"); #endif - DCPVideoFrame dcp_video_frame (image, out_size, padding, scaler, frame, frames_per_second, post_process, colour_lut_index, j2k_bandwidth, &_log); + DCPVideoFrame dcp_video_frame (image, out_size, padding, scaler, frame, frames_per_second, post_process, colour_lut_index, j2k_bandwidth, _log); shared_ptr encoded = dcp_video_frame.encode_locally (); encoded->send (socket); diff --git a/src/lib/server.h b/src/lib/server.h index 8c0f86ebb..58cfe0b3f 100644 --- a/src/lib/server.h +++ b/src/lib/server.h @@ -74,7 +74,7 @@ private: class Server { public: - Server (); + Server (Log* log); void run (); @@ -86,5 +86,5 @@ private: std::list > _queue; boost::mutex _worker_mutex; boost::condition _worker_condition; - Log _log; + Log* _log; }; diff --git a/src/tools/servomatic_cli.cc b/src/tools/servomatic_cli.cc index 1fcd02117..3ad73faf9 100644 --- a/src/tools/servomatic_cli.cc +++ b/src/tools/servomatic_cli.cc @@ -44,7 +44,8 @@ int main () { Scaler::setup_scalers (); - Server server; + FileLog log ("servomatic.log"); + Server server (&log); server.run (); return 0; } diff --git a/src/tools/servomatic_gui.cc b/src/tools/servomatic_gui.cc index d89bd91ad..1d95f498a 100644 --- a/src/tools/servomatic_gui.cc +++ b/src/tools/servomatic_gui.cc @@ -24,28 +24,65 @@ #include "lib/util.h" #include "lib/server.h" +using namespace std; using namespace boost; enum { ID_status = 1, - ID_quit + ID_quit, + ID_timer }; +class MemoryLog : public Log +{ +public: + + string get () const { + boost::mutex::scoped_lock (_mutex); + return _log; + } + +private: + void do_log (string m) + { + _log = m; + } + + string _log; +}; + +static MemoryLog memory_log; + class StatusDialog : public wxDialog { public: StatusDialog () - : wxDialog (0, wxID_ANY, _("DVD-o-matic encode server"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) + : wxDialog (0, wxID_ANY, _("DVD-o-matic encode server"), wxDefaultPosition, wxSize (600, 40), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + , _timer (this, ID_timer) { - wxFlexGridSizer* table = new wxFlexGridSizer (2, 6, 6); - table->AddGrowableCol (1, 1); + _sizer = new wxFlexGridSizer (1, 6, 6); + _sizer->AddGrowableCol (0, 1); - add_label_to_sizer (table, this, "Hello"); + _text = new wxTextCtrl (this, wxID_ANY); + _sizer->Add (_text, 1, wxEXPAND); - SetSizer (table); - table->Layout (); - table->SetSizeHints (this); + SetSizer (_sizer); + _sizer->Layout (); + + Connect (ID_timer, wxEVT_TIMER, wxTimerEventHandler (StatusDialog::update)); + _timer.Start (1000); } + +private: + void update (wxTimerEvent &) + { + _text->ChangeValue (std_to_wx (memory_log.get ())); + _sizer->Layout (); + } + + wxFlexGridSizer* _sizer; + wxTextCtrl* _text; + wxTimer _timer; }; class TaskBarIcon : public wxTaskBarIcon @@ -103,7 +140,7 @@ private: void main_thread () { - Server server; + Server server (&memory_log); server.run (); } diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc index c53eeddf0..c5d9be41f 100644 --- a/src/wx/config_dialog.cc +++ b/src/wx/config_dialog.cc @@ -287,6 +287,10 @@ ConfigDialog::remove_server_clicked (wxCommandEvent &) if (i >= 0) { _servers->DeleteItem (i); } + + vector o = Config::instance()->servers (); + o.erase (o.begin() + i); + Config::instance()->set_servers (o); } void -- 2.30.2