diff options
author | Christian Wieninger <cwieninger (at) gmx (dot) de> | 2007-04-15 18:34:18 +0000 |
---|---|---|
committer | Christian Wieninger <cwieninger (at) gmx (dot) de> | 2007-04-15 18:34:18 +0000 |
commit | 97b856ab7ad8f845ea51378f6448676787bf21e6 (patch) | |
tree | 1d897577d25fc979f63d99197d91666bdbe0db5e /epgsearch.cpp | |
parent | 059b437a2a72410a799b8e22a7ffcec1405af107 (diff) | |
download | vdr-plugin-live-97b856ab7ad8f845ea51378f6448676787bf21e6.tar.gz vdr-plugin-live-97b856ab7ad8f845ea51378f6448676787bf21e6.tar.bz2 |
changes for searchtimer edit
Diffstat (limited to 'epgsearch.cpp')
-rw-r--r-- | epgsearch.cpp | 378 |
1 files changed, 348 insertions, 30 deletions
diff --git a/epgsearch.cpp b/epgsearch.cpp index 68d3aad..2936b71 100644 --- a/epgsearch.cpp +++ b/epgsearch.cpp @@ -1,6 +1,7 @@ #include <vector> #include <vdr/channels.h> #include <vdr/plugin.h> +#include <iomanip> #include "epgsearch/services.h" #include "epgsearch.h" #include "exception.h" @@ -12,34 +13,55 @@ using namespace std; bool operator<( SearchTimer const& left, SearchTimer const& right ) { - return left.m_id < right.m_id; -} - -SearchTimer::SearchTimer( string const& data ): - m_id( 0 ), - m_useTime( false ), - m_startTime( 0 ), - m_stopTime( 0 ), - m_useChannel( NoChannel ), - m_useCase( false ), - m_mode( 0 ), - m_useTitle( false ), - m_useSubtitle( false ), - m_useDescription( false ), - m_useDuration( false ), - m_minDuration( 0 ), - m_maxDuration( 0 ), - m_useAsSearchTimer( false ), - m_useDayOfWeek( false ), - m_dayOfWeek( 0 ), - m_useEpisode( false ), - m_priority( 0 ), - m_lifetime( 0 ) -{ - vector< string > parts = StringSplit( data, ':' ); - try { - vector< string >::const_iterator part = parts.begin(); - for ( int i = 0; part != parts.end(); ++i, ++part ) { + return left.m_search < right.m_search; +} + +SearchTimer::SearchTimer() +{ + Init(); +} + +void SearchTimer::Init() +{ + m_id = -1; + m_useTime = false; + m_startTime = 0; + m_stopTime = 0; + m_useChannel = NoChannel; + m_useCase = false; + m_mode = 0; + m_useTitle = false; + m_useSubtitle = false; + m_useDescription = false; + m_useDuration = false; + m_minDuration = 0; + m_maxDuration = 0; + m_useDayOfWeek = false; + m_dayOfWeek = 0; + m_useEpisode = false; + m_priority = 99; + m_lifetime = 50; + m_fuzzytolerance = 1; + m_useInFavorites = false; + m_useAsSearchtimer = false; + m_action = 0; + m_delAfterDays = 0; + m_recordingsKeep = 0; + m_pauseOnNrRecordings = 0; + m_switchMinBefore = 1; + m_useExtEPGInfo = false; + m_useVPS = false; + m_marginstart = 2; + m_marginstop = 10; +} + +SearchTimer::SearchTimer( string const& data ) +{ + Init(); + vector< string > parts = StringSplit( data, ':' ); + try { + vector< string >::const_iterator part = parts.begin(); + for ( int i = 0; part != parts.end(); ++i, ++part ) { switch ( i ) { case 0: m_id = lexical_cast< int >( *part ); break; case 1: m_search = StringReplace( StringReplace( *part, "|", ":" ), "!^pipe^!", "|" ); break; @@ -56,19 +78,150 @@ SearchTimer::SearchTimer( string const& data ): case 12: m_useDuration = lexical_cast< bool >( *part ); break; case 13: if ( m_useDuration ) m_minDuration = lexical_cast< int >( *part ); break; case 14: if ( m_useDuration ) m_maxDuration = lexical_cast< int >( *part ); break; - case 15: m_useAsSearchTimer = lexical_cast< bool >( *part ); break; + case 15: m_useAsSearchtimer = lexical_cast< bool >( *part ); break; case 16: m_useDayOfWeek = lexical_cast< bool >( *part ); break; case 17: m_dayOfWeek = lexical_cast< int >( *part ); break; case 18: m_useEpisode = lexical_cast< bool >( *part ); break; - case 19: m_directory = *part; break; + case 19: m_directory = StringReplace( StringReplace( *part, "|", ":" ), "!^pipe^!", "|" ); break; case 20: m_priority = lexical_cast< int >( *part ); break; case 21: m_lifetime = lexical_cast< int >( *part ); break; + case 22: m_marginstart = lexical_cast< int >( *part ); break; + case 23: m_marginstop = lexical_cast< int >( *part ); break; + case 24: m_useVPS = lexical_cast< bool >( *part ); break; + case 25: m_action = lexical_cast< int >( *part ); break; + case 26: m_useExtEPGInfo = lexical_cast< bool >( *part ); break; + case 27: ParseExtEPGInfo( *part ); break; + case 28: m_avoidrepeats = lexical_cast< bool >( *part ); break; + case 29: m_allowedrepeats = lexical_cast< int >( *part ); break; + case 30: m_compareTitle = lexical_cast< bool >( *part ); break; + case 31: m_compareSubtitle = lexical_cast< bool >( *part ); break; + case 32: m_compareSummary = lexical_cast< bool >( *part ); break; + case 33: m_catvaluesAvoidRepeat = lexical_cast< unsigned long >( *part ); break; + case 34: m_repeatsWithinDays = lexical_cast< int >( *part ); break; + case 35: m_delAfterDays = lexical_cast< int >( *part ); break; + case 36: m_recordingsKeep = lexical_cast< int >( *part ); break; + case 37: m_switchMinBefore = lexical_cast< int >( *part ); break; + case 38: m_pauseOnNrRecordings = lexical_cast< int >( *part ); break; + case 39: m_blacklistmode = lexical_cast< int >( *part ); break; + case 40: ParseBlacklist( *part ); break; + case 41: m_fuzzytolerance = lexical_cast< int >( *part ); break; + case 42: m_useInFavorites = lexical_cast< bool >( *part ); break; + case 43: m_menuTemplate = lexical_cast< int >( *part ); break; } } } catch ( bad_lexical_cast const& ex ) { } } +std::string SearchTimer::ToText() +{ + std::string tmp_Start; + std::string tmp_Stop; + std::string tmp_minDuration; + std::string tmp_maxDuration; + std::string tmp_chanSel; + std::string tmp_search; + std::string tmp_directory; + std::string tmp_catvalues; + std::string tmp_blacklists; + + tmp_search = StringReplace(StringReplace(m_search, "|", "!^pipe^!"), ":", "|"); + tmp_directory = StringReplace(StringReplace(m_directory, "|", "!^pipe^!"), ":", "|"); + + if (m_useTime) + { + ostringstream os; + os << setw(4) << setfill('0') << m_startTime; + tmp_Start = os.str(); + os.str(""); + os << setw(4) << setfill('0') << m_stopTime; + tmp_Stop = os.str(); + } + if (m_useDuration) + { + ostringstream os; + os << setw(4) << setfill('0') << m_minDuration; + tmp_minDuration = os.str(); + os.str(""); + os << setw(4) << setfill('0') << m_maxDuration; + tmp_maxDuration = os.str(); + } + + if (m_useChannel==1) + { + cChannel const* channelMin = Channels.GetByChannelID( m_channelMin ); + cChannel const* channelMax = Channels.GetByChannelID( m_channelMax ); + + if (channelMax && channelMin->Number() < channelMax->Number()) + tmp_chanSel = *m_channelMin.ToString() + std::string("|") + *m_channelMax.ToString(); + else + tmp_chanSel = *m_channelMin.ToString(); + } + if (m_useChannel==2) + tmp_chanSel = m_channels; + + if (m_useExtEPGInfo) + { + for(unsigned int i=0; i<m_ExtEPGInfo.size(); i++) + tmp_catvalues += (tmp_catvalues != ""?"|":"") + + StringReplace(StringReplace(m_ExtEPGInfo[i], ":", "!^colon^!"), "|", "!^pipe^!"); + } + + if (m_blacklistmode == 1) + { + for(unsigned int i=0; i<m_blacklistIDs.size(); i++) + tmp_blacklists += (tmp_blacklists != ""?"|":"") + m_blacklistIDs[i]; + } + + ostringstream os; + os << m_id << ":" + << tmp_search << ":" + << (m_useTime?1:0) << ":" + << tmp_Start << ":" + << tmp_Stop << ":" + << m_useChannel << ":" + << ((m_useChannel>0 && m_useChannel<3)?tmp_chanSel:"0") << ":" + << (m_useCase?1:0) << ":" + << m_mode << ":" + << (m_useTitle?1:0) << ":" + << (m_useSubtitle?1:0) << ":" + << (m_useDescription?1:0) << ":" + << (m_useDuration?1:0) << ":" + << tmp_minDuration << ":" + << tmp_maxDuration << ":" + << (m_useAsSearchtimer?1:0) << ":" + << (m_useDayOfWeek?1:0) << ":" + << m_dayOfWeek << ":" + << (m_useEpisode?1:0) << ":" + << tmp_directory << ":" + << m_priority << ":" + << m_lifetime << ":" + << m_marginstart << ":" + << m_marginstop << ":" + << (m_useVPS?1:0) << ":" + << m_action << ":" + << (m_useExtEPGInfo?1:0) << ":" + << tmp_catvalues << ":" + << (m_avoidrepeats?1:0) << ":" + << m_allowedrepeats << ":" + << (m_compareTitle?1:0) << ":" + << (m_compareSubtitle?1:0) << ":" + << (m_compareSummary?1:0) << ":" + << m_catvaluesAvoidRepeat << ":" + << m_repeatsWithinDays << ":" + << m_delAfterDays << ":" + << m_recordingsKeep << ":" + << m_switchMinBefore << ":" + << m_pauseOnNrRecordings << ":" + << m_blacklistmode << ":" + << tmp_blacklists << ":" + << m_fuzzytolerance << ":" + << (m_useInFavorites?1:0) << ":" + << m_menuTemplate << ":"; + + return os.str(); +} + void SearchTimer::ParseChannel( string const& data ) { switch ( m_useChannel ) { @@ -98,6 +251,32 @@ void SearchTimer::ParseChannelIDs( string const& data ) m_channels += string( " - " ) + channel->Name(); } +void SearchTimer::ParseExtEPGInfo( string const& data ) +{ + m_ExtEPGInfo = StringSplit( data, '|' ); +} + +void SearchTimer::ParseBlacklist( string const& data ) +{ + m_blacklistIDs = StringSplit( data, '|' ); +} + +string SearchTimer::StartTimeFormatted() +{ + ostringstream os; + os << setw(2) << setfill('0') << ( StartTime() / 100 ) % 100 << ":" + << setw(2) << setfill('0') << StartTime() % 100; + return os.str(); +} + +string SearchTimer::StopTimeFormatted() +{ + ostringstream os; + os << setw(2) << setfill('0') << ( StopTime() / 100 ) % 100 << ":" + << setw(2) << setfill('0') << StopTime() % 100; + return os.str(); +} + SearchTimers::SearchTimers() { Epgsearch_services_v1_0 service; @@ -107,6 +286,145 @@ SearchTimers::SearchTimers() ReadLock channelsLock( Channels, 0 ); list< string > timers = service.handler->SearchTimerList(); m_timers.assign( timers.begin(), timers.end() ); + m_timers.sort(); +} + +bool SearchTimers::Save(SearchTimer* searchtimer) +{ + Epgsearch_services_v1_0 service; + if ( cPluginManager::CallFirstService("Epgsearch-services-v1.0", &service) == 0 ) + throw HtmlError( tr("No searchtimers available") ); + + if (!searchtimer) return false; + ReadLock channelsLock( Channels, 0 ); + if (searchtimer->Id() >= 0) + return service.handler->ModSearchTimer(searchtimer->ToText()); + else + { + int id = service.handler->AddSearchTimer(searchtimer->ToText()); + if (id >= 0) + searchtimer->SetId(id); + return (id >= 0); + } +} + +SearchTimer* SearchTimers::GetByTimerId( std::string const& id ) +{ + for (SearchTimers::iterator timer = m_timers.begin(); timer != m_timers.end(); ++timer) + if (timer->Id() == lexical_cast< int >(id)) + return &*timer; + return NULL; + +} + +bool SearchTimer::BlacklistSelected(int id) const +{ + for(unsigned int i=0; i<m_blacklistIDs.size(); i++) + if (StringToInt(m_blacklistIDs[i]) == id) return true; + return false; +} + +ExtEPGInfo::ExtEPGInfo( string const& data ) +{ + m_id = -1; + m_searchmode = 0; + + vector< string > parts = StringSplit( data, '|' ); + try { + vector< string >::const_iterator part = parts.begin(); + for ( int i = 0; part != parts.end(); ++i, ++part ) { + switch ( i ) { + case 0: m_id = lexical_cast< int >( *part ); break; + case 1: m_name = *part; break; + case 2: m_menuname = *part; break; + case 3: ParseValues( *part ); break; + case 4: m_searchmode = lexical_cast< int >( *part ); break; + } + } + } catch ( bad_lexical_cast const& ex ) { + } +} + +void ExtEPGInfo::ParseValues( string const& data ) +{ + m_values = StringSplit( data, ',' ); +} + +bool ExtEPGInfo::Selected(unsigned int index, std::string const& values) +{ + if (index >= m_values.size()) return false; + string extepgvalue = StringTrim(m_values[index]); + + vector< string > parts; + parts = StringSplit( values, ',' ); + for(unsigned int i=0; i<parts.size(); i++) if (StringTrim(parts[i]) == extepgvalue) return true; + parts = StringSplit( values, ';' ); + for(unsigned int i=0; i<parts.size(); i++) if (StringTrim(parts[i]) == extepgvalue) return true; + parts = StringSplit( values, '|' ); + for(unsigned int i=0; i<parts.size(); i++) if (StringTrim(parts[i]) == extepgvalue) return true; + parts = StringSplit( values, '~' ); + for(unsigned int i=0; i<parts.size(); i++) if (StringTrim(parts[i]) == extepgvalue) return true; + return false; +} + +ExtEPGInfos::ExtEPGInfos() +{ + Epgsearch_services_v1_0 service; + if ( cPluginManager::CallFirstService("Epgsearch-services-v1.0", &service) == 0 ) + throw HtmlError( tr("No searchtimers available") ); + + list< string > infos = service.handler->ExtEPGInfoList(); + m_infos.assign( infos.begin(), infos.end() ); +} + +ChannelGroup::ChannelGroup( string const& data ) +{ + vector< string > parts = StringSplit( data, '|' ); + try { + vector< string >::const_iterator part = parts.begin(); + for ( int i = 0; part != parts.end(); ++i, ++part ) { + switch ( i ) { + case 0: m_name = *part; break; + } + } + } catch ( bad_lexical_cast const& ex ) { + } +} + +ChannelGroups::ChannelGroups() +{ + Epgsearch_services_v1_0 service; + if ( cPluginManager::CallFirstService("Epgsearch-services-v1.0", &service) == 0 ) + throw HtmlError( tr("No searchtimers available") ); + + list< string > list = service.handler->ChanGrpList(); + m_list.assign( list.begin(), list.end() ); +} + +Blacklist::Blacklist( string const& data ) +{ + vector< string > parts = StringSplit( data, ':' ); + try { + vector< string >::const_iterator part = parts.begin(); + for ( int i = 0; part != parts.end(); ++i, ++part ) { + switch ( i ) { + case 0: m_id = lexical_cast< int >( *part ); break; + case 1: m_search = StringReplace( StringReplace( *part, "|", ":" ), "!^pipe^!", "|" ); break; + } + } + } catch ( bad_lexical_cast const& ex ) { + } +} + +Blacklists::Blacklists() +{ + Epgsearch_services_v1_0 service; + if ( cPluginManager::CallFirstService("Epgsearch-services-v1.0", &service) == 0 ) + throw HtmlError( tr("No searchtimers available") ); + + list< string > list = service.handler->BlackList(); + m_list.assign( list.begin(), list.end() ); + m_list.sort(); } } // namespace vdrlive |