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