IBR-DTNSuite
0.8
|
00001 /* 00002 * StandByManager.cpp 00003 * 00004 * Created on: 29.03.2012 00005 * Author: jm 00006 */ 00007 00008 #include "StandByManager.h" 00009 #include "core/GlobalEvent.h" 00010 #include <ibrcommon/thread/MutexLock.h> 00011 #include <ibrcommon/Logger.h> 00012 #include <typeinfo> 00013 00014 namespace dtn { 00015 namespace daemon { 00016 StandByManager::StandByManager() 00017 : _suspended(false), _enabled(false) 00018 { 00019 } 00020 00021 StandByManager::~StandByManager() 00022 { 00023 } 00024 00025 void StandByManager::adopt(Component *c) 00026 { 00027 ibrcommon::MutexLock l(_lock); 00028 _components.push_back(c); 00029 00030 IBRCOMMON_LOGGER(info) << "StandByManager: " << c->getName() << " adopted" << IBRCOMMON_LOGGER_ENDL; 00031 } 00032 00033 void StandByManager::raiseEvent(const dtn::core::Event *evt) 00034 { 00035 try { 00036 const dtn::core::GlobalEvent &global = dynamic_cast<const dtn::core::GlobalEvent&>(*evt); 00037 00038 switch (global.getAction()) 00039 { 00040 case dtn::core::GlobalEvent::GLOBAL_SUSPEND: 00041 suspend(); 00042 break; 00043 00044 case dtn::core::GlobalEvent::GLOBAL_WAKEUP: 00045 wakeup(); 00046 break; 00047 00048 default: 00049 break; 00050 } 00051 } catch (const bad_cast&) { }; 00052 } 00053 00054 void StandByManager::wakeup() 00055 { 00056 ibrcommon::MutexLock l(_lock); 00057 if ((!_suspended) || (!_enabled)) return; 00058 IBRCOMMON_LOGGER(info) << "StandByManager: wake-up components" << IBRCOMMON_LOGGER_ENDL; 00059 00060 for (std::list<Component*>::const_iterator iter = _components.begin(); iter != _components.end(); iter++) 00061 { 00062 Component &c = (**iter); 00063 c.initialize(); 00064 } 00065 00066 for (std::list<Component*>::const_iterator iter = _components.begin(); iter != _components.end(); iter++) 00067 { 00068 Component &c = (**iter); 00069 c.startup(); 00070 } 00071 00072 _suspended = false; 00073 } 00074 00075 void StandByManager::suspend() 00076 { 00077 ibrcommon::MutexLock l(_lock); 00078 if (_suspended || (!_enabled)) return; 00079 IBRCOMMON_LOGGER(info) << "StandByManager: suspend components" << IBRCOMMON_LOGGER_ENDL; 00080 00081 for (std::list<Component*>::const_iterator iter = _components.begin(); iter != _components.end(); iter++) 00082 { 00083 Component &c = (**iter); 00084 c.terminate(); 00085 } 00086 00087 _suspended = true; 00088 } 00089 00090 void StandByManager::componentUp() 00091 { 00092 bindEvent(dtn::core::GlobalEvent::className); 00093 _enabled = true; 00094 } 00095 00096 void StandByManager::componentDown() 00097 { 00098 unbindEvent(dtn::core::GlobalEvent::className); 00099 _enabled = false; 00100 } 00101 00102 const std::string StandByManager::getName() const 00103 { 00104 return "StandByManager"; 00105 } 00106 } /* namespace daemon */ 00107 } /* namespace dtn */