From 92fcf3537f42475148feaf9a85f800603811ede2 Mon Sep 17 00:00:00 2001 From: csharptest Date: Tue, 7 May 2013 15:56:50 -0500 Subject: Added the ability to instantiate a coded input with a pre-existing buffer Added CodedInputStream.Position to return the current input stream position --- src/ProtocolBuffers/CodedInputStream.cs | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) (limited to 'src/ProtocolBuffers/CodedInputStream.cs') diff --git a/src/ProtocolBuffers/CodedInputStream.cs b/src/ProtocolBuffers/CodedInputStream.cs index 3ee7d55f..bc443839 100644 --- a/src/ProtocolBuffers/CodedInputStream.cs +++ b/src/ProtocolBuffers/CodedInputStream.cs @@ -108,6 +108,14 @@ namespace Google.ProtocolBuffers { return new CodedInputStream(input); } + /// + /// Creates a new CodedInputStream reading data from the given + /// stream and a pre-allocated memory buffer. + /// + public static CodedInputStream CreateInstance(Stream input, byte[] buffer) + { + return new CodedInputStream(input, buffer); + } /// /// Creates a new CodedInputStream reading data from the given @@ -142,8 +150,28 @@ namespace Google.ProtocolBuffers this.input = input; } + private CodedInputStream(Stream input, byte[] buffer) + { + this.buffer = buffer; + this.bufferSize = 0; + this.input = input; + } #endregion + /// + /// Returns the current position in the input stream, or the position in the input buffer + /// + public long Position + { + get + { + if (input != null) + return input.Position - (bufferSize - bufferPos); + return bufferPos; + } + } + + void ICodedInputStream.ReadMessageStart() { } void ICodedInputStream.ReadMessageEnd() { } @@ -1608,7 +1636,7 @@ namespace Google.ProtocolBuffers bufferPos += size; return bytes; } - else if (size < BufferSize) + else if (size < buffer.Length) { // Reading more bytes than are in the buffer, but not an excessive number // of bytes. We can safely allocate the resulting array ahead of time. @@ -1663,7 +1691,7 @@ namespace Google.ProtocolBuffers while (sizeLeft > 0) { - byte[] chunk = new byte[Math.Min(sizeLeft, BufferSize)]; + byte[] chunk = new byte[Math.Min(sizeLeft, buffer.Length)]; int pos = 0; while (pos < chunk.Length) { -- cgit v1.2.3