Skip to content

Commit 15bec81

Browse files
authored
Partial wrapping of pb_ostream_t (pt5) (#916)
Wraps encoding of FieldValue's. At this point, raw pb_ostream_t structs aren't used outside of Writer, except during creation of a Writer.
1 parent a2b8b96 commit 15bec81

File tree

1 file changed

+20
-24
lines changed

1 file changed

+20
-24
lines changed

Firestore/core/src/firebase/firestore/remote/serializer.cc

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,6 @@ class Writer {
108108
*/
109109
void EncodeVarint(uint64_t value);
110110

111-
public:
112-
// TODO(rsgowman): make this private again.
113111
pb_ostream_t* stream_;
114112
};
115113

@@ -240,40 +238,38 @@ std::string DecodeString(pb_istream_t* stream) {
240238
// TODO(rsgowman): Refactor to use a helper class that wraps the stream struct.
241239
// This will help with error handling, and should eliminate the issue of two
242240
// 'EncodeFieldValue' methods.
243-
void EncodeFieldValueImpl(pb_ostream_t* raw_stream,
244-
const FieldValue& field_value) {
241+
void EncodeFieldValueImpl(Writer* stream, const FieldValue& field_value) {
245242
// TODO(rsgowman): some refactoring is in order... but will wait until after a
246243
// non-varint, non-fixed-size (i.e. string) type is present before doing so.
247-
Writer stream(raw_stream);
248244
switch (field_value.type()) {
249245
case FieldValue::Type::Null:
250-
stream.EncodeTag(PB_WT_VARINT,
251-
google_firestore_v1beta1_Value_null_value_tag);
252-
stream.EncodeNull();
246+
stream->EncodeTag(PB_WT_VARINT,
247+
google_firestore_v1beta1_Value_null_value_tag);
248+
stream->EncodeNull();
253249
break;
254250

255251
case FieldValue::Type::Boolean:
256-
stream.EncodeTag(PB_WT_VARINT,
257-
google_firestore_v1beta1_Value_boolean_value_tag);
258-
stream.EncodeBool(field_value.boolean_value());
252+
stream->EncodeTag(PB_WT_VARINT,
253+
google_firestore_v1beta1_Value_boolean_value_tag);
254+
stream->EncodeBool(field_value.boolean_value());
259255
break;
260256

261257
case FieldValue::Type::Integer:
262-
stream.EncodeTag(PB_WT_VARINT,
263-
google_firestore_v1beta1_Value_integer_value_tag);
264-
stream.EncodeInteger(field_value.integer_value());
258+
stream->EncodeTag(PB_WT_VARINT,
259+
google_firestore_v1beta1_Value_integer_value_tag);
260+
stream->EncodeInteger(field_value.integer_value());
265261
break;
266262

267263
case FieldValue::Type::String:
268-
stream.EncodeTag(PB_WT_STRING,
269-
google_firestore_v1beta1_Value_string_value_tag);
270-
stream.EncodeString(field_value.string_value());
264+
stream->EncodeTag(PB_WT_STRING,
265+
google_firestore_v1beta1_Value_string_value_tag);
266+
stream->EncodeString(field_value.string_value());
271267
break;
272268

273269
case FieldValue::Type::Object:
274-
stream.EncodeTag(PB_WT_STRING,
275-
google_firestore_v1beta1_Value_map_value_tag);
276-
EncodeObject(&stream, field_value.object_value());
270+
stream->EncodeTag(PB_WT_STRING,
271+
google_firestore_v1beta1_Value_map_value_tag);
272+
EncodeObject(stream, field_value.object_value());
277273
break;
278274

279275
default:
@@ -441,9 +437,8 @@ void EncodeFieldsEntry(Writer* stream,
441437
// Encode the value (FieldValue)
442438
stream->EncodeTag(PB_WT_STRING,
443439
google_firestore_v1beta1_MapValue_FieldsEntry_value_tag);
444-
stream->EncodeNestedMessage([&kv](Writer* stream) {
445-
EncodeFieldValueImpl(stream->stream_, kv.second);
446-
});
440+
stream->EncodeNestedMessage(
441+
[&kv](Writer* stream) { EncodeFieldValueImpl(stream, kv.second); });
447442
}
448443

449444
std::pair<std::string, FieldValue> DecodeFieldsEntry(pb_istream_t* stream) {
@@ -537,7 +532,7 @@ void Serializer::EncodeFieldValue(const FieldValue& field_value,
537532
// bytes_written is (always) initialized to 0. (NB: nanopb does not know or
538533
// care about the underlying output vector, so where we are in the vector
539534
// itself is irrelevant. i.e. don't use out_bytes->size())
540-
pb_ostream_t stream = {
535+
pb_ostream_t raw_stream = {
541536
/*callback=*/[](pb_ostream_t* stream, const pb_byte_t* buf,
542537
size_t count) -> bool {
543538
auto* out_bytes = static_cast<std::vector<uint8_t>*>(stream->state);
@@ -548,6 +543,7 @@ void Serializer::EncodeFieldValue(const FieldValue& field_value,
548543
/*max_size=*/kMaxDocumentSize,
549544
/*bytes_written=*/0,
550545
/*errmsg=*/NULL};
546+
Writer stream(&raw_stream);
551547
EncodeFieldValueImpl(&stream, field_value);
552548
}
553549

0 commit comments

Comments
 (0)