/// <summary>
        /// Fordert zum Beenden einer Aufzeichnung oder Aufgabe aus.
        /// </summary>
        /// <param name="item">Alle notwendigen Informationen zur Aufzeichnung.</param>
        /// <param name="planner">Die zugehörige Aufzeichnungsplanung.</param>
        public void Stop( IScheduleInformation item, RecordingPlanner planner )
        {
            // Report
            Debug.WriteLine( string.Format( "{0} stop {1}", m_planTime.ToLocalTime(), item.Definition.Name ) );

            // Readout
            var definition = item.Definition;
            var resource = item.Resource;

            // Forward
            planner.Stop( definition.UniqueIdentifier );

            // Check mode
            if (definition is ProgramGuideTask)
                m_lastRunGuide[resource.Name] = m_planTime;
            else if (definition is SourceListTask)
                m_lastRunScan[resource.Name] = m_planTime;
            else
                VCRConfiguration.Current.HasRecordedSomething = true;
        }
        /// <summary>
        /// Fordert zum Starten einer Aufzeichnung oder Aufgabe auf.
        /// </summary>
        /// <param name="item">Die Beschreibung der Aufgabe.</param>
        /// <param name="planner">Die zugehörige Aufzeichnungsplanung.</param>
        /// <param name="context">Zusatzinformationen zur Aufzeichnungsplanung.</param>
        public void Start( IScheduleInformation item, RecordingPlanner planner, PlanContext context )
        {
            // Report
            Debug.WriteLine( string.Format( "{0} start{3} on {1}: {2}", m_planTime.ToLocalTime(), item.Resource, item.Definition.Name, item.StartsLate ? " late" : string.Empty ) );

            // Forward
            planner.Start( item );
        }
        /// <summary>
        /// Überträgt alle Aufträge in einen Ablaufplanung.
        /// </summary>
        /// <param name="scheduler">Die zu befüllende Ablaufplanung.</param>
        /// <param name="disabled">Alle deaktivierten Aufträge.</param>
        /// <param name="planner">Die zugehörige Aufzeichnungsplanung.</param>
        /// <param name="context">Detailinformationen zur Planung.</param>
        public void AddRegularJobs( RecordingScheduler scheduler, Func<Guid, bool> disabled, RecordingPlanner planner, PlanContext context )
        {
            // Retrieve all jobs related to this profile
            foreach (var job in m_jobs.Values)
                foreach (var schedule in job.Schedules)
                {
                    // No longer in use
                    if (!schedule.IsActive)
                        continue;

                    // Resolve source
                    var source = schedule.Source ?? job.Source;
                    if (source == null)
                        continue;

                    // Resolve profile
                    var resource = planner.GetResourceForProfile( source.ProfileName );
                    if (resource == null)
                        continue;

                    // Register
                    schedule.AddToScheduler( scheduler, job, new[] { resource }, FindSource, disabled, context );

                    // Connect
                    context.RegisterSchedule( schedule, job );
                }
        }