Ejemplo n.º 1
0
        public unsafe void Init(Stream stream, CompressionMode mode, LZMAOptionLZMA *opts)
        {
            _compressedStream = stream;
            _mode             = mode;

            _isClosed = false;

            _zstreamBuff   = new byte[sizeof(LZMAStreamNative)];
            _zstreamHandle = GCHandle.Alloc(_zstreamBuff, GCHandleType.Pinned);
            _zstream       = (LZMAStreamNative *)_zstreamHandle.AddrOfPinnedObject().ToPointer();

            _tmpBuffer       = new byte[BufferSize];
            _tmpBufferHandle = GCHandle.Alloc(_tmpBuffer, GCHandleType.Pinned);
            _tmpBufferPtr    = _tmpBufferHandle.AddrOfPinnedObject().ToPointer();

            LZMAStatus ret;

            switch (mode)
            {
            case CompressionMode.Compress:
                // We will always use one filter, + 1 to mark the end of the filter array
                var filters = stackalloc LZMAFilter[2];
                filters[0].id      = LZMANative.LZMA_FILTER_LZMA2;
                filters[0].options = opts;
                filters[1].id      = LZMANative.LZMA_VLI_UNKNOWN;

                ret = LZMANative.lzma_stream_encoder(_zstream, filters, LZMACheck.LZMA_CHECK_CRC64);

                if (ret != LZMAStatus.LZMA_OK)
                {
                    throw new ArgumentException(string.Format("Unable to init LZMA decoder. Return code: {0}", ret));
                }

                _zstream->next_out  = _tmpBufferPtr;
                _zstream->avail_out = (IntPtr)_tmpBuffer.Length;

                break;

            case CompressionMode.Decompress:
                ret = LZMANative.lzma_auto_decoder(_zstream, 1024 * 1024 * 1024, 0);

                if (ret != LZMAStatus.LZMA_OK)
                {
                    throw new ArgumentException(string.Format("Unable to init LZMA decoder. Return code: {0}", ret));
                }
                break;
            }
        }