1555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Protocol Buffers - Google's data interchange format 2555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Copyright 2008 Google Inc. All rights reserved. 3555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// http://code.google.com/p/protobuf/ 4555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 5555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Redistribution and use in source and binary forms, with or without 6555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// modification, are permitted provided that the following conditions are 7555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// met: 8555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 9555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Redistributions of source code must retain the above copyright 10555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// notice, this list of conditions and the following disclaimer. 11555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Redistributions in binary form must reproduce the above 12555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// copyright notice, this list of conditions and the following disclaimer 13555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// in the documentation and/or other materials provided with the 14555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// distribution. 15555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Neither the name of Google Inc. nor the names of its 16555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// contributors may be used to endorse or promote products derived from 17555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// this software without specific prior written permission. 18555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 19555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 31555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Author: kenton@google.com (Kenton Varda) 32555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Based on original Protocol Buffers design by 33555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Sanjay Ghemawat, Jeff Dean, and others. 34555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 35555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This file contains the CodedInputStream and CodedOutputStream classes, 36555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// which wrap a ZeroCopyInputStream or ZeroCopyOutputStream, respectively, 37555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// and allow you to read or write individual pieces of data in various 38555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// formats. In particular, these implement the varint encoding for 39555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// integers, a simple variable-length encoding in which smaller numbers 40555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// take fewer bytes. 41555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 42555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Typically these classes will only be used internally by the protocol 43555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// buffer library in order to encode and decode protocol buffers. Clients 44555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// of the library only need to know about this class if they wish to write 45555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// custom message parsing or serialization procedures. 46555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 47555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// CodedOutputStream example: 48555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// // Write some data to "myfile". First we write a 4-byte "magic number" 49555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// // to identify the file type, then write a length-delimited string. The 50555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// // string is composed of a varint giving the length followed by the raw 51555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// // bytes. 52555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// int fd = open("myfile", O_WRONLY); 53555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ZeroCopyOutputStream* raw_output = new FileOutputStream(fd); 54555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// CodedOutputStream* coded_output = new CodedOutputStream(raw_output); 55555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 56555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// int magic_number = 1234; 57555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// char text[] = "Hello world!"; 58555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// coded_output->WriteLittleEndian32(magic_number); 59555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// coded_output->WriteVarint32(strlen(text)); 60555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// coded_output->WriteRaw(text, strlen(text)); 61555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 62555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// delete coded_output; 63555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// delete raw_output; 64555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// close(fd); 65555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 66555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// CodedInputStream example: 67555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// // Read a file created by the above code. 68555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// int fd = open("myfile", O_RDONLY); 69555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ZeroCopyInputStream* raw_input = new FileInputStream(fd); 70555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// CodedInputStream coded_input = new CodedInputStream(raw_input); 71555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 72555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// coded_input->ReadLittleEndian32(&magic_number); 73555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// if (magic_number != 1234) { 74555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// cerr << "File not in expected format." << endl; 75555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// return; 76555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// } 77555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 78555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// uint32 size; 79555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// coded_input->ReadVarint32(&size); 80555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 81555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// char* text = new char[size + 1]; 82555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// coded_input->ReadRaw(buffer, size); 83555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// text[size] = '\0'; 84555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 85555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// delete coded_input; 86555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// delete raw_input; 87555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// close(fd); 88555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 89555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// cout << "Text is: " << text << endl; 90555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// delete [] text; 91555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 92555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// For those who are interested, varint encoding is defined as follows: 93555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 94555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// The encoding operates on unsigned integers of up to 64 bits in length. 95555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Each byte of the encoded value has the format: 96555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * bits 0-6: Seven bits of the number being encoded. 97555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * bit 7: Zero if this is the last byte in the encoding (in which 98555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// case all remaining bits of the number are zero) or 1 if 99555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// more bytes follow. 100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// The first byte contains the least-significant 7 bits of the number, the 101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// second byte (if present) contains the next-least-significant 7 bits, 102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// and so on. So, the binary number 1011000101011 would be encoded in two 103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// bytes as "10101011 00101100". 104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// In theory, varint could be used to encode integers of any length. 106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// However, for practicality we set a limit at 64 bits. The maximum encoded 107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// length of a number is thus 10 bytes. 108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <string> 113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifdef _MSC_VER 114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot #if defined(_M_IX86) && \ 115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) 116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot #define PROTOBUF_LITTLE_ENDIAN 1 117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot #endif 118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot #if _MSC_VER >= 1300 119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If MSVC has "/RTCc" set, it will complain about truncating casts at 120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // runtime. This file contains some intentional truncating casts. 121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot #pragma runtime_checks("c", off) 122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot #endif 123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#else 124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot #include <sys/param.h> // __BYTE_ORDER 125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot #if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN && \ 126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) 127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot #define PROTOBUF_LITTLE_ENDIAN 1 128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot #endif 129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/stubs/common.h> 131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace google { 134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace protobuf { 135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass DescriptorPool; 137555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass MessageFactory; 138555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 139555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace io { 140555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 141555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Defined in this file. 142555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass CodedInputStream; 143555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass CodedOutputStream; 144555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 145555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Defined in other files. 146555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass ZeroCopyInputStream; // zero_copy_stream.h 147555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass ZeroCopyOutputStream; // zero_copy_stream.h 148555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 149555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Class which reads and decodes binary data which is composed of varint- 150555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// encoded integers and fixed-width pieces. Wraps a ZeroCopyInputStream. 151555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Most users will not need to deal with CodedInputStream. 152555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 153555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Most methods of CodedInputStream that return a bool return false if an 154555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// underlying I/O error occurs or if the data is malformed. Once such a 155555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// failure occurs, the CodedInputStream is broken and is no longer useful. 156555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT CodedInputStream { 157555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 158555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Create a CodedInputStream that reads from the given ZeroCopyInputStream. 159555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot explicit CodedInputStream(ZeroCopyInputStream* input); 160555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 161555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Create a CodedInputStream that reads from the given flat array. This is 162555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // faster than using an ArrayInputStream. PushLimit(size) is implied by 163555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // this constructor. 164555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot explicit CodedInputStream(const uint8* buffer, int size); 165555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 166555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Destroy the CodedInputStream and position the underlying 167555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ZeroCopyInputStream at the first unread byte. If an error occurred while 168555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // reading (causing a method to return false), then the exact position of 169555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the input stream may be anywhere between the last value that was read 170555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // successfully and the stream's byte limit. 171555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ~CodedInputStream(); 172555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 173555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Return true if this CodedInputStream reads from a flat array instead of 174555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // a ZeroCopyInputStream. 175555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline bool IsFlat() const; 176555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 177555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Skips a number of bytes. Returns false if an underlying read error 178555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // occurs. 179555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool Skip(int count); 180555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 181555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Sets *data to point directly at the unread part of the CodedInputStream's 182555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // underlying buffer, and *size to the size of that buffer, but does not 183555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // advance the stream's current position. This will always either produce 184555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // a non-empty buffer or return false. If the caller consumes any of 185555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // this data, it should then call Skip() to skip over the consumed bytes. 186555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // This may be useful for implementing external fast parsing routines for 187555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // types of data not covered by the CodedInputStream interface. 188555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool GetDirectBufferPointer(const void** data, int* size); 189555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 190555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like GetDirectBufferPointer, but this method is inlined, and does not 191555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // attempt to Refresh() if the buffer is currently empty. 192555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline void GetDirectBufferPointerInline(const void** data, 193555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int* size) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 194555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 195555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Read raw bytes, copying them into the given buffer. 196555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadRaw(void* buffer, int size); 197555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 198555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like ReadRaw, but reads into a string. 199555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 200555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Implementation Note: ReadString() grows the string gradually as it 201555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // reads in the data, rather than allocating the entire requested size 202555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // upfront. This prevents denial-of-service attacks in which a client 203555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // could claim that a string is going to be MAX_INT bytes long in order to 204555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // crash the server because it can't allocate this much space at once. 205555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadString(string* buffer, int size); 206555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like the above, with inlined optimizations. This should only be used 207555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // by the protobuf implementation. 208555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline bool InternalReadStringInline(string* buffer, 209555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int size) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 210555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 211555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 212555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Read a 32-bit little-endian integer. 213555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadLittleEndian32(uint32* value); 214555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Read a 64-bit little-endian integer. 215555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadLittleEndian64(uint64* value); 216555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 217555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // These methods read from an externally provided buffer. The caller is 218555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // responsible for ensuring that the buffer has sufficient space. 219555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Read a 32-bit little-endian integer. 220555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static const uint8* ReadLittleEndian32FromArray(const uint8* buffer, 221555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32* value); 222555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Read a 64-bit little-endian integer. 223555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static const uint8* ReadLittleEndian64FromArray(const uint8* buffer, 224555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint64* value); 225555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 226555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Read an unsigned integer with Varint encoding, truncating to 32 bits. 227555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Reading a 32-bit value is equivalent to reading a 64-bit one and casting 228555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // it to uint32, but may be more efficient. 229555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadVarint32(uint32* value); 230555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Read an unsigned integer with Varint encoding. 231555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadVarint64(uint64* value); 232555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 233555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Read a tag. This calls ReadVarint32() and returns the result, or returns 234555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // zero (which is not a valid tag) if ReadVarint32() fails. Also, it updates 235555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the last tag value, which can be checked with LastTagWas(). 236555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Always inline because this is only called in once place per parse loop 237555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // but it is called for every iteration of said loop, so it should be fast. 238555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // GCC doesn't want to inline this by default. 239555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 ReadTag() GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 240555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 241555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Usually returns true if calling ReadVarint32() now would produce the given 242555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // value. Will always return false if ReadVarint32() would not return the 243555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // given value. If ExpectTag() returns true, it also advances past 244555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the varint. For best performance, use a compile-time constant as the 245555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // parameter. 246555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Always inline because this collapses to a small number of instructions 247555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // when given a constant parameter, but GCC doesn't want to inline by default. 248555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ExpectTag(uint32 expected) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 249555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 250555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like above, except this reads from the specified buffer. The caller is 251555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // responsible for ensuring that the buffer is large enough to read a varint 252555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // of the expected size. For best performance, use a compile-time constant as 253555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the expected tag parameter. 254555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 255555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns a pointer beyond the expected tag if it was found, or NULL if it 256555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // was not. 257555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static const uint8* ExpectTagFromArray( 258555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const uint8* buffer, 259555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 expected) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 260555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 261555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Usually returns true if no more bytes can be read. Always returns false 262555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // if more bytes can be read. If ExpectAtEnd() returns true, a subsequent 263555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // call to LastTagWas() will act as if ReadTag() had been called and returned 264555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // zero, and ConsumedEntireMessage() will return true. 265555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ExpectAtEnd(); 266555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 267555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If the last call to ReadTag() returned the given value, returns true. 268555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Otherwise, returns false; 269555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 270555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // This is needed because parsers for some types of embedded messages 271555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // (with field type TYPE_GROUP) don't actually know that they've reached the 272555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // end of a message until they see an ENDGROUP tag, which was actually part 273555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // of the enclosing message. The enclosing message would like to check that 274555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // tag to make sure it had the right number, so it calls LastTagWas() on 275555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // return from the embedded parser to check. 276555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool LastTagWas(uint32 expected); 277555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 278555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // When parsing message (but NOT a group), this method must be called 279555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // immediately after MergeFromCodedStream() returns (if it returns true) 280555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // to further verify that the message ended in a legitimate way. For 281555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // example, this verifies that parsing did not end on an end-group tag. 282555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // It also checks for some cases where, due to optimizations, 283555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // MergeFromCodedStream() can incorrectly return true. 284555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ConsumedEntireMessage(); 285555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 286555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Limits ---------------------------------------------------------- 287555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Limits are used when parsing length-delimited embedded messages. 288555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // After the message's length is read, PushLimit() is used to prevent 289555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the CodedInputStream from reading beyond that length. Once the 290555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // embedded message has been parsed, PopLimit() is called to undo the 291555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // limit. 292555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 293555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Opaque type used with PushLimit() and PopLimit(). Do not modify 294555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // values of this type yourself. The only reason that this isn't a 295555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // struct with private internals is for efficiency. 296555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef int Limit; 297555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 298555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Places a limit on the number of bytes that the stream may read, 299555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // starting from the current position. Once the stream hits this limit, 300555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // it will act like the end of the input has been reached until PopLimit() 301555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // is called. 302555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 303555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // As the names imply, the stream conceptually has a stack of limits. The 304555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // shortest limit on the stack is always enforced, even if it is not the 305555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // top limit. 306555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 307555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // The value returned by PushLimit() is opaque to the caller, and must 308555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // be passed unchanged to the corresponding call to PopLimit(). 309555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Limit PushLimit(int byte_limit); 310555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 311555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Pops the last limit pushed by PushLimit(). The input must be the value 312555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // returned by that call to PushLimit(). 313555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PopLimit(Limit limit); 314555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 315555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns the number of bytes left until the nearest limit on the 316555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // stack is hit, or -1 if no limits are in place. 317555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int BytesUntilLimit() const; 318555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 319555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns current position relative to the beginning of the input stream. 320555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int CurrentPosition() const; 321555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 322555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Total Bytes Limit ----------------------------------------------- 323555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // To prevent malicious users from sending excessively large messages 324555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // and causing integer overflows or memory exhaustion, CodedInputStream 325555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // imposes a hard limit on the total number of bytes it will read. 326555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 327555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Sets the maximum number of bytes that this CodedInputStream will read 328555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // before refusing to continue. To prevent integer overflows in the 329555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // protocol buffers implementation, as well as to prevent servers from 330555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // allocating enormous amounts of memory to hold parsed messages, the 331555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // maximum message length should be limited to the shortest length that 332555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // will not harm usability. The theoretical shortest message that could 333555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // cause integer overflows is 512MB. The default limit is 64MB. Apps 334555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // should set shorter limits if possible. If warning_threshold is not -1, 335555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // a warning will be printed to stderr after warning_threshold bytes are 336555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // read. For backwards compatibility all negative values get squached to -1, 337555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // as other negative values might have special internal meanings. 338555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // An error will always be printed to stderr if the limit is reached. 339555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 340555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // This is unrelated to PushLimit()/PopLimit(). 341555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 342555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Hint: If you are reading this because your program is printing a 343555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // warning about dangerously large protocol messages, you may be 344555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // confused about what to do next. The best option is to change your 345555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // design such that excessively large messages are not necessary. 346555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // For example, try to design file formats to consist of many small 347555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // messages rather than a single large one. If this is infeasible, 348555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // you will need to increase the limit. Chances are, though, that 349555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // your code never constructs a CodedInputStream on which the limit 350555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // can be set. You probably parse messages by calling things like 351555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Message::ParseFromString(). In this case, you will need to change 352555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // your code to instead construct some sort of ZeroCopyInputStream 353555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // (e.g. an ArrayInputStream), construct a CodedInputStream around 354555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // that, then call Message::ParseFromCodedStream() instead. Then 355555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // you can adjust the limit. Yes, it's more work, but you're doing 356555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // something unusual. 357555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetTotalBytesLimit(int total_bytes_limit, int warning_threshold); 358555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 359555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Recursion Limit ------------------------------------------------- 360555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // To prevent corrupt or malicious messages from causing stack overflows, 361555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // we must keep track of the depth of recursion when parsing embedded 362555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // messages and groups. CodedInputStream keeps track of this because it 363555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // is the only object that is passed down the stack during parsing. 364555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 365555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Sets the maximum recursion depth. The default is 100. 366555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetRecursionLimit(int limit); 367555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 368555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 369555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Increments the current recursion depth. Returns true if the depth is 370555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // under the limit, false if it has gone over. 371555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool IncrementRecursionDepth(); 372555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 373555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Decrements the recursion depth. 374555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void DecrementRecursionDepth(); 375555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 376555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Extension Registry ---------------------------------------------- 377555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ADVANCED USAGE: 99.9% of people can ignore this section. 378555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 379555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // By default, when parsing extensions, the parser looks for extension 380555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // definitions in the pool which owns the outer message's Descriptor. 381555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // However, you may call SetExtensionRegistry() to provide an alternative 382555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // pool instead. This makes it possible, for example, to parse a message 383555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // using a generated class, but represent some extensions using 384555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // DynamicMessage. 385555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 386555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Set the pool used to look up extensions. Most users do not need to call 387555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // this as the correct pool will be chosen automatically. 388555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 389555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // WARNING: It is very easy to misuse this. Carefully read the requirements 390555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // below. Do not use this unless you are sure you need it. Almost no one 391555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // does. 392555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 393555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Let's say you are parsing a message into message object m, and you want 394555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // to take advantage of SetExtensionRegistry(). You must follow these 395555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // requirements: 396555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 397555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // The given DescriptorPool must contain m->GetDescriptor(). It is not 398555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // sufficient for it to simply contain a descriptor that has the same name 399555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // and content -- it must be the *exact object*. In other words: 400555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // assert(pool->FindMessageTypeByName(m->GetDescriptor()->full_name()) == 401555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // m->GetDescriptor()); 402555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // There are two ways to satisfy this requirement: 403555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 1) Use m->GetDescriptor()->pool() as the pool. This is generally useless 404555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // because this is the pool that would be used anyway if you didn't call 405555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // SetExtensionRegistry() at all. 406555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 2) Use a DescriptorPool which has m->GetDescriptor()->pool() as an 407555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // "underlay". Read the documentation for DescriptorPool for more 408555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // information about underlays. 409555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 410555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // You must also provide a MessageFactory. This factory will be used to 411555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // construct Message objects representing extensions. The factory's 412555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // GetPrototype() MUST return non-NULL for any Descriptor which can be found 413555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // through the provided pool. 414555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 415555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If the provided factory might return instances of protocol-compiler- 416555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // generated (i.e. compiled-in) types, or if the outer message object m is 417555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // a generated type, then the given factory MUST have this property: If 418555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // GetPrototype() is given a Descriptor which resides in 419555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // DescriptorPool::generated_pool(), the factory MUST return the same 420555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // prototype which MessageFactory::generated_factory() would return. That 421555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // is, given a descriptor for a generated type, the factory must return an 422555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // instance of the generated class (NOT DynamicMessage). However, when 423555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // given a descriptor for a type that is NOT in generated_pool, the factory 424555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // is free to return any implementation. 425555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 426555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // The reason for this requirement is that generated sub-objects may be 427555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // accessed via the standard (non-reflection) extension accessor methods, 428555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // and these methods will down-cast the object to the generated class type. 429555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If the object is not actually of that type, the results would be undefined. 430555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // On the other hand, if an extension is not compiled in, then there is no 431555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // way the code could end up accessing it via the standard accessors -- the 432555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // only way to access the extension is via reflection. When using reflection, 433555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // DynamicMessage and generated messages are indistinguishable, so it's fine 434555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // if these objects are represented using DynamicMessage. 435555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 436555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Using DynamicMessageFactory on which you have called 437555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // SetDelegateToGeneratedFactory(true) should be sufficient to satisfy the 438555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // above requirement. 439555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 440555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If either pool or factory is NULL, both must be NULL. 441555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 442555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Note that this feature is ignored when parsing "lite" messages as they do 443555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // not have descriptors. 444555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetExtensionRegistry(const DescriptorPool* pool, 445555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageFactory* factory); 446555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 447555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Get the DescriptorPool set via SetExtensionRegistry(), or NULL if no pool 448555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // has been provided. 449555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const DescriptorPool* GetExtensionPool(); 450555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 451555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Get the MessageFactory set via SetExtensionRegistry(), or NULL if no 452555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // factory has been provided. 453555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageFactory* GetExtensionFactory(); 454555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 455555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot private: 456555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedInputStream); 457555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 458555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ZeroCopyInputStream* input_; 459555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const uint8* buffer_; 460555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const uint8* buffer_end_; // pointer to the end of the buffer. 461555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int total_bytes_read_; // total bytes read from input_, including 462555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the current buffer 463555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 464555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If total_bytes_read_ surpasses INT_MAX, we record the extra bytes here 465555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // so that we can BackUp() on destruction. 466555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int overflow_bytes_; 467555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 468555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // LastTagWas() stuff. 469555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 last_tag_; // result of last ReadTag(). 470555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 471555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // This is set true by ReadTag{Fallback/Slow}() if it is called when exactly 472555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // at EOF, or by ExpectAtEnd() when it returns true. This happens when we 473555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // reach the end of a message and attempt to read another tag. 474555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool legitimate_message_end_; 475555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 476555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // See EnableAliasing(). 477555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool aliasing_enabled_; 478555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 479555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Limits 480555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Limit current_limit_; // if position = -1, no limit is applied 481555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 482555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // For simplicity, if the current buffer crosses a limit (either a normal 483555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // limit created by PushLimit() or the total bytes limit), buffer_size_ 484555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // only tracks the number of bytes before that limit. This field 485555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // contains the number of bytes after it. Note that this implies that if 486555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // buffer_size_ == 0 and buffer_size_after_limit_ > 0, we know we've 487555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // hit a limit. However, if both are zero, it doesn't necessarily mean 488555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // we aren't at a limit -- the buffer may have ended exactly at the limit. 489555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int buffer_size_after_limit_; 490555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 491555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Maximum number of bytes to read, period. This is unrelated to 492555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // current_limit_. Set using SetTotalBytesLimit(). 493555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int total_bytes_limit_; 494555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 495555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If positive/0: Limit for bytes read after which a warning due to size 496555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // should be logged. 497555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If -1: Printing of warning disabled. Can be set by client. 498555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If -2: Internal: Limit has been reached, print full size when destructing. 499555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int total_bytes_warning_threshold_; 500555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 501555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Current recursion depth, controlled by IncrementRecursionDepth() and 502555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // DecrementRecursionDepth(). 503555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int recursion_depth_; 504555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Recursion depth limit, set by SetRecursionLimit(). 505555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int recursion_limit_; 506555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 507555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // See SetExtensionRegistry(). 508555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const DescriptorPool* extension_pool_; 509555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageFactory* extension_factory_; 510555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 511555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Private member functions. 512555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 513555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Advance the buffer by a given number of bytes. 514555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void Advance(int amount); 515555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 516555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Back up input_ to the current buffer position. 517555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void BackUpInputToCurrentPosition(); 518555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 519555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Recomputes the value of buffer_size_after_limit_. Must be called after 520555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // current_limit_ or total_bytes_limit_ changes. 521555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void RecomputeBufferLimits(); 522555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 523555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Writes an error message saying that we hit total_bytes_limit_. 524555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintTotalBytesLimitError(); 525555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 526555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Called when the buffer runs out to request more data. Implies an 527555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Advance(BufferSize()). 528555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool Refresh(); 529555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 530555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // When parsing varints, we optimize for the common case of small values, and 531555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // then optimize for the case when the varint fits within the current buffer 532555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // piece. The Fallback method is used when we can't use the one-byte 533555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // optimization. The Slow method is yet another fallback when the buffer is 534555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // not large enough. Making the slow path out-of-line speeds up the common 535555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // case by 10-15%. The slow path is fairly uncommon: it only triggers when a 536555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // message crosses multiple buffers. 537555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadVarint32Fallback(uint32* value); 538555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadVarint64Fallback(uint64* value); 539555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadVarint32Slow(uint32* value); 540555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadVarint64Slow(uint64* value); 541555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadLittleEndian32Fallback(uint32* value); 542555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadLittleEndian64Fallback(uint64* value); 543555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Fallback/slow methods for reading tags. These do not update last_tag_, 544555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // but will set legitimate_message_end_ if we are at the end of the input 545555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // stream. 546555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 ReadTagFallback(); 547555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 ReadTagSlow(); 548555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ReadStringFallback(string* buffer, int size); 549555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 550555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Return the size of the buffer. 551555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int BufferSize() const; 552555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 553555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static const int kDefaultTotalBytesLimit = 64 << 20; // 64MB 554555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 555555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static const int kDefaultTotalBytesWarningThreshold = 32 << 20; // 32MB 556555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 557555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static int default_recursion_limit_; // 100 by default. 558555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 559555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 560555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Class which encodes and writes binary data which is composed of varint- 561555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// encoded integers and fixed-width pieces. Wraps a ZeroCopyOutputStream. 562555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Most users will not need to deal with CodedOutputStream. 563555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 564555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Most methods of CodedOutputStream which return a bool return false if an 565555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// underlying I/O error occurs. Once such a failure occurs, the 566555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// CodedOutputStream is broken and is no longer useful. The Write* methods do 567555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// not return the stream status, but will invalidate the stream if an error 568555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// occurs. The client can probe HadError() to determine the status. 569555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 570555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Note that every method of CodedOutputStream which writes some data has 571555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// a corresponding static "ToArray" version. These versions write directly 572555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// to the provided buffer, returning a pointer past the last written byte. 573555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// They require that the buffer has sufficient capacity for the encoded data. 574555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This allows an optimization where we check if an output stream has enough 575555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// space for an entire message before we start writing and, if there is, we 576555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// call only the ToArray methods to avoid doing bound checks for each 577555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// individual value. 578555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// i.e., in the example above: 579555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 580555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// CodedOutputStream coded_output = new CodedOutputStream(raw_output); 581555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// int magic_number = 1234; 582555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// char text[] = "Hello world!"; 583555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 584555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// int coded_size = sizeof(magic_number) + 585555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// CodedOutputStream::VarintSize32(strlen(text)) + 586555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// strlen(text); 587555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 588555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// uint8* buffer = 589555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// coded_output->GetDirectBufferForNBytesAndAdvance(coded_size); 590555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// if (buffer != NULL) { 591555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// // The output stream has enough space in the buffer: write directly to 592555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// // the array. 593555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// buffer = CodedOutputStream::WriteLittleEndian32ToArray(magic_number, 594555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// buffer); 595555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// buffer = CodedOutputStream::WriteVarint32ToArray(strlen(text), buffer); 596555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// buffer = CodedOutputStream::WriteRawToArray(text, strlen(text), buffer); 597555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// } else { 598555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// // Make bound-checked writes, which will ask the underlying stream for 599555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// // more space as needed. 600555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// coded_output->WriteLittleEndian32(magic_number); 601555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// coded_output->WriteVarint32(strlen(text)); 602555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// coded_output->WriteRaw(text, strlen(text)); 603555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// } 604555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 605555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// delete coded_output; 606555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT CodedOutputStream { 607555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 608555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Create an CodedOutputStream that writes to the given ZeroCopyOutputStream. 609555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot explicit CodedOutputStream(ZeroCopyOutputStream* output); 610555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 611555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Destroy the CodedOutputStream and position the underlying 612555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ZeroCopyOutputStream immediately after the last byte written. 613555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ~CodedOutputStream(); 614555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 615555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Skips a number of bytes, leaving the bytes unmodified in the underlying 616555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // buffer. Returns false if an underlying write error occurs. This is 617555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // mainly useful with GetDirectBufferPointer(). 618555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool Skip(int count); 619555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 620555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Sets *data to point directly at the unwritten part of the 621555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // CodedOutputStream's underlying buffer, and *size to the size of that 622555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // buffer, but does not advance the stream's current position. This will 623555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // always either produce a non-empty buffer or return false. If the caller 624555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // writes any data to this buffer, it should then call Skip() to skip over 625555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the consumed bytes. This may be useful for implementing external fast 626555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // serialization routines for types of data not covered by the 627555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // CodedOutputStream interface. 628555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool GetDirectBufferPointer(void** data, int* size); 629555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 630555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If there are at least "size" bytes available in the current buffer, 631555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // returns a pointer directly into the buffer and advances over these bytes. 632555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // The caller may then write directly into this buffer (e.g. using the 633555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // *ToArray static methods) rather than go through CodedOutputStream. If 634555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // there are not enough bytes available, returns NULL. The return pointer is 635555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // invalidated as soon as any other non-const method of CodedOutputStream 636555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // is called. 637555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline uint8* GetDirectBufferForNBytesAndAdvance(int size); 638555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 639555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Write raw bytes, copying them from the given buffer. 640555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void WriteRaw(const void* buffer, int size); 641555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like WriteRaw() but writing directly to the target array. 642555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // This is _not_ inlined, as the compiler often optimizes memcpy into inline 643555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // copy loops. Since this gets called by every field with string or bytes 644555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // type, inlining may lead to a significant amount of code bloat, with only a 645555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // minor performance gain. 646555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* WriteRawToArray(const void* buffer, int size, uint8* target); 647555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 648555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Equivalent to WriteRaw(str.data(), str.size()). 649555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void WriteString(const string& str); 650555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like WriteString() but writing directly to the target array. 651555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* WriteStringToArray(const string& str, uint8* target); 652555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 653555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 654555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Write a 32-bit little-endian integer. 655555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void WriteLittleEndian32(uint32 value); 656555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like WriteLittleEndian32() but writing directly to the target array. 657555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* WriteLittleEndian32ToArray(uint32 value, uint8* target); 658555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Write a 64-bit little-endian integer. 659555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void WriteLittleEndian64(uint64 value); 660555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like WriteLittleEndian64() but writing directly to the target array. 661555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* WriteLittleEndian64ToArray(uint64 value, uint8* target); 662555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 663555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Write an unsigned integer with Varint encoding. Writing a 32-bit value 664555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // is equivalent to casting it to uint64 and writing it as a 64-bit value, 665555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // but may be more efficient. 666555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void WriteVarint32(uint32 value); 667555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like WriteVarint32() but writing directly to the target array. 668555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* WriteVarint32ToArray(uint32 value, uint8* target); 669555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Write an unsigned integer with Varint encoding. 670555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void WriteVarint64(uint64 value); 671555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like WriteVarint64() but writing directly to the target array. 672555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* WriteVarint64ToArray(uint64 value, uint8* target); 673555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 674555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Equivalent to WriteVarint32() except when the value is negative, 675555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // in which case it must be sign-extended to a full 10 bytes. 676555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void WriteVarint32SignExtended(int32 value); 677555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like WriteVarint32SignExtended() but writing directly to the target array. 678555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* WriteVarint32SignExtendedToArray(int32 value, uint8* target); 679555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 680555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // This is identical to WriteVarint32(), but optimized for writing tags. 681555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // In particular, if the input is a compile-time constant, this method 682555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // compiles down to a couple instructions. 683555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Always inline because otherwise the aformentioned optimization can't work, 684555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // but GCC by default doesn't want to inline this. 685555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void WriteTag(uint32 value); 686555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like WriteTag() but writing directly to the target array. 687555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* WriteTagToArray( 688555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 689555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 690555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns the number of bytes needed to encode the given value as a varint. 691555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static int VarintSize32(uint32 value); 692555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns the number of bytes needed to encode the given value as a varint. 693555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static int VarintSize64(uint64 value); 694555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 695555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If negative, 10 bytes. Otheriwse, same as VarintSize32(). 696555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static int VarintSize32SignExtended(int32 value); 697555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 698555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Compile-time equivalent of VarintSize32(). 699555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <uint32 Value> 700555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot struct StaticVarintSize32 { 701555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static const int value = 702555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (Value < (1 << 7)) 703555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ? 1 704555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot : (Value < (1 << 14)) 705555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ? 2 706555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot : (Value < (1 << 21)) 707555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ? 3 708555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot : (Value < (1 << 28)) 709555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ? 4 710555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot : 5; 711555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot }; 712555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 713555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns the total number of bytes written since this object was created. 714555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline int ByteCount() const; 715555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 716555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns true if there was an underlying I/O error since this object was 717555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // created. 718555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool HadError() const { return had_error_; } 719555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 720555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot private: 721555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedOutputStream); 722555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 723555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ZeroCopyOutputStream* output_; 724555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* buffer_; 725555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int buffer_size_; 726555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int total_bytes_; // Sum of sizes of all buffers seen so far. 727555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool had_error_; // Whether an error occurred during output. 728555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 729555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Advance the buffer by a given number of bytes. 730555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void Advance(int amount); 731555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 732555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Called when the buffer runs out to request more data. Implies an 733555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Advance(buffer_size_). 734555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool Refresh(); 735555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 736555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* WriteVarint32FallbackToArray(uint32 value, uint8* target); 737555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 738555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Always-inlined versions of WriteVarint* functions so that code can be 739555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // reused, while still controlling size. For instance, WriteVarint32ToArray() 740555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // should not directly call this: since it is inlined itself, doing so 741555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // would greatly increase the size of generated code. Instead, it should call 742555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // WriteVarint32FallbackToArray. Meanwhile, WriteVarint32() is already 743555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // out-of-line, so it should just invoke this directly to avoid any extra 744555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // function call overhead. 745555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* WriteVarint32FallbackToArrayInline( 746555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 747555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* WriteVarint64ToArrayInline( 748555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint64 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 749555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 750555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static int VarintSize32Fallback(uint32 value); 751555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 752555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 753555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// inline methods ==================================================== 754555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// The vast majority of varints are only one byte. These inline 755555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// methods optimize for that case. 756555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 757555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline bool CodedInputStream::ReadVarint32(uint32* value) { 758555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && *buffer_ < 0x80) { 759555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot *value = *buffer_; 760555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Advance(1); 761555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return true; 762555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 763555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return ReadVarint32Fallback(value); 764555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 765555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 766555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 767555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline bool CodedInputStream::ReadVarint64(uint64* value) { 768555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && *buffer_ < 0x80) { 769555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot *value = *buffer_; 770555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Advance(1); 771555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return true; 772555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 773555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return ReadVarint64Fallback(value); 774555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 775555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 776555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 777555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// static 778555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline const uint8* CodedInputStream::ReadLittleEndian32FromArray( 779555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const uint8* buffer, 780555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32* value) { 781555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 782555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot memcpy(value, buffer, sizeof(*value)); 783555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return buffer + sizeof(*value); 784555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#else 785555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot *value = (static_cast<uint32>(buffer[0]) ) | 786555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (static_cast<uint32>(buffer[1]) << 8) | 787555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (static_cast<uint32>(buffer[2]) << 16) | 788555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (static_cast<uint32>(buffer[3]) << 24); 789555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return buffer + sizeof(*value); 790555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 791555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 792555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// static 793555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline const uint8* CodedInputStream::ReadLittleEndian64FromArray( 794555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const uint8* buffer, 795555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint64* value) { 796555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 797555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot memcpy(value, buffer, sizeof(*value)); 798555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return buffer + sizeof(*value); 799555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#else 800555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 part0 = (static_cast<uint32>(buffer[0]) ) | 801555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (static_cast<uint32>(buffer[1]) << 8) | 802555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (static_cast<uint32>(buffer[2]) << 16) | 803555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (static_cast<uint32>(buffer[3]) << 24); 804555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 part1 = (static_cast<uint32>(buffer[4]) ) | 805555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (static_cast<uint32>(buffer[5]) << 8) | 806555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (static_cast<uint32>(buffer[6]) << 16) | 807555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (static_cast<uint32>(buffer[7]) << 24); 808555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot *value = static_cast<uint64>(part0) | 809555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (static_cast<uint64>(part1) << 32); 810555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return buffer + sizeof(*value); 811555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 812555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 813555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 814555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline bool CodedInputStream::ReadLittleEndian32(uint32* value) { 815555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 816555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) { 817555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot memcpy(value, buffer_, sizeof(*value)); 818555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Advance(sizeof(*value)); 819555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return true; 820555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 821555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return ReadLittleEndian32Fallback(value); 822555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 823555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#else 824555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return ReadLittleEndian32Fallback(value); 825555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 826555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 827555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 828555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline bool CodedInputStream::ReadLittleEndian64(uint64* value) { 829555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 830555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) { 831555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot memcpy(value, buffer_, sizeof(*value)); 832555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Advance(sizeof(*value)); 833555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return true; 834555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 835555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return ReadLittleEndian64Fallback(value); 836555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 837555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#else 838555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return ReadLittleEndian64Fallback(value); 839555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 840555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 841555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 842555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline uint32 CodedInputStream::ReadTag() { 843555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && buffer_[0] < 0x80) { 844555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot last_tag_ = buffer_[0]; 845555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Advance(1); 846555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return last_tag_; 847555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 848555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot last_tag_ = ReadTagFallback(); 849555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return last_tag_; 850555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 851555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 852555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 853555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline bool CodedInputStream::LastTagWas(uint32 expected) { 854555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return last_tag_ == expected; 855555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 856555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 857555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline bool CodedInputStream::ConsumedEntireMessage() { 858555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return legitimate_message_end_; 859555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 860555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 861555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline bool CodedInputStream::ExpectTag(uint32 expected) { 862555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (expected < (1 << 7)) { 863555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && buffer_[0] == expected) { 864555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Advance(1); 865555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return true; 866555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 867555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return false; 868555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 869555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else if (expected < (1 << 14)) { 870555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (GOOGLE_PREDICT_TRUE(BufferSize() >= 2) && 871555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer_[0] == static_cast<uint8>(expected | 0x80) && 872555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer_[1] == static_cast<uint8>(expected >> 7)) { 873555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Advance(2); 874555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return true; 875555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 876555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return false; 877555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 878555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 879555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Don't bother optimizing for larger values. 880555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return false; 881555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 882555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 883555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 884555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline const uint8* CodedInputStream::ExpectTagFromArray( 885555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const uint8* buffer, uint32 expected) { 886555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (expected < (1 << 7)) { 887555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (buffer[0] == expected) { 888555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return buffer + 1; 889555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 890555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else if (expected < (1 << 14)) { 891555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (buffer[0] == static_cast<uint8>(expected | 0x80) && 892555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer[1] == static_cast<uint8>(expected >> 7)) { 893555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return buffer + 2; 894555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 895555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 896555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return NULL; 897555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 898555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 899555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void CodedInputStream::GetDirectBufferPointerInline(const void** data, 900555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int* size) { 901555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot *data = buffer_; 902555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot *size = buffer_end_ - buffer_; 903555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 904555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 905555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline bool CodedInputStream::ExpectAtEnd() { 906555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If we are at a limit we know no more bytes can be read. Otherwise, it's 907555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // hard to say without calling Refresh(), and we'd rather not do that. 908555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 909555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (buffer_ == buffer_end_ && 910555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ((buffer_size_after_limit_ != 0) || 911555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (total_bytes_read_ == current_limit_))) { 912555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot last_tag_ = 0; // Pretend we called ReadTag()... 913555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot legitimate_message_end_ = true; // ... and it hit EOF. 914555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return true; 915555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 916555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return false; 917555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 918555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 919555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 920555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline int CodedInputStream::CurrentPosition() const { 921555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return total_bytes_read_ - (BufferSize() + buffer_size_after_limit_); 922555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 923555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 924555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline uint8* CodedOutputStream::GetDirectBufferForNBytesAndAdvance(int size) { 925555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (buffer_size_ < size) { 926555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return NULL; 927555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 928555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* result = buffer_; 929555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Advance(size); 930555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return result; 931555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 932555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 933555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 934555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline uint8* CodedOutputStream::WriteVarint32ToArray(uint32 value, 935555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* target) { 936555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (value < 0x80) { 937555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot *target = value; 938555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return target + 1; 939555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 940555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return WriteVarint32FallbackToArray(value, target); 941555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 942555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 943555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 944555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void CodedOutputStream::WriteVarint32SignExtended(int32 value) { 945555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (value < 0) { 946555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot WriteVarint64(static_cast<uint64>(value)); 947555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 948555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot WriteVarint32(static_cast<uint32>(value)); 949555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 950555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 951555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 952555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline uint8* CodedOutputStream::WriteVarint32SignExtendedToArray( 953555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int32 value, uint8* target) { 954555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (value < 0) { 955555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return WriteVarint64ToArray(static_cast<uint64>(value), target); 956555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 957555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return WriteVarint32ToArray(static_cast<uint32>(value), target); 958555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 959555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 960555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 961555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline uint8* CodedOutputStream::WriteLittleEndian32ToArray(uint32 value, 962555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* target) { 963555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 964555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot memcpy(target, &value, sizeof(value)); 965555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#else 966555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[0] = static_cast<uint8>(value); 967555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[1] = static_cast<uint8>(value >> 8); 968555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[2] = static_cast<uint8>(value >> 16); 969555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[3] = static_cast<uint8>(value >> 24); 970555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 971555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return target + sizeof(value); 972555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 973555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 974555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline uint8* CodedOutputStream::WriteLittleEndian64ToArray(uint64 value, 975555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* target) { 976555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 977555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot memcpy(target, &value, sizeof(value)); 978555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#else 979555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 part0 = static_cast<uint32>(value); 980555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 part1 = static_cast<uint32>(value >> 32); 981555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 982555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[0] = static_cast<uint8>(part0); 983555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[1] = static_cast<uint8>(part0 >> 8); 984555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[2] = static_cast<uint8>(part0 >> 16); 985555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[3] = static_cast<uint8>(part0 >> 24); 986555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[4] = static_cast<uint8>(part1); 987555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[5] = static_cast<uint8>(part1 >> 8); 988555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[6] = static_cast<uint8>(part1 >> 16); 989555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[7] = static_cast<uint8>(part1 >> 24); 990555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 991555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return target + sizeof(value); 992555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 993555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 994555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void CodedOutputStream::WriteTag(uint32 value) { 995555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot WriteVarint32(value); 996555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 997555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 998555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline uint8* CodedOutputStream::WriteTagToArray( 999555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 value, uint8* target) { 1000555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (value < (1 << 7)) { 1001555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[0] = value; 1002555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return target + 1; 1003555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else if (value < (1 << 14)) { 1004555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[0] = static_cast<uint8>(value | 0x80); 1005555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot target[1] = static_cast<uint8>(value >> 7); 1006555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return target + 2; 1007555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 1008555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return WriteVarint32FallbackToArray(value, target); 1009555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 1010555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1011555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1012555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline int CodedOutputStream::VarintSize32(uint32 value) { 1013555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (value < (1 << 7)) { 1014555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return 1; 1015555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 1016555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return VarintSize32Fallback(value); 1017555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 1018555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1019555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1020555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline int CodedOutputStream::VarintSize32SignExtended(int32 value) { 1021555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (value < 0) { 1022555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return 10; // TODO(kenton): Make this a symbolic constant. 1023555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 1024555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return VarintSize32(static_cast<uint32>(value)); 1025555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 1026555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1027555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1028555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void CodedOutputStream::WriteString(const string& str) { 1029555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot WriteRaw(str.data(), static_cast<int>(str.size())); 1030555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1031555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1032555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline uint8* CodedOutputStream::WriteStringToArray( 1033555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string& str, uint8* target) { 1034555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return WriteRawToArray(str.data(), static_cast<int>(str.size()), target); 1035555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1036555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1037555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline int CodedOutputStream::ByteCount() const { 1038555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return total_bytes_ - buffer_size_; 1039555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1040555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1041555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void CodedInputStream::Advance(int amount) { 1042555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer_ += amount; 1043555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1044555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1045555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void CodedOutputStream::Advance(int amount) { 1046555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer_ += amount; 1047555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer_size_ -= amount; 1048555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1049555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1050555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void CodedInputStream::SetRecursionLimit(int limit) { 1051555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot recursion_limit_ = limit; 1052555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1053555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1054555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline bool CodedInputStream::IncrementRecursionDepth() { 1055555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ++recursion_depth_; 1056555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return recursion_depth_ <= recursion_limit_; 1057555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1058555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1059555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void CodedInputStream::DecrementRecursionDepth() { 1060555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (recursion_depth_ > 0) --recursion_depth_; 1061555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1062555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1063555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void CodedInputStream::SetExtensionRegistry(const DescriptorPool* pool, 1064555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageFactory* factory) { 1065555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot extension_pool_ = pool; 1066555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot extension_factory_ = factory; 1067555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1068555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1069555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline const DescriptorPool* CodedInputStream::GetExtensionPool() { 1070555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return extension_pool_; 1071555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1072555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1073555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline MessageFactory* CodedInputStream::GetExtensionFactory() { 1074555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return extension_factory_; 1075555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1076555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1077555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline int CodedInputStream::BufferSize() const { 1078555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return buffer_end_ - buffer_; 1079555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1080555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1081555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline CodedInputStream::CodedInputStream(ZeroCopyInputStream* input) 1082555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot : input_(input), 1083555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer_(NULL), 1084555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer_end_(NULL), 1085555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot total_bytes_read_(0), 1086555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot overflow_bytes_(0), 1087555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot last_tag_(0), 1088555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot legitimate_message_end_(false), 1089555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot aliasing_enabled_(false), 1090555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot current_limit_(kint32max), 1091555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer_size_after_limit_(0), 1092555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot total_bytes_limit_(kDefaultTotalBytesLimit), 1093555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), 1094555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot recursion_depth_(0), 1095555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot recursion_limit_(default_recursion_limit_), 1096555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot extension_pool_(NULL), 1097555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot extension_factory_(NULL) { 1098555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Eagerly Refresh() so buffer space is immediately available. 1099555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Refresh(); 1100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline CodedInputStream::CodedInputStream(const uint8* buffer, int size) 1103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot : input_(NULL), 1104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer_(buffer), 1105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer_end_(buffer + size), 1106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot total_bytes_read_(size), 1107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot overflow_bytes_(0), 1108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot last_tag_(0), 1109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot legitimate_message_end_(false), 1110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot aliasing_enabled_(false), 1111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot current_limit_(size), 1112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot buffer_size_after_limit_(0), 1113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot total_bytes_limit_(kDefaultTotalBytesLimit), 1114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), 1115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot recursion_depth_(0), 1116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot recursion_limit_(default_recursion_limit_), 1117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot extension_pool_(NULL), 1118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot extension_factory_(NULL) { 1119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Note that setting current_limit_ == size is important to prevent some 1120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // code paths from trying to access input_ and segfaulting. 1121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline bool CodedInputStream::IsFlat() const { 1124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return input_ == NULL; 1125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 1126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace io 1128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace protobuf 1129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#if defined(_MSC_VER) && _MSC_VER >= 1300 1132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot #pragma runtime_checks("c", restore) 1133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif // _MSC_VER 1134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace google 1136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 1137