Fix crash when starting two batch converters at the same time.
[dcpomatic.git] / src / tools / dcpomatic_batch.cc
index 29f79ff080bf840276773c1159c12f3078c21fc1..6e054edf8d8921b2b3793bfe4dcebe398f7d514a 100644 (file)
 #include "lib/film.h"
 #include "lib/job.h"
 #include "lib/job_manager.h"
+#include "lib/make_dcp.h"
 #include "lib/transcode_job.h"
 #include "lib/util.h"
 #include "lib/version.h"
+#include <dcp/warnings.h>
+LIBDCP_DISABLE_WARNINGS
 #include <wx/aboutdlg.h>
 #include <wx/cmdline.h>
 #include <wx/preferences.h>
 #include <wx/splash.h>
 #include <wx/stdpaths.h>
 #include <wx/wx.h>
+LIBDCP_ENABLE_WARNINGS
 #include <iostream>
 #include <set>
 
@@ -211,7 +215,7 @@ public:
                                }
                        }
 
-                       film->make_dcp (TranscodeJob::ChangedBehaviour::STOP);
+                       make_dcp (film, TranscodeJob::ChangedBehaviour::STOP);
                } catch (std::exception& e) {
                        auto p = std_to_wx (path.string ());
                        auto b = p.ToUTF8 ();
@@ -369,7 +373,7 @@ public:
                , _frame (frame)
        {}
 
-       void handle (shared_ptr<Socket> socket)
+       void handle (shared_ptr<Socket> socket) override
        {
                try {
                        int const length = socket->read_uint32 ();
@@ -390,14 +394,14 @@ private:
 
 class App : public wxApp
 {
-       bool OnInit ()
+       bool OnInit () override
        {
                wxInitAllImageHandlers ();
 
                SetAppName (_("DCP-o-matic Batch Converter"));
                is_batch_converter = true;
 
-               Config::FailedToLoad.connect (boost::bind(&App::config_failed_to_load, this));
+               Config::FailedToLoad.connect(boost::bind(&App::config_failed_to_load, this, _1));
                Config::Warning.connect (boost::bind(&App::config_warning, this, _1));
 
                auto splash = maybe_show_splash ();
@@ -438,8 +442,12 @@ class App : public wxApp
                }
                _frame->Show ();
 
-               auto server = new JobServer (_frame);
-               new thread (boost::bind (&JobServer::run, server));
+               try {
+                       auto server = new JobServer (_frame);
+                       new thread (boost::bind (&JobServer::run, server));
+               } catch (boost::system::system_error& e) {
+                       error_dialog(_frame, _("Could not listen for new batch jobs.  Perhaps another instance of the DCP-o-matic Batch Converter is running."));
+               }
 
                signal_manager = new wxSignalManager (this);
                this->Bind (wxEVT_IDLE, boost::bind (&App::idle, this));
@@ -450,7 +458,7 @@ class App : public wxApp
                                try {
                                        film = make_shared<Film>(i);
                                        film->read_metadata ();
-                                       film->make_dcp (TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
+                                       make_dcp (film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
                                } catch (exception& e) {
                                        error_dialog (
                                                0,
@@ -469,13 +477,13 @@ class App : public wxApp
                signal_manager->ui_idle ();
        }
 
-       void OnInitCmdLine (wxCmdLineParser& parser)
+       void OnInitCmdLine (wxCmdLineParser& parser) override
        {
                parser.SetDesc (command_line_description);
                parser.SetSwitchChars (wxT ("-"));
        }
 
-       bool OnCmdLineParsed (wxCmdLineParser& parser)
+       bool OnCmdLineParsed (wxCmdLineParser& parser) override
        {
                for (size_t i = 0; i < parser.GetParamCount(); ++i) {
                        films_to_load.push_back (wx_to_std(parser.GetParam(i)));
@@ -484,9 +492,9 @@ class App : public wxApp
                return true;
        }
 
-       void config_failed_to_load ()
+       void config_failed_to_load(Config::LoadFailure what)
        {
-               message_dialog (_frame, _("The existing configuration failed to load.  Default values will be used instead.  These may take a short time to create."));
+               report_config_load_failure(_frame, what);
        }
 
        void config_warning (string m)