18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// Protocol Buffers - Google's data interchange format 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// Copyright 2008 Google Inc. All rights reserved. 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// http://code.google.com/p/protobuf/ 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// Redistribution and use in source and binary forms, with or without 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// modification, are permitted provided that the following conditions are 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// met: 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// * Redistributions of source code must retain the above copyright 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// notice, this list of conditions and the following disclaimer. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// * Redistributions in binary form must reproduce the above 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// copyright notice, this list of conditions and the following disclaimer 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// in the documentation and/or other materials provided with the 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// distribution. 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// * Neither the name of Google Inc. nor the names of its 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// contributors may be used to endorse or promote products derived from 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// this software without specific prior written permission. 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpackage com.google.protobuf; 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This class is used internally by the Protocol Buffer library and generated 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * message implementations. It is public only because those generated messages 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * do not reside in the {@code protobuf} package. Others should not use this 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * class directly. 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This class contains constants and helper functions useful for dealing with 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the Protocol Buffer wire format. 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @author kenton@google.com Kenton Varda 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic final class WireFormat { 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Do not allow instantiation. 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project private WireFormat() {} 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int WIRETYPE_VARINT = 0; 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int WIRETYPE_FIXED64 = 1; 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int WIRETYPE_LENGTH_DELIMITED = 2; 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int WIRETYPE_START_GROUP = 3; 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int WIRETYPE_END_GROUP = 4; 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int WIRETYPE_FIXED32 = 5; 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int TAG_TYPE_BITS = 3; 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1; 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** Given a tag value, determines the wire type (the lower 3 bits). */ 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int getTagWireType(final int tag) { 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return tag & TAG_TYPE_MASK; 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** Given a tag value, determines the field number (the upper 29 bits). */ 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public static int getTagFieldNumber(final int tag) { 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return tag >>> TAG_TYPE_BITS; 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** Makes a tag value given a field number and wire type. */ 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int makeTag(final int fieldNumber, final int wireType) { 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (fieldNumber << TAG_TYPE_BITS) | wireType; 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Lite equivalent to {@link Descriptors.FieldDescriptor.JavaType}. This is 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * only here to support the lite runtime and should not be used by users. 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public enum JavaType { 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project INT(0), 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project LONG(0L), 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FLOAT(0F), 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DOUBLE(0D), 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BOOLEAN(false), 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRING(""), 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BYTE_STRING(ByteString.EMPTY), 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ENUM(null), 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project MESSAGE(null); 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project JavaType(final Object defaultDefault) { 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project this.defaultDefault = defaultDefault; 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The default default value for fields of this type, if it's a primitive 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * type. 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Object getDefaultDefault() { 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return defaultDefault; 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project private final Object defaultDefault; 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Lite equivalent to {@link Descriptors.FieldDescriptor.Type}. This is 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * only here to support the lite runtime and should not be used by users. 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public enum FieldType { 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DOUBLE (JavaType.DOUBLE , WIRETYPE_FIXED64 ), 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FLOAT (JavaType.FLOAT , WIRETYPE_FIXED32 ), 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project INT64 (JavaType.LONG , WIRETYPE_VARINT ), 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project UINT64 (JavaType.LONG , WIRETYPE_VARINT ), 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project INT32 (JavaType.INT , WIRETYPE_VARINT ), 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FIXED64 (JavaType.LONG , WIRETYPE_FIXED64 ), 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FIXED32 (JavaType.INT , WIRETYPE_FIXED32 ), 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BOOL (JavaType.BOOLEAN , WIRETYPE_VARINT ), 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRING (JavaType.STRING , WIRETYPE_LENGTH_DELIMITED) { 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public boolean isPackable() { return false; } 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }, 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project GROUP (JavaType.MESSAGE , WIRETYPE_START_GROUP ) { 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public boolean isPackable() { return false; } 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }, 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project MESSAGE (JavaType.MESSAGE , WIRETYPE_LENGTH_DELIMITED) { 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public boolean isPackable() { return false; } 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }, 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BYTES (JavaType.BYTE_STRING, WIRETYPE_LENGTH_DELIMITED) { 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public boolean isPackable() { return false; } 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }, 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project UINT32 (JavaType.INT , WIRETYPE_VARINT ), 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ENUM (JavaType.ENUM , WIRETYPE_VARINT ), 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SFIXED32(JavaType.INT , WIRETYPE_FIXED32 ), 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SFIXED64(JavaType.LONG , WIRETYPE_FIXED64 ), 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SINT32 (JavaType.INT , WIRETYPE_VARINT ), 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SINT64 (JavaType.LONG , WIRETYPE_VARINT ); 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FieldType(final JavaType javaType, final int wireType) { 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project this.javaType = javaType; 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project this.wireType = wireType; 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project private final JavaType javaType; 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project private final int wireType; 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public JavaType getJavaType() { return javaType; } 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public int getWireType() { return wireType; } 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public boolean isPackable() { return true; } 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Field numbers for feilds in MessageSet wire format. 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int MESSAGE_SET_ITEM = 1; 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int MESSAGE_SET_TYPE_ID = 2; 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int MESSAGE_SET_MESSAGE = 3; 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Tag numbers. 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int MESSAGE_SET_ITEM_TAG = 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project makeTag(MESSAGE_SET_ITEM, WIRETYPE_START_GROUP); 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int MESSAGE_SET_ITEM_END_TAG = 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project makeTag(MESSAGE_SET_ITEM, WIRETYPE_END_GROUP); 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int MESSAGE_SET_TYPE_ID_TAG = 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project makeTag(MESSAGE_SET_TYPE_ID, WIRETYPE_VARINT); 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static final int MESSAGE_SET_MESSAGE_TAG = 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project makeTag(MESSAGE_SET_MESSAGE, WIRETYPE_LENGTH_DELIMITED); 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project