public void FutureStartIsActive()
        {
            var cut =
                new VCRSchedule
                {
                    FirstStart = DateTime.UtcNow.AddDays( 1 ),
                    UniqueID = Guid.NewGuid(),
                    Duration = 10,
                };

            Assert.IsTrue( cut.IsActive );
        }
 /// <summary>
 /// Legt eine neue Information an.
 /// </summary>
 /// <param name="job">Der Auftrag.</param>
 /// <param name="schedule">Die Aufzeichnung.</param>
 /// <param name="guide">Ein Eintrag der Programmzeitschrift.</param>
 /// <param name="profile">Vorgabe für das Geräteprofil.</param>
 /// <returns>Die Information.</returns>
 public static JobScheduleInfo Create( VCRJob job, VCRSchedule schedule, ProgramGuideEntry guide, string profile )
 {
     // Process
     return
         new JobScheduleInfo
         {
             ScheduleIdentifier = (schedule == null) ? null : schedule.UniqueID.Value.ToString( "N" ),
             JobIdentifier = (job == null) ? null : job.UniqueID.Value.ToString( "N" ),
             Schedule = EditSchedule.Create( schedule, job, guide ),
             Job = EditJob.Create( job, guide, profile ),
         };
 }
 /// <summary>
 /// Meldet die Daten zu einer Aufzeichnung.
 /// </summary>
 /// <param name="schedule">Die Aufzeichnung.</param>
 /// <param name="job">Der zugehörige Auftrag.</param>
 /// <returns></returns>
 public static InfoSchedule Create( VCRSchedule schedule, VCRJob job )
 {
     // Create
     return
         new InfoSchedule
         {
             Source = (schedule.Source ?? job.Source).GetUniqueName(),
             WebId = ServerRuntime.GetUniqueWebId( job, schedule ),
             StartTime = schedule.FirstStart,
             RepeatPattern = schedule.Days,
             Duration = schedule.Duration,
             Name = schedule.Name,
         };
 }
        public void FutureStartWithRepeatIsActive()
        {
            foreach (DayOfWeek day in Enum.GetValues( typeof( DayOfWeek ) ))
            {
                var cut =
                    new VCRSchedule
                    {
                        FirstStart = DateTime.UtcNow.AddDays( 1 ),
                        Days = VCRSchedule.GetDay( day ),
                        UniqueID = Guid.NewGuid(),
                        Duration = 10,
                    };

                cut.LastDay = cut.FirstStart.ToLocalTime().Date.AddDays( 14 );

                Assert.IsTrue( cut.IsActive, "{0}", day );
            }
        }
        public void FutureStartWithRepeatIsInactive()
        {
            for (var delta = 10; delta-- > 0; )
                foreach (DayOfWeek day in Enum.GetValues( typeof( DayOfWeek ) ))
                {
                    var cut =
                        new VCRSchedule
                        {
                            FirstStart = DateTime.UtcNow.AddDays( 1 + 40 * delta ),
                            Days = VCRSchedule.GetDay( day ),
                            UniqueID = Guid.NewGuid(),
                            Duration = 10,
                        };

                    cut.LastDay = cut.FirstStart.ToLocalTime().Date.AddDays( 5 );

                    Assert.AreEqual( day != cut.FirstStart.ToLocalTime().AddDays( -1 ).DayOfWeek, cut.IsActive, "{0} {1}", delta, day );
                }
        }
        /// <summary>
        /// Erstellt eine neue Ausnahmebeschreibung.
        /// </summary>
        /// <param name="exception">Die Ausnahmedaten.</param>
        /// <param name="schedule">Die zugehörige Aufzeichnung.</param>
        private PlanException( VCRScheduleException exception, VCRSchedule schedule )
        {
            // Remember
            ExceptionDurationDelta = exception.Duration.GetValueOrDefault( schedule.Duration ) - schedule.Duration;
            ExceptionDate = new DateTime( exception.When.Date.Ticks, DateTimeKind.Utc );
            ExceptionStartShift = exception.ShiftTime.GetValueOrDefault( 0 );

            // Start berechnen
            PlannedStart = (new DateTime( exception.When.Date.Ticks, DateTimeKind.Local ) + schedule.FirstStart.ToLocalTime().TimeOfDay).ToUniversalTime();
            PlannedDuration = schedule.Duration;
        }
        /// <summary>
        /// Erstellt eine neue Ausnahmebeschreibung.
        /// </summary>
        /// <param name="exception">Die Ausnahmedaten.</param>
        /// <param name="schedule">Die zugehörige Aufzeichnung.</param>
        /// <returns>Die neue Ausnahmebeschreibung.</returns>
        public static PlanException Create( VCRScheduleException exception, VCRSchedule schedule )
        {
            // Validate
            if (exception == null)
                throw new ArgumentNullException( nameof( exception ) );
            if (schedule == null)
                throw new ArgumentNullException( nameof( schedule ) );

            // Forward
            return new PlanException( exception, schedule );
        }
        /// <summary>
        /// Erstellt die Beschreibung der Aufzeichnung für die persistente Ablage.
        /// </summary>
        /// <param name="scheduleIdentifier">Die eindeutige Kennung der Aufzeichnung.</param>
        /// <param name="job">Der zugehörige Auftrag.</param>
        /// <returns>Die gewünschte Beschreibung.</returns>
        public VCRSchedule CreateSchedule( Guid scheduleIdentifier, VCRJob job )
        {
            // Create
            var schedule =
                new VCRSchedule
                {
                    UniqueID = scheduleIdentifier,
                    FirstStart = FirstStart,
                    Days = RepeatPattern,
                    Duration = Duration,
                    LastDay = LastDay,
                    Name = Name,
                };

            // See if we have a source
            var sourceName = Source;
            if (string.IsNullOrEmpty( sourceName ))
                return schedule;

            // See if there is a profile
            var jobSource = job.Source;
            if (jobSource == null)
                return schedule;

            // Locate the source
            schedule.Source = ServerRuntime.VCRServer.FindSource( jobSource.ProfileName, sourceName );
            if (schedule.Source == null)
                return schedule;

            // Configure streams
            schedule.Streams = new StreamSelection();

            // Set all - oder of audio settings is relevant, dolby MUST come last
            schedule.Streams.SetUsesAllAudio( AllLanguages );
            schedule.Streams.SetUsesDolbyAudio( DolbyDigital );
            schedule.Streams.SetUsesSubtitles( DVBSubtitles );
            schedule.Streams.SetUsesVideotext( Videotext );
            schedule.Streams.ProgramGuide = true;

            // Report
            return schedule;
        }
        /// <summary>
        /// Erstellt eine Beschreibung zu dieser Aufzeichnung.
        /// </summary>
        /// <param name="schedule">Eine Aufzeichnung.</param>
        /// <param name="job">Der bereits vorhandene Auftrag.</param>
        /// <param name="guide">Ein Eintrag aus der Programmzeitschrift.</param>
        /// <returns>Die gewünschte Beschreibung.</returns>
        public static EditSchedule Create( VCRSchedule schedule, VCRJob job, ProgramGuideEntry guide )
        {
            // None
            if (schedule == null)
            {
                // No hope
                if (guide == null)
                    return null;

                // Calculate
                var start = guide.StartTime - TimeSpan.FromMinutes( UserProfileSettings.EPGPreTime );
                var duration = checked( (int) (UserProfileSettings.EPGPreTime + (guide.Duration / 60) + UserProfileSettings.EPGPostTime) );

                // Partial - we have a brand new job which is pre-initialized with the source
                if (job == null)
                    return new EditSchedule { FirstStart = start, Duration = duration };

                // Full monty - we have to overwrite the jobs settings since we are not the first schedule
                return
                    new EditSchedule
                    {
                        Source = ServerRuntime.VCRServer.GetUniqueName( new SourceSelection { ProfileName = job.Source.ProfileName, Source = guide.Source } ),
                        DVBSubtitles = UserProfileSettings.UseSubTitles,
                        DolbyDigital = UserProfileSettings.UseAC3,
                        AllLanguages = UserProfileSettings.UseMP2,
                        Videotext = UserProfileSettings.UseTTX,
                        Name = guide.Name.MakeValid(),
                        Duration = duration,
                        FirstStart = start,
                    };
            }

            // Consolidate exceptions
            schedule.CleanupExceptions();

            // Optionen ermitteln
            var streams = schedule.Streams;
            var sourceName = ServerRuntime.VCRServer.GetUniqueName( schedule.Source );

            // Create
            return
                new EditSchedule
                {
                    Exceptions = schedule.Exceptions.Select( exception => PlanException.Create( exception, schedule ) ).ToArray(),
                    LastDay = schedule.LastDay.GetValueOrDefault( VCRSchedule.MaxMovableDay ),
                    DolbyDigital = streams.GetUsesDolbyAudio(),
                    DVBSubtitles = streams.GetUsesSubtitles(),
                    AllLanguages = streams.GetUsesAllAudio(),
                    Videotext = streams.GetUsesVideotext(),
                    FirstStart = schedule.FirstStart,
                    RepeatPattern = schedule.Days,
                    Duration = schedule.Duration,
                    Name = schedule.Name,
                    Source = sourceName,
                };
        }
 /// <summary>
 /// Ermittelt eine Referenz für eine bestimmte Aufzeichung in einem Auftrag, so dass diese
 /// auch in einer URL verwendet werden kann.
 /// </summary>
 /// <param name="job">Ein Auftrag.</param>
 /// <param name="schedule">Eine Aufzeichnung.</param>
 /// <returns>Die eindeutige Referenz.</returns>
 public static string GetUniqueWebId( VCRJob job, VCRSchedule schedule )
 {
     // Forward
     if (job == null)
         return "*";
     else if (schedule == null)
         return string.Format( "*{0:N}", job.UniqueID.Value );
     else
         return GetUniqueWebId( job.UniqueID.Value, schedule.UniqueID.Value );
 }