--- smsdaemon/TaskManager.cpp 2008/06/16 11:30:20 92 +++ smsdaemon/TaskManager.cpp 2008/06/16 14:04:19 96 @@ -11,7 +11,13 @@ } TaskManager::~TaskManager() -{ +{ + //delete any temporary tasks still in the list + std::list::iterator it; + for (it = _temp_tasks.begin(); it != _temp_tasks.end(); ++it) + { + delete (*it); + } } @@ -21,48 +27,77 @@ } -void TaskManager::ExecuteTasks(IGsmModem& modem) +void TaskManager::AddTask(Task* task) { - const int SLEEP_TIME = 10; //wait at least 10 seconds between executions - int now = time(0); + Common* cmn = Common::instance(); - if (now > (_lastExecuted + SLEEP_TIME) ) + if (task != 0) { - _lastExecuted = now; - - std::map::iterator it; + std::string name = task->GetName(); - for (it = _tasks.begin(); it != _tasks.end(); ++it) - { - Task* tsk = (*it).second; - tsk->ExecuteTask(modem); - } + if ( _tasks[ name ] == 0) + _tasks[ name ] = task; + else + cmn->logMessage( std::string("AddTask() -- already have a task called ") + name); + } + else + { + cmn->logMessage("AddTask() -- cannot register a null pointer"); } } - -Task* TaskManager::GetTask(const std::string& taskname) +void TaskManager::AddTemporaryTask(Task* task) { - return _tasks[ taskname ]; + _temp_tasks.push_back(task); } -std::vector TaskManager::GetTaskList() +void TaskManager::ExecuteTasks(IGsmModem& modem) { - typedef std::map::iterator MapIterator; - std::vector task_list; + const int SLEEP_TIME = 10; //wait at least 10 seconds between executions + int now = time(0); - for (MapIterator it = _tasks.begin(); it != _tasks.end(); ++it) + if (now < (_lastExecuted + SLEEP_TIME) ) + return; + + _lastExecuted = now; + + //execute real tasks + + std::map::iterator m_it; + + for (m_it = _tasks.begin(); m_it != _tasks.end(); ++m_it) { - Task* pl = (*it).second; - task_list.push_back(pl); + Task* tsk = (*m_it).second; + tsk->ExecuteTask(modem); } + //execute temporary tasks - return task_list; -} + std::list::iterator l_it; + for (l_it = _temp_tasks.begin(); l_it != _temp_tasks.end(); ++l_it) + { + Task* tsk = (*l_it); + tsk->ExecuteTask(modem); + + if ( tsk->IsFinished() ) + { + delete tsk; + l_it = _temp_tasks.erase(l_it); + + //now l_it points to the next element in the list, + //but since the for() loop will increment it before next iteration we will decrease it here + --l_it; + } + } +} + +Task* TaskManager::GetTask(const std::string& taskname) +{ + return _tasks[ taskname ]; +}