/// <summary>
        /// Creates a new file scanner for scanning (multiple) files.
        /// </summary>
        /// <param name="containerDataScanner">The <see cref="IDataScanner"/> for container formats</param>
        /// <param name="codecDataScanner">The <see cref="IDataScanner"/> for codec formats</param>
        /// <param name="dataReaderPool">The shared pool of file data readers</param>
        /// <param name="createDataBlockBuilder">The factory method for creating data blocks</param>
        /// <param name="createSubProgressReporter">The factory method for creating a sub progress reporter</param>
        /// data scanner fors canning codec streams (of a detected data block)</param>
        /// <exception cref="ArgumentNullException">If any argument is <c>null</c></exception>
        public FileScanner(IDataScanner containerDataScanner, IDataScanner codecDataScanner, IDataScanner codecStreamDataScanner,
                           IDataReaderPool dataReaderPool, Creator <IDataBlockBuilder> createDataBlockBuilder,
                           Creator <IProgressReporter, IProgressReporter, long, long, long> createSubProgressReporter)
        {
            PreConditions.Argument("containerDataScanner").Value(containerDataScanner).IsNotNull();
            PreConditions.Argument("codecDataScanner").Value(codecDataScanner).IsNotNull();
            PreConditions.Argument("codecStreamDataScanner").Value(codecStreamDataScanner).IsNotNull();
            PreConditions.Argument("dataReaderPool").Value(dataReaderPool).IsNotNull();
            PreConditions.Argument("createDataBlockBuilder").Value(createDataBlockBuilder).IsNotNull();
            PreConditions.Argument("createSubProgressReporter").Value(createSubProgressReporter).IsNotNull();

            _containerDataScanner      = containerDataScanner;
            _codecDataScanner          = codecDataScanner;
            _codecStreamDataScanner    = codecStreamDataScanner;
            _dataReaderPool            = dataReaderPool;
            _createDataBlockBuilder    = createDataBlockBuilder;
            _createSubProgressReporter = createSubProgressReporter;

            _codecDataScanner.DataBlockDetected       += (sender, e) => FixAndReportDataBlock(e.DataBlock);
            _containerDataScanner.DataBlockDetected   += (sender, e) => ScanCodecStreams(e, e.DataBlock);
            _containerDataScanner.UnknownDataDetected += (sender, e) => ScanForCodecFormats(_inputFile.CreateDataPacket().GetSubPacket(e.Offset, e.Length));

            // The default is that container blocks are allowed to overlap. See also issue DEFR-867.
            AllowOverlap = true;
        }
예제 #2
0
 public void TearDown()
 {
     _mockRepository            = null;
     _containerDataScanner      = null;
     _codecDataScanner          = null;
     _codecStreamDataScanner    = null;
     _dataReaderPool            = null;
     _progressReporter          = null;
     _createDataBlockBuilder    = null;
     _createSubProgressReporter = null;
     _inputFile   = null;
     _fileScanner = null;
 }
예제 #3
0
        public void SetUp()
        {
            _mockRepository            = new MockRepository();
            _containerDataScanner      = MockRepository.GenerateStub <IDataScanner>();
            _codecDataScanner          = MockRepository.GenerateStub <IDataScanner>();
            _codecStreamDataScanner    = MockRepository.GenerateStub <IDataScanner>();
            _dataReaderPool            = MockRepository.GenerateStub <IDataReaderPool>();
            _progressReporter          = MockRepository.GenerateStub <IProgressReporter>();
            _createDataBlockBuilder    = MockRepository.GenerateStub <Creator <IDataBlockBuilder> >();
            _createSubProgressReporter = MockRepository.GenerateStub <Creator <IProgressReporter, IProgressReporter, long, long, long> >();
            _inputFile = MockRepository.GenerateStub <IInputFile>();

            _fileScanner = new FileScanner(_containerDataScanner, _codecDataScanner, _codecStreamDataScanner, _dataReaderPool, _createDataBlockBuilder, _createSubProgressReporter);
        }
            internal CompleteCodecStreamScanner(IDataScanner dataScanner, IDataBlockBuilder dataBlockBuilder, ICodecStream completeCodecStream, IProgressReporter progressReporter)
            {
                _dataScanner          = dataScanner;
                _dataBlockBuilder     = dataBlockBuilder;
                _completeCodecStream  = completeCodecStream;
                _progressReporter     = progressReporter;
                _codecStreamFragments = new List <IFragment>();

                long length = _completeCodecStream.Length;

                _maxUnknownDataForCompleteStream = Math.Max((MaxPercentageUnkownDataForCompleteStream * length) / 100, Math.Min((2 * MaxUnparsableBytes), length));

                long detectBytes = Math.Min(length, MaxBytesForDetect);

                _maxUnknownDataForDetect = Math.Max((MaxPercentageUnkownDataForDetect * detectBytes) / 100, Math.Min((2 * MaxUnparsableBytes), detectBytes));
            }