private static Stream RemoveHash(Stream stream) { if (stream == null) { throw new ArgumentNullException("stream"); } byte type = (byte)stream.ReadByte(); if (type == (byte)ConvertHashAlgorithm.Sha256) { Stream dataStream = null; try { byte[] hash = new byte[32]; using (RangeStream hashStream = new RangeStream(stream, stream.Length - 32, 32, true)) { hashStream.Read(hash, 0, hash.Length); } dataStream = new RangeStream(stream, 1, stream.Length - (1 + 32)); if (!Unsafe.Equals(hash, Sha256.ComputeHash(dataStream))) { throw new FormatException(); } dataStream.Seek(0, SeekOrigin.Begin); return(dataStream); } catch (Exception) { if (dataStream != null) { dataStream.Dispose(); } throw; } } throw new NotSupportedException(); }
private static Stream ToStream <T>(int version, MessageBase <T> item) where T : MessageBase <T> { Stream stream = null; try { stream = new RangeStream(item.Export(_bufferManager)); var dic = new Dictionary <byte, Stream>(); try { stream.Seek(0, SeekOrigin.Begin); RecyclableMemoryStream deflateBufferStream = null; try { deflateBufferStream = new RecyclableMemoryStream(_bufferManager); using (var deflateStream = new DeflateStream(deflateBufferStream, CompressionMode.Compress, true)) using (var safeBuffer = _bufferManager.CreateSafeBuffer(1024 * 4)) { int length; while ((length = stream.Read(safeBuffer.Value, 0, safeBuffer.Value.Length)) > 0) { deflateStream.Write(safeBuffer.Value, 0, length); } } deflateBufferStream.Seek(0, SeekOrigin.Begin); dic.Add((byte)ConvertCompressionAlgorithm.Deflate, deflateBufferStream); } catch (Exception) { if (deflateBufferStream != null) { deflateBufferStream.Dispose(); } } } catch (Exception) { } dic.Add((byte)ConvertCompressionAlgorithm.None, stream); var list = dic.ToList(); list.Sort((x, y) => { int c = x.Value.Length.CompareTo(y.Value.Length); if (c != 0) { return(c); } return(x.Key.CompareTo(y.Key)); }); for (int i = 1; i < list.Count; i++) { list[i].Value.Dispose(); } var headerStream = new RecyclableMemoryStream(_bufferManager); Varint.SetUInt64(headerStream, (uint)version); Varint.SetUInt64(headerStream, list[0].Key); var dataStream = new UniteStream(headerStream, list[0].Value); var crcStream = new MemoryStream(Crc32_Castagnoli.Compute(new WrapperStream(dataStream))); return(new UniteStream(dataStream, crcStream)); } catch (Exception ex) { if (stream != null) { stream.Dispose(); } throw new ArgumentException(ex.Message, ex); } }
public override System.IO.Stream Receive(TimeSpan timeout, Information options) { if (_disposed) { throw new ObjectDisposedException(this.GetType().FullName); } if (!_connect) { throw new ConnectionException(); } lock (_receiveLock) { Stream stream = null; try { stream = _connection.Receive(timeout, options); byte version = (byte)stream.ReadByte(); Stream dataStream = null; try { dataStream = new RangeStream(stream, stream.Position, stream.Length - stream.Position); if (version == (byte)0) { return(dataStream); } else if (version == (byte)1) { BufferStream deflateBufferStream = null; try { deflateBufferStream = new BufferStream(_bufferManager); using (DeflateStream deflateStream = new DeflateStream(dataStream, CompressionMode.Decompress, true)) { byte[] decompressBuffer = null; try { decompressBuffer = _bufferManager.TakeBuffer(1024 * 4); int i = -1; while ((i = deflateStream.Read(decompressBuffer, 0, decompressBuffer.Length)) > 0) { deflateBufferStream.Write(decompressBuffer, 0, i); if (deflateBufferStream.Length > _maxReceiveCount) { throw new ConnectionException(); } } } finally { if (decompressBuffer != null) { _bufferManager.ReturnBuffer(decompressBuffer); } } } } catch (Exception e) { if (deflateBufferStream != null) { deflateBufferStream.Dispose(); } throw e; } #if DEBUG Debug.WriteLine("Receive : {0}→{1} {2}", NetworkConverter.ToSizeString(stream.Length), NetworkConverter.ToSizeString(deflateBufferStream.Length), NetworkConverter.ToSizeString(stream.Length - deflateBufferStream.Length)); #endif deflateBufferStream.Seek(0, SeekOrigin.Begin); dataStream.Dispose(); return(deflateBufferStream); } else { throw new ArgumentException("ArgumentException"); } } catch (ConnectionException e) { if (dataStream != null) { dataStream.Dispose(); } throw e; } catch (Exception e) { if (dataStream != null) { dataStream.Dispose(); } throw new ConnectionException(e.Message, e); } } catch (ConnectionException e) { if (stream != null) { stream.Dispose(); } throw e; } catch (Exception e) { if (stream != null) { stream.Dispose(); } throw new ConnectionException(e.Message, e); } } }
public override System.IO.Stream Receive(TimeSpan timeout, Information options) { if (_disposed) { throw new ObjectDisposedException(this.GetType().FullName); } if (!_connect) { throw new ConnectionException(); } lock (_receiveLock) { Stream stream = null; RangeStream dataStream = null; try { stream = _connection.Receive(timeout, options); dataStream = new RangeStream(stream, 0, stream.Length - 4); byte[] verifyCrc = Crc32_Castagnoli.ComputeHash(dataStream); byte[] orignalCrc = new byte[4]; using (RangeStream crcStream = new RangeStream(stream, stream.Length - 4, 4, true)) { crcStream.Read(orignalCrc, 0, orignalCrc.Length); } if (!Unsafe.Equals(verifyCrc, orignalCrc)) { throw new ArgumentException("Crc Error"); } dataStream.Seek(0, SeekOrigin.Begin); return(dataStream); } catch (ConnectionException e) { if (stream != null) { stream.Dispose(); } if (dataStream != null) { dataStream.Dispose(); } throw e; } catch (Exception e) { if (stream != null) { stream.Dispose(); } if (dataStream != null) { dataStream.Dispose(); } throw new ConnectionException(e.Message, e); } } }
private static Stream ToStream <T>(ItemBase <T> item) where T : ItemBase <T> { Stream stream = null; try { stream = new RangeStream(item.Export(_bufferManager)); List <KeyValuePair <byte, Stream> > list = new List <KeyValuePair <byte, Stream> >(); try { stream.Seek(0, SeekOrigin.Begin); BufferStream deflateBufferStream = null; try { deflateBufferStream = new BufferStream(_bufferManager); using (DeflateStream deflateStream = new DeflateStream(deflateBufferStream, CompressionMode.Compress, true)) { byte[] compressBuffer = null; try { compressBuffer = _bufferManager.TakeBuffer(1024 * 4); int i = -1; while ((i = stream.Read(compressBuffer, 0, compressBuffer.Length)) > 0) { deflateStream.Write(compressBuffer, 0, i); } } finally { if (compressBuffer != null) { _bufferManager.ReturnBuffer(compressBuffer); } } } deflateBufferStream.Seek(0, SeekOrigin.Begin); list.Add(new KeyValuePair <byte, Stream>((byte)ConvertCompressionAlgorithm.Deflate, deflateBufferStream)); } catch (Exception) { if (deflateBufferStream != null) { deflateBufferStream.Dispose(); } } } catch (Exception) { } list.Add(new KeyValuePair <byte, Stream>((byte)ConvertCompressionAlgorithm.None, stream)); list.Sort((x, y) => { int c = x.Value.Length.CompareTo(y.Value.Length); if (c != 0) { return(c); } return(x.Key.CompareTo(y.Key)); }); #if DEBUG if (list[0].Value.Length != stream.Length) { Debug.WriteLine("AmoebaConverter ToStream : {0}→{1} {2}", NetworkConverter.ToSizeString(stream.Length), NetworkConverter.ToSizeString(list[0].Value.Length), NetworkConverter.ToSizeString(list[0].Value.Length - stream.Length)); } #endif for (int i = 1; i < list.Count; i++) { list[i].Value.Dispose(); } BufferStream headerStream = new BufferStream(_bufferManager); headerStream.WriteByte((byte)list[0].Key); var dataStream = new UniteStream(headerStream, list[0].Value); MemoryStream crcStream = new MemoryStream(Crc32_Castagnoli.ComputeHash(dataStream)); return(new UniteStream(dataStream, crcStream)); } catch (Exception ex) { if (stream != null) { stream.Dispose(); } throw new ArgumentException(ex.Message, ex); } }