diff --git a/lib/timerdclient/timerdclient.cpp b/lib/timerdclient/timerdclient.cpp index 63aed7d6e..c6b62b6f0 100644 --- a/lib/timerdclient/timerdclient.cpp +++ b/lib/timerdclient/timerdclient.cpp @@ -237,10 +237,53 @@ int CTimerdClient::addTimerEvent( CTimerEventTypes evType, void* data , int min, addTimerEvent(evType,true,data,0,mktime(actTime),0); } */ +bool CTimerdClient::checkDouble(CTimerd::CTimerEventTypes evType, void* data, time_t announcetime, time_t alarmtime,time_t stoptime, + CTimerd::CTimerEventRepeat evrepeat, uint32_t repeatcount) +{ + if (evType != CTimerd::TIMER_RECORD && evType != CTimerd::TIMER_ZAPTO) + return false;//skip check not zap and record timer + + CTimerd::TimerList timerlist; + getTimerList(timerlist); + for (CTimerd::TimerList::iterator it = timerlist.begin(); it != timerlist.end();++it) + { + if ( (it->eventType == CTimerd::TIMER_RECORD || it->eventType == CTimerd::TIMER_ZAPTO ) && + (it->alarmTime == alarmtime && it->announceTime == announcetime && it->stopTime == stoptime && it->eventRepeat == evrepeat && it->repeatCount == repeatcount ) ) + { + if( it->eventType == CTimerd::TIMER_ZAPTO ) + { + CTimerd::EventInfo *ei=static_cast(data); + if( ei->channel_id == it->channel_id ) + { + if(( ei->epgID != 0 && ei->epgID != it->epgID ) || ( ei->epg_starttime != 0 && it->epg_starttime != ei->epg_starttime) ) + { + return false;//not double + } + return true; + } + } + else if(it->eventType == CTimerd::TIMER_RECORD) + { + CTimerd::RecordingInfo *ri=static_cast(data); + if(ri->channel_id == it->channel_id && ri->apids == it->apids && !strncmp(ri->recordingDir, it->recordingDir, RECORD_DIR_MAXLEN-1) ) + { + if( ( ri->epgID != 0 && ri->epgID != it->epgID ) || ( ri->epg_starttime != 0 && it->epg_starttime != ri->epg_starttime) ) + { + return false;//not double + } + return true; + } + } + } + } + return false;//not double +} //------------------------------------------------------------------------- int CTimerdClient::addTimerEvent( CTimerd::CTimerEventTypes evType, void* data, time_t announcetime, time_t alarmtime,time_t stoptime, CTimerd::CTimerEventRepeat evrepeat, uint32_t repeatcount,bool forceadd) { + if(checkDouble(evType, data, announcetime, alarmtime, stoptime, evrepeat, repeatcount))//check if timer is add double + return -1; if (!forceadd) { diff --git a/lib/timerdclient/timerdclient.h b/lib/timerdclient/timerdclient.h index 59a41b260..157c8f0f0 100644 --- a/lib/timerdclient/timerdclient.h +++ b/lib/timerdclient/timerdclient.h @@ -66,6 +66,7 @@ class CTimerdClient:private CBasicClient bool isTimerdAvailable(); // check if timerd is running CTimerd::TimerList getOverlappingTimers(time_t& announcetime, time_t& stoptime); + bool checkDouble(CTimerd::CTimerEventTypes evType, void* data, time_t announcetime, time_t alarmtime,time_t stoptime, CTimerd::CTimerEventRepeat /*evrepeat*/, uint32_t repeatcount); int addTimerEvent( CTimerd::CTimerEventTypes evType, void* data, time_t alarmtime,time_t announcetime = 0, time_t stoptime = 0, CTimerd::CTimerEventRepeat evrepeat = CTimerd::TIMERREPEAT_ONCE, uint32_t repeatcount = 0, bool forceadd=true);