Remove unused variable.
[dcpomatic.git] / src / lib / job.cc
index 399b235d9bee7d0264d19da544c4a20f283966d8..39ce4173a78a8af19621e5f4f31f95a946ea170c 100644 (file)
@@ -22,6 +22,8 @@
  */
 
 #include <boost/thread.hpp>
+#include <boost/filesystem.hpp>
+#include <libdcp/exceptions.h>
 #include "job.h"
 #include "util.h"
 
@@ -39,6 +41,7 @@ Job::Job (shared_ptr<const FilmState> s, shared_ptr<const Options> o, Log* l)
        , _state (NEW)
        , _start_time (0)
        , _progress_unknown (false)
+       , _ran_for (0)
 {
        assert (_log);
        
@@ -62,6 +65,12 @@ Job::run_wrapper ()
 
                run ();
 
+       } catch (libdcp::FileError& e) {
+               
+               set_progress (1);
+               set_state (FINISHED_ERROR);
+               set_error (String::compose ("%1 (%2)", e.what(), filesystem::path (e.filename()).leaf()));
+               
        } catch (std::exception& e) {
 
                set_progress (1);
@@ -111,6 +120,10 @@ Job::set_state (State s)
 {
        boost::mutex::scoped_lock lm (_state_mutex);
        _state = s;
+
+       if (_state == FINISHED_OK || _state == FINISHED_ERROR) {
+               _ran_for = elapsed_time ();
+       }
 }
 
 /** A hack to work around our lack of cross-thread
@@ -213,7 +226,7 @@ Job::set_error (string e)
        _error = e;
 }
 
-/** Set that this job's progress will always be unknown */
+/** Say that this job's progress will always be unknown */
 void
 Job::set_progress_unknown ()
 {
@@ -221,22 +234,31 @@ Job::set_progress_unknown ()
        _progress_unknown = true;
 }
 
+/** @return Human-readable status of this job */
 string
 Job::status () const
 {
        float const p = overall_progress ();
        int const t = elapsed_time ();
+       int const r = remaining_time ();
        
        stringstream s;
-       if (!finished () && p >= 0 && t > 10) {
-               s << rint (p * 100) << "%; about " << seconds_to_approximate_hms (t / p - t) << " remaining";
-       } else if (!finished () && t <= 10) {
+       if (!finished () && p >= 0 && t > 10 && r > 0) {
+               s << rint (p * 100) << "%; " << seconds_to_approximate_hms (r) << " remaining";
+       } else if (!finished () && (t <= 10 || r == 0)) {
                s << rint (p * 100) << "%";
        } else if (finished_ok ()) {
-               s << "OK (ran for " << seconds_to_hms (t) << ")";
+               s << "OK (ran for " << seconds_to_hms (_ran_for) << ")";
        } else if (finished_in_error ()) {
                s << "Error (" << error() << ")";
        }
 
        return s.str ();
 }
+
+/** @return An estimate of the remaining time for this job, in seconds */
+int
+Job::remaining_time () const
+{
+       return elapsed_time() / overall_progress() - elapsed_time();
+}