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