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