#include #include #include "TaskMan.h" #include "Task.h" #include "String.h" #include "config.h" Task::Task() : current(0), state(TASK_ON_HOLD), stopped(false), suspended(false), wbta(0) { TaskMan::AddTask(this); } Task::~Task() { TaskMan::RemoveFromWatches(this); } int Task::Do() throw (GeneralException) { return TASK_ON_HOLD; } int Task::Run() { try { state = Do(); } catch (TaskSwitch) { return state; } catch (GeneralException e) { std::cerr << _("Task ") << GetName() << _(" caused an unexpected exception: \"") << e.GetMsg() << _("\". Terminating.\n"); state = TASK_DONE; return TASK_DONE; } return state; } int Task::DryRun() { while (state != TASK_DONE) { try { state = Do(); } catch (TaskSwitch) { } catch (GeneralException e) { std::cerr << _("Task ") << GetName() << _(" caused an unexpected exception during dry-run: \"") << e.GetMsg() << _("\". Terminating.\n"); state = TASK_DONE; } } return state; } int Task::GetState() { return state; } String Task::GetName() { return _("Unknow Task"); } void Task::Suspend(int newstate) throw (GeneralException) { if (newstate != -1) { state = newstate; } suspended = true; throw TaskSwitch(); } void Task::WaitFor(Handle * h, int flags) { h->SetNonBlock(); TaskMan::WaitFor(h, this, flags); } void Task::WaitFor(Task * t) { t->wbta = this; } void Task::WaitFor(pid_t p) { TaskMan::WaitFor(p, this); } void Task::WaitFor(timeval t, int flags) { TaskMan::WaitFor(t, this, flags); } void Task::SetBurst() { state = TASK_BURST; } void Task::Stop() { stopped = true; } void Task::Restart() { stopped = false; } bool Task::IsStopped() { return stopped; } Task * Task::WaitedBy() { return wbta; } void Task::RemoveFromWatches() { wbta = 0; }