#ifndef _WIN32 #include #endif #include #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "TaskMan.h" #include "Task.h" #include "BString.h" #include "gettext.h" Task::Task() : current(0), state(TASK_ON_HOLD), stopped(false), suspended(false), wbta(0), wta(0), BurstHandle(0) { TaskMan::AddTask(this); } Task::~Task() { TaskMan::RemoveFromWatches(this); TaskMan::RemoveTimeout(this); if (wbta) wbta->wta = 0; if (wta) wta->wbta = 0; } int Task::Do() throw (GeneralException) { return TASK_ON_HOLD; } int Task::Run() { if (TaskMan::Event() == Task::EVT_TASK) wta = 0; 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; wta = t; } void Task::WaitFor(pid_t p) { TaskMan::WaitFor(p, this); } void Task::WaitFor(const 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; } void Task::RemoveTimeout() { TaskMan::RemoveTimeout(this); }