/// <summary>Assign all schedules to cards</summary> /// <param name="Schedules">An IList containing all scheduled recordings</param> /// <returns>Array of List<Schedule> : one per card, index [0] contains unassigned schedules</returns> private List <Schedule>[] AssignSchedulesToCards(IList <Schedule> Schedules) { IList <Card> cardsList = Card.ListAllEnabled(); // creates an array of Schedule Lists // element [0] will be filled with conflicting schedules // element [x] will be filled with the schedules assigned to card with idcard=x List <Schedule>[] cardSchedules = new List <Schedule> [cardsList.Count + 1]; for (int i = 0; i < cardsList.Count + 1; i++) { cardSchedules[i] = new List <Schedule>(); } #region assigns schedules from table // Dictionary <int, int> cardno = new Dictionary <int, int>(); int n = 1; foreach (Card _card in _cards) { cardno.Add(_card.IdCard, n); n++; } // foreach (Schedule schedule in Schedules) { bool assigned = false; Schedule lastOverlappingSchedule = null; int lastBusyCard = 0; bool overlap = false; foreach (Card card in cardsList) { if (card.canViewTvChannel(schedule.IdChannel)) { // checks if any schedule assigned to this cards overlaps current parsed schedule bool free = true; foreach (Schedule assignedSchedule in cardSchedules[cardno[card.IdCard]]) { if (schedule.IsOverlapping(assignedSchedule)) { bool _isSameTransponder = (cmLayer.isSameTransponder(schedule, assignedSchedule) && card.supportSubChannels); if (!_isSameTransponder) { free = false; //_overlap = true; lastOverlappingSchedule = assignedSchedule; lastBusyCard = card.IdCard; break; } } } if (free) { cardSchedules[cardno[card.IdCard]].Add(schedule); assigned = true; break; } } } if (!assigned) { cardSchedules[0].Add(schedule); Conflict newConflict = new Conflict(schedule.IdSchedule, lastOverlappingSchedule.IdSchedule, schedule.IdChannel, schedule.StartTime); newConflict.IdCard = lastBusyCard; newConflict.Persist(); Program prg = Program.RetrieveByTitleTimesAndChannel(schedule.ProgramName, schedule.StartTime, schedule.EndTime, schedule.IdChannel); if (prg != null) { prg.HasConflict = true; prg.Persist(); _conflictingPrograms.Add(prg); } } } #endregion return(cardSchedules); }