Ejemplo n.º 1
0
        public unsafe void Init(Stream stream, CompressionMode mode, uint preset)
        {
            _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:
                ret = LZMANative.lzma_easy_encoder(_zstream, preset, 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;
            }
        }