#include <libdcp/exceptions.h>
#include "job.h"
#include "util.h"
+#include "cross.h"
+#include "ui_signaller.h"
+#include "exceptions.h"
#include "i18n.h"
using std::stringstream;
using boost::shared_ptr;
-Job::Job (shared_ptr<Film> f)
+Job::Job (shared_ptr<const Film> f)
: _film (f)
, _thread (0)
, _state (NEW)
set_error (e.what(), m);
+ } catch (OpenFileError& e) {
+
+ set_progress (1);
+ set_state (FINISHED_ERROR);
+
+ set_error (
+ String::compose (_("Could not open %1"), e.file().string()),
+ String::compose (_("DCP-o-matic could not open the file %1. Perhaps it does not exist or is in an unexpected format."), e.file().string())
+ );
+
} catch (boost::thread_interrupted &) {
set_state (FINISHED_CANCELLED);
-
+
} catch (std::exception& e) {
set_progress (1);
return _state == FINISHED_CANCELLED;
}
+bool
+Job::paused () const
+{
+ boost::mutex::scoped_lock lm (_state_mutex);
+ return _state == PAUSED;
+}
+
/** Set the state of this job.
* @param s New state.
*/
void
Job::set_state (State s)
{
- boost::mutex::scoped_lock lm (_state_mutex);
- _state = s;
+ bool finished = false;
+
+ {
+ boost::mutex::scoped_lock lm (_state_mutex);
+ _state = s;
+
+ if (_state == FINISHED_OK || _state == FINISHED_ERROR || _state == FINISHED_CANCELLED) {
+ _ran_for = elapsed_time ();
+ finished = true;
+ }
+ }
- if (_state == FINISHED_OK || _state == FINISHED_ERROR) {
- _ran_for = elapsed_time ();
+ if (finished && ui_signaller) {
+ ui_signaller->emit (boost::bind (boost::ref (Finished)));
}
}
_progress_unknown = false;
_stack.back().normalised = p;
boost::this_thread::interruption_point ();
+
+ if (paused ()) {
+ dcpomatic_sleep (1);
+ }
+
+ if (ui_signaller) {
+ ui_signaller->emit (boost::bind (boost::ref (Progress)));
+ }
}
/** @return fractional overall progress, or -1 if not known */
_thread->interrupt ();
_thread->join ();
}
+
+void
+Job::pause ()
+{
+ if (running ()) {
+ set_state (PAUSED);
+ }
+}
+
+void
+Job::resume ()
+{
+ if (paused ()) {
+ set_state (RUNNING);
+ }
+}