Process() 개인적인 메소드

private Process ( int r ) : int
r int
리턴 int
예제 #1
0
        internal int Inflate()
        {
            if (_codec.InputBuffer == null)
            {
                throw new InvalidOperationException("InputBuffer is null. ");
            }

            int r = RCode.BufferError;

            if (!done)
            {
                r = blocks.Process(r);
                if (r == RCode.DataError)
                {
                    throw new InvalidDataException("Bad state");
                }

                if (r != RCode.StreamEnd)
                {
                    return(r);
                }

                blocks.Reset();
                done = true;
            }
            return(RCode.StreamEnd);
        }
예제 #2
0
        internal int Inflate(FlushType flush)
        {
            int b;

            if (_codec.InputBuffer == null)
            {
                throw new ZlibException("InputBuffer is null. ");
            }

//             int f = (flush == FlushType.Finish)
//                 ? ZlibConstants.Z_BUF_ERROR
//                 : ZlibConstants.Z_OK;

            // workitem 8870
            int f = ZlibConstants.Z_OK;
            int r = ZlibConstants.Z_BUF_ERROR;

            while (true)
            {
                switch (mode)
                {
                case InflateManagerMode.METHOD:
                    if (_codec.AvailableBytesIn == 0)
                    {
                        return(r);
                    }
                    r = f;
                    _codec.AvailableBytesIn--;
                    _codec.TotalBytesIn++;
                    if (((method = _codec.InputBuffer[_codec.NextIn++]) & 0xf) != Z_DEFLATED)
                    {
                        mode           = InflateManagerMode.BAD;
                        _codec.Message = String.Format("unknown compression method (0x{0:X2})", method);
                        marker         = 5;                         // can't try inflateSync
                        break;
                    }
                    if ((method >> 4) + 8 > wbits)
                    {
                        mode           = InflateManagerMode.BAD;
                        _codec.Message = String.Format("invalid window size ({0})", (method >> 4) + 8);
                        marker         = 5;                         // can't try inflateSync
                        break;
                    }
                    mode = InflateManagerMode.FLAG;
                    break;


                case InflateManagerMode.FLAG:
                    if (_codec.AvailableBytesIn == 0)
                    {
                        return(r);
                    }
                    r = f;
                    _codec.AvailableBytesIn--;
                    _codec.TotalBytesIn++;
                    b = (_codec.InputBuffer[_codec.NextIn++]) & 0xff;

                    if ((((method << 8) + b) % 31) != 0)
                    {
                        mode           = InflateManagerMode.BAD;
                        _codec.Message = "incorrect header check";
                        marker         = 5;                         // can't try inflateSync
                        break;
                    }

                    mode = ((b & PRESET_DICT) == 0)
                                                        ? InflateManagerMode.BLOCKS
                                                        : InflateManagerMode.DICT4;
                    break;

                case InflateManagerMode.DICT4:
                    if (_codec.AvailableBytesIn == 0)
                    {
                        return(r);
                    }
                    r = f;
                    _codec.AvailableBytesIn--;
                    _codec.TotalBytesIn++;
                    expectedCheck = (uint)((_codec.InputBuffer[_codec.NextIn++] << 24) & 0xff000000);
                    mode          = InflateManagerMode.DICT3;
                    break;

                case InflateManagerMode.DICT3:
                    if (_codec.AvailableBytesIn == 0)
                    {
                        return(r);
                    }
                    r = f;
                    _codec.AvailableBytesIn--;
                    _codec.TotalBytesIn++;
                    expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 16) & 0x00ff0000);
                    mode           = InflateManagerMode.DICT2;
                    break;

                case InflateManagerMode.DICT2:

                    if (_codec.AvailableBytesIn == 0)
                    {
                        return(r);
                    }
                    r = f;
                    _codec.AvailableBytesIn--;
                    _codec.TotalBytesIn++;
                    expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 8) & 0x0000ff00);
                    mode           = InflateManagerMode.DICT1;
                    break;


                case InflateManagerMode.DICT1:
                    if (_codec.AvailableBytesIn == 0)
                    {
                        return(r);
                    }
                    r = f;
                    _codec.AvailableBytesIn--; _codec.TotalBytesIn++;
                    expectedCheck  += (uint)(_codec.InputBuffer[_codec.NextIn++] & 0x000000ff);
                    _codec._Adler32 = expectedCheck;
                    mode            = InflateManagerMode.DICT0;
                    return(ZlibConstants.Z_NEED_DICT);


                case InflateManagerMode.DICT0:
                    mode           = InflateManagerMode.BAD;
                    _codec.Message = "need dictionary";
                    marker         = 0;                     // can try inflateSync
                    return(ZlibConstants.Z_STREAM_ERROR);


                case InflateManagerMode.BLOCKS:
                    r = blocks.Process(r);
                    if (r == ZlibConstants.Z_DATA_ERROR)
                    {
                        mode   = InflateManagerMode.BAD;
                        marker = 0;                                 // can try inflateSync
                        break;
                    }

                    if (r == ZlibConstants.Z_OK)
                    {
                        r = f;
                    }

                    if (r != ZlibConstants.Z_STREAM_END)
                    {
                        return(r);
                    }

                    r             = f;
                    computedCheck = blocks.Reset();
                    if (!HandleRfc1950HeaderBytes)
                    {
                        mode = InflateManagerMode.DONE;
                        return(ZlibConstants.Z_STREAM_END);
                    }
                    mode = InflateManagerMode.CHECK4;
                    break;

                case InflateManagerMode.CHECK4:
                    if (_codec.AvailableBytesIn == 0)
                    {
                        return(r);
                    }
                    r = f;
                    _codec.AvailableBytesIn--;
                    _codec.TotalBytesIn++;
                    expectedCheck = (uint)((_codec.InputBuffer[_codec.NextIn++] << 24) & 0xff000000);
                    mode          = InflateManagerMode.CHECK3;
                    break;

                case InflateManagerMode.CHECK3:
                    if (_codec.AvailableBytesIn == 0)
                    {
                        return(r);
                    }
                    r = f;
                    _codec.AvailableBytesIn--; _codec.TotalBytesIn++;
                    expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 16) & 0x00ff0000);
                    mode           = InflateManagerMode.CHECK2;
                    break;

                case InflateManagerMode.CHECK2:
                    if (_codec.AvailableBytesIn == 0)
                    {
                        return(r);
                    }
                    r = f;
                    _codec.AvailableBytesIn--;
                    _codec.TotalBytesIn++;
                    expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 8) & 0x0000ff00);
                    mode           = InflateManagerMode.CHECK1;
                    break;

                case InflateManagerMode.CHECK1:
                    if (_codec.AvailableBytesIn == 0)
                    {
                        return(r);
                    }
                    r = f;
                    _codec.AvailableBytesIn--; _codec.TotalBytesIn++;
                    expectedCheck += (uint)(_codec.InputBuffer[_codec.NextIn++] & 0x000000ff);
                    if (computedCheck != expectedCheck)
                    {
                        mode           = InflateManagerMode.BAD;
                        _codec.Message = "incorrect data check";
                        marker         = 5;                         // can't try inflateSync
                        break;
                    }
                    mode = InflateManagerMode.DONE;
                    return(ZlibConstants.Z_STREAM_END);

                case InflateManagerMode.DONE:
                    return(ZlibConstants.Z_STREAM_END);

                case InflateManagerMode.BAD:
                    throw new ZlibException(String.Format("Bad state ({0})", _codec.Message));

                default:
                    throw new ZlibException("Stream error.");
                }
            }
        }