/// <summary> /// Entschlüsselt eine einzelne Quelle. /// </summary> /// <param name="service">Die Informationen zur Quelle.</param> /// <param name="graph">Der zu verwendende Graph.</param> public void Decrypt( ushort service, DataGraph graph ) { // Check COM interface var controlPtr = ComIdentity.QueryInterface( graph.AdditionalFilters[m_filterIndex].Interface, typeof( KsControl.Interface ) ); if (controlPtr != IntPtr.Zero) using (var control = new KsControl( controlPtr )) control.SetServices( service ); }
/// <summary> /// Aktiviert die Entschlüsselung einer Quelle. /// </summary> /// <param name="token">Informationen zur gewählten Quelle.</param> public PipelineResult Decrypt( DataGraph.DecryptToken token ) { // Load graph if (token != null) m_dataGraph = token.Pipeline.Graph; // Get unique call identifier var callIdentifier = Interlocked.Increment( ref m_changeCounter ); // See if we can do anything if (m_dataGraph == null) return PipelineResult.Continue; if (m_filterIndex < 0) return PipelineResult.Continue; if (m_filterIndex >= m_dataGraph.AdditionalFilters.Count) return PipelineResult.Continue; // Deactivate if CAM reset is forbidden var sources = (token == null) ? null : token.Sources; var noSources = (sources == null) || (sources.Length < 1); if ((noSources && (m_suppress != SuppressionMode.Complete)) || !m_hasBeenReset) lock (m_deviceAccess) { // Check COM interface var controlPtr = ComIdentity.QueryInterface( m_dataGraph.AdditionalFilters[m_filterIndex].Interface, typeof( KsControl.Interface ) ); if (controlPtr == IntPtr.Zero) return PipelineResult.Continue; // Process using (var control = new KsControl( controlPtr )) { // Report if (BDASettings.BDATraceSwitch.Enabled) Trace.WriteLine( Properties.Resources.Trace_ResetCAM, BDASettings.BDATraceSwitch.DisplayName ); // Reset the CAM control.Reset(); // We did it once m_hasBeenReset = true; } } // Start processor token.WaitForPMTs( ( pmt, first ) => { // See if we are still allowed to process and do so lock (m_deviceAccess) { // No longer current if (Thread.VolatileRead( ref m_changeCounter ) != callIdentifier) return false; // Try reset if (!first) if (m_disableOnChange) Decrypt( 0, m_dataGraph ); // Wait for it if (m_changeDelay > 0) Thread.Sleep( m_changeDelay ); // Regular Decrypt( pmt.ProgramNumber, m_dataGraph ); } // Next return true; }, sources ); // Next return PipelineResult.Continue; }