12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Protocol Buffers - Google's data interchange format 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2008 Google Inc. All rights reserved. 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://code.google.com/p/protobuf/ 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Redistribution and use in source and binary forms, with or without 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// modification, are permitted provided that the following conditions are 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// met: 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// * Redistributions of source code must retain the above copyright 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// notice, this list of conditions and the following disclaimer. 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// * Redistributions in binary form must reproduce the above 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// in the documentation and/or other materials provided with the 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// distribution. 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// * Neither the name of Google Inc. nor the names of its 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// contributors may be used to endorse or promote products derived from 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// this software without specific prior written permission. 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)package com.google.protobuf; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * This class is used internally by the Protocol Buffer library and generated 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * message implementations. It is public only because those generated messages 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * do not reside in the {@code protobuf} package. Others should not use this 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * class directly. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * This class contains constants and helper functions useful for dealing with 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * the Protocol Buffer wire format. 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @author kenton@google.com Kenton Varda 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public final class WireFormat { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do not allow instantiation. 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private WireFormat() {} 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public static final int WIRETYPE_VARINT = 0; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public static final int WIRETYPE_FIXED64 = 1; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public static final int WIRETYPE_LENGTH_DELIMITED = 2; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public static final int WIRETYPE_START_GROUP = 3; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public static final int WIRETYPE_END_GROUP = 4; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public static final int WIRETYPE_FIXED32 = 5; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static final int TAG_TYPE_BITS = 3; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static final int TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** Given a tag value, determines the wire type (the lower 3 bits). */ 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static int getTagWireType(final int tag) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tag & TAG_TYPE_MASK; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** Given a tag value, determines the field number (the upper 29 bits). */ 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public static int getTagFieldNumber(final int tag) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tag >>> TAG_TYPE_BITS; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** Makes a tag value given a field number and wire type. */ 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static int makeTag(final int fieldNumber, final int wireType) { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (fieldNumber << TAG_TYPE_BITS) | wireType; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Lite equivalent to {@link Descriptors.FieldDescriptor.JavaType}. This is 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * only here to support the lite runtime and should not be used by users. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public enum JavaType { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INT(0), 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG(0L), 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FLOAT(0F), 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DOUBLE(0D), 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BOOLEAN(false), 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) STRING(""), 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BYTE_STRING(ByteString.EMPTY), 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ENUM(null), 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MESSAGE(null); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JavaType(final Object defaultDefault) { 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.defaultDefault = defaultDefault; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * The default default value for fields of this type, if it's a primitive 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * type. 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Object getDefaultDefault() { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return defaultDefault; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final Object defaultDefault; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Lite equivalent to {@link Descriptors.FieldDescriptor.Type}. This is 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * only here to support the lite runtime and should not be used by users. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public enum FieldType { 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DOUBLE (JavaType.DOUBLE , WIRETYPE_FIXED64 ), 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FLOAT (JavaType.FLOAT , WIRETYPE_FIXED32 ), 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INT64 (JavaType.LONG , WIRETYPE_VARINT ), 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UINT64 (JavaType.LONG , WIRETYPE_VARINT ), 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INT32 (JavaType.INT , WIRETYPE_VARINT ), 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FIXED64 (JavaType.LONG , WIRETYPE_FIXED64 ), 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FIXED32 (JavaType.INT , WIRETYPE_FIXED32 ), 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BOOL (JavaType.BOOLEAN , WIRETYPE_VARINT ), 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) STRING (JavaType.STRING , WIRETYPE_LENGTH_DELIMITED) { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public boolean isPackable() { return false; } 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GROUP (JavaType.MESSAGE , WIRETYPE_START_GROUP ) { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public boolean isPackable() { return false; } 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MESSAGE (JavaType.MESSAGE , WIRETYPE_LENGTH_DELIMITED) { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public boolean isPackable() { return false; } 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BYTES (JavaType.BYTE_STRING, WIRETYPE_LENGTH_DELIMITED) { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public boolean isPackable() { return false; } 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UINT32 (JavaType.INT , WIRETYPE_VARINT ), 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ENUM (JavaType.ENUM , WIRETYPE_VARINT ), 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SFIXED32(JavaType.INT , WIRETYPE_FIXED32 ), 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SFIXED64(JavaType.LONG , WIRETYPE_FIXED64 ), 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SINT32 (JavaType.INT , WIRETYPE_VARINT ), 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SINT64 (JavaType.LONG , WIRETYPE_VARINT ); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FieldType(final JavaType javaType, final int wireType) { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.javaType = javaType; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.wireType = wireType; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final JavaType javaType; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final int wireType; 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public JavaType getJavaType() { return javaType; } 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public int getWireType() { return wireType; } 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public boolean isPackable() { return true; } 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1493d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch // Field numbers for fields in MessageSet wire format. 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static final int MESSAGE_SET_ITEM = 1; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static final int MESSAGE_SET_TYPE_ID = 2; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static final int MESSAGE_SET_MESSAGE = 3; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Tag numbers. 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static final int MESSAGE_SET_ITEM_TAG = 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) makeTag(MESSAGE_SET_ITEM, WIRETYPE_START_GROUP); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static final int MESSAGE_SET_ITEM_END_TAG = 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) makeTag(MESSAGE_SET_ITEM, WIRETYPE_END_GROUP); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static final int MESSAGE_SET_TYPE_ID_TAG = 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) makeTag(MESSAGE_SET_TYPE_ID, WIRETYPE_VARINT); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static final int MESSAGE_SET_MESSAGE_TAG = 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) makeTag(MESSAGE_SET_MESSAGE, WIRETYPE_LENGTH_DELIMITED); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 164