Beispiel #1
0
void loadTimersFromConfig()
{
	CConfigFile *config = new CConfigFile(',');

	if(!config->loadConfig(CONFIGFILE))
	{
		/* set defaults if no configuration file exists */
		dprintf("%s not found\n", CONFIGFILE);
	}
	else
	{
		vector<int> savedIDs;
		savedIDs = config->getInt32Vector ("IDS");
		dprintf("%d timer(s) in config\n",savedIDs.size());
		for(unsigned int i=0; i < savedIDs.size(); i++)
		{
			stringstream ostr;
			ostr << savedIDs[i];
			string id=ostr.str();
			CTimerd::CTimerEventTypes type=(CTimerd::CTimerEventTypes)config->getInt32 ("EVENT_TYPE_"+id,0);
			time_t now = time(NULL);
			switch(type)
			{
				case CTimerd::TIMER_SHUTDOWN :
					{
						CTimerEvent_Shutdown *event=
						new CTimerEvent_Shutdown(config, savedIDs[i]);
						if((event->alarmTime >= now) || (event->stopTime > now))
						{
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else if(event->eventRepeat != CTimerd::TIMERREPEAT_ONCE)
						{
							// old periodic timers need to be rescheduled
							event->eventState = CTimerd::TIMERSTATE_HASFINISHED;
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else
						{
							dprintf("Timer too old %d/%d\n",(int)now,(int) event->alarmTime);
							delete event;
						}
						break;
					}       
				case CTimerd::TIMER_NEXTPROGRAM :
					{
						CTimerEvent_NextProgram *event=
						new CTimerEvent_NextProgram(config, savedIDs[i]);
						if((event->alarmTime >= now) || (event->stopTime > now))
						{
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else if(event->eventRepeat != CTimerd::TIMERREPEAT_ONCE)
						{
							// old periodic timers need to be rescheduled
							event->eventState = CTimerd::TIMERSTATE_HASFINISHED;
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else
						{
							dprintf("Timer too old %d/%d\n",(int)now,(int) event->alarmTime);
							delete event;
						}
						break;
					}       
				case CTimerd::TIMER_ZAPTO :
					{
						CTimerEvent_Zapto *event=
						new CTimerEvent_Zapto(config, savedIDs[i]);
						if((event->alarmTime >= now) || (event->stopTime > now))
						{
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else if(event->eventRepeat != CTimerd::TIMERREPEAT_ONCE)
						{
							// old periodic timers need to be rescheduled
							event->eventState = CTimerd::TIMERSTATE_HASFINISHED;
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else
						{
							dprintf("Timer too old %d/%d\n",(int)now,(int) event->alarmTime);
							delete event;
						}
						break;
					}          
				case CTimerd::TIMER_STANDBY :
					{
						CTimerEvent_Standby *event=
						new CTimerEvent_Standby(config, savedIDs[i]);
						if((event->alarmTime >= now) || (event->stopTime > now))
						{
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else if(event->eventRepeat != CTimerd::TIMERREPEAT_ONCE)
						{
							// old periodic timers need to be rescheduled
							event->eventState = CTimerd::TIMERSTATE_HASFINISHED;
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else
						{
							dprintf("Timer too old %d/%d\n",(int)now,(int) event->alarmTime);
							delete event;
						}
						break;
					}           
				case CTimerd::TIMER_RECORD :
					{
						CTimerEvent_Record *event=
						new CTimerEvent_Record(config, savedIDs[i]);
						if((event->alarmTime >= now) || (event->stopTime > now))
						{
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else if(event->eventRepeat != CTimerd::TIMERREPEAT_ONCE)
						{
							// old periodic timers need to be rescheduled
							event->eventState = CTimerd::TIMERSTATE_HASFINISHED;
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else
						{
							dprintf("Timer too old %d/%d\n",(int)now,(int) event->alarmTime);
							delete event;
						}
						break;
					}          
				case CTimerd::TIMER_SLEEPTIMER :
					{
						CTimerEvent_Sleeptimer *event=
						new CTimerEvent_Sleeptimer(config, savedIDs[i]);
						if((event->alarmTime >= now) || (event->stopTime > now))
						{
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else if(event->eventRepeat != CTimerd::TIMERREPEAT_ONCE)
						{
							// old periodic timers need to be rescheduled
							event->eventState = CTimerd::TIMERSTATE_HASFINISHED;
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else
						{
							dprintf("Timer too old %d/%d\n",(int)now,(int) event->alarmTime);
							delete event;
						}
						break;
					}
				case CTimerd::TIMER_REMIND :
					{
						CTimerEvent_Remind *event=
						new CTimerEvent_Remind(config, savedIDs[i]);
						if((event->alarmTime >= now) || (event->stopTime > now))
						{
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else if(event->eventRepeat != CTimerd::TIMERREPEAT_ONCE)
						{
							// old periodic timers need to be rescheduled
							event->eventState = CTimerd::TIMERSTATE_HASFINISHED;
							CTimerManager::getInstance()->addEvent(event,false);
						}
						else
						{
							dprintf("Timer too old %d/%d\n",(int)now,(int) event->alarmTime);
							delete event;
						}
						break;
					}
				default:
					dprintf("Unknown timer on load %d\n",type);
			}
		}
	}
	delete config;
	CTimerManager::getInstance()->saveEventsToConfig();
}