File indexing completed on 2026-08-01 09:09:49
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_H__
0017 #define GOOGLE_PROTOBUF_WIRE_FORMAT_H__
0018
0019 #include <cstddef>
0020 #include <cstdint>
0021
0022 #include "absl/base/casts.h"
0023 #include "absl/log/absl_check.h"
0024 #include "absl/strings/cord.h"
0025 #include "absl/strings/string_view.h"
0026 #include "google/protobuf/descriptor.h"
0027 #include "google/protobuf/generated_message_util.h"
0028 #include "google/protobuf/io/coded_stream.h"
0029 #include "google/protobuf/message.h"
0030 #include "google/protobuf/metadata_lite.h"
0031 #include "google/protobuf/parse_context.h"
0032 #include "google/protobuf/wire_format_lite.h"
0033
0034 #ifdef SWIG
0035 #error "You cannot SWIG proto headers"
0036 #endif
0037
0038
0039 #include "google/protobuf/port_def.inc"
0040
0041 namespace google {
0042 namespace protobuf {
0043 class MapKey;
0044 class UnknownFieldSet;
0045 }
0046 }
0047
0048 namespace google {
0049 namespace protobuf {
0050 namespace internal {
0051
0052 class TcParser;
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063 class PROTOBUF_EXPORT WireFormat {
0064 public:
0065 WireFormat() = delete;
0066
0067
0068 static inline WireFormatLite::WireType WireTypeForField(
0069 const FieldDescriptor* field);
0070
0071
0072 static inline WireFormatLite::WireType WireTypeForFieldType(
0073 FieldDescriptor::Type type);
0074
0075
0076
0077 static inline size_t TagSize(int field_number, FieldDescriptor::Type type);
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 static bool ParseAndMergePartial(io::CodedInputStream* input,
0096 Message* message);
0097
0098
0099
0100 static const char* _InternalParse(Message* msg, const char* ptr,
0101 internal::ParseContext* ctx);
0102
0103
0104
0105
0106
0107
0108
0109
0110 static void SerializeWithCachedSizes(const Message& message, int size,
0111 io::CodedOutputStream* output) {
0112 int expected_endpoint = output->ByteCount() + size;
0113 output->SetCur(
0114 _InternalSerialize(message, output->Cur(), output->EpsCopy()));
0115 ABSL_CHECK_EQ(output->ByteCount(), expected_endpoint)
0116 << ": Protocol message serialized to a size different from what was "
0117 "originally expected. Perhaps it was modified by another thread "
0118 "during serialization?";
0119 }
0120 static uint8_t* _InternalSerialize(const Message& message, uint8_t* target,
0121 io::EpsCopyOutputStream* stream);
0122
0123
0124
0125
0126
0127
0128 static size_t ByteSize(const Message& message);
0129
0130
0131
0132
0133
0134
0135
0136 static bool SkipField(io::CodedInputStream* input, uint32_t tag,
0137 UnknownFieldSet* unknown_fields);
0138
0139
0140
0141 static bool SkipMessage(io::CodedInputStream* input,
0142 UnknownFieldSet* unknown_fields);
0143
0144
0145 static void SerializeUnknownFields(const UnknownFieldSet& unknown_fields,
0146 io::CodedOutputStream* output) {
0147 output->SetCur(InternalSerializeUnknownFieldsToArray(
0148 unknown_fields, output->Cur(), output->EpsCopy()));
0149 }
0150
0151
0152
0153
0154
0155 static uint8_t* SerializeUnknownFieldsToArray(
0156 const UnknownFieldSet& unknown_fields, uint8_t* target) {
0157 io::EpsCopyOutputStream stream(
0158 target, static_cast<int>(ComputeUnknownFieldsSize(unknown_fields)),
0159 io::CodedOutputStream::IsDefaultSerializationDeterministic());
0160 return InternalSerializeUnknownFieldsToArray(unknown_fields, target,
0161 &stream);
0162 }
0163 static uint8_t* InternalSerializeUnknownFieldsToArray(
0164 const UnknownFieldSet& unknown_fields, uint8_t* target,
0165 io::EpsCopyOutputStream* stream);
0166
0167
0168
0169
0170
0171
0172
0173
0174 static uint8_t* InternalSerializeUnknownMessageSetItemsToArray(
0175 const UnknownFieldSet& unknown_fields, uint8_t* target,
0176 io::EpsCopyOutputStream* stream);
0177
0178
0179 static size_t ComputeUnknownFieldsSize(const UnknownFieldSet& unknown_fields);
0180
0181
0182
0183 static size_t ComputeUnknownMessageSetItemsSize(
0184 const UnknownFieldSet& unknown_fields);
0185
0186
0187
0188
0189
0190
0191 static uint32_t MakeTag(const FieldDescriptor* field);
0192
0193
0194
0195 static bool ParseAndMergeField(
0196 uint32_t tag,
0197 const FieldDescriptor* field,
0198 Message* message, io::CodedInputStream* input);
0199
0200
0201 static void SerializeFieldWithCachedSizes(
0202 const FieldDescriptor* field,
0203 const Message& message, io::CodedOutputStream* output) {
0204 output->SetCur(InternalSerializeField(field, message, output->Cur(),
0205 output->EpsCopy()));
0206 }
0207 static uint8_t* InternalSerializeField(
0208 const FieldDescriptor* field,
0209 const Message& message, uint8_t* target, io::EpsCopyOutputStream* stream);
0210
0211
0212
0213
0214 static size_t FieldByteSize(const FieldDescriptor* field,
0215 const Message& message);
0216
0217
0218
0219 static bool ParseAndMergeMessageSetItem(io::CodedInputStream* input,
0220 Message* message);
0221 static uint8_t* InternalSerializeMessageSetItem(
0222 const FieldDescriptor* field, const Message& message, uint8_t* target,
0223 io::EpsCopyOutputStream* stream);
0224 static size_t MessageSetItemByteSize(const FieldDescriptor* field,
0225 const Message& message);
0226
0227
0228
0229
0230
0231 static size_t FieldDataOnlyByteSize(
0232 const FieldDescriptor* field,
0233 const Message& message);
0234
0235 enum Operation {
0236 PARSE = 0,
0237 SERIALIZE = 1,
0238 };
0239
0240
0241
0242
0243 static void VerifyUTF8String(const char* data, int size, Operation op);
0244
0245
0246 static void VerifyUTF8StringNamedField(const char* data, int size,
0247 Operation op,
0248 absl::string_view field_name);
0249
0250 private:
0251 struct MessageSetParser;
0252 friend class TcParser;
0253
0254 static bool SkipMessageSetField(io::CodedInputStream* input,
0255 uint32_t field_number,
0256 UnknownFieldSet* unknown_fields);
0257
0258
0259 static bool ParseAndMergeMessageSetField(uint32_t field_number,
0260 const FieldDescriptor* field,
0261 Message* message,
0262 io::CodedInputStream* input);
0263
0264 static const char* _InternalParseAndMergeField(Message* msg, const char* ptr,
0265 internal::ParseContext* ctx,
0266 uint64_t tag,
0267 const Reflection* reflection,
0268 const FieldDescriptor* field);
0269 };
0270
0271
0272 class PROTOBUF_EXPORT UnknownFieldSetFieldSkipper : public FieldSkipper {
0273 public:
0274 explicit UnknownFieldSetFieldSkipper(UnknownFieldSet* unknown_fields)
0275 : unknown_fields_(unknown_fields) {}
0276 ~UnknownFieldSetFieldSkipper() override = default;
0277
0278
0279 bool SkipField(io::CodedInputStream* input, uint32_t tag) override;
0280 bool SkipMessage(io::CodedInputStream* input) override;
0281 void SkipUnknownEnum(int field_number, int value) override;
0282
0283 protected:
0284 UnknownFieldSet* unknown_fields_;
0285 };
0286
0287
0288
0289 inline WireFormatLite::WireType WireFormat::WireTypeForField(
0290 const FieldDescriptor* field) {
0291 if (field->is_packed()) {
0292 return WireFormatLite::WIRETYPE_LENGTH_DELIMITED;
0293 } else {
0294 return WireTypeForFieldType(field->type());
0295 }
0296 }
0297
0298 inline WireFormatLite::WireType WireFormat::WireTypeForFieldType(
0299 FieldDescriptor::Type type) {
0300
0301
0302 return WireFormatLite::WireTypeForFieldType(
0303 static_cast<WireFormatLite::FieldType>(absl::implicit_cast<int>(type)));
0304 }
0305
0306 inline uint32_t WireFormat::MakeTag(const FieldDescriptor* field) {
0307 return WireFormatLite::MakeTag(field->number(), WireTypeForField(field));
0308 }
0309
0310 inline size_t WireFormat::TagSize(int field_number,
0311 FieldDescriptor::Type type) {
0312
0313
0314 return WireFormatLite::TagSize(
0315 field_number,
0316 static_cast<WireFormatLite::FieldType>(absl::implicit_cast<int>(type)));
0317 }
0318
0319 inline void WireFormat::VerifyUTF8String(const char* data, int size,
0320 WireFormat::Operation op) {
0321 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
0322 WireFormatLite::VerifyUtf8String(data, size,
0323 static_cast<WireFormatLite::Operation>(op),
0324 "");
0325 #else
0326
0327 (void)data;
0328 (void)size;
0329 (void)op;
0330 #endif
0331 }
0332
0333 inline void WireFormat::VerifyUTF8StringNamedField(
0334 const char* data, int size, WireFormat::Operation op,
0335 const absl::string_view field_name) {
0336 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
0337 WireFormatLite::VerifyUtf8String(
0338 data, size, static_cast<WireFormatLite::Operation>(op), field_name);
0339 #else
0340
0341 (void)data;
0342 (void)size;
0343 (void)op;
0344 (void)field_name;
0345 #endif
0346 }
0347
0348
0349 inline uint8_t* InternalSerializeUnknownMessageSetItemsToArray(
0350 const UnknownFieldSet& unknown_fields, uint8_t* target,
0351 io::EpsCopyOutputStream* stream) {
0352 return WireFormat::InternalSerializeUnknownMessageSetItemsToArray(
0353 unknown_fields, target, stream);
0354 }
0355
0356 inline size_t ComputeUnknownMessageSetItemsSize(
0357 const UnknownFieldSet& unknown_fields) {
0358 return WireFormat::ComputeUnknownMessageSetItemsSize(unknown_fields);
0359 }
0360
0361
0362 PROTOBUF_EXPORT
0363 size_t ComputeUnknownFieldsSize(const InternalMetadata& metadata, size_t size,
0364 CachedSize* cached_size);
0365
0366 size_t MapKeyDataOnlyByteSize(const FieldDescriptor* field,
0367 const MapKey& value);
0368
0369 uint8_t* SerializeMapKeyWithCachedSizes(const FieldDescriptor* field,
0370 const MapKey& value, uint8_t* target,
0371 io::EpsCopyOutputStream* stream);
0372 }
0373 }
0374 }
0375
0376 #include "google/protobuf/port_undef.inc"
0377
0378 #endif