1 #region Copyright notice and license 2 // Protocol Buffers - Google's data interchange format 3 // Copyright 2015 Google Inc. All rights reserved. 4 // https://developers.google.com/protocol-buffers/ 5 // 6 // Redistribution and use in source and binary forms, with or without 7 // modification, are permitted provided that the following conditions are 8 // met: 9 // 10 // * Redistributions of source code must retain the above copyright 11 // notice, this list of conditions and the following disclaimer. 12 // * Redistributions in binary form must reproduce the above 13 // copyright notice, this list of conditions and the following disclaimer 14 // in the documentation and/or other materials provided with the 15 // distribution. 16 // * Neither the name of Google Inc. nor the names of its 17 // contributors may be used to endorse or promote products derived from 18 // this software without specific prior written permission. 19 // 20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 #endregion 32 33 using System; 34 using System.IO; 35 36 namespace Google.Protobuf 37 { 38 /// <summary> 39 /// Stream implementation which proxies another stream, only allowing a certain amount 40 /// of data to be read. Note that this is only used to read delimited streams, so it 41 /// doesn't attempt to implement everything. 42 /// </summary> 43 internal sealed class LimitedInputStream : Stream 44 { 45 private readonly Stream proxied; 46 private int bytesLeft; 47 LimitedInputStream(Stream proxied, int size)48 internal LimitedInputStream(Stream proxied, int size) 49 { 50 this.proxied = proxied; 51 bytesLeft = size; 52 } 53 54 public override bool CanRead 55 { 56 get { return true; } 57 } 58 59 public override bool CanSeek 60 { 61 get { return false; } 62 } 63 64 public override bool CanWrite 65 { 66 get { return false; } 67 } 68 Flush()69 public override void Flush() 70 { 71 } 72 73 public override long Length 74 { 75 get { throw new NotSupportedException(); } 76 } 77 78 public override long Position 79 { 80 get { throw new NotSupportedException(); } 81 set { throw new NotSupportedException(); } 82 } 83 Read(byte[] buffer, int offset, int count)84 public override int Read(byte[] buffer, int offset, int count) 85 { 86 if (bytesLeft > 0) 87 { 88 int bytesRead = proxied.Read(buffer, offset, Math.Min(bytesLeft, count)); 89 bytesLeft -= bytesRead; 90 return bytesRead; 91 } 92 return 0; 93 } 94 Seek(long offset, SeekOrigin origin)95 public override long Seek(long offset, SeekOrigin origin) 96 { 97 throw new NotSupportedException(); 98 } 99 SetLength(long value)100 public override void SetLength(long value) 101 { 102 throw new NotSupportedException(); 103 } 104 Write(byte[] buffer, int offset, int count)105 public override void Write(byte[] buffer, int offset, int count) 106 { 107 throw new NotSupportedException(); 108 } 109 } 110 } 111