/// <summary>
        /// Prüft die Eingangsdaten.
        /// </summary>
        /// <returns>Gesetzt, wenn weitere Aktionen notwendig sind.</returns>
        private bool Validate()
        {
            // Validation phase
            try
            {
                // Check times
                if (m_originalEndTime < m_startTime)
                    throw new InvalidOperationException( "ends before start" );

                // Load the device
                m_device = m_service.Devices[m_allocation.CardId];
                if (m_device == null)
                    throw new InvalidOperationException( "bad device name" );

                // Find the possible sources
                m_sources = m_device.Resolve( m_allocation.ChannelName );
                if (m_sources == null)
                    throw new InvalidOperationException( "no such channel" );

                // Prepare next step
                m_run = Start;

                // When we should go for it
                NextTime = m_startTime;

                // If we are overdue just start immediately
                return (NextTime <= DateTime.UtcNow) ? Run() : true;
            }
            catch (Exception e)
            {
                // Report to scheduler
                using (var sink = new RecorderCallbackServiceAgent( m_schedulerHost, m_schedulerPort ))
                    sink.StartRecordingFailed( m_allocation, m_program, e.Message );

                // No further error processing required
                return false;
            }
        }