15a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Protocol Buffers - Google's data interchange format 25a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Copyright 2008 Google Inc. All rights reserved. 35a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// http://code.google.com/p/protobuf/ 45a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 55a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Redistribution and use in source and binary forms, with or without 65a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// modification, are permitted provided that the following conditions are 75a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// met: 85a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 95a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// * Redistributions of source code must retain the above copyright 105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// notice, this list of conditions and the following disclaimer. 115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// * Redistributions in binary form must reproduce the above 125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// copyright notice, this list of conditions and the following disclaimer 135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// in the documentation and/or other materials provided with the 145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// distribution. 155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// * Neither the name of Google Inc. nor the names of its 165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// contributors may be used to endorse or promote products derived from 175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// this software without specific prior written permission. 185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Author: kenton@google.com (Kenton Varda) 325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Based on original Protocol Buffers design by 335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Sanjay Ghemawat, Jeff Dean, and others. 345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This file contains the CodedInputStream and CodedOutputStream classes, 365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// which wrap a ZeroCopyInputStream or ZeroCopyOutputStream, respectively, 375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// and allow you to read or write individual pieces of data in various 385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// formats. In particular, these implement the varint encoding for 395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// integers, a simple variable-length encoding in which smaller numbers 405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// take fewer bytes. 415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Typically these classes will only be used internally by the protocol 435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// buffer library in order to encode and decode protocol buffers. Clients 445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// of the library only need to know about this class if they wish to write 455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// custom message parsing or serialization procedures. 465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedOutputStream example: 485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // Write some data to "myfile". First we write a 4-byte "magic number" 495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // to identify the file type, then write a length-delimited string. The 505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // string is composed of a varint giving the length followed by the raw 515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // bytes. 525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// int fd = open("myfile", O_WRONLY); 535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ZeroCopyOutputStream* raw_output = new FileOutputStream(fd); 545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedOutputStream* coded_output = new CodedOutputStream(raw_output); 555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// int magic_number = 1234; 575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// char text[] = "Hello world!"; 585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteLittleEndian32(magic_number); 595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteVarint32(strlen(text)); 605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteRaw(text, strlen(text)); 615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete coded_output; 635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete raw_output; 645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// close(fd); 655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedInputStream example: 675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // Read a file created by the above code. 685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// int fd = open("myfile", O_RDONLY); 695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ZeroCopyInputStream* raw_input = new FileInputStream(fd); 705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedInputStream coded_input = new CodedInputStream(raw_input); 715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_input->ReadLittleEndian32(&magic_number); 735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// if (magic_number != 1234) { 745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// cerr << "File not in expected format." << endl; 755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// return; 765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// } 775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// uint32 size; 795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_input->ReadVarint32(&size); 805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// char* text = new char[size + 1]; 825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_input->ReadRaw(buffer, size); 835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// text[size] = '\0'; 845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete coded_input; 865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete raw_input; 875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// close(fd); 885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// cout << "Text is: " << text << endl; 905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete [] text; 915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// For those who are interested, varint encoding is defined as follows: 935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// The encoding operates on unsigned integers of up to 64 bits in length. 955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Each byte of the encoded value has the format: 965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// * bits 0-6: Seven bits of the number being encoded. 975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// * bit 7: Zero if this is the last byte in the encoding (in which 985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// case all remaining bits of the number are zero) or 1 if 995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// more bytes follow. 1005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// The first byte contains the least-significant 7 bits of the number, the 1015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// second byte (if present) contains the next-least-significant 7 bits, 1025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// and so on. So, the binary number 1011000101011 would be encoded in two 1035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// bytes as "10101011 00101100". 1045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 1055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// In theory, varint could be used to encode integers of any length. 1065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// However, for practicality we set a limit at 64 bits. The maximum encoded 1075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// length of a number is thus 10 bytes. 1085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 1105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 1115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <string> 1135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifdef _MSC_VER 1145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #if defined(_M_IX86) && \ 1155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) 1165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #define PROTOBUF_LITTLE_ENDIAN 1 1175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #endif 1185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #if _MSC_VER >= 1300 1195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If MSVC has "/RTCc" set, it will complain about truncating casts at 1205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // runtime. This file contains some intentional truncating casts. 1215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #pragma runtime_checks("c", off) 1225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #endif 1235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 1245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #include <sys/param.h> // __BYTE_ORDER 1255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN && \ 1265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) 1275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #define PROTOBUF_LITTLE_ENDIAN 1 1285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #endif 1295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 1305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/stubs/common.h> 1315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace google { 1345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace protobuf { 1355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass DescriptorPool; 1375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass MessageFactory; 1385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace io { 1405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in this file. 1425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass CodedInputStream; 1435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass CodedOutputStream; 1445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in other files. 1465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass ZeroCopyInputStream; // zero_copy_stream.h 1475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass ZeroCopyOutputStream; // zero_copy_stream.h 1485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Class which reads and decodes binary data which is composed of varint- 1505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// encoded integers and fixed-width pieces. Wraps a ZeroCopyInputStream. 1515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Most users will not need to deal with CodedInputStream. 1525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 1535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Most methods of CodedInputStream that return a bool return false if an 1545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// underlying I/O error occurs or if the data is malformed. Once such a 1555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// failure occurs, the CodedInputStream is broken and is no longer useful. 1565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT CodedInputStream { 1575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public: 1585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Create a CodedInputStream that reads from the given ZeroCopyInputStream. 1595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot explicit CodedInputStream(ZeroCopyInputStream* input); 1605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Create a CodedInputStream that reads from the given flat array. This is 1625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // faster than using an ArrayInputStream. PushLimit(size) is implied by 1635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // this constructor. 1645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot explicit CodedInputStream(const uint8* buffer, int size); 1655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Destroy the CodedInputStream and position the underlying 1675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // ZeroCopyInputStream at the first unread byte. If an error occurred while 1685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // reading (causing a method to return false), then the exact position of 1695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the input stream may be anywhere between the last value that was read 1705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // successfully and the stream's byte limit. 1715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ~CodedInputStream(); 1725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Return true if this CodedInputStream reads from a flat array instead of 1745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // a ZeroCopyInputStream. 1755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot inline bool IsFlat() const; 1765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Skips a number of bytes. Returns false if an underlying read error 1785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // occurs. 1795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool Skip(int count); 1805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Sets *data to point directly at the unread part of the CodedInputStream's 1825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // underlying buffer, and *size to the size of that buffer, but does not 1835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // advance the stream's current position. This will always either produce 1845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // a non-empty buffer or return false. If the caller consumes any of 1855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // this data, it should then call Skip() to skip over the consumed bytes. 1865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This may be useful for implementing external fast parsing routines for 1875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // types of data not covered by the CodedInputStream interface. 1885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool GetDirectBufferPointer(const void** data, int* size); 1895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like GetDirectBufferPointer, but this method is inlined, and does not 1915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // attempt to Refresh() if the buffer is currently empty. 1925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot inline void GetDirectBufferPointerInline(const void** data, 1935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int* size) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 1945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read raw bytes, copying them into the given buffer. 1965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadRaw(void* buffer, int size); 1975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like ReadRaw, but reads into a string. 1995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 2005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Implementation Note: ReadString() grows the string gradually as it 2015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // reads in the data, rather than allocating the entire requested size 2025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // upfront. This prevents denial-of-service attacks in which a client 2035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // could claim that a string is going to be MAX_INT bytes long in order to 2045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // crash the server because it can't allocate this much space at once. 2055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadString(string* buffer, int size); 2065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like the above, with inlined optimizations. This should only be used 2075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // by the protobuf implementation. 2085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot inline bool InternalReadStringInline(string* buffer, 2095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int size) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 2105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read a 32-bit little-endian integer. 2135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadLittleEndian32(uint32* value); 2145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read a 64-bit little-endian integer. 2155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadLittleEndian64(uint64* value); 2165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // These methods read from an externally provided buffer. The caller is 2185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // responsible for ensuring that the buffer has sufficient space. 2195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read a 32-bit little-endian integer. 2205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static const uint8* ReadLittleEndian32FromArray(const uint8* buffer, 2215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32* value); 2225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read a 64-bit little-endian integer. 2235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static const uint8* ReadLittleEndian64FromArray(const uint8* buffer, 2245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint64* value); 2255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read an unsigned integer with Varint encoding, truncating to 32 bits. 2275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Reading a 32-bit value is equivalent to reading a 64-bit one and casting 2285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // it to uint32, but may be more efficient. 2295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadVarint32(uint32* value); 2305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read an unsigned integer with Varint encoding. 2315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadVarint64(uint64* value); 2325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read a tag. This calls ReadVarint32() and returns the result, or returns 2345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // zero (which is not a valid tag) if ReadVarint32() fails. Also, it updates 2355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the last tag value, which can be checked with LastTagWas(). 2365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Always inline because this is only called in once place per parse loop 2375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // but it is called for every iteration of said loop, so it should be fast. 2385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // GCC doesn't want to inline this by default. 2395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 ReadTag() GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 2405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Usually returns true if calling ReadVarint32() now would produce the given 2425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // value. Will always return false if ReadVarint32() would not return the 2435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // given value. If ExpectTag() returns true, it also advances past 2445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the varint. For best performance, use a compile-time constant as the 2455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // parameter. 2465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Always inline because this collapses to a small number of instructions 2475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // when given a constant parameter, but GCC doesn't want to inline by default. 2485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ExpectTag(uint32 expected) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 2495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like above, except this reads from the specified buffer. The caller is 2515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // responsible for ensuring that the buffer is large enough to read a varint 2525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // of the expected size. For best performance, use a compile-time constant as 2535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the expected tag parameter. 2545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 2555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns a pointer beyond the expected tag if it was found, or NULL if it 2565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // was not. 2575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static const uint8* ExpectTagFromArray( 2585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer, 2595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 expected) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 2605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Usually returns true if no more bytes can be read. Always returns false 2625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // if more bytes can be read. If ExpectAtEnd() returns true, a subsequent 2635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // call to LastTagWas() will act as if ReadTag() had been called and returned 2645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // zero, and ConsumedEntireMessage() will return true. 2655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ExpectAtEnd(); 2665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If the last call to ReadTag() returned the given value, returns true. 2685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Otherwise, returns false; 2695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 2705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This is needed because parsers for some types of embedded messages 2715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // (with field type TYPE_GROUP) don't actually know that they've reached the 2725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // end of a message until they see an ENDGROUP tag, which was actually part 2735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // of the enclosing message. The enclosing message would like to check that 2745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // tag to make sure it had the right number, so it calls LastTagWas() on 2755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // return from the embedded parser to check. 2765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool LastTagWas(uint32 expected); 2775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // When parsing message (but NOT a group), this method must be called 2795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // immediately after MergeFromCodedStream() returns (if it returns true) 2805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // to further verify that the message ended in a legitimate way. For 2815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // example, this verifies that parsing did not end on an end-group tag. 2825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // It also checks for some cases where, due to optimizations, 2835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // MergeFromCodedStream() can incorrectly return true. 2845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ConsumedEntireMessage(); 2855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Limits ---------------------------------------------------------- 2875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Limits are used when parsing length-delimited embedded messages. 2885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // After the message's length is read, PushLimit() is used to prevent 2895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the CodedInputStream from reading beyond that length. Once the 2905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // embedded message has been parsed, PopLimit() is called to undo the 2915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // limit. 2925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Opaque type used with PushLimit() and PopLimit(). Do not modify 2945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // values of this type yourself. The only reason that this isn't a 2955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // struct with private internals is for efficiency. 2965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot typedef int Limit; 2975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Places a limit on the number of bytes that the stream may read, 2995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // starting from the current position. Once the stream hits this limit, 3005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // it will act like the end of the input has been reached until PopLimit() 3015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is called. 3025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // As the names imply, the stream conceptually has a stack of limits. The 3045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // shortest limit on the stack is always enforced, even if it is not the 3055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // top limit. 3065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // The value returned by PushLimit() is opaque to the caller, and must 3085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // be passed unchanged to the corresponding call to PopLimit(). 3095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Limit PushLimit(int byte_limit); 3105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Pops the last limit pushed by PushLimit(). The input must be the value 3125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // returned by that call to PushLimit(). 3135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void PopLimit(Limit limit); 3145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns the number of bytes left until the nearest limit on the 3165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // stack is hit, or -1 if no limits are in place. 3175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int BytesUntilLimit() const; 3185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns current position relative to the beginning of the input stream. 3205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int CurrentPosition() const; 3215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Total Bytes Limit ----------------------------------------------- 3235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // To prevent malicious users from sending excessively large messages 3245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // and causing integer overflows or memory exhaustion, CodedInputStream 3255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // imposes a hard limit on the total number of bytes it will read. 3265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Sets the maximum number of bytes that this CodedInputStream will read 3285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // before refusing to continue. To prevent integer overflows in the 3295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // protocol buffers implementation, as well as to prevent servers from 3305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // allocating enormous amounts of memory to hold parsed messages, the 3315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // maximum message length should be limited to the shortest length that 3325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // will not harm usability. The theoretical shortest message that could 3335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // cause integer overflows is 512MB. The default limit is 64MB. Apps 3345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // should set shorter limits if possible. If warning_threshold is not -1, 3355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // a warning will be printed to stderr after warning_threshold bytes are 3365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // read. For backwards compatibility all negative values get squached to -1, 3375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // as other negative values might have special internal meanings. 3385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // An error will always be printed to stderr if the limit is reached. 3395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This is unrelated to PushLimit()/PopLimit(). 3415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Hint: If you are reading this because your program is printing a 3435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // warning about dangerously large protocol messages, you may be 3445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // confused about what to do next. The best option is to change your 3455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // design such that excessively large messages are not necessary. 3465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // For example, try to design file formats to consist of many small 3475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // messages rather than a single large one. If this is infeasible, 3485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // you will need to increase the limit. Chances are, though, that 3495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // your code never constructs a CodedInputStream on which the limit 3505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // can be set. You probably parse messages by calling things like 3515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Message::ParseFromString(). In this case, you will need to change 3525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // your code to instead construct some sort of ZeroCopyInputStream 3535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // (e.g. an ArrayInputStream), construct a CodedInputStream around 3545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // that, then call Message::ParseFromCodedStream() instead. Then 3555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // you can adjust the limit. Yes, it's more work, but you're doing 3565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // something unusual. 3575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void SetTotalBytesLimit(int total_bytes_limit, int warning_threshold); 3585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Recursion Limit ------------------------------------------------- 3605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // To prevent corrupt or malicious messages from causing stack overflows, 3615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // we must keep track of the depth of recursion when parsing embedded 3625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // messages and groups. CodedInputStream keeps track of this because it 3635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is the only object that is passed down the stack during parsing. 3645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Sets the maximum recursion depth. The default is 100. 3665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void SetRecursionLimit(int limit); 3675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Increments the current recursion depth. Returns true if the depth is 3705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // under the limit, false if it has gone over. 3715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool IncrementRecursionDepth(); 3725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Decrements the recursion depth. 3745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void DecrementRecursionDepth(); 3755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Extension Registry ---------------------------------------------- 3775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // ADVANCED USAGE: 99.9% of people can ignore this section. 3785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // By default, when parsing extensions, the parser looks for extension 3805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // definitions in the pool which owns the outer message's Descriptor. 3815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // However, you may call SetExtensionRegistry() to provide an alternative 3825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // pool instead. This makes it possible, for example, to parse a message 3835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // using a generated class, but represent some extensions using 3845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // DynamicMessage. 3855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Set the pool used to look up extensions. Most users do not need to call 3875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // this as the correct pool will be chosen automatically. 3885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // WARNING: It is very easy to misuse this. Carefully read the requirements 3905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // below. Do not use this unless you are sure you need it. Almost no one 3915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // does. 3925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Let's say you are parsing a message into message object m, and you want 3945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // to take advantage of SetExtensionRegistry(). You must follow these 3955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // requirements: 3965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // The given DescriptorPool must contain m->GetDescriptor(). It is not 3985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // sufficient for it to simply contain a descriptor that has the same name 3995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // and content -- it must be the *exact object*. In other words: 4005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // assert(pool->FindMessageTypeByName(m->GetDescriptor()->full_name()) == 4015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // m->GetDescriptor()); 4025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // There are two ways to satisfy this requirement: 4035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 1) Use m->GetDescriptor()->pool() as the pool. This is generally useless 4045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // because this is the pool that would be used anyway if you didn't call 4055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // SetExtensionRegistry() at all. 4065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 2) Use a DescriptorPool which has m->GetDescriptor()->pool() as an 4075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // "underlay". Read the documentation for DescriptorPool for more 4085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // information about underlays. 4095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // You must also provide a MessageFactory. This factory will be used to 4115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // construct Message objects representing extensions. The factory's 4125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // GetPrototype() MUST return non-NULL for any Descriptor which can be found 4135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // through the provided pool. 4145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If the provided factory might return instances of protocol-compiler- 4165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // generated (i.e. compiled-in) types, or if the outer message object m is 4175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // a generated type, then the given factory MUST have this property: If 4185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // GetPrototype() is given a Descriptor which resides in 4195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // DescriptorPool::generated_pool(), the factory MUST return the same 4205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // prototype which MessageFactory::generated_factory() would return. That 4215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is, given a descriptor for a generated type, the factory must return an 4225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // instance of the generated class (NOT DynamicMessage). However, when 4235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // given a descriptor for a type that is NOT in generated_pool, the factory 4245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is free to return any implementation. 4255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // The reason for this requirement is that generated sub-objects may be 4275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // accessed via the standard (non-reflection) extension accessor methods, 4285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // and these methods will down-cast the object to the generated class type. 4295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If the object is not actually of that type, the results would be undefined. 4305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // On the other hand, if an extension is not compiled in, then there is no 4315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // way the code could end up accessing it via the standard accessors -- the 4325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // only way to access the extension is via reflection. When using reflection, 4335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // DynamicMessage and generated messages are indistinguishable, so it's fine 4345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // if these objects are represented using DynamicMessage. 4355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Using DynamicMessageFactory on which you have called 4375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // SetDelegateToGeneratedFactory(true) should be sufficient to satisfy the 4385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // above requirement. 4395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If either pool or factory is NULL, both must be NULL. 4415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Note that this feature is ignored when parsing "lite" messages as they do 4435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // not have descriptors. 4445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void SetExtensionRegistry(const DescriptorPool* pool, 4455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot MessageFactory* factory); 4465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Get the DescriptorPool set via SetExtensionRegistry(), or NULL if no pool 4485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // has been provided. 4495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const DescriptorPool* GetExtensionPool(); 4505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Get the MessageFactory set via SetExtensionRegistry(), or NULL if no 4525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // factory has been provided. 4535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot MessageFactory* GetExtensionFactory(); 4545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private: 4565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedInputStream); 4575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ZeroCopyInputStream* input_; 4595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer_; 4605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer_end_; // pointer to the end of the buffer. 4615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int total_bytes_read_; // total bytes read from input_, including 4625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the current buffer 4635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If total_bytes_read_ surpasses INT_MAX, we record the extra bytes here 4655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // so that we can BackUp() on destruction. 4665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int overflow_bytes_; 4675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // LastTagWas() stuff. 4695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 last_tag_; // result of last ReadTag(). 4705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This is set true by ReadTag{Fallback/Slow}() if it is called when exactly 4725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // at EOF, or by ExpectAtEnd() when it returns true. This happens when we 4735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // reach the end of a message and attempt to read another tag. 4745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool legitimate_message_end_; 4755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // See EnableAliasing(). 4775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool aliasing_enabled_; 4785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Limits 4805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Limit current_limit_; // if position = -1, no limit is applied 4815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // For simplicity, if the current buffer crosses a limit (either a normal 4835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // limit created by PushLimit() or the total bytes limit), buffer_size_ 4845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // only tracks the number of bytes before that limit. This field 4855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // contains the number of bytes after it. Note that this implies that if 4865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // buffer_size_ == 0 and buffer_size_after_limit_ > 0, we know we've 4875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // hit a limit. However, if both are zero, it doesn't necessarily mean 4885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // we aren't at a limit -- the buffer may have ended exactly at the limit. 4895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int buffer_size_after_limit_; 4905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Maximum number of bytes to read, period. This is unrelated to 4925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // current_limit_. Set using SetTotalBytesLimit(). 4935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int total_bytes_limit_; 4945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If positive/0: Limit for bytes read after which a warning due to size 4965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // should be logged. 4975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If -1: Printing of warning disabled. Can be set by client. 4985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If -2: Internal: Limit has been reached, print full size when destructing. 4995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int total_bytes_warning_threshold_; 5005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Current recursion depth, controlled by IncrementRecursionDepth() and 5025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // DecrementRecursionDepth(). 5035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int recursion_depth_; 5045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Recursion depth limit, set by SetRecursionLimit(). 5055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int recursion_limit_; 5065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // See SetExtensionRegistry(). 5085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const DescriptorPool* extension_pool_; 5095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot MessageFactory* extension_factory_; 5105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Private member functions. 5125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Advance the buffer by a given number of bytes. 5145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void Advance(int amount); 5155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Back up input_ to the current buffer position. 5175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void BackUpInputToCurrentPosition(); 5185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Recomputes the value of buffer_size_after_limit_. Must be called after 5205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // current_limit_ or total_bytes_limit_ changes. 5215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void RecomputeBufferLimits(); 5225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Writes an error message saying that we hit total_bytes_limit_. 5245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void PrintTotalBytesLimitError(); 5255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Called when the buffer runs out to request more data. Implies an 5275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Advance(BufferSize()). 5285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool Refresh(); 5295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // When parsing varints, we optimize for the common case of small values, and 5315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // then optimize for the case when the varint fits within the current buffer 5325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // piece. The Fallback method is used when we can't use the one-byte 5335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // optimization. The Slow method is yet another fallback when the buffer is 5345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // not large enough. Making the slow path out-of-line speeds up the common 5355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // case by 10-15%. The slow path is fairly uncommon: it only triggers when a 5365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // message crosses multiple buffers. 5375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadVarint32Fallback(uint32* value); 5385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadVarint64Fallback(uint64* value); 5395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadVarint32Slow(uint32* value); 5405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadVarint64Slow(uint64* value); 5415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadLittleEndian32Fallback(uint32* value); 5425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadLittleEndian64Fallback(uint64* value); 5435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Fallback/slow methods for reading tags. These do not update last_tag_, 5445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // but will set legitimate_message_end_ if we are at the end of the input 5455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // stream. 5465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 ReadTagFallback(); 5475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 ReadTagSlow(); 5485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadStringFallback(string* buffer, int size); 5495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Return the size of the buffer. 5515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int BufferSize() const; 5525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static const int kDefaultTotalBytesLimit = 64 << 20; // 64MB 5545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static const int kDefaultTotalBytesWarningThreshold = 32 << 20; // 32MB 5565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static int default_recursion_limit_; // 100 by default. 5585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}; 5595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Class which encodes and writes binary data which is composed of varint- 5615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// encoded integers and fixed-width pieces. Wraps a ZeroCopyOutputStream. 5625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Most users will not need to deal with CodedOutputStream. 5635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 5645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Most methods of CodedOutputStream which return a bool return false if an 5655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// underlying I/O error occurs. Once such a failure occurs, the 5665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedOutputStream is broken and is no longer useful. The Write* methods do 5675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// not return the stream status, but will invalidate the stream if an error 5685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// occurs. The client can probe HadError() to determine the status. 5695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 5705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Note that every method of CodedOutputStream which writes some data has 5715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// a corresponding static "ToArray" version. These versions write directly 5725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// to the provided buffer, returning a pointer past the last written byte. 5735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// They require that the buffer has sufficient capacity for the encoded data. 5745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This allows an optimization where we check if an output stream has enough 5755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// space for an entire message before we start writing and, if there is, we 5765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// call only the ToArray methods to avoid doing bound checks for each 5775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// individual value. 5785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// i.e., in the example above: 5795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 5805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedOutputStream coded_output = new CodedOutputStream(raw_output); 5815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// int magic_number = 1234; 5825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// char text[] = "Hello world!"; 5835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 5845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// int coded_size = sizeof(magic_number) + 5855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedOutputStream::VarintSize32(strlen(text)) + 5865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// strlen(text); 5875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 5885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// uint8* buffer = 5895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->GetDirectBufferForNBytesAndAdvance(coded_size); 5905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// if (buffer != NULL) { 5915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // The output stream has enough space in the buffer: write directly to 5925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // the array. 5935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// buffer = CodedOutputStream::WriteLittleEndian32ToArray(magic_number, 5945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// buffer); 5955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// buffer = CodedOutputStream::WriteVarint32ToArray(strlen(text), buffer); 5965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// buffer = CodedOutputStream::WriteRawToArray(text, strlen(text), buffer); 5975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// } else { 5985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // Make bound-checked writes, which will ask the underlying stream for 5995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // more space as needed. 6005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteLittleEndian32(magic_number); 6015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteVarint32(strlen(text)); 6025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteRaw(text, strlen(text)); 6035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// } 6045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 6055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete coded_output; 6065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT CodedOutputStream { 6075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public: 6085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Create an CodedOutputStream that writes to the given ZeroCopyOutputStream. 6095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot explicit CodedOutputStream(ZeroCopyOutputStream* output); 6105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Destroy the CodedOutputStream and position the underlying 6125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // ZeroCopyOutputStream immediately after the last byte written. 6135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ~CodedOutputStream(); 6145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Skips a number of bytes, leaving the bytes unmodified in the underlying 6165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // buffer. Returns false if an underlying write error occurs. This is 6175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // mainly useful with GetDirectBufferPointer(). 6185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool Skip(int count); 6195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Sets *data to point directly at the unwritten part of the 6215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // CodedOutputStream's underlying buffer, and *size to the size of that 6225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // buffer, but does not advance the stream's current position. This will 6235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // always either produce a non-empty buffer or return false. If the caller 6245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // writes any data to this buffer, it should then call Skip() to skip over 6255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the consumed bytes. This may be useful for implementing external fast 6265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // serialization routines for types of data not covered by the 6275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // CodedOutputStream interface. 6285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool GetDirectBufferPointer(void** data, int* size); 6295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If there are at least "size" bytes available in the current buffer, 6315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // returns a pointer directly into the buffer and advances over these bytes. 6325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // The caller may then write directly into this buffer (e.g. using the 6335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // *ToArray static methods) rather than go through CodedOutputStream. If 6345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // there are not enough bytes available, returns NULL. The return pointer is 6355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // invalidated as soon as any other non-const method of CodedOutputStream 6365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is called. 6375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot inline uint8* GetDirectBufferForNBytesAndAdvance(int size); 6385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Write raw bytes, copying them from the given buffer. 6405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteRaw(const void* buffer, int size); 6415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteRaw() but writing directly to the target array. 6425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This is _not_ inlined, as the compiler often optimizes memcpy into inline 6435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // copy loops. Since this gets called by every field with string or bytes 6445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // type, inlining may lead to a significant amount of code bloat, with only a 6455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // minor performance gain. 6465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteRawToArray(const void* buffer, int size, uint8* target); 6475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Equivalent to WriteRaw(str.data(), str.size()). 6495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteString(const string& str); 6505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteString() but writing directly to the target array. 6515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteStringToArray(const string& str, uint8* target); 6525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Write a 32-bit little-endian integer. 6555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteLittleEndian32(uint32 value); 6565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteLittleEndian32() but writing directly to the target array. 6575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteLittleEndian32ToArray(uint32 value, uint8* target); 6585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Write a 64-bit little-endian integer. 6595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteLittleEndian64(uint64 value); 6605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteLittleEndian64() but writing directly to the target array. 6615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteLittleEndian64ToArray(uint64 value, uint8* target); 6625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Write an unsigned integer with Varint encoding. Writing a 32-bit value 6645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is equivalent to casting it to uint64 and writing it as a 64-bit value, 6655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // but may be more efficient. 6665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteVarint32(uint32 value); 6675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteVarint32() but writing directly to the target array. 6685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteVarint32ToArray(uint32 value, uint8* target); 6695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Write an unsigned integer with Varint encoding. 6705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteVarint64(uint64 value); 6715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteVarint64() but writing directly to the target array. 6725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteVarint64ToArray(uint64 value, uint8* target); 6735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Equivalent to WriteVarint32() except when the value is negative, 6755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // in which case it must be sign-extended to a full 10 bytes. 6765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteVarint32SignExtended(int32 value); 6775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteVarint32SignExtended() but writing directly to the target array. 6785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteVarint32SignExtendedToArray(int32 value, uint8* target); 6795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This is identical to WriteVarint32(), but optimized for writing tags. 6815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // In particular, if the input is a compile-time constant, this method 6825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // compiles down to a couple instructions. 6835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Always inline because otherwise the aformentioned optimization can't work, 6845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // but GCC by default doesn't want to inline this. 6855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteTag(uint32 value); 6865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteTag() but writing directly to the target array. 6875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteTagToArray( 6885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 6895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns the number of bytes needed to encode the given value as a varint. 6915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static int VarintSize32(uint32 value); 6925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns the number of bytes needed to encode the given value as a varint. 6935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static int VarintSize64(uint64 value); 6945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If negative, 10 bytes. Otheriwse, same as VarintSize32(). 6965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static int VarintSize32SignExtended(int32 value); 6975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Compile-time equivalent of VarintSize32(). 6995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot template <uint32 Value> 7005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot struct StaticVarintSize32 { 7015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static const int value = 7025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (Value < (1 << 7)) 7035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ? 1 7045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : (Value < (1 << 14)) 7055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ? 2 7065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : (Value < (1 << 21)) 7075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ? 3 7085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : (Value < (1 << 28)) 7095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ? 4 7105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : 5; 7115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot }; 7125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns the total number of bytes written since this object was created. 7145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot inline int ByteCount() const; 7155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns true if there was an underlying I/O error since this object was 7175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // created. 7185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool HadError() const { return had_error_; } 7195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private: 7215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedOutputStream); 7225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ZeroCopyOutputStream* output_; 7245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* buffer_; 7255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int buffer_size_; 7265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int total_bytes_; // Sum of sizes of all buffers seen so far. 7275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool had_error_; // Whether an error occurred during output. 7285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Advance the buffer by a given number of bytes. 7305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void Advance(int amount); 7315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Called when the buffer runs out to request more data. Implies an 7335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Advance(buffer_size_). 7345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool Refresh(); 7355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteVarint32FallbackToArray(uint32 value, uint8* target); 7375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Always-inlined versions of WriteVarint* functions so that code can be 7395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // reused, while still controlling size. For instance, WriteVarint32ToArray() 7405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // should not directly call this: since it is inlined itself, doing so 7415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // would greatly increase the size of generated code. Instead, it should call 7425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // WriteVarint32FallbackToArray. Meanwhile, WriteVarint32() is already 7435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // out-of-line, so it should just invoke this directly to avoid any extra 7445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // function call overhead. 7455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteVarint32FallbackToArrayInline( 7465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 7475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteVarint64ToArrayInline( 7485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint64 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 7495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static int VarintSize32Fallback(uint32 value); 7515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}; 7525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// inline methods ==================================================== 7545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// The vast majority of varints are only one byte. These inline 7555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// methods optimize for that case. 7565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ReadVarint32(uint32* value) { 7585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && *buffer_ < 0x80) { 7595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *value = *buffer_; 7605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(1); 7615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 7625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 7635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return ReadVarint32Fallback(value); 7645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 7655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 7665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ReadVarint64(uint64* value) { 7685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && *buffer_ < 0x80) { 7695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *value = *buffer_; 7705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(1); 7715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 7725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 7735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return ReadVarint64Fallback(value); 7745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 7755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 7765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// static 7785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const uint8* CodedInputStream::ReadLittleEndian32FromArray( 7795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer, 7805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32* value) { 7815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 7825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(value, buffer, sizeof(*value)); 7835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + sizeof(*value); 7845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 7855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *value = (static_cast<uint32>(buffer[0]) ) | 7865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[1]) << 8) | 7875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[2]) << 16) | 7885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[3]) << 24); 7895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + sizeof(*value); 7905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 7915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 7925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// static 7935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const uint8* CodedInputStream::ReadLittleEndian64FromArray( 7945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer, 7955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint64* value) { 7965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 7975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(value, buffer, sizeof(*value)); 7985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + sizeof(*value); 7995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 8005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 part0 = (static_cast<uint32>(buffer[0]) ) | 8015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[1]) << 8) | 8025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[2]) << 16) | 8035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[3]) << 24); 8045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 part1 = (static_cast<uint32>(buffer[4]) ) | 8055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[5]) << 8) | 8065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[6]) << 16) | 8075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[7]) << 24); 8085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *value = static_cast<uint64>(part0) | 8095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint64>(part1) << 32); 8105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + sizeof(*value); 8115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 8125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 8135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ReadLittleEndian32(uint32* value) { 8155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 8165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) { 8175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(value, buffer_, sizeof(*value)); 8185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(sizeof(*value)); 8195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 8205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 8215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return ReadLittleEndian32Fallback(value); 8225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 8245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return ReadLittleEndian32Fallback(value); 8255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 8265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 8275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ReadLittleEndian64(uint64* value) { 8295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 8305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) { 8315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(value, buffer_, sizeof(*value)); 8325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(sizeof(*value)); 8335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 8345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 8355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return ReadLittleEndian64Fallback(value); 8365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 8385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return ReadLittleEndian64Fallback(value); 8395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 8405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 8415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint32 CodedInputStream::ReadTag() { 8435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && buffer_[0] < 0x80) { 8445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot last_tag_ = buffer_[0]; 8455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(1); 8465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return last_tag_; 8475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 8485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot last_tag_ = ReadTagFallback(); 8495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return last_tag_; 8505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 8525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::LastTagWas(uint32 expected) { 8545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return last_tag_ == expected; 8555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 8565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ConsumedEntireMessage() { 8585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return legitimate_message_end_; 8595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 8605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ExpectTag(uint32 expected) { 8625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (expected < (1 << 7)) { 8635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && buffer_[0] == expected) { 8645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(1); 8655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 8665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 8675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return false; 8685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else if (expected < (1 << 14)) { 8705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(BufferSize() >= 2) && 8715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_[0] == static_cast<uint8>(expected | 0x80) && 8725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_[1] == static_cast<uint8>(expected >> 7)) { 8735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(2); 8745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 8755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 8765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return false; 8775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 8795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Don't bother optimizing for larger values. 8805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return false; 8815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 8835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const uint8* CodedInputStream::ExpectTagFromArray( 8855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer, uint32 expected) { 8865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (expected < (1 << 7)) { 8875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (buffer[0] == expected) { 8885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + 1; 8895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else if (expected < (1 << 14)) { 8915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (buffer[0] == static_cast<uint8>(expected | 0x80) && 8925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer[1] == static_cast<uint8>(expected >> 7)) { 8935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + 2; 8945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return NULL; 8975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 8985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedInputStream::GetDirectBufferPointerInline(const void** data, 9005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int* size) { 9015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *data = buffer_; 9025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *size = buffer_end_ - buffer_; 9035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ExpectAtEnd() { 9065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If we are at a limit we know no more bytes can be read. Otherwise, it's 9075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // hard to say without calling Refresh(), and we'd rather not do that. 9085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (buffer_ == buffer_end_ && 9105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ((buffer_size_after_limit_ != 0) || 9115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (total_bytes_read_ == current_limit_))) { 9125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot last_tag_ = 0; // Pretend we called ReadTag()... 9135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot legitimate_message_end_ = true; // ... and it hit EOF. 9145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 9155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 9165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return false; 9175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int CodedInputStream::CurrentPosition() const { 9215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return total_bytes_read_ - (BufferSize() + buffer_size_after_limit_); 9225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::GetDirectBufferForNBytesAndAdvance(int size) { 9255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (buffer_size_ < size) { 9265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return NULL; 9275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 9285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* result = buffer_; 9295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(size); 9305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return result; 9315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteVarint32ToArray(uint32 value, 9355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* target) { 9365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (value < 0x80) { 9375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *target = value; 9385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return target + 1; 9395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 9405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return WriteVarint32FallbackToArray(value, target); 9415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedOutputStream::WriteVarint32SignExtended(int32 value) { 9455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (value < 0) { 9465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot WriteVarint64(static_cast<uint64>(value)); 9475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 9485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot WriteVarint32(static_cast<uint32>(value)); 9495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteVarint32SignExtendedToArray( 9535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int32 value, uint8* target) { 9545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (value < 0) { 9555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return WriteVarint64ToArray(static_cast<uint64>(value), target); 9565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 9575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return WriteVarint32ToArray(static_cast<uint32>(value), target); 9585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteLittleEndian32ToArray(uint32 value, 9625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* target) { 9635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 9645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(target, &value, sizeof(value)); 9655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 9665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[0] = static_cast<uint8>(value); 9675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[1] = static_cast<uint8>(value >> 8); 9685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[2] = static_cast<uint8>(value >> 16); 9695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[3] = static_cast<uint8>(value >> 24); 9705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 9715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return target + sizeof(value); 9725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteLittleEndian64ToArray(uint64 value, 9755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* target) { 9765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 9775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(target, &value, sizeof(value)); 9785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 9795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 part0 = static_cast<uint32>(value); 9805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 part1 = static_cast<uint32>(value >> 32); 9815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[0] = static_cast<uint8>(part0); 9835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[1] = static_cast<uint8>(part0 >> 8); 9845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[2] = static_cast<uint8>(part0 >> 16); 9855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[3] = static_cast<uint8>(part0 >> 24); 9865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[4] = static_cast<uint8>(part1); 9875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[5] = static_cast<uint8>(part1 >> 8); 9885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[6] = static_cast<uint8>(part1 >> 16); 9895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[7] = static_cast<uint8>(part1 >> 24); 9905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 9915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return target + sizeof(value); 9925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedOutputStream::WriteTag(uint32 value) { 9955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot WriteVarint32(value); 9965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteTagToArray( 9995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 value, uint8* target) { 10005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (value < (1 << 7)) { 10015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[0] = value; 10025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return target + 1; 10035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else if (value < (1 << 14)) { 10045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[0] = static_cast<uint8>(value | 0x80); 10055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[1] = static_cast<uint8>(value >> 7); 10065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return target + 2; 10075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 10085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return WriteVarint32FallbackToArray(value, target); 10095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int CodedOutputStream::VarintSize32(uint32 value) { 10135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (value < (1 << 7)) { 10145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return 1; 10155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 10165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return VarintSize32Fallback(value); 10175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int CodedOutputStream::VarintSize32SignExtended(int32 value) { 10215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (value < 0) { 10225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return 10; // TODO(kenton): Make this a symbolic constant. 10235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 10245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return VarintSize32(static_cast<uint32>(value)); 10255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedOutputStream::WriteString(const string& str) { 10295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot WriteRaw(str.data(), static_cast<int>(str.size())); 10305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteStringToArray( 10335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const string& str, uint8* target) { 10345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return WriteRawToArray(str.data(), static_cast<int>(str.size()), target); 10355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int CodedOutputStream::ByteCount() const { 10385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return total_bytes_ - buffer_size_; 10395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedInputStream::Advance(int amount) { 10425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_ += amount; 10435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedOutputStream::Advance(int amount) { 10465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_ += amount; 10475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_size_ -= amount; 10485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedInputStream::SetRecursionLimit(int limit) { 10515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot recursion_limit_ = limit; 10525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::IncrementRecursionDepth() { 10555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ++recursion_depth_; 10565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return recursion_depth_ <= recursion_limit_; 10575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedInputStream::DecrementRecursionDepth() { 10605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (recursion_depth_ > 0) --recursion_depth_; 10615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedInputStream::SetExtensionRegistry(const DescriptorPool* pool, 10645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot MessageFactory* factory) { 10655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_pool_ = pool; 10665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_factory_ = factory; 10675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const DescriptorPool* CodedInputStream::GetExtensionPool() { 10705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return extension_pool_; 10715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline MessageFactory* CodedInputStream::GetExtensionFactory() { 10745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return extension_factory_; 10755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int CodedInputStream::BufferSize() const { 10785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer_end_ - buffer_; 10795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline CodedInputStream::CodedInputStream(ZeroCopyInputStream* input) 10825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : input_(input), 10835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_(NULL), 10845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_end_(NULL), 10855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_read_(0), 10865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot overflow_bytes_(0), 10875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot last_tag_(0), 10885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot legitimate_message_end_(false), 10895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot aliasing_enabled_(false), 10905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot current_limit_(kint32max), 10915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_size_after_limit_(0), 10925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_limit_(kDefaultTotalBytesLimit), 10935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), 10945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot recursion_depth_(0), 10955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot recursion_limit_(default_recursion_limit_), 10965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_pool_(NULL), 10975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_factory_(NULL) { 10985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Eagerly Refresh() so buffer space is immediately available. 10995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Refresh(); 11005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline CodedInputStream::CodedInputStream(const uint8* buffer, int size) 11035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : input_(NULL), 11045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_(buffer), 11055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_end_(buffer + size), 11065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_read_(size), 11075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot overflow_bytes_(0), 11085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot last_tag_(0), 11095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot legitimate_message_end_(false), 11105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot aliasing_enabled_(false), 11115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot current_limit_(size), 11125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_size_after_limit_(0), 11135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_limit_(kDefaultTotalBytesLimit), 11145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), 11155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot recursion_depth_(0), 11165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot recursion_limit_(default_recursion_limit_), 11175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_pool_(NULL), 11185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_factory_(NULL) { 11195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Note that setting current_limit_ == size is important to prevent some 11205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // code paths from trying to access input_ and segfaulting. 11215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::IsFlat() const { 11245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return input_ == NULL; 11255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} // namespace io 11285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} // namespace protobuf 11295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(_MSC_VER) && _MSC_VER >= 1300 11325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #pragma runtime_checks("c", restore) 11335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif // _MSC_VER 11345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} // namespace google 11365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 1137