1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format
2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc.  All rights reserved.
3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/
4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without
6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are
7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met:
8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Redistributions of source code must retain the above copyright
10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer.
11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Redistributions in binary form must reproduce the above
12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer
13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the
14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution.
15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Neither the name of Google Inc. nor the names of its
16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from
17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission.
18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerpackage com.google.protobuf;
32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.io.IOException;
34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * This class is used internally by the Protocol Buffer library and generated
37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * message implementations.  It is public only because those generated messages
38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * do not reside in the {@code protobuf} package.  Others should not use this
39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * class directly.
40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * This class contains constants and helper functions useful for dealing with
42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * the Protocol Buffer wire format.
43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @author kenton@google.com Kenton Varda
45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerpublic final class WireFormat {
47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Do not allow instantiation.
48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  private WireFormat() {}
49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  public static final int WIRETYPE_VARINT           = 0;
51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  public static final int WIRETYPE_FIXED64          = 1;
52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  public static final int WIRETYPE_LENGTH_DELIMITED = 2;
53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  public static final int WIRETYPE_START_GROUP      = 3;
54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  public static final int WIRETYPE_END_GROUP        = 4;
55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  public static final int WIRETYPE_FIXED32          = 5;
56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static final int TAG_TYPE_BITS = 3;
58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static final int TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1;
59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /** Given a tag value, determines the wire type (the lower 3 bits). */
61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  public static int getTagWireType(final int tag) {
62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return tag & TAG_TYPE_MASK;
63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /** Given a tag value, determines the field number (the upper 29 bits). */
66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  public static int getTagFieldNumber(final int tag) {
67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return tag >>> TAG_TYPE_BITS;
68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /** Makes a tag value given a field number and wire type. */
71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static int makeTag(final int fieldNumber, final int wireType) {
72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return (fieldNumber << TAG_TYPE_BITS) | wireType;
73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Lite equivalent to {@link Descriptors.FieldDescriptor.JavaType}.  This is
77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * only here to support the lite runtime and should not be used by users.
78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  public enum JavaType {
80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    INT(0),
81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    LONG(0L),
82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    FLOAT(0F),
83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    DOUBLE(0D),
84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    BOOLEAN(false),
85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    STRING(""),
86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    BYTE_STRING(ByteString.EMPTY),
87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ENUM(null),
88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    MESSAGE(null);
89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    JavaType(final Object defaultDefault) {
91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.defaultDefault = defaultDefault;
92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    /**
95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer     * The default default value for fields of this type, if it's a primitive
96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer     * type.
97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer     */
98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    Object getDefaultDefault() {
99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return defaultDefault;
100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    private final Object defaultDefault;
103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Lite equivalent to {@link Descriptors.FieldDescriptor.Type}.  This is
107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * only here to support the lite runtime and should not be used by users.
108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  public enum FieldType {
110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    DOUBLE  (JavaType.DOUBLE     , WIRETYPE_FIXED64         ),
111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    FLOAT   (JavaType.FLOAT      , WIRETYPE_FIXED32         ),
112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    INT64   (JavaType.LONG       , WIRETYPE_VARINT          ),
113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    UINT64  (JavaType.LONG       , WIRETYPE_VARINT          ),
114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    INT32   (JavaType.INT        , WIRETYPE_VARINT          ),
115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    FIXED64 (JavaType.LONG       , WIRETYPE_FIXED64         ),
116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    FIXED32 (JavaType.INT        , WIRETYPE_FIXED32         ),
117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    BOOL    (JavaType.BOOLEAN    , WIRETYPE_VARINT          ),
118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    STRING  (JavaType.STRING     , WIRETYPE_LENGTH_DELIMITED) {
119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      @Override
120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      public boolean isPackable() {
121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return false; }
122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    },
123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    GROUP   (JavaType.MESSAGE    , WIRETYPE_START_GROUP     ) {
124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      @Override
125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      public boolean isPackable() {
126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return false; }
127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    },
128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    MESSAGE (JavaType.MESSAGE    , WIRETYPE_LENGTH_DELIMITED) {
129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      @Override
130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      public boolean isPackable() {
131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return false; }
132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    },
133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    BYTES   (JavaType.BYTE_STRING, WIRETYPE_LENGTH_DELIMITED) {
134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      @Override
135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      public boolean isPackable() {
136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return false; }
137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    },
138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    UINT32  (JavaType.INT        , WIRETYPE_VARINT          ),
139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ENUM    (JavaType.ENUM       , WIRETYPE_VARINT          ),
140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    SFIXED32(JavaType.INT        , WIRETYPE_FIXED32         ),
141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    SFIXED64(JavaType.LONG       , WIRETYPE_FIXED64         ),
142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    SINT32  (JavaType.INT        , WIRETYPE_VARINT          ),
143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    SINT64  (JavaType.LONG       , WIRETYPE_VARINT          );
144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    FieldType(final JavaType javaType, final int wireType) {
146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.javaType = javaType;
147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      this.wireType = wireType;
148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    private final JavaType javaType;
151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    private final int wireType;
152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    public JavaType getJavaType() { return javaType; }
154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    public int getWireType() { return wireType; }
155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    public boolean isPackable() { return true; }
157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Field numbers for fields in MessageSet wire format.
160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static final int MESSAGE_SET_ITEM    = 1;
161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static final int MESSAGE_SET_TYPE_ID = 2;
162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static final int MESSAGE_SET_MESSAGE = 3;
163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Tag numbers.
165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static final int MESSAGE_SET_ITEM_TAG =
166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    makeTag(MESSAGE_SET_ITEM, WIRETYPE_START_GROUP);
167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static final int MESSAGE_SET_ITEM_END_TAG =
168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    makeTag(MESSAGE_SET_ITEM, WIRETYPE_END_GROUP);
169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static final int MESSAGE_SET_TYPE_ID_TAG =
170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    makeTag(MESSAGE_SET_TYPE_ID, WIRETYPE_VARINT);
171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static final int MESSAGE_SET_MESSAGE_TAG =
172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    makeTag(MESSAGE_SET_MESSAGE, WIRETYPE_LENGTH_DELIMITED);
173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Validation level for handling incoming string field data which potentially
176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * contain non-UTF8 bytes.
177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  enum Utf8Validation {
179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    /** Eagerly parses to String; silently accepts invalid UTF8 bytes. */
180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    LOOSE {
181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      @Override
182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      Object readString(CodedInputStream input) throws IOException {
183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return input.readString();
184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      }
185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    },
186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    /** Eagerly parses to String; throws an IOException on invalid bytes. */
187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    STRICT {
188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      @Override
189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      Object readString(CodedInputStream input) throws IOException {
190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return input.readStringRequireUtf8();
191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      }
192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    },
193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    /** Keep data as ByteString; validation/conversion to String is lazy. */
194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    LAZY {
195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      @Override
196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      Object readString(CodedInputStream input) throws IOException {
197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return input.readBytes();
198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      }
199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    };
200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    /** Read a string field from the input with the proper UTF8 validation. */
202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    abstract Object readString(CodedInputStream input) throws IOException;
203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Read a field of any primitive type for immutable messages from a
207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * CodedInputStream. Enums, groups, and embedded messages are not handled by
208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * this method.
209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   *
210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @param input The stream from which to read.
211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @param type Declared type of the field.
212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @param utf8Validation Different string UTF8 validation level for handling
213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   *                       string fields.
214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @return An object representing the field's value, of the exact
215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   *         type which would be returned by
216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   *         {@link Message#getField(Descriptors.FieldDescriptor)} for
217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   *         this field.
218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static Object readPrimitiveField(
220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      CodedInputStream input,
221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      FieldType type,
222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      Utf8Validation utf8Validation) throws IOException {
223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    switch (type) {
224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case DOUBLE  : return input.readDouble  ();
225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case FLOAT   : return input.readFloat   ();
226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case INT64   : return input.readInt64   ();
227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case UINT64  : return input.readUInt64  ();
228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case INT32   : return input.readInt32   ();
229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case FIXED64 : return input.readFixed64 ();
230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case FIXED32 : return input.readFixed32 ();
231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case BOOL    : return input.readBool    ();
232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case BYTES   : return input.readBytes   ();
233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case UINT32  : return input.readUInt32  ();
234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case SFIXED32: return input.readSFixed32();
235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case SFIXED64: return input.readSFixed64();
236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case SINT32  : return input.readSInt32  ();
237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case SINT64  : return input.readSInt64  ();
238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case STRING  : return utf8Validation.readString(input);
240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case GROUP:
241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        throw new IllegalArgumentException(
242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "readPrimitiveField() cannot handle nested groups.");
243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case MESSAGE:
244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        throw new IllegalArgumentException(
245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "readPrimitiveField() cannot handle embedded messages.");
246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      case ENUM:
247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        // We don't handle enums because we don't know what to do if the
248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        // value is not recognized.
249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        throw new IllegalArgumentException(
250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "readPrimitiveField() cannot handle enums.");
251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    throw new RuntimeException(
254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "There is no way to get here, but the compiler thinks otherwise.");
255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
257