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