1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepackage com.google.protobuf; 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.FilterInputStream; 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.InputStream; 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.IOException; 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.OutputStream; 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.util.Collection; 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville/** 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * A partial implementation of the {@link MessageLite} interface which 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * implements as many methods of that interface as possible in terms of other 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * methods. 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @author kenton@google.com Kenton Varda 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepublic abstract class AbstractMessageLite implements MessageLite { 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public ByteString toByteString() { 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final ByteString.CodedBuilder out = 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ByteString.newCodedBuilder(getSerializedSize()); 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTo(out.getCodedOutput()); 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return out.build(); 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (IOException e) { 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw new RuntimeException( 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Serializing to a ByteString threw an IOException (should " + 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "never happen).", e); 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public byte[] toByteArray() { 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final byte[] result = new byte[getSerializedSize()]; 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final CodedOutputStream output = CodedOutputStream.newInstance(result); 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTo(output); 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.checkNoSpaceLeft(); 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (IOException e) { 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw new RuntimeException( 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Serializing to a byte array threw an IOException " + 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "(should never happen).", e); 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeTo(final OutputStream output) throws IOException { 75d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville final int bufferSize = 76d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville CodedOutputStream.computePreferredBufferSize(getSerializedSize()); 77d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville final CodedOutputStream codedOutput = 78d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville CodedOutputStream.newInstance(output, bufferSize); 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTo(codedOutput); 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville codedOutput.flush(); 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeDelimitedTo(final OutputStream output) throws IOException { 84d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville final int serialized = getSerializedSize(); 85d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville final int bufferSize = CodedOutputStream.computePreferredBufferSize( 86d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville CodedOutputStream.computeRawVarint32Size(serialized) + serialized); 87d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville final CodedOutputStream codedOutput = 88d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville CodedOutputStream.newInstance(output, bufferSize); 89d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville codedOutput.writeRawVarint32(serialized); 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTo(codedOutput); 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville codedOutput.flush(); 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * A partial implementation of the {@link Message.Builder} interface which 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * implements as many methods of that interface as possible in terms of 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * other methods. 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville @SuppressWarnings("unchecked") 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static abstract class Builder<BuilderType extends Builder> 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville implements MessageLite.Builder { 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The compiler produces an error if this is not declared explicitly. 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville @Override 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public abstract BuilderType clone(); 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public BuilderType mergeFrom(final CodedInputStream input) 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 108d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return mergeFrom(input, ExtensionRegistryLite.getEmptyRegistry()); 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Re-defined here for return type covariance. 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public abstract BuilderType mergeFrom( 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final CodedInputStream input, 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final ExtensionRegistryLite extensionRegistry) 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException; 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public BuilderType mergeFrom(final ByteString data) 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws InvalidProtocolBufferException { 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final CodedInputStream input = data.newCodedInput(); 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville mergeFrom(input); 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville input.checkLastTagWas(0); 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (BuilderType) this; 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (InvalidProtocolBufferException e) { 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw e; 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (IOException e) { 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw new RuntimeException( 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Reading from a ByteString threw an IOException (should " + 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "never happen).", e); 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public BuilderType mergeFrom( 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final ByteString data, 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final ExtensionRegistryLite extensionRegistry) 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws InvalidProtocolBufferException { 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final CodedInputStream input = data.newCodedInput(); 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville mergeFrom(input, extensionRegistry); 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville input.checkLastTagWas(0); 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (BuilderType) this; 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (InvalidProtocolBufferException e) { 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw e; 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (IOException e) { 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw new RuntimeException( 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Reading from a ByteString threw an IOException (should " + 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "never happen).", e); 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public BuilderType mergeFrom(final byte[] data) 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws InvalidProtocolBufferException { 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return mergeFrom(data, 0, data.length); 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public BuilderType mergeFrom(final byte[] data, final int off, 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int len) 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws InvalidProtocolBufferException { 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final CodedInputStream input = 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedInputStream.newInstance(data, off, len); 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville mergeFrom(input); 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville input.checkLastTagWas(0); 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (BuilderType) this; 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (InvalidProtocolBufferException e) { 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw e; 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (IOException e) { 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw new RuntimeException( 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Reading from a byte array threw an IOException (should " + 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "never happen).", e); 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public BuilderType mergeFrom( 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final byte[] data, 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final ExtensionRegistryLite extensionRegistry) 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws InvalidProtocolBufferException { 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return mergeFrom(data, 0, data.length, extensionRegistry); 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public BuilderType mergeFrom( 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final byte[] data, final int off, final int len, 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final ExtensionRegistryLite extensionRegistry) 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws InvalidProtocolBufferException { 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final CodedInputStream input = 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedInputStream.newInstance(data, off, len); 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville mergeFrom(input, extensionRegistry); 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville input.checkLastTagWas(0); 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (BuilderType) this; 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (InvalidProtocolBufferException e) { 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw e; 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (IOException e) { 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw new RuntimeException( 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Reading from a byte array threw an IOException (should " + 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "never happen).", e); 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public BuilderType mergeFrom(final InputStream input) throws IOException { 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final CodedInputStream codedInput = CodedInputStream.newInstance(input); 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville mergeFrom(codedInput); 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville codedInput.checkLastTagWas(0); 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (BuilderType) this; 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public BuilderType mergeFrom( 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final InputStream input, 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final ExtensionRegistryLite extensionRegistry) 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final CodedInputStream codedInput = CodedInputStream.newInstance(input); 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville mergeFrom(codedInput, extensionRegistry); 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville codedInput.checkLastTagWas(0); 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (BuilderType) this; 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * An InputStream implementations which reads from some other InputStream 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * but is limited to a particular number of bytes. Used by 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * mergeDelimitedFrom(). This is intentionally package-private so that 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * UnknownFieldSet can share it. 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static final class LimitedInputStream extends FilterInputStream { 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private int limit; 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville LimitedInputStream(InputStream in, int limit) { 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville super(in); 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville this.limit = limit; 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville @Override 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public int available() throws IOException { 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return Math.min(super.available(), limit); 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville @Override 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public int read() throws IOException { 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (limit <= 0) { 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return -1; 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int result = super.read(); 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (result >= 0) { 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville --limit; 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville @Override 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public int read(final byte[] b, final int off, int len) 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (limit <= 0) { 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return -1; 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville len = Math.min(len, limit); 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int result = super.read(b, off, len); 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (result >= 0) { 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville limit -= result; 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville @Override 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public long skip(final long n) throws IOException { 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final long result = super.skip(Math.min(n, limit)); 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (result >= 0) { 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville limit -= result; 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 272d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville public boolean mergeDelimitedFrom( 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final InputStream input, 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final ExtensionRegistryLite extensionRegistry) 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 276d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville final int firstByte = input.read(); 277d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville if (firstByte == -1) { 278d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return false; 279d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 280d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville final int size = CodedInputStream.readRawVarint32(firstByte, input); 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final InputStream limitedInput = new LimitedInputStream(input, size); 282d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville mergeFrom(limitedInput, extensionRegistry); 283d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return true; 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 286d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville public boolean mergeDelimitedFrom(final InputStream input) 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 288d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return mergeDelimitedFrom(input, 289d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ExtensionRegistryLite.getEmptyRegistry()); 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Construct an UninitializedMessageException reporting missing fields in 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * the given message. 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected static UninitializedMessageException 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville newUninitializedMessageException(MessageLite message) { 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return new UninitializedMessageException(message); 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Adds the {@code values} to the {@code list}. This is a helper method 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * used by generated code. Users should ignore it. 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @throws NullPointerException if any of the elements of {@code values} is 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * null. 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected static <T> void addAll(final Iterable<T> values, 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final Collection<? super T> list) { 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (final T value : values) { 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (value == null) { 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw new NullPointerException(); 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (values instanceof Collection) { 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville @SuppressWarnings("unsafe") final 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Collection<T> collection = (Collection<T>) values; 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville list.addAll(collection); 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (final T value : values) { 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville list.add(value); 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 327