Mercurial > hg > sv-dependency-builds
comparison src/zlib-1.2.7/contrib/dotzlib/DotZLib/CodecBase.cs @ 4:e13257ea84a4
Add bzip2, zlib, liblo, portaudio sources
| author | Chris Cannam | 
|---|---|
| date | Wed, 20 Mar 2013 13:59:52 +0000 | 
| parents | |
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| 3:6c505a35919a | 4:e13257ea84a4 | 
|---|---|
| 1 // | |
| 2 // © Copyright Henrik Ravn 2004 | |
| 3 // | |
| 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) | |
| 6 // | |
| 7 | |
| 8 using System; | |
| 9 using System.Runtime.InteropServices; | |
| 10 | |
| 11 namespace DotZLib | |
| 12 { | |
| 13 /// <summary> | |
| 14 /// Implements the common functionality needed for all <see cref="Codec"/>s | |
| 15 /// </summary> | |
| 16 public abstract class CodecBase : Codec, IDisposable | |
| 17 { | |
| 18 | |
| 19 #region Data members | |
| 20 | |
| 21 /// <summary> | |
| 22 /// Instance of the internal zlib buffer structure that is | |
| 23 /// passed to all functions in the zlib dll | |
| 24 /// </summary> | |
| 25 internal ZStream _ztream = new ZStream(); | |
| 26 | |
| 27 /// <summary> | |
| 28 /// True if the object instance has been disposed, false otherwise | |
| 29 /// </summary> | |
| 30 protected bool _isDisposed = false; | |
| 31 | |
| 32 /// <summary> | |
| 33 /// The size of the internal buffers | |
| 34 /// </summary> | |
| 35 protected const int kBufferSize = 16384; | |
| 36 | |
| 37 private byte[] _outBuffer = new byte[kBufferSize]; | |
| 38 private byte[] _inBuffer = new byte[kBufferSize]; | |
| 39 | |
| 40 private GCHandle _hInput; | |
| 41 private GCHandle _hOutput; | |
| 42 | |
| 43 private uint _checksum = 0; | |
| 44 | |
| 45 #endregion | |
| 46 | |
| 47 /// <summary> | |
| 48 /// Initializes a new instance of the <c>CodeBase</c> class. | |
| 49 /// </summary> | |
| 50 public CodecBase() | |
| 51 { | |
| 52 try | |
| 53 { | |
| 54 _hInput = GCHandle.Alloc(_inBuffer, GCHandleType.Pinned); | |
| 55 _hOutput = GCHandle.Alloc(_outBuffer, GCHandleType.Pinned); | |
| 56 } | |
| 57 catch (Exception) | |
| 58 { | |
| 59 CleanUp(false); | |
| 60 throw; | |
| 61 } | |
| 62 } | |
| 63 | |
| 64 | |
| 65 #region Codec Members | |
| 66 | |
| 67 /// <summary> | |
| 68 /// Occurs when more processed data are available. | |
| 69 /// </summary> | |
| 70 public event DataAvailableHandler DataAvailable; | |
| 71 | |
| 72 /// <summary> | |
| 73 /// Fires the <see cref="DataAvailable"/> event | |
| 74 /// </summary> | |
| 75 protected void OnDataAvailable() | |
| 76 { | |
| 77 if (_ztream.total_out > 0) | |
| 78 { | |
| 79 if (DataAvailable != null) | |
| 80 DataAvailable( _outBuffer, 0, (int)_ztream.total_out); | |
| 81 resetOutput(); | |
| 82 } | |
| 83 } | |
| 84 | |
| 85 /// <summary> | |
| 86 /// Adds more data to the codec to be processed. | |
| 87 /// </summary> | |
| 88 /// <param name="data">Byte array containing the data to be added to the codec</param> | |
| 89 /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks> | |
| 90 public void Add(byte[] data) | |
| 91 { | |
| 92 Add(data,0,data.Length); | |
| 93 } | |
| 94 | |
| 95 /// <summary> | |
| 96 /// Adds more data to the codec to be processed. | |
| 97 /// </summary> | |
| 98 /// <param name="data">Byte array containing the data to be added to the codec</param> | |
| 99 /// <param name="offset">The index of the first byte to add from <c>data</c></param> | |
| 100 /// <param name="count">The number of bytes to add</param> | |
| 101 /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks> | |
| 102 /// <remarks>This must be implemented by a derived class</remarks> | |
| 103 public abstract void Add(byte[] data, int offset, int count); | |
| 104 | |
| 105 /// <summary> | |
| 106 /// Finishes up any pending data that needs to be processed and handled. | |
| 107 /// </summary> | |
| 108 /// <remarks>This must be implemented by a derived class</remarks> | |
| 109 public abstract void Finish(); | |
| 110 | |
| 111 /// <summary> | |
| 112 /// Gets the checksum of the data that has been added so far | |
| 113 /// </summary> | |
| 114 public uint Checksum { get { return _checksum; } } | |
| 115 | |
| 116 #endregion | |
| 117 | |
| 118 #region Destructor & IDisposable stuff | |
| 119 | |
| 120 /// <summary> | |
| 121 /// Destroys this instance | |
| 122 /// </summary> | |
| 123 ~CodecBase() | |
| 124 { | |
| 125 CleanUp(false); | |
| 126 } | |
| 127 | |
| 128 /// <summary> | |
| 129 /// Releases any unmanaged resources and calls the <see cref="CleanUp()"/> method of the derived class | |
| 130 /// </summary> | |
| 131 public void Dispose() | |
| 132 { | |
| 133 CleanUp(true); | |
| 134 } | |
| 135 | |
| 136 /// <summary> | |
| 137 /// Performs any codec specific cleanup | |
| 138 /// </summary> | |
| 139 /// <remarks>This must be implemented by a derived class</remarks> | |
| 140 protected abstract void CleanUp(); | |
| 141 | |
| 142 // performs the release of the handles and calls the dereived CleanUp() | |
| 143 private void CleanUp(bool isDisposing) | |
| 144 { | |
| 145 if (!_isDisposed) | |
| 146 { | |
| 147 CleanUp(); | |
| 148 if (_hInput.IsAllocated) | |
| 149 _hInput.Free(); | |
| 150 if (_hOutput.IsAllocated) | |
| 151 _hOutput.Free(); | |
| 152 | |
| 153 _isDisposed = true; | |
| 154 } | |
| 155 } | |
| 156 | |
| 157 | |
| 158 #endregion | |
| 159 | |
| 160 #region Helper methods | |
| 161 | |
| 162 /// <summary> | |
| 163 /// Copies a number of bytes to the internal codec buffer - ready for proccesing | |
| 164 /// </summary> | |
| 165 /// <param name="data">The byte array that contains the data to copy</param> | |
| 166 /// <param name="startIndex">The index of the first byte to copy</param> | |
| 167 /// <param name="count">The number of bytes to copy from <c>data</c></param> | |
| 168 protected void copyInput(byte[] data, int startIndex, int count) | |
| 169 { | |
| 170 Array.Copy(data, startIndex, _inBuffer,0, count); | |
| 171 _ztream.next_in = _hInput.AddrOfPinnedObject(); | |
| 172 _ztream.total_in = 0; | |
| 173 _ztream.avail_in = (uint)count; | |
| 174 | |
| 175 } | |
| 176 | |
| 177 /// <summary> | |
| 178 /// Resets the internal output buffers to a known state - ready for processing | |
| 179 /// </summary> | |
| 180 protected void resetOutput() | |
| 181 { | |
| 182 _ztream.total_out = 0; | |
| 183 _ztream.avail_out = kBufferSize; | |
| 184 _ztream.next_out = _hOutput.AddrOfPinnedObject(); | |
| 185 } | |
| 186 | |
| 187 /// <summary> | |
| 188 /// Updates the running checksum property | |
| 189 /// </summary> | |
| 190 /// <param name="newSum">The new checksum value</param> | |
| 191 protected void setChecksum(uint newSum) | |
| 192 { | |
| 193 _checksum = newSum; | |
| 194 } | |
| 195 #endregion | |
| 196 | |
| 197 } | |
| 198 } | 
