2 // © Copyright Henrik Ravn 2004
4 // Use, modification and distribution are subject to the Boost Software License, Version 1.0.
5 // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 using System
.Diagnostics
;
10 using System
.Runtime
.InteropServices
;
16 /// Implements a data decompressor, using the inflate algorithm in the ZLib dll
18 public class Inflater
: CodecBase
21 [DllImport("ZLIB1.dll", CallingConvention
=CallingConvention
.Cdecl
, CharSet
=CharSet
.Ansi
)]
22 private static extern int inflateInit_(ref ZStream sz
, string vs
, int size
);
24 [DllImport("ZLIB1.dll", CallingConvention
=CallingConvention
.Cdecl
)]
25 private static extern int inflate(ref ZStream sz
, int flush
);
27 [DllImport("ZLIB1.dll", CallingConvention
=CallingConvention
.Cdecl
)]
28 private static extern int inflateReset(ref ZStream sz
);
30 [DllImport("ZLIB1.dll", CallingConvention
=CallingConvention
.Cdecl
)]
31 private static extern int inflateEnd(ref ZStream sz
);
35 /// Constructs an new instance of the <c>Inflater</c>
37 public Inflater() : base()
39 int retval
= inflateInit_(ref _ztream
, Info
.Version
, Marshal
.SizeOf(_ztream
));
41 throw new ZLibException(retval
, "Could not initialize inflater");
48 /// Adds more data to the codec to be processed.
50 /// <param name="data">Byte array containing the data to be added to the codec</param>
51 /// <param name="offset">The index of the first byte to add from <c>data</c></param>
52 /// <param name="count">The number of bytes to add</param>
53 /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
54 public override void Add(byte[] data
, int offset
, int count
)
56 if (data
== null) throw new ArgumentNullException();
57 if (offset
< 0 || count
< 0) throw new ArgumentOutOfRangeException();
58 if ((offset
+count
) > data
.Length
) throw new ArgumentException();
61 int inputIndex
= offset
;
64 while (err
>= 0 && inputIndex
< total
)
66 copyInput(data
, inputIndex
, Math
.Min(total
- inputIndex
, kBufferSize
));
67 err
= inflate(ref _ztream
, (int)FlushTypes
.None
);
69 while (_ztream
.avail_out
== 0)
72 err
= inflate(ref _ztream
, (int)FlushTypes
.None
);
75 inputIndex
+= (int)_ztream
.total_in
;
77 setChecksum( _ztream
.adler
);
82 /// Finishes up any pending data that needs to be processed and handled.
84 public override void Finish()
89 err
= inflate(ref _ztream
, (int)FlushTypes
.Finish
);
93 setChecksum( _ztream
.adler
);
94 inflateReset(ref _ztream
);
99 /// Closes the internal zlib inflate stream
101 protected override void CleanUp() { inflateEnd(ref _ztream); }