Ask user for storing overlapping CI timer from epg

Origin commit data
------------------
Commit: 7543aa602c
Author: FlatTV <FlatTV@gmx.de>
Date: 2016-07-10 (Sun, 10 Jul 2016)
This commit is contained in:
FlatTV
2016-07-10 21:44:30 +02:00
parent 918c1cb45a
commit bcc4103260
10 changed files with 50 additions and 10 deletions

View File

@@ -330,6 +330,7 @@ int CTimerdClient::addTimerEvent( CTimerd::CTimerEventTypes evType, void* data,
tri.epg_starttime = ri->epg_starttime; tri.epg_starttime = ri->epg_starttime;
tri.epgID = ri->epgID; tri.epgID = ri->epgID;
tri.recordingSafety = ri->recordingSafety; tri.recordingSafety = ri->recordingSafety;
tri.channel_ci = ri->channel_ci; //NI
strncpy(tri.recordingDir, ri->recordingDir, RECORD_DIR_MAXLEN-1); strncpy(tri.recordingDir, ri->recordingDir, RECORD_DIR_MAXLEN-1);
length = sizeof( CTimerd::TransferRecordingInfo); length = sizeof( CTimerd::TransferRecordingInfo);
data = &tri; data = &tri;
@@ -418,7 +419,6 @@ CTimerd::TimerList CTimerdClient::getOverlappingTimers(time_t& startTime, time_t
} }
return overlapping; return overlapping;
} }
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
bool CTimerdClient::shutdown() bool CTimerdClient::shutdown()

View File

@@ -111,7 +111,7 @@ class CTimerdClient:private CBasicClient
// adds new record timer event // adds new record timer event
int addRecordTimerEvent(const t_channel_id channel_id, time_t alarmtime, time_t stoptime, 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, 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; CTimerd::RecordingInfo eventInfo;
eventInfo.channel_id = channel_id; eventInfo.channel_id = channel_id;
@@ -119,6 +119,7 @@ class CTimerdClient:private CBasicClient
eventInfo.epg_starttime = epg_starttime; eventInfo.epg_starttime = epg_starttime;
eventInfo.apids = apids; eventInfo.apids = apids;
eventInfo.recordingSafety = safety; eventInfo.recordingSafety = safety;
eventInfo.channel_ci = channel_ci; //NI
strncpy(eventInfo.recordingDir, recDir.c_str(), RECORD_DIR_MAXLEN); strncpy(eventInfo.recordingDir, recDir.c_str(), RECORD_DIR_MAXLEN);
return addTimerEvent(CTimerd::TIMER_RECORD, &eventInfo, announcetime, alarmtime, stoptime,CTimerd::TIMERREPEAT_ONCE, 0,forceAdd); return addTimerEvent(CTimerd::TIMER_RECORD, &eventInfo, announcetime, alarmtime, stoptime,CTimerd::TIMERREPEAT_ONCE, 0,forceAdd);
}; };

View File

