Inheritance: System.Runtime.InteropServices.SafeHandle
Exemple #1
0
        internal Deflater(CompressionLevel compressionLevel, int windowBits)
        {
            Debug.Assert(windowBits >= minWindowBits && windowBits <= maxWindowBits);
            ZLibNative.CompressionLevel zlibCompressionLevel;
            int memLevel;

            switch (compressionLevel)
            {
            // See the note in ZLibNative.CompressionLevel for the recommended combinations.

            case CompressionLevel.Optimal:
                zlibCompressionLevel = ZLibNative.CompressionLevel.DefaultCompression;
                memLevel             = ZLibNative.Deflate_DefaultMemLevel;
                break;

            case CompressionLevel.Fastest:
                zlibCompressionLevel = ZLibNative.CompressionLevel.BestSpeed;
                memLevel             = ZLibNative.Deflate_DefaultMemLevel;
                break;

            case CompressionLevel.NoCompression:
                zlibCompressionLevel = ZLibNative.CompressionLevel.NoCompression;
                memLevel             = ZLibNative.Deflate_NoCompressionMemLevel;
                break;

            case CompressionLevel.SmallestSize:
                zlibCompressionLevel = ZLibNative.CompressionLevel.BestCompression;
                memLevel             = ZLibNative.Deflate_DefaultMemLevel;
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(compressionLevel));
            }

            ZLibNative.CompressionStrategy strategy = ZLibNative.CompressionStrategy.DefaultStrategy;

            ZLibNative.ZLibStreamHandle?zlibStream = null;
            ZErrorCode errC;

            try
            {
                errC = ZLibNative.CreateZLibStreamForDeflate(out zlibStream, zlibCompressionLevel,
                                                             windowBits, memLevel, strategy);
            }
            catch (Exception cause)
            {
                zlibStream?.Dispose();
                throw new ZLibException(SR.ZLibErrorDLLLoadError, cause);
            }

            _zlibStream = zlibStream;

            switch (errC)
            {
            case ZErrorCode.Ok:
                return;

            case ZErrorCode.MemError:
                throw new ZLibException(SR.ZLibErrorNotEnoughMemory, "deflateInit2_", (int)errC, _zlibStream.GetErrorMessage());

            case ZErrorCode.VersionError:
                throw new ZLibException(SR.ZLibErrorVersionMismatch, "deflateInit2_", (int)errC, _zlibStream.GetErrorMessage());

            case ZErrorCode.StreamError:
                throw new ZLibException(SR.ZLibErrorIncorrectInitParameters, "deflateInit2_", (int)errC, _zlibStream.GetErrorMessage());

            default:
                throw new ZLibException(SR.ZLibErrorUnexpected, "deflateInit2_", (int)errC, _zlibStream.GetErrorMessage());
            }
        }