コード例 #1
0
        private void ExtractFileFromStream(
            LimitedStream sourceStream,
            Stream targetStream,
            long fileSize,
            ICryptoTransform decryptor,
            DecompressorCreator createDecompressor,
            Action <double> onProgress,
            CancellationToken cancellationToken)
        {
            using (var cryptoStream = new CryptoStream(sourceStream, decryptor, CryptoStreamMode.Read))
            {
                using (var wrapperStream = new GZipReadWrapperStream(cryptoStream))
                {
                    using (Stream decompressionStream = createDecompressor(wrapperStream))
                    {
                        try
                        {
                            const int bufferSize = 128 * 1024;
                            var       buffer     = new byte[bufferSize];
                            int       count;

                            while ((count = decompressionStream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                cancellationToken.ThrowIfCancellationRequested();
                                targetStream.Write(buffer, 0, count);

                                long bytesProcessed = sourceStream.Limit - sourceStream.BytesLeft;
                                onProgress(bytesProcessed / (double)fileSize);
                            }
                        }
                        catch (OperationCanceledException)
                        {
                            throw;
                        }
                        catch (Exception e)
                        {
                            DebugLogger.LogException(e);

                            PatcherLogManager        logManager     = PatcherLogManager.Instance;
                            PatcherLogSentryRegistry sentryRegistry = logManager.SentryRegistry;
                            RavenClient ravenClient = sentryRegistry.RavenClient;

                            var sentryEvent = new SentryEvent(e);
                            PatcherLogSentryRegistry.AddDataToSentryEvent(sentryEvent, logManager.Storage.Guid.ToString());
                            ravenClient.Capture(sentryEvent);

                            throw;
                        }
                    }
                }
            }
        }
コード例 #2
0
    public void Wrapped_Read_Succeeds_On_Mocked_Stream()
    {
        string decompressed;

        using (var targetStream = new MemoryStream())
        {
            using (var mockStream = new MockStream(compressedData, 5))
            {
                using (var wrapperStream = new GZipReadWrapperStream(mockStream))
                {
                    using (var gzipStream = new GZipStream(wrapperStream, CompressionMode.Decompress))
                    {
                        Streams.Copy(gzipStream, targetStream);
                    }
                }
            }

            decompressed = Encoding.ASCII.GetString(targetStream.ToArray());
        }

        Assert.That(decompressed == RawData);
    }