@@ -87,6 +87,7 @@ class CTimerd
t_channel_id channel_id; t_channel_id channel_id;
unsigned char apids; unsigned char apids;
bool recordingSafety; bool recordingSafety;
bool channel_ci; //NI - channel is member of CI bouquet?
}; };
struct TransferEventInfo struct TransferEventInfo
@@ -96,6 +97,7 @@ class CTimerd
t_channel_id channel_id; t_channel_id channel_id;
unsigned char apids; unsigned char apids;
bool recordingSafety; bool recordingSafety;
bool channel_ci; //NI - channel is member of CI bouquet?
}; };
struct TransferRecordingInfo : TransferEventInfo struct TransferRecordingInfo : TransferEventInfo
@@ -116,6 +118,7 @@ class CTimerd
epgID = e.epgID; epgID = e.epgID;
epg_starttime = e.epg_starttime; epg_starttime = e.epg_starttime;
recordingSafety = e.recordingSafety; recordingSafety = e.recordingSafety;
channel_ci = e.channel_ci; //NI
}; };
RecordingInfo& operator = (EventInfo& e) RecordingInfo& operator = (EventInfo& e)
{ {
@@ -124,6 +127,7 @@ class CTimerd
epgID = e.epgID; epgID = e.epgID;
epg_starttime = e.epg_starttime; epg_starttime = e.epg_starttime;
recordingSafety = e.recordingSafety; recordingSafety = e.recordingSafety;
channel_ci = e.channel_ci; //NI
return *this; return *this;
} }
unsigned char apids; unsigned char apids;
@@ -157,7 +161,7 @@ class CTimerd
char pluginName[EXEC_PLUGIN_NAME_MAXLEN]; //only filled if applicable char pluginName[EXEC_PLUGIN_NAME_MAXLEN]; //only filled if applicable
char recordingDir[RECORD_DIR_MAXLEN]; //only filled if applicable char recordingDir[RECORD_DIR_MAXLEN]; //only filled if applicable
char epgTitle[EPG_TITLE_MAXLEN]; //only filled if applicable char epgTitle[EPG_TITLE_MAXLEN]; //only filled if applicable
bool channel_ci; //NI
bool operator< (const responseGetTimer& a) const bool operator< (const responseGetTimer& a) const
{ {
return this->alarmTime < a.alarmTime ; return this->alarmTime < a.alarmTime ;

View File

@@ -45,6 +45,8 @@
#include <gui/widget/messagebox.h> #include <gui/widget/messagebox.h>
#include <gui/timerlist.h> #include <gui/timerlist.h>
#include <zapit/zapit.h> //NI
#include <global.h> #include <global.h>
#include <neutrino.h> #include <neutrino.h>
@@ -98,14 +100,18 @@ int CFollowScreenings::exec(CMenuTarget* /*parent*/, const std::string & actionK
#endif #endif
return menu_return::RETURN_REPAINT; 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)) if (!askUserOnTimerConflict(start, stop, channel_id))
return menu_return::RETURN_REPAINT; 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, 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 ... //FIXME -- no error handling, but this shouldn't happen ...
} else { } else {
#if 0 #if 0

View File

@@ -737,6 +737,7 @@ void CTimerList::paintItem(int pos)
case CTimerd::TIMER_RECORD : case CTimerd::TIMER_RECORD :
{ {
zAddData = convertChannelId2String(timer.channel_id); // UTF-8 zAddData = convertChannelId2String(timer.channel_id); // UTF-8
zAddData += timer.channel_ci?"(CI)":""; //NI
if (timer.apids != TIMERD_APIDS_CONF) if (timer.apids != TIMERD_APIDS_CONF)
{ {
std::string sep = ""; std::string sep = "";
@@ -1263,7 +1264,11 @@ int CTimerList::newTimer()
bool askUserOnTimerConflict(time_t announceTime, time_t stopTime, t_channel_id channel_id) 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; CTimerdClient Timer;
CTimerd::TimerList overlappingTimers = Timer.getOverlappingTimers(announceTime,stopTime); 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); //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) { if (channel_id) {
CTimerd::TimerList::iterator i; CTimerd::TimerList::iterator i;
for (i = overlappingTimers.begin(); i != overlappingTimers.end(); 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; break;
if (i == overlappingTimers.end()) if (i == overlappingTimers.end())
return true; // yes, add timer 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(); for (CTimerd::TimerList::iterator it = overlappingTimers.begin();
it != overlappingTimers.end(); ++it) it != overlappingTimers.end(); ++it)
{ {
//NI
if(useCI && !it->channel_ci)
continue;
timerbuf += CTimerList::convertTimerType2String(it->eventType); timerbuf += CTimerList::convertTimerType2String(it->eventType);
timerbuf += " ("; timerbuf += " (";
timerbuf += CTimerList::convertChannelId2String(it->channel_id); // UTF-8 timerbuf += CTimerList::convertChannelId2String(it->channel_id); // UTF-8

View File

@@ -115,6 +115,7 @@ bool timerd_parse_command(CBasicMessage::Header &rmsg, int connfd)
resp.apids = ev->eventInfo.apids; resp.apids = ev->eventInfo.apids;
strcpy(resp.recordingDir, ev->recordingDir.substr(0,sizeof(resp.recordingDir)-1).c_str()); 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()); 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) 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; lresp.apids = ev->eventInfo.apids;
strcpy(lresp.recordingDir, ev->recordingDir.substr(0,sizeof(lresp.recordingDir)-1).c_str()); 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()); 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) else if(event->eventType == CTimerd::TIMER_ZAPTO)
{ {
@@ -321,7 +323,8 @@ bool timerd_parse_command(CBasicMessage::Header &rmsg, int connfd)
recInfo.apids, recInfo.apids,
msgAddTimer.eventRepeat, msgAddTimer.eventRepeat,
msgAddTimer.repeatCount, msgAddTimer.repeatCount,
recInfo.recordingDir); recInfo.recordingDir,
recInfo.channel_ci); //NI
rspAddTimer.eventID = CTimerManager::getInstance()->addEvent(event); rspAddTimer.eventID = CTimerManager::getInstance()->addEvent(event);
break; break;

View File

@@ -1134,13 +1134,14 @@ CTimerEvent_Record::CTimerEvent_Record(time_t announce_Time, time_t alarm_Time,
event_id_t epgID, event_id_t epgID,
time_t epg_starttime, unsigned char apids, time_t epg_starttime, unsigned char apids,
CTimerd::CTimerEventRepeat evrepeat, 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) CTimerEvent(getEventType(), announce_Time, alarm_Time, stop_Time, evrepeat, repeatcount)
{ {
eventInfo.epgID = epgID; eventInfo.epgID = epgID;
eventInfo.epg_starttime = epg_starttime; eventInfo.epg_starttime = epg_starttime;
eventInfo.channel_id = channel_id; eventInfo.channel_id = channel_id;
eventInfo.apids = apids; eventInfo.apids = apids;
eventInfo.channel_ci = channel_ci; //NI
recordingDir = recDir; recordingDir = recDir;
epgTitle=""; epgTitle="";
CShortEPGData epgdata; CShortEPGData epgdata;
@@ -1172,6 +1173,9 @@ CTimerEvent_Record::CTimerEvent_Record(CConfigFile *config, int iId):
epgTitle = config->getString("EPG_TITLE_"+id); epgTitle = config->getString("EPG_TITLE_"+id);
dprintf("read EPG_TITLE_%s %s (%p)\n",id.c_str(),epgTitle.c_str(),&epgTitle); 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() void CTimerEvent_Record::fireEvent()
@@ -1238,6 +1242,9 @@ void CTimerEvent_Record::saveToConfig(CConfigFile *config)
config->setString("EPG_TITLE_"+id,epgTitle); config->setString("EPG_TITLE_"+id,epgTitle);
dprintf("set EPG_TITLE_%s to %s (%p)\n",id.c_str(),epgTitle.c_str(), &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() void CTimerEvent_Record::Reschedule()

View File

@@ -123,7 +123,7 @@ class CTimerEvent_Record : public CTimerEvent
time_t epg_starttime = 0, time_t epg_starttime = 0,
unsigned char apids = TIMERD_APIDS_STD, unsigned char apids = TIMERD_APIDS_STD,
CTimerd::CTimerEventRepeat evrepeat = CTimerd::TIMERREPEAT_ONCE, 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); CTimerEvent_Record(CConfigFile *config, int iId);
virtual ~CTimerEvent_Record(){}; virtual ~CTimerEvent_Record(){};
virtual CTimerd::CTimerEventTypes getEventType(void) const { return CTimerd::TIMER_RECORD; }; virtual CTimerd::CTimerEventTypes getEventType(void) const { return CTimerd::TIMER_RECORD; };

View File

@@ -273,5 +273,7 @@ class CZapit : public OpenThreads::Thread
void unlockPlayBack(const bool sendpmt = true); void unlockPlayBack(const bool sendpmt = true);
void Rezap(); void Rezap();
std::list<std::string> *GetWebTVXML(void) { return webtv_xml; } std::list<std::string> *GetWebTVXML(void) { return webtv_xml; }
//NI
bool getUseChannelFilter();
}; };
#endif /* __zapit_h__ */ #endif /* __zapit_h__ */

View File

@@ -2469,6 +2469,11 @@ static bool zapit_parse_command(CBasicMessage::Header &rmsg, int connfd)
{ {
return CZapit::getInstance()->ParseCommand(rmsg, connfd); return CZapit::getInstance()->ParseCommand(rmsg, connfd);
} }
//NI
bool CZapit::getUseChannelFilter()
{
return CCamManager::getInstance()->getChannelFilter();
}
void CZapit::run() void CZapit::run()
{ {