bool MythScheduleHelper76::FillTimerEntryWithRule(MythTimerEntry& entry, const MythRecordingRuleNode& node) const { // Assign timer type regarding rule attributes. The match SHOULD be opposite to // that which is applied in function 'NewFromTimer' MythRecordingRule rule = node.GetRule(); if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "76::%s: RecordID %u", __FUNCTION__, rule.RecordID()); switch (rule.Type()) { case Myth::RT_SingleRecord: { // Fill recording status from its upcoming MythScheduleList recordings = m_manager->FindUpComingByRuleId(rule.RecordID()); MythScheduleList::const_reverse_iterator it = recordings.rbegin(); if (it != recordings.rend()) entry.recordingStatus = it->second->Status(); else return false; // Don't transfer single without upcoming } if (rule.SearchType() == Myth::ST_ManualSearch) entry.timerType = TIMER_TYPE_MANUAL_SEARCH; else entry.timerType = TIMER_TYPE_THIS_SHOWING; entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); break; case Myth::RT_OneRecord: entry.timerType = TIMER_TYPE_RECORD_ONE; if (rule.Filter() & Myth::FM_ThisChannel) { entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); } break; case Myth::RT_DailyRecord: entry.timerType = TIMER_TYPE_RECORD_DAILY; if (rule.Filter() & Myth::FM_ThisChannel) { entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); } break; case Myth::RT_WeeklyRecord: entry.timerType = TIMER_TYPE_RECORD_WEEKLY; if (rule.Filter() & Myth::FM_ThisChannel) { entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); } break; case Myth::RT_AllRecord: if ((rule.Filter() & Myth::FM_ThisDayAndTime)) entry.timerType = TIMER_TYPE_RECORD_WEEKLY; else if ((rule.Filter() & Myth::FM_ThisTime)) entry.timerType = TIMER_TYPE_RECORD_DAILY; else if ((rule.Filter() & Myth::FM_ThisSeries)) entry.timerType = TIMER_TYPE_RECORD_SERIES; else entry.timerType = TIMER_TYPE_RECORD_ALL; if (rule.Filter() & Myth::FM_ThisChannel) { entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); } break; case Myth::RT_OverrideRecord: entry.timerType = TIMER_TYPE_OVERRIDE; entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); break; case Myth::RT_DontRecord: entry.timerType = TIMER_TYPE_DONT_RECORD; entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); break; default: entry.timerType = TIMER_TYPE_UNHANDLED; entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); break; } switch (rule.SearchType()) { case Myth::ST_TitleSearch: entry.epgSearch = rule.Description(); break; case Myth::ST_KeywordSearch: entry.epgSearch = rule.Description(); entry.timerType = TIMER_TYPE_SEARCH_KEYWORD; break; case Myth::ST_PeopleSearch: entry.epgSearch = rule.Description(); entry.timerType = TIMER_TYPE_SEARCH_PEOPLE; break; case Myth::ST_PowerSearch: entry.epgSearch = rule.Description(); entry.timerType = TIMER_TYPE_UNHANDLED; break; case Myth::ST_NoSearch: // EPG based entry.epgCheck = true; entry.epgSearch = rule.Title(); break; case Myth::ST_ManualSearch: // Manual entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); entry.startTime = rule.StartTime(); entry.endTime = rule.EndTime(); break; default: break; } switch (entry.timerType) { case TIMER_TYPE_RECORD_ONE: case TIMER_TYPE_RECORD_WEEKLY: case TIMER_TYPE_RECORD_DAILY: case TIMER_TYPE_RECORD_ALL: case TIMER_TYPE_RECORD_SERIES: case TIMER_TYPE_SEARCH_KEYWORD: case TIMER_TYPE_SEARCH_PEOPLE: case TIMER_TYPE_UNHANDLED: entry.startTime = rule.StartTime(); entry.endTime = rule.EndTime(); // For all repeating fix timeslot as needed if (!entry.HasTimeSlot()) { if (difftime(rule.NextRecording(), 0) > 0) { // fill timeslot starting at next recording entry.startTime = rule.NextRecording(); // it includes offset correction // WARNING: if next recording has been overriden then offset could be different timeadd(&entry.startTime, INTERVAL_MINUTE * rule.StartOffset()); // remove start offset entry.endTime = 0; // any time } else if (difftime(rule.LastRecorded(), 0) > 0) { // fill timeslot starting at last recorded entry.startTime = rule.LastRecorded(); // it includes offset correction // WARNING: if last recorded has been overriden then offset could be different timeadd(&entry.startTime, INTERVAL_MINUTE * rule.StartOffset()); // remove start offset entry.endTime = 0; // any time } } // For all repeating set summary status if (node.HasConflict()) entry.recordingStatus = Myth::RS_CONFLICT; else if (node.IsRecording()) entry.recordingStatus = Myth::RS_RECORDING; // break; default: entry.startTime = rule.StartTime(); entry.endTime = rule.EndTime(); } // fill others entry.epgInfo = MythEPGInfo(rule.ChannelID(), rule.StartTime(), rule.EndTime()); entry.title = rule.Title(); entry.category = rule.Category(); entry.startOffset = rule.StartOffset(); entry.endOffset = rule.EndOffset(); entry.dupMethod = rule.DuplicateControlMethod(); entry.priority = rule.Priority(); entry.expiration = GetRuleExpirationId(RuleExpiration(rule.AutoExpire(), rule.MaxEpisodes(), rule.NewExpiresOldRecord())); entry.isInactive = rule.Inactive(); entry.firstShowing = (rule.Filter() & Myth::FM_FirstShowing ? true : false); entry.recordingGroup = GetRuleRecordingGroupId(rule.RecordingGroup()); entry.entryIndex = MythScheduleManager::MakeIndex(rule); // rule index if (node.IsOverrideRule()) entry.parentIndex = MythScheduleManager::MakeIndex(node.GetMainRule()); else entry.parentIndex = 0; return true; }
bool MythScheduleHelper75::SameTimeslot(const MythRecordingRule& first, const MythRecordingRule& second) const { time_t first_st = first.StartTime(); time_t second_st = second.StartTime(); switch (first.Type()) { case Myth::RT_NotRecording: case Myth::RT_SingleRecord: case Myth::RT_OverrideRecord: case Myth::RT_DontRecord: return second_st == first_st && second.EndTime() == first.EndTime() && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_OneRecord: // FindOneRecord return second.Title() == first.Title() && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_DailyRecord: // TimeslotRecord return second.Title() == first.Title() && daytime(&first_st) == daytime(&second_st) && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_WeeklyRecord: // WeekslotRecord return second.Title() == first.Title() && daytime(&first_st) == daytime(&second_st) && weekday(&first_st) == weekday(&second_st) && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_FindDailyRecord: return second.Title() == first.Title() && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_FindWeeklyRecord: return second.Title() == first.Title() && weekday(&first_st) == weekday(&second_st) && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_ChannelRecord: return second.Title() == first.Title() && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_AllRecord: return second.Title() == first.Title() && second.Filter() == first.Filter(); default: break; } return false; }