IEnumerable <ScanResult> ScanStream(Contracts.Enums.FileType fileType, bool scanOverlaps)
        {
            streamLength = 0L;
            using (var stream = InitiateStream(fileType))
            {
                int read;
                do
                {
                    read = stream.Read(buffer, blockSize);
                    var scanResult = client.ScanBuffer(
                        buffer
                        , (uint)blockSize
                        , $"{filePath}@{stream.Position}>{stream.CurrentEntryName}");

                    yield return(scanResult);
                } while (read > 0);
                streamLength = stream.Position;
            }

            if (scanOverlaps && fileInfo.Length > blockSize)
            {
                using (var stream = InitiateStream(fileType))
                    foreach (var overlap in GetOverlaps(streamLength))
                    {
                        yield return(ScanSegment(stream, overlap));
                    }
            }
        }
        bool TryScan(Contracts.Enums.FileType fileType, bool scanOverlaps, out ScanResult lastResult, out ScanResult breakingResult)
        {
            ScanResult anyResult = null;

            try
            {
                breakingResult = ScanStream(fileType, scanOverlaps)
                                 .FirstOrDefault(segmentResult => ResultBuilder.IsBreakResult((anyResult = segmentResult).Result));
            }
            catch (AMSIRejectedByPolicyException e)
            {
                breakingResult = new ScanResult()
                {
                    IsSafe       = false,
                    Result       = DetectionResult.FileRejected,
                    ResultDetail = e.Message
                };
            }
            catch (Exception e)
            {
                breakingResult = new ScanResult()
                {
                    IsSafe       = false,
                    Result       = DetectionResult.ApplicationError,
                    ResultDetail = e.ToString()
                };
            }

            if (anyResult != null)
            {
                anyResult.ContentInfo.ContentByteSize = streamLength;
                anyResult.ContentInfo.ContentHash     = md5Hash.GetAwaiter().GetResult();
                anyResult.ContentInfo.ContentName     = filePath;
                anyResult.ContentInfo.ContentType     = ContentType.File;
                anyResult.ContentInfo.ContentFileType = ConvertFileType(fileSignature.FileType);
            }

            lastResult = anyResult;
            return(breakingResult == null);
        }
 internal IInputStream InitiateStream(Contracts.Enums.FileType fileType)
 => InputStreamsFunc[fileType]();