/[projects]/smsdaemon/TaskManager.cpp
ViewVC logotype

Annotation of /smsdaemon/TaskManager.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 207 - (hide annotations) (download)
Sun Dec 21 17:42:30 2008 UTC (15 years, 5 months ago) by torben
File size: 3349 byte(s)
Loaded tasks should also be configurable

1 torben 196
2 torben 26 #include "TaskManager.h"
3    
4 torben 157 #include "Logger.h"
5 torben 207 #include "Common.h"
6     #include "Util.h"
7     #include "ConfigFile.h"
8 torben 26
9 torben 82 #include <time.h>
10 torben 26
11 torben 132 #include "tasks/SpoolTask.h"
12    
13    
14 torben 26 TaskManager::TaskManager()
15 torben 196 : _lastExecuted(0)
16 torben 26 {
17     }
18 torben 196
19 torben 26 TaskManager::~TaskManager()
20 torben 196 {
21 torben 96 //delete any temporary tasks still in the list
22     std::list<Task*>::iterator it;
23     for (it = _temp_tasks.begin(); it != _temp_tasks.end(); ++it)
24     {
25     delete (*it);
26     }
27 torben 26 }
28    
29 torben 207 Task* TaskManager::CreateTask(const std::string& taskName, const std::map<std::string, std::string>& arguments)
30     {
31     if (taskName =="spool")
32     return new SpoolTask();
33 torben 26
34 torben 207 return 0;
35     }
36    
37     void TaskManager::DestroyTasks()
38     {
39     }
40    
41 torben 26 void TaskManager::LoadTasks()
42     {
43    
44 torben 207 Logger::logMessage("-------- TaskList --------");
45     std::vector<Value> tasklist = Common::instance()->GetConfigfile()->GetValues("smsdaemon", "task");
46    
47     for (unsigned i=0; i<tasklist.size(); i++)
48     {
49     std::string current = tasklist[i];
50    
51     std::string name;
52     unsigned pos = current.find(' ');
53     std::map<std::string,std::string> args;
54    
55     std::string argstr;
56    
57     if (pos == std::string::npos)
58     {
59     name = current;
60     }
61     else
62     {
63     name = Util::str_trim(current.substr(0,pos));
64     argstr = Util::str_trim(current.substr(pos+1,1024));
65     args = ConfigHelper::ParseArguments(argstr);
66     }
67    
68     Task* task = 0;
69     try
70     {
71     task = CreateTask(name, args );
72     }
73     catch (std::exception& e)
74     {
75     Logger::logMessage(std::string("Failed to load task ") + name + " with args: " + argstr);
76     Logger::logMessage(std::string("Reason: ") + e.what());
77     continue;
78     }
79    
80     if (task)
81     AddPersistantTask(task);
82     else
83     Logger::logMessage( std::string("Unknown task: ")+name);
84    
85     }
86    
87 torben 104 //print the loaded tasks
88 torben 196 std::map<std::string, Task*>::iterator it;
89     for (it = _persistant_tasks.begin(); it != _persistant_tasks.end(); ++it)
90 torben 104 {
91     Task* tsk = (*it).second;
92     if (tsk != 0)
93 torben 157 Logger::logMessage( std::string("Loaded task \"") + tsk->GetName() + "\"" );
94 torben 104 }
95 torben 26 }
96    
97 torben 82
98 torben 129 void TaskManager::AddPersistantTask(Task* task)
99 torben 82 {
100    
101 torben 96 if (task != 0)
102 torben 82 {
103 torben 96 std::string name = task->GetName();
104 torben 82
105 torben 129 if ( _persistant_tasks[ name ] == 0)
106     _persistant_tasks[ name ] = task;
107 torben 96 else
108 torben 157 Logger::logMessage( std::string("AddTask() -- already have a task called ") + name);
109 torben 82 }
110 torben 96 else
111     {
112 torben 157 Logger::logMessage("AddTask() -- cannot register a null pointer");
113 torben 96 }
114 torben 82 }
115    
116 torben 96 void TaskManager::AddTemporaryTask(Task* task)
117 torben 26 {
118 torben 96 _temp_tasks.push_back(task);
119 torben 26 }
120    
121    
122 torben 149 void TaskManager::ExecuteTasks(ISmsTransceiver& modem)
123 torben 26 {
124 torben 189 const int SLEEP_TIME = 2; //wait this long between task executions
125 torben 96 int now = time(0);
126 torben 26
127 torben 196 if (now < (_lastExecuted + SLEEP_TIME) )
128 torben 96 return;
129    
130     _lastExecuted = now;
131    
132     //execute real tasks
133    
134     std::map<std::string, Task*>::iterator m_it;
135    
136 torben 129 for (m_it = _persistant_tasks.begin(); m_it != _persistant_tasks.end(); ++m_it)
137 torben 26 {
138 torben 96 Task* tsk = (*m_it).second;
139     tsk->ExecuteTask(modem);
140 torben 26 }
141    
142 torben 96 //execute temporary tasks
143 torben 26
144 torben 96 std::list<Task*>::iterator l_it;
145     for (l_it = _temp_tasks.begin(); l_it != _temp_tasks.end(); ++l_it)
146     {
147     Task* tsk = (*l_it);
148     tsk->ExecuteTask(modem);
149    
150     if ( tsk->IsFinished() )
151     {
152     delete tsk;
153 torben 196 l_it = _temp_tasks.erase(l_it);
154    
155 torben 96 //now l_it points to the next element in the list,
156     //but since the for() loop will increment it before next iteration we will decrease it here
157 torben 196 --l_it;
158 torben 96 }
159     }
160    
161    
162 torben 26 }
163    
164    
165 torben 129 Task* TaskManager::GetPersistantTask(const std::string& taskname)
166 torben 96 {
167 torben 129 return _persistant_tasks[ taskname ];
168 torben 96 }

  ViewVC Help
Powered by ViewVC 1.1.20