private IResultNode RescanDetectable(IFragment detectable, IProgressReporter progressReporter, IDataReaderPool dataReaderPool)
        {
            IDataPacket data = detectable;

            if (detectable is ICodecStream)
            {
                // Data is specified relative to the codec stream (see IDetectable.Data)
                data = GetData(detectable as ICodecStream, progressReporter, dataReaderPool);

                if (progressReporter.CancellationPending)
                {
                    return(null);                                                      // The rescan is cancelled
                }
                var codecStream = detectable as ICodecStream;
                if (codecStream.ReferenceHeader != null)
                {
                    long off = codecStream.ReferenceHeaderOffset;
                    if (off == 0L)
                    {
                        data = codecStream.ReferenceHeader.Append(data);
                    }
                    else
                    {
                        data = data.GetSubPacket(0, off).Append(codecStream.ReferenceHeader).Append(data.GetSubPacket(off, data.Length - off));
                    }
                }
            }
            if (detectable is IDataBlock)
            {
                IDataBlock dataBlock = detectable as IDataBlock;
                if (dataBlock.ReferenceHeader != null)
                {
                    long off = dataBlock.ReferenceHeaderOffset;
                    if (off == 0L)
                    {
                        data = dataBlock.ReferenceHeader.Append(detectable);
                    }
                    else
                    {
                        data = detectable.GetSubPacket(0, off).Append(dataBlock.ReferenceHeader).Append(detectable.GetSubPacket(off, detectable.Length - off));
                    }
                }
            }

            IResultNode results;

            using (IDataReader dataReader = new ProgressDataReader(new FragmentedDataReader(data, dataReaderPool), progressReporter))
            {
                IScanContext scanContext = _createScanContext(detectable.InputFile.Project);
                scanContext.Detectors = detectable.Detectors;

                IDataBlockBuilder dataBlockBuilder = _createDataBlockBuilder();
                dataBlockBuilder.Detectors = scanContext.Detectors;
                dataBlockBuilder.InputFile = detectable.InputFile;

                IDetector  detector = GetDetector(detectable);
                IDataBlock newDataBlock;

                var codecDetector = (detector as ICodecDetector);
                if (codecDetector == null)
                {
                    newDataBlock = detector.DetectData(dataReader, dataBlockBuilder, scanContext);
                }
                else
                {
                    var referenceHeaders = codecDetector.ReferenceHeaders;
                    try
                    {
                        // Disable reference headers during rescan
                        codecDetector.ReferenceHeaders = null;
                        newDataBlock = detector.DetectData(dataReader, dataBlockBuilder, scanContext);
                    }
                    finally
                    {
                        // Restore reference headers
                        codecDetector.ReferenceHeaders = referenceHeaders;
                    }
                }

                if (!progressReporter.CancellationPending && newDataBlock == null)
                {
                    RetrievedDetectableIsDifferentThanTheOneRetrievedDuringTheInitialScan();
                    return(null);
                }

                results = scanContext.Results;

                // Check cancellation request and results / data block
                if (!progressReporter.CancellationPending && (detectable is IDataBlock) && !IsDataBlockCorrect(detectable as IDataBlock, newDataBlock))
                {
                    //RetrievedDetectableIsDifferentThanTheOneRetrievedDuringTheInitialScan();
                    //return null;
                }
            }
            return(results);
        }