IBR-DTNSuite  0.8
daemon/src/StandByManager.cpp
Go to the documentation of this file.
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 */