diff --git a/lib/timerdclient/timerdclient.cpp b/lib/timerdclient/timerdclient.cpp index f25f8ffcf..9633dffec 100644 --- a/lib/timerdclient/timerdclient.cpp +++ b/lib/timerdclient/timerdclient.cpp @@ -330,6 +330,7 @@ int CTimerdClient::addTimerEvent( CTimerd::CTimerEventTypes evType, void* data, tri.epg_starttime = ri->epg_starttime; tri.epgID = ri->epgID; tri.recordingSafety = ri->recordingSafety; + tri.channel_ci = ri->channel_ci; //NI strncpy(tri.recordingDir, ri->recordingDir, RECORD_DIR_MAXLEN-1); length = sizeof( CTimerd::TransferRecordingInfo); data = &tri; @@ -418,7 +419,6 @@ CTimerd::TimerList CTimerdClient::getOverlappingTimers(time_t& startTime, time_t } return overlapping; } - //------------------------------------------------------------------------- bool CTimerdClient::shutdown() diff --git a/lib/timerdclient/timerdclient.h b/lib/timerdclient/timerdclient.h index 212f94cfa..9d03adef4 100644 --- a/lib/timerdclient/timerdclient.h +++ b/lib/timerdclient/timerdclient.h @@ -111,7 +111,7 @@ class CTimerdClient:private CBasicClient // adds new record timer event int addRecordTimerEvent(const t_channel_id channel_id, time_t alarmtime, time_t stoptime, uint64_t epgID=0, time_t epg_starttime=0, time_t announcetime = 0, - unsigned char apids=TIMERD_APIDS_STD, bool safety=false,std::string recDir="", bool forceAdd=true) + unsigned char apids=TIMERD_APIDS_STD, bool safety=false,std::string recDir="", bool forceAdd=true,/*NI*/bool channel_ci=false) { CTimerd::RecordingInfo eventInfo; eventInfo.channel_id = channel_id; @@ -119,6 +119,7 @@ class CTimerdClient:private CBasicClient eventInfo.epg_starttime = epg_starttime; eventInfo.apids = apids; eventInfo.recordingSafety = safety; + eventInfo.channel_ci = channel_ci; //NI strncpy(eventInfo.recordingDir, recDir.c_str(), RECORD_DIR_MAXLEN); return addTimerEvent(CTimerd::TIMER_RECORD, &eventInfo, announcetime, alarmtime, stoptime,CTimerd::TIMERREPEAT_ONCE, 0,forceAdd); }; diff --git a/lib/timerdclient/timerdtypes.h b/lib/timerdclient/timerdtypes.h index 7e5146771..560ed27c5 100644 --- a/lib/timerdclient/timerdtypes.h +++ b/lib/timerdclient/timerdtypes.h @@ -87,6 +87,7 @@ class CTimerd t_channel_id channel_id; unsigned char apids; bool recordingSafety; + bool channel_ci; //NI - channel is member of CI bouquet? }; struct TransferEventInfo @@ -96,6 +97,7 @@ class CTimerd t_channel_id channel_id; unsigned char apids; bool recordingSafety; + bool channel_ci; //NI - channel is member of CI bouquet? }; struct TransferRecordingInfo : TransferEventInfo @@ -116,6 +118,7 @@ class CTimerd epgID = e.epgID; epg_starttime = e.epg_starttime; recordingSafety = e.recordingSafety; + channel_ci = e.channel_ci; //NI }; RecordingInfo& operator = (EventInfo& e) { @@ -124,6 +127,7 @@ class CTimerd epgID = e.epgID; epg_starttime = e.epg_starttime; recordingSafety = e.recordingSafety; + channel_ci = e.channel_ci; //NI return *this; } unsigned char apids; @@ -157,7 +161,7 @@ class CTimerd char pluginName[EXEC_PLUGIN_NAME_MAXLEN]; //only filled if applicable char recordingDir[RECORD_DIR_MAXLEN]; //only filled if applicable char epgTitle[EPG_TITLE_MAXLEN]; //only filled if applicable - + bool channel_ci; //NI bool operator< (const responseGetTimer& a) const { return this->alarmTime < a.alarmTime ; diff --git a/src/gui/followscreenings.cpp b/src/gui/followscreenings.cpp index cb1933d6e..df5adc20b 100644 --- a/src/gui/followscreenings.cpp +++ b/src/gui/followscreenings.cpp @@ -45,6 +45,8 @@ #include #include +#include //NI + #include #include @@ -98,14 +100,18 @@ int CFollowScreenings::exec(CMenuTarget* /*parent*/, const std::string & actionK #endif return menu_return::RETURN_REPAINT; } - if (!SAME_TRANSPONDER(channel_id, i->channel_id)) { + if (!SAME_TRANSPONDER(channel_id, i->channel_id) ||/*NI*/CZapit::getInstance()->getUseChannelFilter()) { if (!askUserOnTimerConflict(start, stop, channel_id)) return menu_return::RETURN_REPAINT; + else + break; //NI - show conflicts only once } } + //NI + CZapitChannel * ch = CServiceManager::getInstance()->FindChannel(channel_id); if (g_Timerd->addRecordTimerEvent(channel_id, e->startTime, e->startTime + e->duration, e->eventID, - e->startTime, e->startTime - (ANNOUNCETIME + 120 ), apids, true, recDir, true) == -1) { + e->startTime, e->startTime - (ANNOUNCETIME + 120 ), apids, true, recDir, true,/*NI*/ch->bUseCI) == -1) { //FIXME -- no error handling, but this shouldn't happen ... } else { #if 0 diff --git a/src/gui/timerlist.cpp b/src/gui/timerlist.cpp index ec9cb5085..605b51bf0 100644 --- a/src/gui/timerlist.cpp +++ b/src/gui/timerlist.cpp @@ -737,6 +737,7 @@ void CTimerList::paintItem(int pos) case CTimerd::TIMER_RECORD : { zAddData = convertChannelId2String(timer.channel_id); // UTF-8 + zAddData += timer.channel_ci?"(CI)":""; //NI if (timer.apids != TIMERD_APIDS_CONF) { std::string sep = ""; @@ -1263,7 +1264,11 @@ int CTimerList::newTimer() bool askUserOnTimerConflict(time_t announceTime, time_t stopTime, t_channel_id channel_id) { - if (CFEManager::getInstance()->getEnabledCount() == 1) { + //NI + CZapitChannel * channel = CServiceManager::getInstance()->FindChannel(channel_id); + bool useCI = channel->bUseCI; + + if (CFEManager::getInstance()->getEnabledCount() == 1 || /*NI*/useCI) { CTimerdClient Timer; CTimerd::TimerList overlappingTimers = Timer.getOverlappingTimers(announceTime,stopTime); //printf("[CTimerdClient] attention\n%d\t%d\t%d conflicts with:\n",timerNew.announceTime,timerNew.alarmTime,timerNew.stopTime); @@ -1272,7 +1277,10 @@ bool askUserOnTimerConflict(time_t announceTime, time_t stopTime, t_channel_id c if (channel_id) { CTimerd::TimerList::iterator i; for (i = overlappingTimers.begin(); i != overlappingTimers.end(); i++) - if ((i->eventType != CTimerd::TIMER_RECORD || !SAME_TRANSPONDER(channel_id, i->channel_id))) + //NI if ((i->eventType != CTimerd::TIMER_RECORD || !SAME_TRANSPONDER(channel_id, i->channel_id))) + if ((i->eventType != CTimerd::TIMER_RECORD || + (!SAME_TRANSPONDER(channel_id, i->channel_id) && !useCI) || + (useCI && i->channel_ci))) break; if (i == overlappingTimers.end()) return true; // yes, add timer @@ -1283,6 +1291,10 @@ bool askUserOnTimerConflict(time_t announceTime, time_t stopTime, t_channel_id c for (CTimerd::TimerList::iterator it = overlappingTimers.begin(); it != overlappingTimers.end(); ++it) { + //NI + if(useCI && !it->channel_ci) + continue; + timerbuf += CTimerList::convertTimerType2String(it->eventType); timerbuf += " ("; timerbuf += CTimerList::convertChannelId2String(it->channel_id); // UTF-8 diff --git a/src/timerd/timerd.cpp b/src/timerd/timerd.cpp index 5f79230a0..c6b639826 100644 --- a/src/timerd/timerd.cpp +++ b/src/timerd/timerd.cpp @@ -115,6 +115,7 @@ bool timerd_parse_command(CBasicMessage::Header &rmsg, int connfd) resp.apids = ev->eventInfo.apids; strcpy(resp.recordingDir, ev->recordingDir.substr(0,sizeof(resp.recordingDir)-1).c_str()); strcpy(resp.epgTitle, ev->epgTitle.substr(0,sizeof(resp.epgTitle)-1).c_str()); + resp.channel_ci = ev->eventInfo.channel_ci; //NI } else if(event->eventType == CTimerd::TIMER_ZAPTO) { @@ -184,6 +185,7 @@ bool timerd_parse_command(CBasicMessage::Header &rmsg, int connfd) lresp.apids = ev->eventInfo.apids; strcpy(lresp.recordingDir, ev->recordingDir.substr(0,sizeof(lresp.recordingDir)-1).c_str()); strcpy(lresp.epgTitle, ev->epgTitle.substr(0,sizeof(lresp.epgTitle)-1).c_str()); + lresp.channel_ci = ev->eventInfo.channel_ci; //NI } else if(event->eventType == CTimerd::TIMER_ZAPTO) { @@ -321,7 +323,8 @@ bool timerd_parse_command(CBasicMessage::Header &rmsg, int connfd) recInfo.apids, msgAddTimer.eventRepeat, msgAddTimer.repeatCount, - recInfo.recordingDir); + recInfo.recordingDir, + recInfo.channel_ci); //NI rspAddTimer.eventID = CTimerManager::getInstance()->addEvent(event); break; diff --git a/src/timerd/timermanager.cpp b/src/timerd/timermanager.cpp index 0918c262e..29afd9626 100644 --- a/src/timerd/timermanager.cpp +++ b/src/timerd/timermanager.cpp @@ -1134,13 +1134,14 @@ CTimerEvent_Record::CTimerEvent_Record(time_t announce_Time, time_t alarm_Time, event_id_t epgID, time_t epg_starttime, unsigned char apids, CTimerd::CTimerEventRepeat evrepeat, - uint32_t repeatcount, const std::string &recDir) : + uint32_t repeatcount, const std::string &recDir,/*NI*/bool channel_ci) : CTimerEvent(getEventType(), announce_Time, alarm_Time, stop_Time, evrepeat, repeatcount) { eventInfo.epgID = epgID; eventInfo.epg_starttime = epg_starttime; eventInfo.channel_id = channel_id; eventInfo.apids = apids; + eventInfo.channel_ci = channel_ci; //NI recordingDir = recDir; epgTitle=""; CShortEPGData epgdata; @@ -1172,6 +1173,9 @@ CTimerEvent_Record::CTimerEvent_Record(CConfigFile *config, int iId): epgTitle = config->getString("EPG_TITLE_"+id); dprintf("read EPG_TITLE_%s %s (%p)\n",id.c_str(),epgTitle.c_str(),&epgTitle); + //NI + eventInfo.channel_ci = config->getBool("EVENT_INFO_CHANNEL_CI_"+id); + dprintf("read EVENT_INFO_CHANNEL_CI_%s %i\n",id.c_str(),eventInfo.channel_ci); } //------------------------------------------------------------ void CTimerEvent_Record::fireEvent() @@ -1238,6 +1242,9 @@ void CTimerEvent_Record::saveToConfig(CConfigFile *config) config->setString("EPG_TITLE_"+id,epgTitle); dprintf("set EPG_TITLE_%s to %s (%p)\n",id.c_str(),epgTitle.c_str(), &epgTitle); + //NI + config->setBool("EVENT_INFO_CHANNEL_CI_"+id, eventInfo.channel_ci); + dprintf("set EVENT_INFO_CHANNEL_CI_%s to %i\n",id.c_str(),eventInfo.channel_ci); } //------------------------------------------------------------ void CTimerEvent_Record::Reschedule() diff --git a/src/timerd/timermanager.h b/src/timerd/timermanager.h index 7d9a18b22..01acd8ab0 100644 --- a/src/timerd/timermanager.h +++ b/src/timerd/timermanager.h @@ -123,7 +123,7 @@ class CTimerEvent_Record : public CTimerEvent time_t epg_starttime = 0, unsigned char apids = TIMERD_APIDS_STD, CTimerd::CTimerEventRepeat evrepeat = CTimerd::TIMERREPEAT_ONCE, - uint32_t repeatcount = 1, const std::string &recDir = ""); + uint32_t repeatcount = 1, const std::string &recDir = "",/*NI*/bool channel_ci=false); CTimerEvent_Record(CConfigFile *config, int iId); virtual ~CTimerEvent_Record(){}; virtual CTimerd::CTimerEventTypes getEventType(void) const { return CTimerd::TIMER_RECORD; }; diff --git a/src/zapit/include/zapit/zapit.h b/src/zapit/include/zapit/zapit.h index a60c79fb5..d1f08fd70 100644 --- a/src/zapit/include/zapit/zapit.h +++ b/src/zapit/include/zapit/zapit.h @@ -273,5 +273,7 @@ class CZapit : public OpenThreads::Thread void unlockPlayBack(const bool sendpmt = true); void Rezap(); std::list *GetWebTVXML(void) { return webtv_xml; } + //NI + bool getUseChannelFilter(); }; #endif /* __zapit_h__ */ diff --git a/src/zapit/src/zapit.cpp b/src/zapit/src/zapit.cpp index d7f9eba46..9d2dbc4b4 100644 --- a/src/zapit/src/zapit.cpp +++ b/src/zapit/src/zapit.cpp @@ -2469,6 +2469,11 @@ static bool zapit_parse_command(CBasicMessage::Header &rmsg, int connfd) { return CZapit::getInstance()->ParseCommand(rmsg, connfd); } +//NI +bool CZapit::getUseChannelFilter() +{ + return CCamManager::getInstance()->getChannelFilter(); +} void CZapit::run() {