109 #ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 110 #define GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 117 #if !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) 118 #define PROTOBUF_LITTLE_ENDIAN 1 120 #if _MSC_VER >= 1300 && !defined(__INTEL_COMPILER) 123 #pragma runtime_checks("c", off) 126 #include <sys/param.h> 127 #if ((defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) || \ 128 (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN)) && \ 129 !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) 130 #define PROTOBUF_LITTLE_ENDIAN 1 140 class MessageFactory;
145 class CodedInputStream;
146 class CodedOutputStream;
149 class ZeroCopyInputStream;
150 class ZeroCopyOutputStream;
178 inline bool IsFlat()
const;
191 bool GetDirectBufferPointer(
const void**
data,
int* size);
199 bool ReadRaw(
void* buffer,
int size);
212 bool ReadString(
string* buffer,
int size);
222 bool ReadLittleEndian64(
uint64* value);
227 static const uint8* ReadLittleEndian32FromArray(
const uint8* buffer,
230 static const uint8* ReadLittleEndian64FromArray(
const uint8* buffer,
236 bool ReadVarint32(
uint32* value);
238 bool ReadVarint64(
uint64* value);
294 bool LastTagWas(
uint32 expected);
302 bool ConsumedEntireMessage();
327 Limit PushLimit(
int byte_limit);
331 void PopLimit(Limit limit);
335 int BytesUntilLimit()
const;
338 int CurrentPosition()
const;
375 void SetTotalBytesLimit(
int total_bytes_limit,
int warning_threshold);
379 int BytesUntilTotalBytesLimit()
const;
388 void SetRecursionLimit(
int limit);
393 bool IncrementRecursionDepth();
396 void DecrementRecursionDepth();
401 void UnsafeDecrementRecursionDepth();
408 std::pair<CodedInputStream::Limit, int> IncrementRecursionDepthAndPushLimit(
412 Limit ReadLengthAndPushLimit();
421 bool DecrementRecursionDepthAndPopLimit(Limit limit);
428 bool CheckEntireMessageConsumedAndPopLimit(Limit limit);
513 const uint8* buffer_end_;
515 int total_bytes_read_;
528 bool legitimate_message_end_;
531 bool aliasing_enabled_;
534 Limit current_limit_;
543 int buffer_size_after_limit_;
547 int total_bytes_limit_;
553 int total_bytes_warning_threshold_;
558 int recursion_budget_;
560 int recursion_limit_;
572 void BackUpInputToCurrentPosition();
576 void RecomputeBufferLimits();
579 void PrintTotalBytesLimitError();
596 int64 ReadVarint32Fallback(
uint32 first_byte_or_zero);
597 std::pair<uint64, bool> ReadVarint64Fallback();
598 bool ReadVarint32Slow(
uint32* value);
599 bool ReadVarint64Slow(
uint64* value);
600 bool ReadLittleEndian32Fallback(
uint32* value);
601 bool ReadLittleEndian64Fallback(
uint64* value);
607 bool ReadStringFallback(
string* buffer,
int size);
612 static const int kDefaultTotalBytesLimit = 64 << 20;
614 static const int kDefaultTotalBytesWarningThreshold = 32 << 20;
616 static int default_recursion_limit_;
695 bool GetDirectBufferPointer(
void**
data,
int*
size);
704 inline uint8* GetDirectBufferForNBytesAndAdvance(
int size);
707 void WriteRaw(
const void*
buffer,
int size);
710 void WriteRawMaybeAliased(
const void* data,
int size);
719 void WriteString(
const string&
str);
721 static uint8* WriteStringToArray(
const string& str,
uint8* target);
723 static uint8* WriteStringWithSizeToArray(
const string& str,
uint8* target);
735 void EnableAliasing(
bool enabled);
742 void WriteLittleEndian64(
uint64 value);
749 void WriteVarint32(
uint32 value);
753 void WriteVarint64(
uint64 value);
759 void WriteVarint32SignExtended(
int32 value);
761 static uint8* WriteVarint32SignExtendedToArray(
int32 value,
uint8* target);
768 void WriteTag(
uint32 value);
774 static int VarintSize32(
uint32 value);
776 static int VarintSize64(
uint64 value);
779 static int VarintSize32SignExtended(
int32 value);
782 template <u
int32 Value>
784 static const int value =
787 : (
Value < (1 << 14))
789 : (
Value < (1 << 21))
791 : (
Value < (1 << 28))
797 inline int ByteCount()
const;
811 bool aliasing_enabled_;
822 void WriteAliasedRaw(
const void* buffer,
int size);
826 void WriteVarint32SlowPath(
uint32 value);
838 static int VarintSize32Fallback(
uint32 value);
866 std::pair<uint64, bool>
p = ReadVarint64Fallback();
875 #if defined(PROTOBUF_LITTLE_ENDIAN) 876 memcpy(value, buffer,
sizeof(*value));
877 return buffer +
sizeof(*value);
879 *value = (
static_cast<uint32>(buffer[0]) ) |
880 (
static_cast<uint32>(buffer[1]) << 8) |
881 (
static_cast<uint32>(buffer[2]) << 16) |
882 (
static_cast<uint32>(buffer[3]) << 24);
883 return buffer +
sizeof(*value);
890 #if defined(PROTOBUF_LITTLE_ENDIAN) 891 memcpy(value, buffer,
sizeof(*value));
892 return buffer +
sizeof(*value);
895 (
static_cast<uint32>(buffer[1]) << 8) |
896 (
static_cast<uint32>(buffer[2]) << 16) |
897 (
static_cast<uint32>(buffer[3]) << 24);
899 (
static_cast<uint32>(buffer[5]) << 8) |
900 (
static_cast<uint32>(buffer[6]) << 16) |
901 (
static_cast<uint32>(buffer[7]) << 24);
902 *value =
static_cast<uint64>(part0) |
903 (static_cast<uint64>(part1) << 32);
904 return buffer +
sizeof(*value);
909 #if defined(PROTOBUF_LITTLE_ENDIAN) 911 memcpy(value,
buffer_,
sizeof(*value));
912 Advance(
sizeof(*value));
915 return ReadLittleEndian32Fallback(value);
918 return ReadLittleEndian32Fallback(value);
923 #if defined(PROTOBUF_LITTLE_ENDIAN) 925 memcpy(value,
buffer_,
sizeof(*value));
926 Advance(
sizeof(*value));
929 return ReadLittleEndian64Fallback(value);
932 return ReadLittleEndian64Fallback(value);
946 last_tag_ = ReadTagFallback(v);
955 uint32 first_byte_or_zero = 0;
960 first_byte_or_zero =
buffer_[0];
961 if (static_cast<int8>(
buffer_[0]) > 0) {
962 const uint32 kMax1ByteVarint = 0x7f;
965 return std::make_pair(tag, cutoff >= kMax1ByteVarint || tag <= cutoff);
970 if (cutoff >= 0x80 &&
973 const uint32 kMax2ByteVarint = (0x7f << 7) + 0x7f;
982 bool at_or_below_cutoff = cutoff >= kMax2ByteVarint || tag <= cutoff;
983 return std::make_pair(tag, at_or_below_cutoff);
987 last_tag_ = ReadTagFallback(first_byte_or_zero);
988 return std::make_pair(last_tag_, static_cast<uint32>(last_tag_ - 1) < cutoff);
996 return legitimate_message_end_;
1000 if (expected < (1 << 7)) {
1007 }
else if (expected < (1 << 14)) {
1009 buffer_[0] == static_cast<uint8>(expected | 0x80) &&
1010 buffer_[1] == static_cast<uint8>(expected >> 7)) {
1024 if (expected < (1 << 7)) {
1025 if (buffer[0] == expected) {
1028 }
else if (expected < (1 << 14)) {
1029 if (buffer[0] == static_cast<uint8>(expected | 0x80) &&
1030 buffer[1] == static_cast<uint8>(expected >> 7)) {
1040 *size =
static_cast<int>(buffer_end_ -
buffer_);
1048 ((buffer_size_after_limit_ != 0) ||
1049 (total_bytes_read_ == current_limit_))) {
1051 legitimate_message_end_ =
true;
1059 return total_bytes_read_ - (
BufferSize() + buffer_size_after_limit_);
1063 if (buffer_size_ < size) {
1074 while (value >= 0x80) {
1075 *target =
static_cast<uint8>(value | 0x80);
1085 WriteVarint64(static_cast<uint64>(value));
1087 WriteVarint32(static_cast<uint32>(value));
1094 return WriteVarint64ToArray(static_cast<uint64>(value), target);
1096 return WriteVarint32ToArray(static_cast<uint32>(value), target);
1102 #if defined(PROTOBUF_LITTLE_ENDIAN) 1103 memcpy(target, &value,
sizeof(value));
1106 target[1] =
static_cast<uint8>(value >> 8);
1107 target[2] =
static_cast<uint8>(value >> 16);
1108 target[3] =
static_cast<uint8>(value >> 24);
1110 return target +
sizeof(
value);
1115 #if defined(PROTOBUF_LITTLE_ENDIAN) 1116 memcpy(target, &value,
sizeof(value));
1121 target[0] =
static_cast<uint8>(part0);
1122 target[1] =
static_cast<uint8>(part0 >> 8);
1123 target[2] =
static_cast<uint8>(part0 >> 16);
1124 target[3] =
static_cast<uint8>(part0 >> 24);
1125 target[4] =
static_cast<uint8>(part1);
1126 target[5] =
static_cast<uint8>(part1 >> 8);
1127 target[6] =
static_cast<uint8>(part1 >> 16);
1128 target[7] =
static_cast<uint8>(part1 >> 24);
1130 return target +
sizeof(
value);
1134 if (buffer_size_ >= 5) {
1138 uint8*
end = WriteVarint32ToArray(value, target);
1142 WriteVarint32SlowPath(value);
1147 WriteVarint32(value);
1152 return WriteVarint32ToArray(value, target);
1156 if (value < (1 << 7)) {
1159 return VarintSize32Fallback(value);
1167 return VarintSize32(static_cast<uint32>(value));
1172 WriteRaw(str.data(),
static_cast<int>(str.size()));
1177 if (aliasing_enabled_) {
1178 WriteAliasedRaw(data, size);
1180 WriteRaw(data, size);
1186 return WriteRawToArray(str.data(),
static_cast<int>(str.size()), target);
1190 return total_bytes_ - buffer_size_;
1193 inline void CodedInputStream::Advance(
int amount) {
1197 inline void CodedOutputStream::Advance(
int amount) {
1203 recursion_budget_ += limit - recursion_limit_;
1204 recursion_limit_ = limit;
1208 --recursion_budget_;
1209 return recursion_budget_ >= 0;
1213 if (recursion_budget_ < recursion_limit_) ++recursion_budget_;
1217 assert(recursion_budget_ < recursion_limit_);
1218 ++recursion_budget_;
1223 extension_pool_ = pool;
1228 return extension_pool_;
1232 return extension_factory_;
1235 inline int CodedInputStream::BufferSize()
const {
1236 return static_cast<int>(buffer_end_ -
buffer_);
1243 total_bytes_read_(0),
1246 legitimate_message_end_(
false),
1247 aliasing_enabled_(
false),
1249 buffer_size_after_limit_(0),
1250 total_bytes_limit_(kDefaultTotalBytesLimit),
1251 total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold),
1252 recursion_budget_(default_recursion_limit_),
1253 recursion_limit_(default_recursion_limit_),
1254 extension_pool_(
NULL),
1255 extension_factory_(
NULL) {
1262 buffer_end_(buffer + size),
1264 total_bytes_read_(size),
1267 legitimate_message_end_(
false),
1268 aliasing_enabled_(
false),
1269 current_limit_(size),
1270 buffer_size_after_limit_(0),
1271 total_bytes_limit_(kDefaultTotalBytesLimit),
1272 total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold),
1273 recursion_budget_(default_recursion_limit_),
1274 recursion_limit_(default_recursion_limit_),
1275 extension_pool_(
NULL),
1276 extension_factory_(
NULL) {
1282 return input_ ==
NULL;
1289 #if _MSC_VER >= 1300 && !defined(__INTEL_COMPILER) 1290 #pragma runtime_checks("c", restore) 1291 #endif // _MSC_VER && !defined(__INTEL_COMPILER) 1294 #endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ static uint8 * WriteVarint32SignExtendedToArray(int32 value, uint8 *target)
Definition: coded_stream.h:1091
GLint GLsizei count
Definition: gl2.h:421
EGLStreamKHR EGLint EGLint EGLint size
Definition: eglext.h:984
DOMString p
Definition: WebCryptoAPI.idl:116
#define kint32max
Definition: main.cpp:12
GLuint GLuint end
Definition: gl2ext.h:323
uint8 * GetDirectBufferForNBytesAndAdvance(int size)
Definition: coded_stream.h:1062
#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName)
Definition: macros.h:40
bool HadError() const
Definition: coded_stream.h:801
OPENSSL_EXPORT pem_password_cb void * u
Definition: pem.h:398
static int VarintSize32(uint32 value)
Definition: coded_stream.h:1155
NSMutableData * buffer_
Definition: GPBCodedOutputStream.m:49
Definition: xmlparse.c:181
EGLContext EGLenum target
Definition: eglext.h:192
uint8_t uint8
Definition: port.h:133
static uint8 * WriteVarint32ToArray(uint32 value, uint8 *target)
Definition: coded_stream.h:1072
void WriteString(const string &str)
Definition: coded_stream.h:1171
#define GOOGLE_ATTRIBUTE_ALWAYS_INLINE
Definition: port.h:175
void WriteRawMaybeAliased(const void *data, int size)
Definition: coded_stream.h:1175
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: gl2ext.h:133
void WriteVarint32SignExtended(int32 value)
Definition: coded_stream.h:1083
static uint8 * WriteStringToArray(const string &str, uint8 *target)
Definition: coded_stream.h:1184
const FieldDescriptor const OneofDescriptor value
Definition: descriptor.h:1717
int32_t int32
Definition: port.h:130
Definition: zero_copy_stream.h:181
rtc::scoped_refptr< PeerConnectionFactoryInterface > factory(webrtc::CreatePeerConnectionFactory(network_thread.get(), worker_thread.get(), signaling_thread.get(), nullptr, encoder_factory, decoder_factory))
Definition: peerconnection_jni.cc:1838
void WriteTag(uint32 value)
Definition: coded_stream.h:1146
EGLAttrib * value
Definition: eglext.h:120
static int VarintSize32SignExtended(int32 value)
Definition: coded_stream.h:1163
Definition: coded_stream.h:783
#define BufferSize
Definition: testbindings.cpp:342
Definition: protobuf.h:64
uint32_t uint32
Definition: port.h:135
Definition: __init__.py:1
uint64_t uint64
Definition: port.h:136
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE uint8 * WriteTagToArray(uint32 value, uint8 *target)
Definition: coded_stream.h:1150
const GLfloat * v
Definition: gl2.h:514
string expected
Definition: buildtests.py:33
#define GOOGLE_PREDICT_TRUE(x)
Definition: port.h:207
EGLStreamKHR EGLint EGLint EGLint const void * data
Definition: eglext.h:984
str
Definition: make-dist.py:305
Definition: struct.pb.h:161
result
Definition: target-blank-opener-post-window.php:5
google::protobuf::scoped_ptr< io::Tokenizer > input_
Definition: parser_unittest.cc:182
Definition: descriptor.h:1355
int64_t int64
Definition: port.h:131
#define false
Definition: float-mm.c:5
def ReadTag(buffer, pos)
Definition: decoder.py:169
static uint8 * WriteLittleEndian32ToArray(uint32 value, uint8 *target)
Definition: coded_stream.h:1100
#define NULL
Definition: common_types.h:41
#define LIBPROTOBUF_EXPORT
Definition: port.h:97
Definition: gflags_completions.h:115
string input
Definition: tokenizer_unittest.cc:198
Definition: coded_stream.h:665
EGLContext EGLenum EGLClientBuffer buffer
Definition: eglext.h:192
Definition: message.h:1006
void WriteVarint32(uint32 value)
Definition: coded_stream.h:1133
def Skip(lines, pos, regex)
Definition: pump.py:251
DOMString amount
Definition: ApplePayLineItem.idl:38
static uint8 * WriteLittleEndian64ToArray(uint64 value, uint8 *target)
Definition: coded_stream.h:1113
int ByteCount() const
Definition: coded_stream.h:1189