Accessor for ClosedCaptionsDialog.
[dcpomatic.git] / src / lib / job.cc
index ccb75fa9332379ad27488da0e101ba786c150986..8966a65e700eb84b8f3945eb7d81987d8c88f7b5 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -28,6 +28,7 @@
 #include "exceptions.h"
 #include "film.h"
 #include "log.h"
+#include "dcpomatic_log.h"
 #include "compose.hpp"
 #include <dcp/exceptions.h>
 #include <sub/exceptions.h>
@@ -45,9 +46,7 @@ using std::cout;
 using boost::shared_ptr;
 using boost::optional;
 using boost::function;
-
-#define LOG_ERROR_NC(...) if (_film) { _film->log()->log (__VA_ARGS__, LogEntry::TYPE_ERROR); }
-#define LOG_GENERAL(...) if (_film) { _film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL); }
+using namespace dcpomatic;
 
 /** @param film Associated film, or 0 */
 Job::Job (shared_ptr<const Film> film)
@@ -63,6 +62,12 @@ Job::Job (shared_ptr<const Film> film)
 }
 
 Job::~Job ()
+{
+       stop_thread ();
+}
+
+void
+Job::stop_thread ()
 {
        if (_thread) {
                _thread->interrupt ();
@@ -77,6 +82,7 @@ Job::~Job ()
        }
 
        delete _thread;
+       _thread = 0;
 }
 
 /** Start the job in a separate thread, returning immediately */
@@ -174,6 +180,24 @@ Job::run_wrapper ()
                set_progress (1);
                set_state (FINISHED_ERROR);
 
+       } catch (dcp::DCPReadError& e) {
+
+               set_error (e.message(), e.detail().get_value_or(""));
+               set_progress (1);
+               set_state (FINISHED_ERROR);
+
+       } catch (KDMError& e) {
+
+               set_error (e.summary(), e.detail());
+               set_progress (1);
+               set_state (FINISHED_ERROR);
+
+       } catch (FileError& e) {
+
+               set_error (e.what(), e.what());
+               set_progress (1);
+               set_state (FINISHED_ERROR);
+
        } catch (std::exception& e) {
 
                set_error (
@@ -278,6 +302,7 @@ Job::set_state (State s)
 
        if (finished) {
                emit (boost::bind (boost::ref (Finished)));
+               FinishedImmediate ();
        }
 }
 
@@ -387,8 +412,6 @@ void
 Job::set_error (string s, string d)
 {
        if (_film) {
-               LOG_ERROR_NC (s);
-               LOG_ERROR_NC (d);
                _film->log()->log (String::compose ("Error in job: %1 (%2)", s, d), LogEntry::TYPE_ERROR);
        }
 
@@ -434,7 +457,7 @@ Job::status () const
                        if (now.date() != finish.date()) {
                                /// TRANSLATORS: the %1 in this string will be filled in with a day of the week
                                /// to say what day a job will finish.
-                               day = String::compose (_(" on %1"), finish.date().day_of_week().as_long_string());
+                               day = String::compose (_(" on %1"), day_of_week_to_string(finish.date().day_of_week()));
                        }
                        /// TRANSLATORS: "remaining; finishing at" here follows an amount of time that is remaining
                        /// on an operation; after it is an estimated wall-clock completion time.
@@ -507,13 +530,27 @@ Job::cancel ()
        _thread = 0;
 }
 
-void
+/** @return true if the job was paused, false if it was not running */
+bool
 Job::pause_by_user ()
 {
-       if (running ()) {
-               set_state (PAUSED_BY_USER);
+       bool paused = false;
+       {
+               boost::mutex::scoped_lock lm (_state_mutex);
+               /* We can set _state here directly because we have a lock and we aren't
+                  setting the job to FINISHED_*
+               */
+               if (_state == RUNNING) {
+                       paused = true;
+                       _state = PAUSED_BY_USER;
+               }
+       }
+
+       if (paused) {
                _pause_changed.notify_all ();
        }
+
+       return paused;
 }
 
 void
@@ -544,3 +581,17 @@ Job::when_finished (boost::signals2::connection& connection, function<void()> fi
                connection = Finished.connect (finished);
        }
 }
+
+optional<string>
+Job::message () const
+{
+       boost::mutex::scoped_lock lm (_state_mutex);
+       return _message;
+}
+
+void
+Job::set_message (string m)
+{
+       boost::mutex::scoped_lock lm (_state_mutex);
+       _message = m;
+}