16c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/* 26c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Copyright (C) 2012 The Android Open Source Project 36c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 46c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 56c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * you may not use this file except in compliance with the License. 66c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * You may obtain a copy of the License at 76c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 86c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * http://www.apache.org/licenses/LICENSE-2.0 96c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Unless required by applicable law or agreed to in writing, software 116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * See the License for the specific language governing permissions and 146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * limitations under the License. 156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratopackage android.util.proto; 186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoimport android.annotation.TestApi; 206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoimport android.util.Log; 216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 22fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onoratoimport java.io.FileDescriptor; 23fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onoratoimport java.io.FileOutputStream; 24fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onoratoimport java.io.IOException; 25fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onoratoimport java.io.OutputStream; 266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoimport java.io.UnsupportedEncodingException; 276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoimport java.util.List; 286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/** 306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Class to write to a protobuf stream. 316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Each write method takes an ID code from the protoc generated classes 336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * and the value to write. To make a nested object, call startObject 346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * and then endObject when you are done. 356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * The ID codes have type information embedded into them, so if you call 376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * the incorrect function you will get an IllegalArgumentException. 386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * To retrieve the encoded protobuf stream, call getBytes(). 406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * TODO: Add a constructor that takes an OutputStream and write to that 426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * stream as the top-level objects are finished. 436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * @hide 456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/* IMPLEMENTATION NOTES 486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Because protobuf has inner values, and they are length prefixed, and 506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * those sizes themselves are stored with a variable length encoding, it 516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * is impossible to know how big an object will be in a single pass. 526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * The traditional way is to copy the in-memory representation of an object 546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * into the generated proto Message objects, do a traversal of those to 556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * cache the size, and then write the size-prefixed buffers. 566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * We are trying to avoid too much generated code here, but this class still 586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * needs to have a somewhat sane API. We can't have the multiple passes be 596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * done by the calling code. In addition, we want to avoid the memory high 606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * water mark of duplicating all of the values into the traditional in-memory 616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Message objects. We need to find another way. 626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * So what we do here is to let the calling code write the data into a 646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * byte[] (actually a collection of them wrapped in the EncodedBuffer) class, 656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * but not do the varint encoding of the sub-message sizes. Then, we do a 666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * recursive traversal of the buffer itself, calculating the sizes (which are 676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * then knowable, although still not the actual sizes in the buffer because of 686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * possible further nesting). Then we do a third pass, compacting the 696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * buffer and varint encoding the sizes. 706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * This gets us a relatively small number number of fixed-size allocations, 726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * which is less likely to cause memory fragmentation or churn the GC, and 736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * the same number of data copies as would have gotten with setting it 746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * field-by-field in generated code, and no code bloat from generated code. 756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * The final data copy is also done with System.arraycopy, which will be 766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * more efficient, in general, than doing the individual fields twice (as in 776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * the traditional way). 786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * To accomplish the multiple passes, whenever we write a 806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * WIRE_TYPE_LENGTH_DELIMITED field, we write the size occupied in our 816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * buffer as a fixed 32 bit int (called childRawSize), not variable length 826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * one. We reserve another 32 bit slot for the computed size (called 836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * childEncodedSize). If we know the size up front, as we do for strings 846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * and byte[], then we also put that into childEncodedSize, if we don't, we 856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * write the negative of childRawSize, as a sentiel that we need to 866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * compute it during the second pass and recursively compact it during the 876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * third pass. 886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Unsgigned size varints can be up to five bytes long, but we reserve eight 906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * bytes for overhead, so we know that when we compact the buffer, there 916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * will always be space for the encoded varint. 926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * When we can figure out the size ahead of time, we do, in order 946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * to save overhead with recalculating it, and with the later arraycopy. 956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * During the period between when the caller has called startObject, but 976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * not yet called endObject, we maintain a linked list of the tokens 986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * returned by startObject, stored in those 8 bytes of size storage space. 996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * We use that linked list of tokens to ensure that the caller has 1006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * correctly matched pairs of startObject and endObject calls, and issue 1016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * errors if they are not matched. 1026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 1036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato@TestApi 1046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratopublic final class ProtoOutputStream { 1056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final String TAG = "ProtoOutputStream"; 1066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final int FIELD_ID_SHIFT = 3; 1086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final int WIRE_TYPE_MASK = (1<<FIELD_ID_SHIFT)-1; 1096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final int FIELD_ID_MASK = ~WIRE_TYPE_MASK; 1106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final int WIRE_TYPE_VARINT = 0; 1126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final int WIRE_TYPE_FIXED64 = 1; 1136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final int WIRE_TYPE_LENGTH_DELIMITED = 2; 1146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final int WIRE_TYPE_START_GROUP = 3; 1156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final int WIRE_TYPE_END_GROUP = 4; 1166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final int WIRE_TYPE_FIXED32 = 5; 1176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 1196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Position of the field type in a (long) fieldId. 1206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 1216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final int FIELD_TYPE_SHIFT = 32; 1226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 1246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Mask for the field types stored in a fieldId. Leaves a whole 1256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * byte for future expansion, even though there are currently only 17 types. 1266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 1276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_MASK = 0x0ffL << FIELD_TYPE_SHIFT; 1286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_UNKNOWN = 0; 1306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_DOUBLE = 1L << FIELD_TYPE_SHIFT; 1326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_FLOAT = 2L << FIELD_TYPE_SHIFT; 1336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_INT32 = 3L << FIELD_TYPE_SHIFT; 1346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_INT64 = 4L << FIELD_TYPE_SHIFT; 1356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_UINT32 = 5L << FIELD_TYPE_SHIFT; 1366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_UINT64 = 6L << FIELD_TYPE_SHIFT; 1376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_SINT32 = 7L << FIELD_TYPE_SHIFT; 1386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_SINT64 = 8L << FIELD_TYPE_SHIFT; 1396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_FIXED32 = 9L << FIELD_TYPE_SHIFT; 1406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_FIXED64 = 10L << FIELD_TYPE_SHIFT; 1416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_SFIXED32 = 11L << FIELD_TYPE_SHIFT; 1426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_SFIXED64 = 12L << FIELD_TYPE_SHIFT; 1436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_BOOL = 13L << FIELD_TYPE_SHIFT; 1446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_STRING = 14L << FIELD_TYPE_SHIFT; 1456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_BYTES = 15L << FIELD_TYPE_SHIFT; 1466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_ENUM = 16L << FIELD_TYPE_SHIFT; 1476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_TYPE_OBJECT = 17L << FIELD_TYPE_SHIFT; 1486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private static final String[] FIELD_TYPE_NAMES = new String[] { 1506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "Double", 1516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "Float", 1526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "Int32", 1536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "Int64", 1546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "UInt32", 1556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "UInt64", 1566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "SInt32", 1576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "SInt64", 1586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "Fixed32", 1596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "Fixed64", 1606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "SFixed32", 1616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "SFixed64", 1626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "Bool", 1636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "String", 1646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "Bytes", 1656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "Enum", 1666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato "Object", 1676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato }; 1686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 1706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // FieldId flags for whether the field is single, repeated or packed. 1716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 1726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final int FIELD_COUNT_SHIFT = 40; 1736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_COUNT_MASK = 0x0fL << FIELD_COUNT_SHIFT; 1746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_COUNT_UNKNOWN = 0; 1766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_COUNT_SINGLE = 1L << FIELD_COUNT_SHIFT; 1776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_COUNT_REPEATED = 2L << FIELD_COUNT_SHIFT; 1786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static final long FIELD_COUNT_PACKED = 5L << FIELD_COUNT_SHIFT; 1796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 1816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Our buffer. 1826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 1836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private EncodedBuffer mBuffer; 1846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 186fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Our stream. If there is one. 187fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 188fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private OutputStream mStream; 189fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 190fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 1916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Current nesting depth of startObject calls. 1926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 1936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private int mDepth; 1946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 1966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * An ID given to objects and returned in the token from startObject 1976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * and stored in the buffer until endObject is called, where the two 1986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * are checked. Starts at -1 and becomes more negative, so the values 1996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * aren't likely to alias with the size it will be overwritten with, 2006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * which tend to be small, and we will be more likely to catch when 2016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * the caller of endObject uses a stale token that they didn't intend 2026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * to (e.g. copy and paste error). 2036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 2046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private int mNextObjectId = -1; 2056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 2066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 2076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * The object token we are expecting in endObject. If another call to 2086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * startObject happens, this is written to that location, which gives 2096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * us a stack, stored in the space for the as-yet unused size fields. 2106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 2116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private long mExpectedObjectToken; 2126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 2136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 2146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Index in mBuffer that we should start copying from on the next 2156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * pass of compaction. 2166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 2176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private int mCopyBegin; 2186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 2196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 2206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Whether we've already compacted 2216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 2226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private boolean mCompacted; 2236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 2246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 2256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Construct a ProtoOutputStream with the default chunk size. 2266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 2276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public ProtoOutputStream() { 2286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato this(0); 2296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 2306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 2316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 2326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Construct a ProtoOutputStream with the given chunk size. 2336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 2346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public ProtoOutputStream(int chunkSize) { 2356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer = new EncodedBuffer(chunkSize); 2366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 2376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 238fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 239fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Construct a ProtoOutputStream that sits on top of an OutputStream. 240fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @more 241fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * The {@link #flush() flush()} method must be called when done writing 242fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * to flush any remanining data, althought data *may* be written at intermediate 243fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * points within the writing as well. 244fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 245fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public ProtoOutputStream(OutputStream stream) { 246fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato this(); 247fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato mStream = stream; 248fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 249fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 250fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 251fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Construct a ProtoOutputStream that sits on top of a FileDescriptor. 252fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @more 253fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * The {@link #flush() flush()} method must be called when done writing 254fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * to flush any remanining data, althought data *may* be written at intermediate 255fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * points within the writing as well. 256fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 257fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public ProtoOutputStream(FileDescriptor fd) { 258fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato this(new FileOutputStream(fd)); 259fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 260fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 261fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 262fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Write a value for the given fieldId. 263fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 264fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Will automatically convert for the following field types, and 265fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * throw an exception for others: double, float, int32, int64, uint32, uint64, 266fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * sint32, sint64, fixed32, fixed64, sfixed32, sfixed64, bool, enum. 267fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 268fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param fieldId The field identifier constant from the generated class. 269fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param val The value. 270fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 271fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public void write(long fieldId, double val) { 272fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato assertNotCompacted(); 273fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final int id = (int)fieldId; 274fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 275fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) { 276fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // double 277fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 278fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeDoubleImpl(id, (double)val); 279fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 280fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 281fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 282fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedDoubleImpl(id, (double)val); 283fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 284fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // float 285fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 286fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFloatImpl(id, (float)val); 287fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 288fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 289fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 290fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFloatImpl(id, (float)val); 291fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 292fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // int32 293fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 294fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeInt32Impl(id, (int)val); 295fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 296fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 297fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 298fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedInt32Impl(id, (int)val); 299fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 300fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // int64 301fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 302fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeInt64Impl(id, (long)val); 303fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 304fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 305fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 306fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedInt64Impl(id, (long)val); 307fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 308fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // uint32 309fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 310fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeUInt32Impl(id, (int)val); 311fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 312fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 313fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 314fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedUInt32Impl(id, (int)val); 315fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 316fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // uint64 317fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 318fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeUInt64Impl(id, (long)val); 319fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 320fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 321fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 322fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedUInt64Impl(id, (long)val); 323fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 324fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sint32 325fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 326fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSInt32Impl(id, (int)val); 327fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 328fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 329fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 330fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSInt32Impl(id, (int)val); 331fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 332fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sint64 333fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 334fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSInt64Impl(id, (long)val); 335fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 336fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 337fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 338fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSInt64Impl(id, (long)val); 339fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 340fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // fixed32 341fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 342fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFixed32Impl(id, (int)val); 343fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 344fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 345fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 346fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFixed32Impl(id, (int)val); 347fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 348fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // fixed64 349fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 350fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFixed64Impl(id, (long)val); 351fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 352fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 353fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 354fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFixed64Impl(id, (long)val); 355fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 356fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sfixed32 357fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 358fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSFixed32Impl(id, (int)val); 359fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 360fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 361fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 362fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSFixed32Impl(id, (int)val); 363fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 364fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sfixed64 365fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 366fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSFixed64Impl(id, (long)val); 367fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 368fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 369fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 370fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSFixed64Impl(id, (long)val); 371fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 372fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // bool 373fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 374fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeBoolImpl(id, val != 0); 375fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 376fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 377fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 378fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedBoolImpl(id, val != 0); 379fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 380fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // enum 381fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 382fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeEnumImpl(id, (int)val); 383fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 384fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 385fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 386fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedEnumImpl(id, (int)val); 387fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 388fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // string, bytes, object not allowed here. 389fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato default: { 390fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato throw new IllegalArgumentException("Attempt to call write(long, double) with " 391fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato + getFieldIdString(fieldId)); 392fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 393fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 394fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 395fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 396fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 397fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Write a value for the given fieldId. 398fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 399fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Will automatically convert for the following field types, and 400fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * throw an exception for others: double, float, int32, int64, uint32, uint64, 401fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * sint32, sint64, fixed32, fixed64, sfixed32, sfixed64, bool, enum. 402fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 403fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param fieldId The field identifier constant from the generated class. 404fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param val The value. 405fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 406fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public void write(long fieldId, float val) { 407fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato assertNotCompacted(); 408fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final int id = (int)fieldId; 409fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 410fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) { 411fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // double 412fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 413fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeDoubleImpl(id, (double)val); 414fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 415fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 416fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 417fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedDoubleImpl(id, (double)val); 418fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 419fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // float 420fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 421fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFloatImpl(id, (float)val); 422fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 423fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 424fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 425fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFloatImpl(id, (float)val); 426fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 427fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // int32 428fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 429fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeInt32Impl(id, (int)val); 430fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 431fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 432fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 433fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedInt32Impl(id, (int)val); 434fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 435fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // int64 436fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 437fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeInt64Impl(id, (long)val); 438fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 439fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 440fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 441fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedInt64Impl(id, (long)val); 442fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 443fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // uint32 444fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 445fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeUInt32Impl(id, (int)val); 446fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 447fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 448fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 449fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedUInt32Impl(id, (int)val); 450fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 451fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // uint64 452fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 453fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeUInt64Impl(id, (long)val); 454fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 455fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 456fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 457fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedUInt64Impl(id, (long)val); 458fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 459fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sint32 460fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 461fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSInt32Impl(id, (int)val); 462fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 463fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 464fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 465fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSInt32Impl(id, (int)val); 466fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 467fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sint64 468fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 469fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSInt64Impl(id, (long)val); 470fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 471fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 472fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 473fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSInt64Impl(id, (long)val); 474fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 475fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // fixed32 476fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 477fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFixed32Impl(id, (int)val); 478fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 479fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 480fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 481fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFixed32Impl(id, (int)val); 482fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 483fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // fixed64 484fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 485fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFixed64Impl(id, (long)val); 486fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 487fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 488fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 489fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFixed64Impl(id, (long)val); 490fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 491fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sfixed32 492fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 493fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSFixed32Impl(id, (int)val); 494fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 495fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 496fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 497fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSFixed32Impl(id, (int)val); 498fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 499fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sfixed64 500fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 501fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSFixed64Impl(id, (long)val); 502fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 503fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 504fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 505fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSFixed64Impl(id, (long)val); 506fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 507fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // bool 508fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 509fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeBoolImpl(id, val != 0); 510fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 511fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 512fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 513fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedBoolImpl(id, val != 0); 514fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 515fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // enum 516fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 517fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeEnumImpl(id, (int)val); 518fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 519fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 520fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 521fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedEnumImpl(id, (int)val); 522fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 523fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // string, bytes, object not allowed here. 524fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato default: { 525fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato throw new IllegalArgumentException("Attempt to call write(long, float) with " 526fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato + getFieldIdString(fieldId)); 527fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 528fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 529fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 530fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 531fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 532fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Write a value for the given fieldId. 533fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 534fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Will automatically convert for the following field types, and 535fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * throw an exception for others: double, float, int32, int64, uint32, uint64, 536fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * sint32, sint64, fixed32, fixed64, sfixed32, sfixed64, bool, enum. 537fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 538fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param fieldId The field identifier constant from the generated class. 539fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param val The value. 540fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 541fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public void write(long fieldId, int val) { 542fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato assertNotCompacted(); 543fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final int id = (int)fieldId; 544fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 545fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) { 546fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // double 547fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 548fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeDoubleImpl(id, (double)val); 549fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 550fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 551fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 552fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedDoubleImpl(id, (double)val); 553fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 554fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // float 555fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 556fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFloatImpl(id, (float)val); 557fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 558fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 559fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 560fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFloatImpl(id, (float)val); 561fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 562fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // int32 563fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 564fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeInt32Impl(id, (int)val); 565fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 566fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 567fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 568fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedInt32Impl(id, (int)val); 569fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 570fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // int64 571fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 572fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeInt64Impl(id, (long)val); 573fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 574fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 575fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 576fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedInt64Impl(id, (long)val); 577fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 578fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // uint32 579fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 580fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeUInt32Impl(id, (int)val); 581fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 582fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 583fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 584fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedUInt32Impl(id, (int)val); 585fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 586fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // uint64 587fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 588fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeUInt64Impl(id, (long)val); 589fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 590fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 591fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 592fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedUInt64Impl(id, (long)val); 593fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 594fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sint32 595fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 596fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSInt32Impl(id, (int)val); 597fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 598fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 599fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 600fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSInt32Impl(id, (int)val); 601fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 602fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sint64 603fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 604fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSInt64Impl(id, (long)val); 605fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 606fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 607fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 608fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSInt64Impl(id, (long)val); 609fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 610fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // fixed32 611fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 612fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFixed32Impl(id, (int)val); 613fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 614fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 615fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 616fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFixed32Impl(id, (int)val); 617fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 618fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // fixed64 619fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 620fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFixed64Impl(id, (long)val); 621fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 622fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 623fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 624fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFixed64Impl(id, (long)val); 625fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 626fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sfixed32 627fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 628fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSFixed32Impl(id, (int)val); 629fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 630fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 631fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 632fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSFixed32Impl(id, (int)val); 633fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 634fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sfixed64 635fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 636fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSFixed64Impl(id, (long)val); 637fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 638fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 639fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 640fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSFixed64Impl(id, (long)val); 641fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 642fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // bool 643fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 644fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeBoolImpl(id, val != 0); 645fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 646fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 647fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 648fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedBoolImpl(id, val != 0); 649fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 650fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // enum 651fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 652fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeEnumImpl(id, (int)val); 653fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 654fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 655fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 656fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedEnumImpl(id, (int)val); 657fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 658fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // string, bytes, object not allowed here. 659fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato default: { 660fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato throw new IllegalArgumentException("Attempt to call write(long, int) with " 661fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato + getFieldIdString(fieldId)); 662fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 663fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 664fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 665fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 666fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 667fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Write a value for the given fieldId. 668fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 669fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Will automatically convert for the following field types, and 670fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * throw an exception for others: double, float, int32, int64, uint32, uint64, 671fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * sint32, sint64, fixed32, fixed64, sfixed32, sfixed64, bool, enum. 672fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 673fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param fieldId The field identifier constant from the generated class. 674fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param val The value. 675fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 676fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public void write(long fieldId, long val) { 677fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato assertNotCompacted(); 678fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final int id = (int)fieldId; 679fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 680fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) { 681fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // double 682fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 683fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeDoubleImpl(id, (double)val); 684fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 685fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 686fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 687fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedDoubleImpl(id, (double)val); 688fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 689fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // float 690fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 691fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFloatImpl(id, (float)val); 692fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 693fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 694fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 695fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFloatImpl(id, (float)val); 696fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 697fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // int32 698fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 699fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeInt32Impl(id, (int)val); 700fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 701fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 702fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 703fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedInt32Impl(id, (int)val); 704fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 705fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // int64 706fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 707fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeInt64Impl(id, (long)val); 708fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 709fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 710fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 711fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedInt64Impl(id, (long)val); 712fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 713fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // uint32 714fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 715fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeUInt32Impl(id, (int)val); 716fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 717fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 718fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 719fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedUInt32Impl(id, (int)val); 720fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 721fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // uint64 722fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 723fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeUInt64Impl(id, (long)val); 724fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 725fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 726fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 727fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedUInt64Impl(id, (long)val); 728fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 729fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sint32 730fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 731fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSInt32Impl(id, (int)val); 732fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 733fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 734fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 735fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSInt32Impl(id, (int)val); 736fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 737fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sint64 738fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 739fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSInt64Impl(id, (long)val); 740fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 741fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 742fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 743fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSInt64Impl(id, (long)val); 744fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 745fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // fixed32 746fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 747fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFixed32Impl(id, (int)val); 748fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 749fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 750fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 751fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFixed32Impl(id, (int)val); 752fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 753fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // fixed64 754fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 755fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFixed64Impl(id, (long)val); 756fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 757fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 758fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 759fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFixed64Impl(id, (long)val); 760fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 761fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sfixed32 762fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 763fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSFixed32Impl(id, (int)val); 764fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 765fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 766fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 767fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSFixed32Impl(id, (int)val); 768fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 769fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // sfixed64 770fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 771fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSFixed64Impl(id, (long)val); 772fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 773fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 774fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 775fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSFixed64Impl(id, (long)val); 776fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 777fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // bool 778fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 779fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeBoolImpl(id, val != 0); 780fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 781fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 782fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 783fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedBoolImpl(id, val != 0); 784fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 785fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // enum 786fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 787fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeEnumImpl(id, (int)val); 788fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 789fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 790fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 791fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedEnumImpl(id, (int)val); 792fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 793fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // string, bytes, object not allowed here. 794fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato default: { 795fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato throw new IllegalArgumentException("Attempt to call write(long, long) with " 796fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato + getFieldIdString(fieldId)); 797fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 798fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 799fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 800fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 801fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 802fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Write a boolean value for the given fieldId. 803fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 804fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * If the field is not a bool field, an exception will be thrown. 805fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 806fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param fieldId The field identifier constant from the generated class. 807fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param val The value. 808fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 809fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public void write(long fieldId, boolean val) { 810fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato assertNotCompacted(); 811fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final int id = (int)fieldId; 812fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 813fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) { 814fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // bool 815fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 816fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeBoolImpl(id, val); 817fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 818fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 819fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 820fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedBoolImpl(id, val); 821fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 822fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // nothing else allowed 823fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato default: { 824fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato throw new IllegalArgumentException("Attempt to call write(long, boolean) with " 825fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato + getFieldIdString(fieldId)); 826fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 827fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 828fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 829fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 830fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 831fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Write a string value for the given fieldId. 832fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 833fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * If the field is not a string field, an exception will be thrown. 834fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 835fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param fieldId The field identifier constant from the generated class. 836fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param val The value. 837fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 838fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public void write(long fieldId, String val) { 839fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato assertNotCompacted(); 840fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final int id = (int)fieldId; 841fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 842fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) { 843fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // string 844fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_STRING | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 845fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeStringImpl(id, val); 846fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 847fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_STRING | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 848fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_STRING | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 849fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedStringImpl(id, val); 850fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 851fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // nothing else allowed 852fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato default: { 853fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato throw new IllegalArgumentException("Attempt to call write(long, String) with " 854fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato + getFieldIdString(fieldId)); 855fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 856fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 857fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 858fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 859fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 860fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Write a byte[] value for the given fieldId. 861fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 862fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * If the field is not a bytes or object field, an exception will be thrown. 863fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * 864fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param fieldId The field identifier constant from the generated class. 865fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * @param val The value. 866fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 867fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public void write(long fieldId, byte[] val) { 868fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato assertNotCompacted(); 869fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final int id = (int)fieldId; 870fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 871fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) { 872fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // bytes 873fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BYTES | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 874fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeBytesImpl(id, val); 875fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 876fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BYTES | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 877fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_BYTES | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 878fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedBytesImpl(id, val); 879fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 880fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // Object 881fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_OBJECT | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT): 882fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeObjectImpl(id, val); 883fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 884fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_OBJECT | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT): 885fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato case (int)((FIELD_TYPE_OBJECT | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT): 886fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedObjectImpl(id, val); 887fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato break; 888fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // nothing else allowed 889fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato default: { 890fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato throw new IllegalArgumentException("Attempt to call write(long, byte[]) with " 891fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato + getFieldIdString(fieldId)); 892fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 893fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 894fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 895fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 896fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 897fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Start a sub object. 898fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 899fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public long start(long fieldId) { 900fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato assertNotCompacted(); 901fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final int id = (int)fieldId; 902fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 903fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato if ((fieldId & FIELD_TYPE_MASK) == FIELD_TYPE_OBJECT) { 904fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final long count = fieldId & FIELD_COUNT_MASK; 905fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato if (count == FIELD_COUNT_SINGLE) { 906fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato return startObjectImpl(id, false); 907fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } else if (count == FIELD_COUNT_REPEATED || count == FIELD_COUNT_PACKED) { 908fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato return startObjectImpl(id, true); 909fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 910fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 911fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato throw new IllegalArgumentException("Attempt to call start(long) with " 912fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato + getFieldIdString(fieldId)); 913fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 914fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 915fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 916fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * End the object started by start() that returned token. 917fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 918fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public void end(long token) { 919fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato endObjectImpl(token, getRepeatedFromToken(token)); 920fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 921fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 9226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 9236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: double 9246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: double 9256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: fixed64 9266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_FIXED64 9276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 9286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 9296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 9306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "double" type field value. 93134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 93234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 9336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 93434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 9356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeDouble(long fieldId, double val) { 9366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 9376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_DOUBLE); 9386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 939fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeDoubleImpl(id, val); 940fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 941fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 942fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeDoubleImpl(int id, double val) { 9436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 9446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED64); 9456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed64(Double.doubleToLongBits(val)); 9466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 9476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 9486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 9496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 9506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "double" type field value. 95134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 95234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 9536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 95434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 9556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedDouble(long fieldId, double val) { 9566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 9576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_DOUBLE); 9586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 959fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedDoubleImpl(id, val); 960fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 961fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 962fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedDoubleImpl(int id, double val) { 9636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED64); 9646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed64(Double.doubleToLongBits(val)); 9656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 9666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 9676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 9686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "double" type field values. 96934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 97034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 9716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 97234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 9736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedDouble(long fieldId, double[] val) { 9746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 9756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_DOUBLE); 9766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 9776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 9786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 9796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, N * 8); 9806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 9816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed64(Double.doubleToLongBits(val[i])); 9826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 9836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 9846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 9856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 9866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 9876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: float 9886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: float 9896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: fixed32 9906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_FIXED32 9916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 9926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 9936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 9946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "float" type field value. 99534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 99634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 9976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 99834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 9996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeFloat(long fieldId, float val) { 10006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 10016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_FLOAT); 10026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1003fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFloatImpl(id, val); 1004fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1005fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1006fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeFloatImpl(int id, float val) { 10076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 10086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED32); 10096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32(Float.floatToIntBits(val)); 10106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 10116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 10126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 10136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 10146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "float" type field value. 101534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 101634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 10176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 101834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 10196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedFloat(long fieldId, float val) { 10206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 10216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_FLOAT); 10226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1023fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFloatImpl(id, val); 1024fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1025fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1026fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedFloatImpl(int id, float val) { 10276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED32); 10286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32(Float.floatToIntBits(val)); 10296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 10306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 10316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 10326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "float" type field value. 103334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 103434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 10356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 103634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 10376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedFloat(long fieldId, float[] val) { 10386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 10396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_FLOAT); 10406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 10416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 10426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 10436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, N * 4); 10446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 10456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32(Float.floatToIntBits(val[i])); 10466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 10476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 10486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 10496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 10506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 10516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: int32 10526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: int 10536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // signed/unsigned: signed 10546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: varint 10556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_VARINT 10566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 10576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 10586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 10596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Writes a java int as an usigned varint. 10606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 10616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * The unadorned int32 type in protobuf is unfortunate because it 10626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * is stored in memory as a signed value, but encodes as unsigned 10636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * varints, which are formally always longs. So here, we encode 10646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * negative values as 64 bits, which will get the sign-extension, 10656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * and positive values as 32 bits, which saves a marginal amount 10666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * of work in that it processes ints instead of longs. 10676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 10686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private void writeUnsignedVarintFromSignedInt(int val) { 10696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val >= 0) { 10706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint32(val); 10716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 10726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint64(val); 10736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 10746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 10756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 10766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 10776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "int32" type field value. 10786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 10796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Note that these are stored in memory as signed values and written as unsigned 10806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * varints, which if negative, are 10 bytes long. If you know the data is likely 10816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * to be negative, use "sint32". 108234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 108334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 10846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 108534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 10866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeInt32(long fieldId, int val) { 10876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 10886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_INT32); 10896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1090fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeInt32Impl(id, val); 1091fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1092fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1093fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeInt32Impl(int id, int val) { 10946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 10956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 10966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeUnsignedVarintFromSignedInt(val); 10976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 10986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 10996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 11006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 11016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "int32" type field value. 11026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 11036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Note that these are stored in memory as signed values and written as unsigned 11046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * varints, which if negative, are 10 bytes long. If you know the data is likely 11056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * to be negative, use "sint32". 110634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 110734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 11086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 110934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 11106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedInt32(long fieldId, int val) { 11116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 11126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_INT32); 11136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1114fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedInt32Impl(id, val); 1115fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1116fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1117fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedInt32Impl(int id, int val) { 11186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 11196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeUnsignedVarintFromSignedInt(val); 11206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 11216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 11226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 11236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "int32" type field value. 11246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 11256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Note that these are stored in memory as signed values and written as unsigned 11266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * varints, which if negative, are 10 bytes long. If you know the data is likely 11276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * to be negative, use "sint32". 112834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 112934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 11306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 113134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 11326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedInt32(long fieldId, int[] val) { 11336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 11346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_INT32); 11356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 11366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 11376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 11386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int size = 0; 11396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 11406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int v = val[i]; 11416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato size += v >= 0 ? EncodedBuffer.getRawVarint32Size(v) : 10; 11426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 11436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, size); 11446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 11456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeUnsignedVarintFromSignedInt(val[i]); 11466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 11476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 11486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 11496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 11506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 11516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: int64 11526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: int 11536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // signed/unsigned: signed 11546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: varint 11556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_VARINT 11566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 11576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 11586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 11596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "int64" type field value. 116034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 116134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 11626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 116334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 11646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeInt64(long fieldId, long val) { 11656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 11666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_INT64); 11676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1168fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeInt64Impl(id, val); 1169fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1170fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1171fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeInt64Impl(int id, long val) { 11726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 11736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 11746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint64(val); 11756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 11766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 11776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 11786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 11796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "int64" type field value. 118034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 118134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 11826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 118334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 11846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedInt64(long fieldId, long val) { 11856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 11866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_INT64); 11876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1188fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedInt64Impl(id, val); 1189fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1190fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1191fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedInt64Impl(int id, long val) { 11926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 11936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint64(val); 11946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 11956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 11966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 11976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "int64" type field value. 119834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 119934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 12006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 120134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 12026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedInt64(long fieldId, long[] val) { 12036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 12046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_INT64); 12056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 12066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 12076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 12086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int size = 0; 12096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 12106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato size += EncodedBuffer.getRawVarint64Size(val[i]); 12116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 12126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, size); 12136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 12146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint64(val[i]); 12156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 12166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 12176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 12186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 12196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 12206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: uint32 12216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: int 12226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // signed/unsigned: unsigned 12236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: varint 12246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_VARINT 12256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 12266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 12276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 12286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "uint32" type field value. 122934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 123034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 12316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 123234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 12336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeUInt32(long fieldId, int val) { 12346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 12356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_UINT32); 12366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1237fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeUInt32Impl(id, val); 1238fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1239fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1240fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeUInt32Impl(int id, int val) { 12416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 12426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 12436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint32(val); 12446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 12456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 12466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 12476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 12486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "uint32" type field value. 124934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 125034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 12516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 125234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 12536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedUInt32(long fieldId, int val) { 12546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 12556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_UINT32); 12566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1257fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedUInt32Impl(id, val); 1258fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1259fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1260fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedUInt32Impl(int id, int val) { 12616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 12626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint32(val); 12636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 12646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 12656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 12666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "uint32" type field value. 126734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 126834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 12696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 127034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 12716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedUInt32(long fieldId, int[] val) { 12726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 12736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_UINT32); 12746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 12756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 12766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 12776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int size = 0; 12786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 12796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato size += EncodedBuffer.getRawVarint32Size(val[i]); 12806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 12816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, size); 12826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 12836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint32(val[i]); 12846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 12856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 12866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 12876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 12886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 12896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: uint64 12906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: int 12916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // signed/unsigned: unsigned 12926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: varint 12936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_VARINT 12946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 12956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 12966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 12976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "uint64" type field value. 129834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 129934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 13006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 130134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 13026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeUInt64(long fieldId, long val) { 13036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 13046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_UINT64); 13056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1306fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeUInt64Impl(id, val); 1307fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1308fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1309fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeUInt64Impl(int id, long val) { 13106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 13116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 13126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint64(val); 13136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 13146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 13156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 13166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 13176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "uint64" type field value. 131834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 131934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 13206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 132134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 13226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedUInt64(long fieldId, long val) { 13236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 13246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_UINT64); 13256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1326fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedUInt64Impl(id, val); 1327fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1328fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1329fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedUInt64Impl(int id, long val) { 13306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 13316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint64(val); 13326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 13336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 13346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 13356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "uint64" type field value. 133634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 133734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 13386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 133934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 13406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedUInt64(long fieldId, long[] val) { 13416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 13426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_UINT64); 13436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 13446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 13456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 13466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int size = 0; 13476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 13486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato size += EncodedBuffer.getRawVarint64Size(val[i]); 13496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 13506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, size); 13516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 13526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint64(val[i]); 13536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 13546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 13556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 13566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 13576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 13586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: sint32 13596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: int 13606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // signed/unsigned: signed 13616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: zig-zag 13626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_VARINT 13636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 13646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 13656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 13666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "sint32" type field value. 136734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 136834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 13696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 137034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 13716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeSInt32(long fieldId, int val) { 13726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 13736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_SINT32); 13746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1375fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSInt32Impl(id, val); 1376fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1377fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1378fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeSInt32Impl(int id, int val) { 13796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 13806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 13816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawZigZag32(val); 13826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 13836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 13846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 13856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 13866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "sint32" type field value. 138734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 138834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 13896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 139034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 13916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedSInt32(long fieldId, int val) { 13926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 13936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_SINT32); 13946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1395fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSInt32Impl(id, val); 1396fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1397fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1398fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedSInt32Impl(int id, int val) { 13996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 14006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawZigZag32(val); 14016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 14036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 14046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "sint32" type field value. 140534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 140634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 14076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 140834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 14096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedSInt32(long fieldId, int[] val) { 14106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 14116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_SINT32); 14126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 14136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 14146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 14156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int size = 0; 14166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 14176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato size += EncodedBuffer.getRawZigZag32Size(val[i]); 14186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, size); 14206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 14216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawZigZag32(val[i]); 14226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 14266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 14276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: sint64 14286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: int 14296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // signed/unsigned: signed 14306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: zig-zag 14316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_VARINT 14326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 14336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 14346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 14356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "sint64" type field value. 143634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 143734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 14386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 143934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 14406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeSInt64(long fieldId, long val) { 14416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 14426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_SINT64); 14436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1444fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSInt64Impl(id, val); 1445fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1446fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1447fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeSInt64Impl(int id, long val) { 14486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 14496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 14506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawZigZag64(val); 14516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 14546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 14556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "sint64" type field value. 145634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 145734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 14586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 145934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 14606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedSInt64(long fieldId, long val) { 14616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 14626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_SINT64); 14636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1464fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSInt64Impl(id, val); 1465fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1466fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1467fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedSInt64Impl(int id, long val) { 14686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 14696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawZigZag64(val); 14706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 14726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 14736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "sint64" type field value. 147434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 147534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 14766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 147734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 14786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedSInt64(long fieldId, long[] val) { 14796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 14806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_SINT64); 14816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 14826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 14836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 14846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int size = 0; 14856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 14866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato size += EncodedBuffer.getRawZigZag64Size(val[i]); 14876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, size); 14896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 14906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawZigZag64(val[i]); 14916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 14946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 14956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 14966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: fixed32 14976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: int 14986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: little endian 14996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_FIXED32 15006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 15016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 15026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 15036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "fixed32" type field value. 150434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 150534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 15066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 150734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 15086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeFixed32(long fieldId, int val) { 15096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 15106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_FIXED32); 15116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1512fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFixed32Impl(id, val); 1513fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1514fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1515fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeFixed32Impl(int id, int val) { 15166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 15176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED32); 15186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32(val); 15196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 15206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 15216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 15226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 15236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "fixed32" type field value. 152434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 152534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 15266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 152734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 15286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedFixed32(long fieldId, int val) { 15296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 15306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_FIXED32); 15316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1532fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedFixed32Impl(id, val); 1533fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1534fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1535fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedFixed32Impl(int id, int val) { 15366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED32); 15376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32(val); 15386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 15396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 15406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 15416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "fixed32" type field value. 154234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 154334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 15446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 154534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 15466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedFixed32(long fieldId, int[] val) { 15476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 15486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_FIXED32); 15496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 15506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 15516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 15526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, N * 4); 15536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 15546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32(val[i]); 15556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 15566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 15576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 15586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 15596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 15606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: fixed64 15616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: long 15626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: fixed64 15636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_FIXED64 15646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 15656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 15666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 15676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "fixed64" type field value. 156834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 156934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 15706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 157134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 15726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeFixed64(long fieldId, long val) { 15736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 15746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_FIXED64); 15756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1576fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeFixed64Impl(id, val); 1577fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1578fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1579fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeFixed64Impl(int id, long val) { 15806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 15816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED64); 15826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed64(val); 15836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 15846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 15856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 15866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 15876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "fixed64" type field value. 158834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 158934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 15906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 159134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 15926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedFixed64(long fieldId, long val) { 15936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 15946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_FIXED64); 15956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1596416723dccd72aad0d4218f70b3168e6de37eb10fJoe Onorato writeRepeatedFixed64Impl(id, val); 1597fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1598fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1599fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedFixed64Impl(int id, long val) { 16006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED64); 16016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed64(val); 16026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 16036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 16046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 16056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "fixed64" type field value. 160634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 160734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 16086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 160934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 16106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedFixed64(long fieldId, long[] val) { 16116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 16126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_FIXED64); 16136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 16146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 16156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 16166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, N * 8); 16176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 16186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed64(val[i]); 16196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 16206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 16216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 16226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 16236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 16246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: sfixed32 16256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: int 16266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: little endian 16276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_FIXED32 16286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 16296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 16306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "sfixed32" type field value. 163134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 163234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 16336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 163434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 16356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeSFixed32(long fieldId, int val) { 16366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 16376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_SFIXED32); 16386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1639fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSFixed32Impl(id, val); 1640fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1641fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1642fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeSFixed32Impl(int id, int val) { 16436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 16446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED32); 16456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32(val); 16466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 16476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 16486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 16496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 16506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "sfixed32" type field value. 165134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 165234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 16536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 165434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 16556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedSFixed32(long fieldId, int val) { 16566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 16576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_SFIXED32); 16586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1659fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedSFixed32Impl(id, val); 1660fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1661fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1662fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedSFixed32Impl(int id, int val) { 16636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED32); 16646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32(val); 16656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 16666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 16676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 16686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "sfixed32" type field value. 166934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 167034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 16716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 167234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 16736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedSFixed32(long fieldId, int[] val) { 16746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 16756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_SFIXED32); 16766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 16776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 16786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 16796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, N * 4); 16806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 16816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32(val[i]); 16826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 16836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 16846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 16856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 16866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 16876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: sfixed64 16886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: long 16896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: little endian 16906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_FIXED64 16916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 16926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 16936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 16946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "sfixed64" type field value. 169534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 169634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 16976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 169834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 16996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeSFixed64(long fieldId, long val) { 17006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 17016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_SFIXED64); 17026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1703fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeSFixed64Impl(id, val); 1704fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1705fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1706fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeSFixed64Impl(int id, long val) { 17076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 17086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED64); 17096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed64(val); 17106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 17116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 17126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 17136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 17146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "sfixed64" type field value. 171534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 171634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 17176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 171834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 17196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedSFixed64(long fieldId, long val) { 17206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 17216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_SFIXED64); 17226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1723416723dccd72aad0d4218f70b3168e6de37eb10fJoe Onorato writeRepeatedSFixed64Impl(id, val); 1724fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1725fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1726fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedSFixed64Impl(int id, long val) { 17276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_FIXED64); 17286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed64(val); 17296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 17306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 17316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 17326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "sfixed64" type field value. 173334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 173434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 17356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 173634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 17376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedSFixed64(long fieldId, long[] val) { 17386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 17396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_SFIXED64); 17406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 17416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 17426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 17436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, N * 8); 17446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 17456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed64(val[i]); 17466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 17476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 17486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 17496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 17506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 17516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: bool 17526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: boolean 17536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: varint 17546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_VARINT 17556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 17566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 17576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 17586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "bool" type field value. 175934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 176034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 17616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 176234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 17636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeBool(long fieldId, boolean val) { 17646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 17656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_BOOL); 17666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1767fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeBoolImpl(id, val); 1768fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1769fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1770fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeBoolImpl(int id, boolean val) { 17716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val) { 17726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 17736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 0 and 1 are the same as their varint counterparts 17746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawByte((byte)1); 17756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 17766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 17776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 17786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 17796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "bool" type field value. 178034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 178134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 17826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 178334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 17846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedBool(long fieldId, boolean val) { 17856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 17866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_BOOL); 17876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1788416723dccd72aad0d4218f70b3168e6de37eb10fJoe Onorato writeRepeatedBoolImpl(id, val); 1789fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1790fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1791fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedBoolImpl(int id, boolean val) { 17926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 17936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawByte((byte)(val ? 1 : 0)); 17946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 17956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 17966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 17976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "bool" type field value. 179834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 179934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 18006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 180134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 18026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedBool(long fieldId, boolean[] val) { 18036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 18046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_BOOL); 18056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 18066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 18076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 18086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Write the header 18096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, N); 18106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 18116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Write the data 18126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 18136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 0 and 1 are the same as their varint counterparts 18146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawByte((byte)(val[i] ? 1 : 0)); 18156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 18166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 18176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 18186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 18196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 18206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: string 18216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: String 18226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: utf-8 18236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_LENGTH_DELIMITED 18246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 18256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 18266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 18276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "string" type field value. 182834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 182934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 18306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 183134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 18326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeString(long fieldId, String val) { 18336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 18346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_STRING); 18356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1836fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeStringImpl(id, val); 1837fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1838fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1839fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeStringImpl(int id, String val) { 18406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != null && val.length() > 0) { 18416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeUtf8String(id, val); 18426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 18436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 18446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 18456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 18466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "string" type field value. 184734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 184834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 18496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 185034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 18516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedString(long fieldId, String val) { 18526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 18536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_STRING); 18546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1855fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedStringImpl(id, val); 1856fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1857fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1858fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedStringImpl(int id, String val) { 18596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val == null || val.length() == 0) { 18606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, 0); 18616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 18626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeUtf8String(id, val); 18636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 18646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 18656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 18666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 18676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto "string" type field value. 18686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 18696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private void writeUtf8String(int id, String val) { 18706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // TODO: Is it worth converting by hand in order to not allocate? 18716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato try { 18726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final byte[] buf = val.getBytes("UTF-8"); 18736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, buf.length); 18746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawBuffer(buf); 18756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } catch (UnsupportedEncodingException ex) { 18766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new RuntimeException("not possible"); 18776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 18786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 18796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 18806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 18816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: bytes 18826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: byte[] 18836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: varint 18846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_VARINT 18856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 18866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 18876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 18886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto "bytes" type field value. 188934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 189034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 18916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 189234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 18936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeBytes(long fieldId, byte[] val) { 18946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 18956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_BYTES); 18966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1897fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeBytesImpl(id, val); 1898fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1899fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1900fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeBytesImpl(int id, byte[] val) { 19016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != null && val.length > 0) { 19026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, val.length); 19036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawBuffer(val); 19046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 19056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 19066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 19076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 19086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto "bytes" type field value. 190934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 191034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 19116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 191234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 19136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedBytes(long fieldId, byte[] val) { 19146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 19156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_BYTES); 19166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1917fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedBytesImpl(id, val); 1918fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1919fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1920fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedBytesImpl(int id, byte[] val) { 19216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, val == null ? 0 : val.length); 19226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawBuffer(val); 19236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 19246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 19256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 19266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // proto3 type: enum 19276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // java type: int 19286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // signed/unsigned: unsigned 19296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // encoding: varint 19306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // wire type: WIRE_TYPE_VARINT 19316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 19326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 19336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 19346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single proto enum type field value. 193534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 193634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 19376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 193834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 19396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeEnum(long fieldId, int val) { 19406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 19416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_ENUM); 19426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1943fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeEnumImpl(id, val); 1944fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1945fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1946fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeEnumImpl(int id, int val) { 19476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (val != 0) { 19486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 19496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeUnsignedVarintFromSignedInt(val); 19506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 19516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 19526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 19536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 19546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a single repeated proto enum type field value. 195534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 195634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 19576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 195834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 19596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeRepeatedEnum(long fieldId, int val) { 19606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 19616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_ENUM); 19626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 1963fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedEnumImpl(id, val); 1964fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 1965fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 1966fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private void writeRepeatedEnumImpl(int id, int val) { 19676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_VARINT); 19686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeUnsignedVarintFromSignedInt(val); 19696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 19706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 19716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 19726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a list of packed proto enum type field value. 197334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 197434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 19756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 197634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 19776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writePackedEnum(long fieldId, int[] val) { 19786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 19796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_ENUM); 19806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 19816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int N = val != null ? val.length : 0; 19826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (N > 0) { 19836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int size = 0; 19846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 19856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int v = val[i]; 19866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato size += v >= 0 ? EncodedBuffer.getRawVarint32Size(v) : 10; 19876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 19886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeKnownLengthHeader(id, size); 19896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato for (int i=0; i<N; i++) { 19906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeUnsignedVarintFromSignedInt(val[i]); 19916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 19926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 19936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 19946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 19956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 19966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Child objects 19976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 19986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 19996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 20006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Make a token. 20016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Bits 61-63 - tag size (So we can go backwards later if the object had not data) 20026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * - 3 bits, max value 7, max value needed 5 20036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Bit 60 - true if the object is repeated (lets us require endObject or endRepeatedObject) 20046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Bits 59-51 - depth (For error checking) 20056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * - 9 bits, max value 512, when checking, value is masked (if we really 20066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * are more than 512 levels deep) 20076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Bits 32-50 - objectId (For error checking) 20086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * - 19 bits, max value 524,288. that's a lot of objects. IDs will wrap 20096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * because of the overflow, and only the tokens are compared. 20106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Bits 0-31 - offset of the first size field in the buffer. 20116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 20126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // VisibleForTesting 20136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static long makeToken(int tagSize, boolean repeated, int depth, int objectId, 20146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int sizePos) { 20156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return ((0x07L & (long)tagSize) << 61) 20166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato | (repeated ? (1L << 60) : 0) 20176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato | (0x01ffL & (long)depth) << 51 20186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato | (0x07ffffL & (long)objectId) << 32 20196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato | (0x0ffffffffL & (long)sizePos); 20206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 20216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 20226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 20236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Get the encoded tag size from the token. 20246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 20256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static int getTagSizeFromToken(long token) { 20266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return (int)(0x7 & (token >> 61)); 20276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 20286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 20296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 20306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Get whether this is a call to startObject (false) or startRepeatedObject (true). 20316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 20326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static boolean getRepeatedFromToken(long token) { 20336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return (0x1 & (token >> 60)) != 0; 20346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 20356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 20366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 20376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Get the nesting depth of startObject calls from the token. 20386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 20396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static int getDepthFromToken(long token) { 20406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return (int)(0x01ff & (token >> 51)); 20416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 20426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 20436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 20446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Get the object ID from the token. The object ID is a serial number for the 20456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * startObject calls that have happened on this object. The values are truncated 20466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * to 9 bits, but that is sufficient for error checking. 20476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 20486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static int getObjectIdFromToken(long token) { 20496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return (int)(0x07ffff & (token >> 32)); 20506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 20516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 20526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 20536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Get the location of the childRawSize (the first 32 bit size field) in this object. 20546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 20556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static int getSizePosFromToken(long token) { 20566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return (int)token; 20576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 20586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 20596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 20606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Convert the object ID to the ordinal value -- the n-th call to startObject. 20616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * The object IDs start at -1 and count backwards, so that the value is unlikely 20626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * to alias with an actual size field that had been written. 20636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 20646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static int convertObjectIdToOrdinal(int objectId) { 20656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return (-1 & 0x07ffff) - objectId; 20666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 20676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 20686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 20696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Return a debugging string of a token. 20706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 20716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static String token2String(long token) { 20726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (token == 0L) { 20736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return "Token(0)"; 20746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 20756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return "Token(val=0x" + Long.toHexString(token) 20766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " depth=" + getDepthFromToken(token) 20776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " object=" + convertObjectIdToOrdinal(getObjectIdFromToken(token)) 20786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " tagSize=" + getTagSizeFromToken(token) 20796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " sizePos=" + getSizePosFromToken(token) 20806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + ')'; 20816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 20826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 20836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 20846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 20856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Start a child object. 20866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 20876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Returns a token which should be passed to endObject. Calls to endObject must be 20886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * nested properly. 208934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 209034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #start() instead. 20916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 209234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 20936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public long startObject(long fieldId) { 20946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 20956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_OBJECT); 20966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 20976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return startObjectImpl(id, false); 20986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 20996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 21016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * End a child object. Pass in the token from the correspoinding startObject call. 210234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 210334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #end() instead. 21046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 210534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 21066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void endObject(long token) { 21076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 21086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato endObjectImpl(token, false); 21106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 21116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 21136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Start a repeated child object. 21146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 21156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Returns a token which should be passed to endObject. Calls to endObject must be 21166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * nested properly. 211734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 211834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #start() instead. 21196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 212034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 21216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public long startRepeatedObject(long fieldId) { 21226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 21236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_OBJECT); 21246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return startObjectImpl(id, true); 21266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 21276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 21296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * End a child object. Pass in the token from the correspoinding startRepeatedObject call. 213034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 213134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #end() instead. 21326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 213334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 21346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void endRepeatedObject(long token) { 21356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato assertNotCompacted(); 21366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato endObjectImpl(token, true); 21386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 21396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 21416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Common implementation of startObject and startRepeatedObject. 21426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 21436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private long startObjectImpl(final int id, boolean repeated) { 21446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_LENGTH_DELIMITED); 21456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int sizePos = mBuffer.getWritePos(); 21466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mDepth++; 21476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mNextObjectId--; 21486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Write the previous token, giving us a stack of expected tokens. 21506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // After endObject returns, the first fixed32 becomeschildRawSize (set in endObject) 21516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // and the second one becomes childEncodedSize (set in editEncodedSize). 21526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32((int)(mExpectedObjectToken >> 32)); 21536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32((int)mExpectedObjectToken); 21546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato long old = mExpectedObjectToken; 21566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mExpectedObjectToken = makeToken(getTagSize(id), repeated, mDepth, mNextObjectId, sizePos); 21586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return mExpectedObjectToken; 21596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 21606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 21626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Common implementation of endObject and endRepeatedObject. 21636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 21646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private void endObjectImpl(long token, boolean repeated) { 21656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // The upper 32 bits of the token is the depth of startObject / 21666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // endObject calls. We could get aritrarily sophisticated, but 21676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // that's enough to prevent the common error of missing an 21686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // endObject somewhere. 21696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // The lower 32 bits of the token is the offset in the buffer 21706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // at which to write the size. 21716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int depth = getDepthFromToken(token); 21726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final boolean expectedRepeated = getRepeatedFromToken(token); 21736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int sizePos = getSizePosFromToken(token); 21746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int childRawSize = mBuffer.getWritePos() - sizePos - 8; 21756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (repeated != expectedRepeated) { 21776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (repeated) { 21786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new IllegalArgumentException("endRepeatedObject called where endObject should" 21796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " have been"); 21806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 21816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new IllegalArgumentException("endObject called where endRepeatedObject should" 21826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " have been"); 21836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 21846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 21856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Check that we're getting the token and depth that we are expecting. 21876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if ((mDepth & 0x01ff) != depth || mExpectedObjectToken != token) { 21886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // This text of exception is united tested. That test also implicity checks 21896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // that we're tracking the objectIds and depths correctly. 21906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new IllegalArgumentException("Mismatched startObject/endObject calls." 21916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " Current depth " + mDepth 21926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " token=" + token2String(token) 21936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " expectedToken=" + token2String(mExpectedObjectToken)); 21946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 21956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 21966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Get the next expected token that we stashed away in the buffer. 21976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mExpectedObjectToken = (((long)mBuffer.getRawFixed32At(sizePos)) << 32) 21986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato | (0x0ffffffffL & (long)mBuffer.getRawFixed32At(sizePos+4)); 21996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 22006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mDepth--; 22016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (childRawSize > 0) { 22026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.editRawFixed32(sizePos, -childRawSize); 22036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.editRawFixed32(sizePos+4, -1); 22046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else if (repeated) { 22056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.editRawFixed32(sizePos, 0); 22066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.editRawFixed32(sizePos+4, 0); 22076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 22086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // The object has no data. Don't include it. 22096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.rewindWriteTo(sizePos - getTagSizeFromToken(token)); 22106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 22116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 22126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 2213fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 2214fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Write an object that has already been flattend. 221534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 221634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 2217fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 221834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 2219fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public void writeObject(long fieldId, byte[] value) { 2220fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato assertNotCompacted(); 2221fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_OBJECT); 2222fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 2223fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeObjectImpl(id, value); 2224fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2225fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 222634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki void writeObjectImpl(int id, byte[] value) { 2227fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato if (value != null && value.length != 0) { 2228fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeKnownLengthHeader(id, value.length); 2229fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato mBuffer.writeRawBuffer(value); 2230fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2231fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2232fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 2233fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 2234fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Write an object that has already been flattend. 223534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * 223634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki * @deprecated Use #write instead. 2237fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 223834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki @Deprecated 2239fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public void writeRepeatedObject(long fieldId, byte[] value) { 2240fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato assertNotCompacted(); 2241fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_OBJECT); 2242fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 2243fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeRepeatedObjectImpl(id, value); 2244fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2245fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 224634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki void writeRepeatedObjectImpl(int id, byte[] value) { 2247fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato writeKnownLengthHeader(id, value == null ? 0 : value.length); 2248fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato mBuffer.writeRawBuffer(value); 2249fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2250fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 22516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 22526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Tags 22536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 22546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 22556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 22566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Combine a fieldId (the field keys in the proto file) and the field flags. 22576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Mostly useful for testing because the generated code contains the fieldId 22586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * constants. 22596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 22606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static long makeFieldId(int id, long fieldFlags) { 22616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return fieldFlags | (((long)id) & 0x0ffffffffL); 22626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 22636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 22646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 22656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Validates that the fieldId providied is of the type and count from expectedType. 22666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 22676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * The type must match exactly to pass this check. 22686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 22696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * The count must match according to this truth table to pass the check: 22706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 22716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * expectedFlags 22726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * UNKNOWN SINGLE REPEATED PACKED 22736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * fieldId 22746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * UNKNOWN true false false false 22756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * SINGLE x true false false 22766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * REPEATED x false true false 22776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * PACKED x false true true 22786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 22796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * @throws IllegalArgumentException if it is not. 22806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 22816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * @return The raw ID of that field. 22826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 22836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public static int checkFieldId(long fieldId, long expectedFlags) { 22846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final long fieldCount = fieldId & FIELD_COUNT_MASK; 22856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final long fieldType = fieldId & FIELD_TYPE_MASK; 22866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final long expectedCount = expectedFlags & FIELD_COUNT_MASK; 22876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final long expectedType = expectedFlags & FIELD_TYPE_MASK; 22886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (((int)fieldId) == 0) { 22896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new IllegalArgumentException("Invalid proto field " + (int)fieldId 22906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " fieldId=" + Long.toHexString(fieldId)); 22916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 22926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (fieldType != expectedType 22936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato || !((fieldCount == expectedCount) 22946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato || (fieldCount == FIELD_COUNT_PACKED 22956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato && expectedCount == FIELD_COUNT_REPEATED))) { 22966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final String countString = getFieldCountString(fieldCount); 22976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final String typeString = getFieldTypeString(fieldType); 22986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (typeString != null && countString != null) { 22996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final StringBuilder sb = new StringBuilder(); 23006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (expectedType == FIELD_TYPE_OBJECT) { 23016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append("start"); 23026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 23036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append("write"); 23046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(getFieldCountString(expectedCount)); 23066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(getFieldTypeString(expectedType)); 23076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(" called for field "); 23086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append((int)fieldId); 23096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(" which should be used with "); 23106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (fieldType == FIELD_TYPE_OBJECT) { 23116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append("start"); 23126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 23136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append("write"); 23146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(countString); 23166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(typeString); 23176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (fieldCount == FIELD_COUNT_PACKED) { 23186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(" or writeRepeated"); 23196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(typeString); 23206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append('.'); 23226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new IllegalArgumentException(sb.toString()); 23236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 23246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final StringBuilder sb = new StringBuilder(); 23256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (expectedType == FIELD_TYPE_OBJECT) { 23266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append("start"); 23276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 23286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append("write"); 23296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(getFieldCountString(expectedCount)); 23316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(getFieldTypeString(expectedType)); 23326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(" called with an invalid fieldId: 0x"); 23336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(Long.toHexString(fieldId)); 23346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append(". The proto field ID might be "); 23356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append((int)fieldId); 23366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato sb.append('.'); 23376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new IllegalArgumentException(sb.toString()); 23386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return (int)fieldId; 23416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 23436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 23446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Get the developer-usable name of a field type. 23456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 23466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private static String getFieldTypeString(long fieldType) { 23476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int index = ((int)((fieldType & FIELD_TYPE_MASK) >>> FIELD_TYPE_SHIFT)) - 1; 23486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (index >= 0 && index < FIELD_TYPE_NAMES.length) { 23496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return FIELD_TYPE_NAMES[index]; 23506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 23516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return null; 23526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 23556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 23566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Get the developer-usable name of a field count. 23576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 23586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private static String getFieldCountString(long fieldCount) { 23596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (fieldCount == FIELD_COUNT_SINGLE) { 23606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return ""; 23616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else if (fieldCount == FIELD_COUNT_REPEATED) { 23626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return "Repeated"; 23636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else if (fieldCount == FIELD_COUNT_PACKED) { 23646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return "Packed"; 23656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 23666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return null; 23676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 2370fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 2371fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Get a debug string for a fieldId. 2372fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 2373fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato private String getFieldIdString(long fieldId) { 2374fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final long fieldCount = fieldId & FIELD_COUNT_MASK; 2375fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato String countString = getFieldCountString(fieldCount); 2376fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato if (countString == null) { 2377fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato countString = "fieldCount=" + fieldCount; 2378fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2379fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 2380fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final long fieldType = fieldId & FIELD_TYPE_MASK; 2381fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato String typeString = getFieldTypeString(fieldType); 2382fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato if (typeString == null) { 2383fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato typeString = "fieldType=" + fieldType; 2384fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2385fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 2386fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato return fieldCount + " " + typeString + " tag=" + ((int)fieldId) 2387fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato + " fieldId=0x" + Long.toHexString(fieldId); 2388fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 23896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 23906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 23916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Return how many bytes an encoded field tag will require. 23926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 23936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private static int getTagSize(int id) { 23946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return EncodedBuffer.getRawVarint32Size(id << FIELD_ID_SHIFT); 23956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 23966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 23976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 23986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write a field tage to the stream. 23996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 24006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void writeTag(int id, int wireType) { 24016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint32((id << FIELD_ID_SHIFT) | wireType); 24026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 24036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 24056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Write the header of a WIRE_TYPE_LENGTH_DELIMITED field for one where 24066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * we know the size in advance and do not need to compute and compact. 24076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 24086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private void writeKnownLengthHeader(int id, int size) { 24096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Write the tag 24106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato writeTag(id, WIRE_TYPE_LENGTH_DELIMITED); 24116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Size will be compacted later, but we know the size, so write it, 24126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // once for the rawSize and once for the encodedSize. 24136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32(size); 24146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawFixed32(size); 24156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 24166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 24186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Getting the buffer and compaction 24196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // 24206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 24226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Assert that the compact call has not already occured. 24236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 24246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * TODO: Will change when we add the OutputStream version of ProtoOutputStream. 24256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 24266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private void assertNotCompacted() { 24276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (mCompacted) { 24286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new IllegalArgumentException("write called after compact"); 24296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 24306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 24316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 24336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Finish the encoding of the data, and return a byte[] with 24346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * the protobuf formatted data. 24356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * 24366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * After this call, do not call any of the write* functions. The 24376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * behavior is undefined. 24386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 24396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public byte[] getBytes() { 24406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato compactIfNecessary(); 24416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return mBuffer.getBytes(mBuffer.getReadableSize()); 24436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 24446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 24466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * If the buffer hasn't already had the nested object size fields compacted 24476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * and turned into an actual protobuf format, then do so. 24486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 24496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private void compactIfNecessary() { 24506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (!mCompacted) { 24516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (mDepth != 0) { 24526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new IllegalArgumentException("Trying to compact with " + mDepth 24536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " missing calls to endObject"); 24546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 24556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // The buffer must be compacted. 24576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.startEditing(); 24586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int readableSize = mBuffer.getReadableSize(); 24596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Cache the sizes of the objects 24616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato editEncodedSize(readableSize); 24626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Re-write the buffer with the sizes as proper varints instead 24646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // of pairs of uint32s. We know this will always fit in the same 24656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // buffer because the pair of uint32s is exactly 8 bytes long, and 24666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // the single varint size will be no more than 5 bytes long. 24676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.rewindRead(); 24686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato compactSizes(readableSize); 24696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // If there is any data left over that wasn't copied yet, copy it. 24716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (mCopyBegin < readableSize) { 24726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeFromThisBuffer(mCopyBegin, readableSize - mCopyBegin); 24736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 24746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Set the new readableSize 24766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.startEditing(); 24776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // It's not valid to write to this object anymore. The write 24796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // pointers are off, and then some of the data would be compacted 24806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // and some not. 24816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mCompacted = true; 24826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 24836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 24846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 24866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * First compaction pass. Iterate through the data, and fill in the 24876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * nested object sizes so the next pass can compact them. 24886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 24896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private int editEncodedSize(int rawSize) { 24906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int objectStart = mBuffer.getReadPos(); 24916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int objectEnd = objectStart + rawSize; 24926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int encodedSize = 0; 24936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int tagPos; 24946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato while ((tagPos = mBuffer.getReadPos()) < objectEnd) { 24966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int tag = readRawTag(); 24976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato encodedSize += EncodedBuffer.getRawVarint32Size(tag); 24986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 24996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int wireType = tag & WIRE_TYPE_MASK; 25006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato switch (wireType) { 25016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_VARINT: 25026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato encodedSize++; 25036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato while ((mBuffer.readRawByte() & 0x80) != 0) { 25046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato encodedSize++; 25056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 25066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato break; 25076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_FIXED64: 25086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato encodedSize += 8; 25096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.skipRead(8); 25106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato break; 25116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_LENGTH_DELIMITED: { 25126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // This object is not of a fixed-size type. So we need to figure 25136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // out how big it should be. 25146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int childRawSize = mBuffer.readRawFixed32(); 25156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int childEncodedSizePos = mBuffer.getReadPos(); 25166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int childEncodedSize = mBuffer.readRawFixed32(); 25176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (childRawSize >= 0) { 25186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // We know the size, just skip ahead. 25196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (childEncodedSize != childRawSize) { 25206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new RuntimeException("Pre-computed size where the" 25216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " precomputed size and the raw size in the buffer" 25226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " don't match! childRawSize=" + childRawSize 25236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " childEncodedSize=" + childEncodedSize 25246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " childEncodedSizePos=" + childEncodedSizePos); 25256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 25266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.skipRead(childRawSize); 25276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 25286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // We need to compute the size. Recurse. 25296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato childEncodedSize = editEncodedSize(-childRawSize); 25306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.editRawFixed32(childEncodedSizePos, childEncodedSize); 25316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 25326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato encodedSize += EncodedBuffer.getRawVarint32Size(childEncodedSize) 25336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + childEncodedSize; 25346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato break; 25356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 25366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_START_GROUP: 25376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_END_GROUP: 25386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new RuntimeException("groups not supported at index " + tagPos); 25396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_FIXED32: 25406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato encodedSize += 4; 25416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.skipRead(4); 25426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato break; 25436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato default: 25446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new ProtoParseException("editEncodedSize Bad tag tag=0x" 25456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + Integer.toHexString(tag) + " wireType=" + wireType 25466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " -- " + mBuffer.getDebugString()); 25476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 25486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 25496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 25506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return encodedSize; 25516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 25526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 25536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 25546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Second compaction pass. Iterate through the data, and copy the data 25556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * forward in the buffer, converting the pairs of uint32s into a single 25566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * unsigned varint of the size. 25576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 25586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private void compactSizes(int rawSize) { 25596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int objectStart = mBuffer.getReadPos(); 25606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int objectEnd = objectStart + rawSize; 25616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int tagPos; 25626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato while ((tagPos = mBuffer.getReadPos()) < objectEnd) { 25636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato int tag = readRawTag(); 25646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 25656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // For all the non-length-delimited field types, just skip over them, 25666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // and we'll just System.arraycopy it later, either in the case for 25676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // WIRE_TYPE_LENGTH_DELIMITED or at the top of the stack in compactIfNecessary(). 25686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int wireType = tag & WIRE_TYPE_MASK; 25696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato switch (wireType) { 25706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_VARINT: 25716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato while ((mBuffer.readRawByte() & 0x80) != 0) { } 25726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato break; 25736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_FIXED64: 25746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.skipRead(8); 25756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato break; 25766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_LENGTH_DELIMITED: { 25776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Copy everything up to now, including the tag for this field. 25786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeFromThisBuffer(mCopyBegin, mBuffer.getReadPos() - mCopyBegin); 25796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Write the new size. 25806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int childRawSize = mBuffer.readRawFixed32(); 25816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato final int childEncodedSize = mBuffer.readRawFixed32(); 25826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.writeRawVarint32(childEncodedSize); 25836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Next time, start copying from here. 25846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mCopyBegin = mBuffer.getReadPos(); 25856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (childRawSize >= 0) { 25866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // This is raw data, not an object. Skip ahead by the size. 25876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // Recurse into the child 25886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.skipRead(childEncodedSize); 25896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } else { 25906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato compactSizes(-childRawSize); 25916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 25926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato break; 25936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // TODO: What does regular proto do if the object would be 0 size 25946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato // (e.g. if it is all default values). 25956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 25966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_START_GROUP: 25976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_END_GROUP: 25986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new RuntimeException("groups not supported at index " + tagPos); 25996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato case WIRE_TYPE_FIXED32: 26006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.skipRead(4); 26016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato break; 26026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato default: 26036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato throw new ProtoParseException("compactSizes Bad tag tag=0x" 26046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + Integer.toHexString(tag) + " wireType=" + wireType 26056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato + " -- " + mBuffer.getDebugString()); 26066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 26076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 26086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 26096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 26106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 2611fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * Write remaining data to the output stream. If there is no output stream, 2612fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * this function does nothing. Any currently open objects (i.e. ones that 2613fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * have not had endObject called for them will not be written). Whether this 2614fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * writes objects that are closed if there are remaining open objects is 2615fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * undefined (current implementation does not write it, future ones will). 2616fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato * For now, can either call getBytes() or flush(), but not both. 2617fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato */ 2618fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato public void flush() { 2619fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato if (mStream == null) { 2620fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato return; 2621fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2622fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato if (mDepth != 0) { 2623fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // TODO: The compacting code isn't ready yet to compact unless we're done. 2624fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // TODO: Fix that. 2625fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato return; 2626fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2627fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato if (mCompacted) { 2628fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato // If we're compacted, we already wrote it finished. 2629fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato return; 2630fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2631fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato compactIfNecessary(); 2632fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato final byte[] data = mBuffer.getBytes(mBuffer.getReadableSize()); 2633fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato try { 2634fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato mStream.write(data); 2635fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato mStream.flush(); 2636fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } catch (IOException ex) { 2637fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato throw new RuntimeException("Error flushing proto to stream", ex); 2638fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2639fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato } 2640fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato 2641fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato /** 26426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Read a raw tag from the buffer. 26436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 26446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato private int readRawTag() { 26456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato if (mBuffer.getReadPos() == mBuffer.getReadableSize()) { 26466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return 0; 26476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 26486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato return (int)mBuffer.readRawUnsigned(); 26496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 26506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato 26516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato /** 26526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Dump debugging data about the buffers with the given log tag. 26536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */ 26546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato public void dump(String tag) { 26556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato Log.d(tag, mBuffer.getDebugString()); 26566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato mBuffer.dumpBuffers(tag); 26576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato } 26586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato} 2659