X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_batch.cc;h=3570dda084a2dc0a257c43169db4bf03165b2281;hp=da8a614142ad4ad3bd5d5ca2db7e1fba9eac7ccc;hb=5a5324ed3a381a86dfe0a6e3932c1d58fdcd596f;hpb=527deef6f18c46badb396e4520d802333997add2 diff --git a/src/tools/dcpomatic_batch.cc b/src/tools/dcpomatic_batch.cc index da8a61414..3570dda08 100644 --- a/src/tools/dcpomatic_batch.cc +++ b/src/tools/dcpomatic_batch.cc @@ -1,45 +1,57 @@ /* Copyright (C) 2013-2015 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ -#include -#include -#include -#include +#include "wx/wx_util.h" +#include "wx/about_dialog.h" +#include "wx/wx_signal_manager.h" +#include "wx/job_manager_view.h" +#include "wx/config_dialog.h" +#include "wx/servers_list_dialog.h" #include "lib/version.h" #include "lib/compose.hpp" #include "lib/config.h" #include "lib/util.h" #include "lib/film.h" #include "lib/job_manager.h" -#include "wx/wx_util.h" -#include "wx/about_dialog.h" -#include "wx/wx_ui_signaller.h" -#include "wx/job_manager_view.h" +#include "lib/dcpomatic_socket.h" +#include +#include +#include +#include +#include +#include +#include using std::exception; +using std::string; +using std::cout; using boost::shared_ptr; +using boost::make_shared; +using boost::thread; +using boost::scoped_array; static std::string film_to_load; enum { ID_file_add_film = 1, - ID_file_quit, + ID_tools_encoding_servers, ID_help_about }; @@ -48,29 +60,51 @@ setup_menu (wxMenuBar* m) { wxMenu* file = new wxMenu; file->Append (ID_file_add_film, _("&Add Film...")); - file->Append (ID_file_quit, _("&Quit")); +#ifdef DCPOMATIC_OSX + file->Append (wxID_EXIT, _("&Exit")); +#else + file->Append (wxID_EXIT, _("&Quit")); +#endif + +#ifdef DCPOMATIC_OSX + file->Append (wxID_PREFERENCES, _("&Preferences...\tCtrl-P")); +#else + wxMenu* edit = new wxMenu; + edit->Append (wxID_PREFERENCES, _("&Preferences...\tCtrl-P")); +#endif + + wxMenu* tools = new wxMenu; + tools->Append (ID_tools_encoding_servers, _("Encoding servers...")); wxMenu* help = new wxMenu; help->Append (ID_help_about, _("About")); m->Append (file, _("&File")); +#ifndef DCPOMATIC_OSX + m->Append (edit, _("&Edit")); +#endif + m->Append (tools, _("&Tools")); m->Append (help, _("&Help")); } -class Frame : public wxFrame +class DOMFrame : public wxFrame { public: - Frame (wxString const & title) + DOMFrame (wxString const & title) : wxFrame (NULL, -1, title) , _sizer (new wxBoxSizer (wxVERTICAL)) + , _config_dialog (0) + , _servers_list_dialog (0) { wxMenuBar* bar = new wxMenuBar; setup_menu (bar); SetMenuBar (bar); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_add_film, this), ID_file_add_film); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_quit, this), ID_file_quit); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::help_about, this), ID_help_about); + Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_add_film, this), ID_file_add_film); + Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_quit, this), wxID_EXIT); + Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::edit_preferences, this), wxID_PREFERENCES); + Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::tools_encoding_servers, this), ID_tools_encoding_servers); + Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::help_about, this), ID_help_about); wxPanel* panel = new wxPanel (this); wxSizer* s = new wxBoxSizer (wxHORIZONTAL); @@ -82,15 +116,28 @@ public: wxSizer* buttons = new wxBoxSizer (wxHORIZONTAL); wxButton* add = new wxButton (panel, wxID_ANY, _("Add Film...")); - add->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&Frame::add_film, this)); + add->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&DOMFrame::add_film, this)); buttons->Add (add, 1, wxALL, 6); _sizer->Add (buttons, 0, wxALL, 6); panel->SetSizer (_sizer); - Bind (wxEVT_CLOSE_WINDOW, boost::bind (&Frame::close, this, _1)); - Bind (wxEVT_SIZE, boost::bind (&Frame::sized, this, _1)); + Bind (wxEVT_CLOSE_WINDOW, boost::bind (&DOMFrame::close, this, _1)); + Bind (wxEVT_SIZE, boost::bind (&DOMFrame::sized, this, _1)); + } + + void start_job (boost::filesystem::path path) + { + try { + shared_ptr film = make_shared (path); + film->read_metadata (); + film->make_dcp (); + } catch (std::exception& e) { + wxString p = std_to_wx (path.string ()); + wxCharBuffer b = p.ToUTF8 (); + error_dialog (this, wxString::Format (_("Could not open film at %s (%s)"), p.data(), std_to_wx (e.what()).data())); + } } private: @@ -99,7 +146,7 @@ private: _sizer->Layout (); ev.Skip (); } - + bool should_close () { if (!JobManager::instance()->work_to_do ()) { @@ -117,7 +164,7 @@ private: d->Destroy (); return r; } - + void close (wxCloseEvent& ev) { if (!should_close ()) { @@ -132,7 +179,7 @@ private: { add_film (); } - + void file_quit () { if (should_close ()) { @@ -140,6 +187,23 @@ private: } } + void edit_preferences () + { + if (!_config_dialog) { + _config_dialog = create_config_dialog (); + } + _config_dialog->Show (this); + } + + void tools_encoding_servers () + { + if (!_servers_list_dialog) { + _servers_list_dialog = new ServersListDialog (this); + } + + _servers_list_dialog->Show (); + } + void help_about () { AboutDialog* d = new AboutDialog (this); @@ -153,7 +217,7 @@ private: if (_last_parent) { c->SetPath (std_to_wx (_last_parent.get().string ())); } - + int r; while (true) { r = c->ShowModal (); @@ -163,17 +227,9 @@ private: break; } } - + if (r == wxID_OK) { - try { - shared_ptr film (new Film (wx_to_std (c->GetPath ()))); - film->read_metadata (); - film->make_dcp (); - } catch (std::exception& e) { - wxString p = c->GetPath (); - wxCharBuffer b = p.ToUTF8 (); - error_dialog (this, wxString::Format (_("Could not open film at %s (%s)"), p.data(), std_to_wx (e.what()).data())); - } + start_job (wx_to_std (c->GetPath ())); } _last_parent = boost::filesystem::path (wx_to_std (c->GetPath ())).parent_path (); @@ -183,6 +239,8 @@ private: boost::optional _last_parent; wxSizer* _sizer; + wxPreferencesEditor* _config_dialog; + ServersListDialog* _servers_list_dialog; }; static const wxCmdLineEntryDesc command_line_description[] = { @@ -190,17 +248,47 @@ static const wxCmdLineEntryDesc command_line_description[] = { { wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType (0), 0 } }; +class JobServer : public Server +{ +public: + JobServer (DOMFrame* frame) + : Server (Config::instance()->server_port_base() + 2) + , _frame (frame) + {} + + void handle (shared_ptr socket) + { + try { + int const length = socket->read_uint32 (); + scoped_array buffer (new char[length]); + socket->read (reinterpret_cast (buffer.get()), length); + string s (buffer.get()); + _frame->start_job (s); + socket->write (reinterpret_cast ("OK"), 3); + } catch (...) { + + } + } + +private: + DOMFrame* _frame; +}; + class App : public wxApp { bool OnInit () { + SetAppName (_("DCP-o-matic Batch Converter")); + if (!wxApp::OnInit()) { return false; } - -#ifdef DCPOMATIC_LINUX + +#ifdef DCPOMATIC_LINUX unsetenv ("UBUNTU_MENUPROXY"); -#endif +#endif + + dcpomatic_setup_path_encoding (); /* Enable i18n; this will create a Config object to look for a force-configured language. This Config @@ -220,12 +308,15 @@ class App : public wxApp */ Config::drop (); - Frame* f = new Frame (_("DCP-o-matic Batch Converter")); + DOMFrame* f = new DOMFrame (_("DCP-o-matic Batch Converter")); SetTopWindow (f); f->Maximize (); f->Show (); - ui_signaller = new wxUISignaller (this); + JobServer* server = new JobServer (f); + new thread (boost::bind (&JobServer::run, server)); + + signal_manager = new wxSignalManager (this); this->Bind (wxEVT_IDLE, boost::bind (&App::idle, this)); shared_ptr film; @@ -244,7 +335,7 @@ class App : public wxApp void idle () { - ui_signaller->ui_idle (); + signal_manager->ui_idle (); } void OnInitCmdLine (wxCmdLineParser& parser)