164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Protocol Buffers - Google's data interchange format 264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Copyright 2013 Google Inc. All rights reserved. 364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// http://code.google.com/p/protobuf/ 464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// 564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Redistribution and use in source and binary forms, with or without 664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// modification, are permitted provided that the following conditions are 764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// met: 864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// 964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// * Redistributions of source code must retain the above copyright 1064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// notice, this list of conditions and the following disclaimer. 1164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// * Redistributions in binary form must reproduce the above 1264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// copyright notice, this list of conditions and the following disclaimer 1364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// in the documentation and/or other materials provided with the 1464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// distribution. 1564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// * Neither the name of Google Inc. nor the names of its 1664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// contributors may be used to endorse or promote products derived from 1764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// this software without specific prior written permission. 1864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// 1964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci 3164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcipackage com.google.protobuf.nano; 3264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci 3364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazciimport java.io.IOException; 3464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci 3564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci/** 3664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * This class is used internally by the Protocol Buffer library and generated 3764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * message implementations. It is public only because those generated messages 3864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * do not reside in the {@code protobuf} package. Others should not use this 3964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * class directly. 4064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * 4164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * This class contains constants and helper functions useful for dealing with 4264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * the Protocol Buffer wire format. 4364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * 4464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * @author kenton@google.com Kenton Varda 4564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci */ 4664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcipublic final class WireFormatNano { 4764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci // Do not allow instantiation. 4864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci private WireFormatNano() {} 4964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci 5064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci static final int WIRETYPE_VARINT = 0; 5164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci static final int WIRETYPE_FIXED64 = 1; 5264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci static final int WIRETYPE_LENGTH_DELIMITED = 2; 5364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci static final int WIRETYPE_START_GROUP = 3; 5464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci static final int WIRETYPE_END_GROUP = 4; 5564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci static final int WIRETYPE_FIXED32 = 5; 5664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci 5764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci static final int TAG_TYPE_BITS = 3; 5864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci static final int TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1; 5964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci 6064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci /** Given a tag value, determines the wire type (the lower 3 bits). */ 6164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci static int getTagWireType(final int tag) { 6264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci return tag & TAG_TYPE_MASK; 6364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci } 6464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci 6564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci /** Given a tag value, determines the field number (the upper 29 bits). */ 6664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci public static int getTagFieldNumber(final int tag) { 6764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci return tag >>> TAG_TYPE_BITS; 6864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci } 6964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci 7064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci /** Makes a tag value given a field number and wire type. */ 7164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci static int makeTag(final int fieldNumber, final int wireType) { 7264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci return (fieldNumber << TAG_TYPE_BITS) | wireType; 7364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci } 7464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci 7564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci public static final int EMPTY_INT_ARRAY[] = {}; 7664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci public static final long EMPTY_LONG_ARRAY[] = {}; 7764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci public static final float EMPTY_FLOAT_ARRAY[] = {}; 7864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci public static final double EMPTY_DOUBLE_ARRAY[] = {}; 7964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci public static final boolean EMPTY_BOOLEAN_ARRAY[] = {}; 8064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci public static final String EMPTY_STRING_ARRAY[] = {}; 8164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci public static final byte[] EMPTY_BYTES_ARRAY[] = {}; 8264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci public static final byte[] EMPTY_BYTES = {}; 8364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci 8464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci /** 850e055f079f53b07de3705838a7b4742ce56839f8Brian Duff * Parses an unknown field. This implementation skips the field. 860e055f079f53b07de3705838a7b4742ce56839f8Brian Duff * 870e055f079f53b07de3705838a7b4742ce56839f8Brian Duff * <p>Generated messages will call this for unknown fields if the store_unknown_fields 880e055f079f53b07de3705838a7b4742ce56839f8Brian Duff * option is off. 890e055f079f53b07de3705838a7b4742ce56839f8Brian Duff * 900e055f079f53b07de3705838a7b4742ce56839f8Brian Duff * @return {@literal true} unless the tag is an end-group tag. 9164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci */ 9264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci public static boolean parseUnknownField( 9364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci final CodedInputByteBufferNano input, 9464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci final int tag) throws IOException { 9564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci return input.skipField(tag); 9664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci } 9764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci 9864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci /** 9964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * Computes the array length of a repeated field. We assume that in the common case repeated 10064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * fields are contiguously serialized but we still correctly handle interspersed values of a 10164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * repeated field (but with extra allocations). 10264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * 10364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * Rewinds to current input position before returning. 10464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * 10564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * @param input stream input, pointing to the byte after the first tag 10664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * @param tag repeated field tag just read 10764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * @return length of array 10864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * @throws IOException 10964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci */ 11064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci public static final int getRepeatedFieldArrayLength( 11164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci final CodedInputByteBufferNano input, 11264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci final int tag) throws IOException { 11364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci int arrayLength = 1; 11464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci int startPos = input.getPosition(); 11564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci input.skipField(tag); 11664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci while (input.getBytesUntilLimit() > 0) { 11764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci int thisTag = input.readTag(); 11864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci if (thisTag != tag) { 11964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci break; 12064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci } 12164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci input.skipField(tag); 12264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci arrayLength++; 12364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci } 12464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci input.rewindToPosition(startPos); 12564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci return arrayLength; 12664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci } 1270e055f079f53b07de3705838a7b4742ce56839f8Brian Duff 12864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci} 129